rsync备份服务
1.1 rsync数据复制传输服务介绍
1.1.1 rsync的官方网站
https://download.samba.org/pub/rsync/rsync.html
1.1.2 rsync的官方定义
rsync是一款快速的、多功能的、开源的、并且可以实现全量及增量,可实现远程或本地数据复制的优秀工具
总结:
(1)rsync的核心作用是实现本地服务器和远程服务器上的文件或目录的复制传输(包括本地推到远程,远程拉到本地两种同步方式);
(2)rsync也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步;
(3)rsync既可以拷贝文件,也可以拷贝目录。
(4)rsync软件适用于unix/linux/windows等多种操作系统平台
重要概念:
本地:本机,自己手里正在操作的这台服务器;
远程:非本机,除了自己手里正在操作的这台以外的所有服务器;
全量:需要被操作的所有数据(数据第一次被操作的时候一定是全量);
增量:需要被操作的所有数据里面,相对上一次操作后,发生了变化的数据(数据至少被操作了一次之后,才会有增量这个概念);
推送:从本地往远程复制传输数据(也就是由己及人叫做推),get、pull;
拉取:从远程往本地复制传输数据(也就是由人及己叫做拉),put、push。
1.1.3 rsync详细特点介绍
(1)支持拷贝普通文件与特殊文件,如链接文件(-l参数),设备(-D参数)等;
(2)可以做到保持原文件或目录的权限(-p参数)、时间(-t参数)、软硬链接(-l参数)、属主(-o参数)、属组(-g参数)等所有属性均不改变;
(3)可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能;
# 作为对比,给出tar命令的相关功能举例
# 在打包所有的脚本时,排除掉test.sh文件;目录同理
cd /server/scripts/;tar zcvf allShell_backup.tar.gz *.sh --exclude=test.sh
(4)可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar -N);
# 作为对比,给出tar命令的相关功能举例
# 备份/server/script目录自2018-03-21以来修改过的文件
cd /server/scripts/;tar -N 2018-03-21 -zcvf /tmp/inc-backup_$(date +%F).tar.gz .
# 备份/server/script目录自昨天以来修改过的文件
cd /server/scripts/;tar -N $(date -d yesterday "+%F") -zcvf /tmp/inc-backup_$(date +%F).tar.gz ./
# 添加文件到已经打包的文件内,即追加文件到已存在的打包文件内
cd /server/scripts/;tar -rf all.tar *.sh
# 说明:这条命令是将所有的sh文件增加到all.tar的包里面去,-r是表示增加文件的意思
(5)rsync虽然本身不对数据加密,但可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(-e参数);
(6)可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****重点讲解的部分;
(7)支持匿名的或认证(无需系统用户)的进程模式传输,方便安全的拷贝传输数据。
1.1.4 rsync拷贝传输服务工作原理介绍
(1)前提条件:
需要复制传输数据的多台服务器之间的网络连接要通畅;
(2)检查模式(决定哪些文件需要复制传输):
检查模式是指按照指定规则来检查哪些文件需要被同步。
rsync有一个自己独特的叫做“quick check”的算法,
这个算法默认会快速的比对源文件和目标文件(如果存在)的大小和修改时间是否一致,
如果两端文件的大小或修改时间不同,则发送端会传输该文件,否则将忽略该文件,
这样就可以做到不是每次都整份复制传输,这也是rsync复制传输时速度相当快的原因所在。
当然,也可以通过在使用rsync时指定特定的选项来改变“quick check”算法的检查项,达到比对更多内容的目的。
rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。
(3)同步模式:
同步模式是指在文件确定要被复制传输后,在同步过程发生之前要做哪些额外工作。
例如
是否要先删除源服务器上没有但目标服务器上有的文件,
是否要先备份已存在的目标文件,
是否要追踪链接文件等额外操作。
rsync也提供非常多的选项使得同步模式变得更具弹性。
总结:
由“quick check”算法,结合rsync的参数,可以实现每次传输的时候,只传输有变化的部分,这样就能够达成一个灵活传输数据的目的。
比如,
能够只传输A里面属主或属组有变化的文件到B,
能够只传输A里面权限有变化的文件到B,
能够只传输A里面时间戳有变化的文件到B,
还能够只传输B里面目录内新增或改动的文件到A,
也能够将B里面有而A里面没有的数据传输到A
1.1.5 rsync功能说明:1v4
(1)实现数据信息查看(VS ls及ls -d命令)
ls命令实现:
[root@backup ~]# ls -l /data/
[root@backup ~]# ls -ld /data/
rsync命令实现:
[root@backup ~]# rsync /data 《《==查看目录信息
注意:请比较下面这条rsync命令的执行结果与上一条rsync命令的执行结果的差别。
[root@backup ~]# rsync /data/ 《《==查看目录下文件信息
重要说明:
举例详细说明一下这一点:
rsync命令后面接的目录信息:/data/# 表示被操作的对象的是/data/目录下面的所有内容
rsync命令后面接的目录信息:/data #表示被操作的对象的是/data/目录本身以及/data/目录下面的所有内容
(2)实现本地传输数据(local-only mode)(VS cp命令)
语法格式
rsync [OPTION…] SRC… [DEST]
程序命令复制传输时的参数选项 要复制传输的分区、文件 目的地,即把数据复制传输到哪里
-
拷贝文件
[root@backup ~]# cp -a /etc/hosts /tmp/hosts_cp
[root@backup ~]# ls -l /tmp/hosts
rsync命令实现:
[root@backup ~]# rsync /etc/hosts /tmp/hosts_rsync 《《==把/etc/hosts拷贝到/tmp下,命名为hosts_rsync
[root@backup ~]# ls -l /tmp/
-
拷贝目录
cp命令实现:
[root@backup ~]# cp -ap /data /tmp/
[root@backup ~]# ls -l /tmp/
rsync命令实现:
[root@backup ~]# rsync -av /data /tmp/ 《《==-av参数,将/data目录拷贝到/tmp下
(3)实现远程传输数据(remote shell mode)(VS scp命令)
语法格式
推送(push)rsync [OPTION…] SRC… [USER@] HOST: [DEST]
拉取(pull) rsync [OPTION…] [USER@] HOST: SRC… [DEST]
命令 参数 传输时使用用户 IP地址 数据把数据复制到本地服务器的位置
-
分别使用scp及rsync命令推送本地172.16.1.41的/etc/hosts文件到远程172.16.1.31的/tmp/目录内
scp命令实现:
[root@backup ~]# scp -rp /etc/hosts 172.16.1.31:/tmp/
[root@backup ~]# rsync 172.16.1.31:/tmp/ 《《==查看31服务器/tmp目录下文件信息
[root@backup ~]# rsync 172.16.1.31:/tmp 《《==查看31服务器/tmp目录信息
rsync命令实现:
[root@backup ~]# rm /tmp/* -rf
[root@backup ~]# rsync -avP /etc/hosts 172.16.1.31:/tmp 》》将本地hosts推送到31的/tmp下
-
分别使用scp及rsync命令拉取远端172.16.1.31的/data/目录到本地172.16.1.41的/tmp/目录内
scp命令实现:
[root@backup ~]# scp -rp root@172.16.1.31:/data /tmp/
[root@backup ~]# ls -l /tmp/
rsync命令实现:
[root@backup ~]# rsync -vrtopglDP root@172.16.1.31:/data /tmp/ 《《==将31下的/data目录拉到本地/tmp下
[root@backup ~]# ls -l /tmp/
(4)实现数据清空操作(VS rm命令)
-
删除/tmp目录的内容
rsync命令实现:
[root@backup ~]# touch /tmp/{1..10}.txt
[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /tmp/ 《《==同步/null内容到/tmp内
总结:rsync命令可以实现cp、scp、rm、ls(-l和-d参数)这4个命令的功能,并且某些点上rsync命令的功能还优于它们。
1.2 rsync守护进程方式传输数据(daemon mode)
1.2.1 语法格式
拉取 rsync [OPTION…] [USER@]HOST::SRC… [DEST]
推送 rsync [OPTION…] SRC… [USER@]HOST::[DEST]
语法说明
推送push语法格式说明:
rsync # 程序命令
[OPTION...] # 参数
SRC: # 本地要备份的数据信息
[USER@] # 认证用户信息
HOST:: # 远程主机IP地址或者域名信息
DEST # 模块信息
拉取pull语法格式说明:
rsync # 程序命令
[OPTION...] # 参数
[USER@] # 认证用户信息
HOST:: # 远程主机IP地址或者域名信息
SRC # 模块信息
[DEST] # 把备份的数据复制本地主机哪里
1.3 RSYNC的守护进程工作模式部署流程,重要程度,五颗星*****
rsync的守护进程模式分为服务端与客户端两部分,rsync默认使用的端口是873
1.4 服务端部署流程
1.4.1 服务器环境检查
无论做什么操作,都应该养成一个好的习惯,那就是先进行检查,再上手操作。
所以第一步应该先检查服务器上是否已经安装了rsync软件。
命令:rpm -qa rsync或rpm -qa | grep rsync
1.4.2 安装rsync软件(此步视上一步的结果来确定是否需要操作)
如果检查结果是服务器上没有安装rsync软件,那么需要安装一下,一般rsync软件在装机时就已安装好了。
命令:yum install -y rsync
1.4.3 编写rsync服务配置文件
强调:rsyncd.conf这个配置文件里面,每一行的后面都不可以有任何的空格以及tab键存在,否则在使用时会报错
# created by oldboy at 2018
#####rsyncd.conf start#####
# 设置rsync守护进程模式保存进程号的文件的位置及名字
pid file = /var/run/rsyncd.pid
# 设置锁文件的位置及名字
lock file = /var/run/rsync.lock
# 设置日志文件的位置及名字,可以通过log format参数设置日志格式
log file = /var/log/rsyncd.log
# 设置进行数据传输时所使用的linux系统的用户或UID号
uid = rsync
# 设置进行数据传输时所使用的linux系统的用户组或GID号
gid = rsync
# 这是一个与安全有关的参数。如果设置use chroot = yes,rsync会首先进行chroot设置,
# 将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径,但这样做需要root权限,
# 并且在同步符号连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
# 设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会接收到稍后重试的提示消息。
max connections = 200
# 超时时间
timeout = 300
# 忽略一些I/O错误
ignore errors
# 是否允许客户端传输数据到服务端,设置为yes表示客户端不可写,也就是只读。
read only = false
# 客户端请求显示模块列表时,是否予以显示。设置为true为显示,设置为false为不显示。
list = false
# 设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP和网段之间使用空格分隔。
hosts allow = 172.16.1.0/24 白名单
# 设置出hosts allow里面设置的主机以外,要拒绝的IP或网段信息。
hosts deny = 0.0.0.0/32 黑名单
# 设置允许连接服务端的rsync服务的虚拟用户,此用户与linux系统中的用户没有关系。
auth users = rsync_backup
# 设置秘钥认证文件,此文件要求权限为制度,建议设为600。
secrets file = /etc/rsync.password chmod 600 /etc/
# 模块名称,rsync守护进程模式通过模块定义同步的目录,模块以[name]的形式定义。
[backup_test]
# 注释说明,非必须项。
comment = "backup dir by oldboy"
# 同步目录的真实路径
path = /backup
#####rsyncd.conf end#####
1.4.4 创建进行数据传输时所使用的linux系统用户
命令:useradd rsync -s /sbin/nologin -M
检查:id rsync
1.4.5 创建认证密钥文件
配置文件中指定的认证密钥文件默认是不存在的,需要创建出来。
命令:echo "rsync_backup:oldboyedu" > /etc/rsync.password
检查:cat /etc/rsync.password
1.4.6 设置密钥文件的权限
涉及到密码信息的文件,都应该格外注意安全性,所以尽量将密钥文件的权限将至最低,将安全性提到最高。
rsync的密钥文件只需要root用户自己能够读写即可,所以权限设置为600即可。
命令:chmod 600 /etc/rsync.password
检查:ls -l /etc/rsync.password
1.4.7 创建本地同步目录
本地同步目录一定要确保存在,不存在的话务必要事先创建,否则在应用时会出错。
命令:mkdir -p /backup
检查:ls -ld /backup/
1.4.8 设置本地同步目录的属主和属组
由于在配置文件中设定了uid和gid的信息,所以需要将本地同步目录属主和属组为相应的用户。
命令:chown -R rsync.rsync /backup
检查:ls -ld /backup/
1.4.9 启动rsync服务
rsync --daemon
1.4.10 检查rsync服务是否正常启动
命令:ps -ef | grep rsync | grep -v grep
或netstat -nltup | grep rsync
或lsof -i :873
1.4.11 设置rsync开机自动启动
想要让rsync服务开机自动启动,可以将其添加至/etc/rc.local文件内。其中/etc/rc.local文件是
/etc/rc.d/rc/local文件的软链接。
命令:
echo '# start rsync server when this machine opened.' >> /etc/rc.local
echo '/usr/bin/rsync --daemon' >> /etc/rc.local
1.4.12 停止rsync服务(在需要的时候使用,一般修改了服务的配置文件后会需要重启服务)
可以使用killall或者pkill命令杀掉rsync服务,也可以查到端口号交给kill命令去直接杀掉。
命令:
killall rsync
或pkill rsync
或kill `cat /var/run/rsyncd.pid`
或ps aux |grep rsync |grep -v grep |awk '{print $2}' |xargs kill -9 && rm -f /var/run/rsyncd.pid
1.5 客户端部署流程
1.5.1 服务器环境检查
命令:rpm -qa rsync或rpm -qa | grep rsync
1.5.2 安装rsync软件(此步视上一步的结果来确定是否需要操作)
如果检查结果是服务器上没有安装rsync软件,那么需要安装一下,一般rsync软件在装机时就已安装好了。
命令:yum install -y rsync
1.5.3 创建认证密钥文件
此处需要注意,与服务端不同的地方在于,客户端的密钥文件里面只需要存放rsyncd.conf中auth users参数设定的用户的密码,不需要将用户也一并存放进去。
也就是说,如果客户端的密钥文件里面也写成 user:password的形式,反倒是错误的写法,在应用rsync的守护进程模式传输数据时,会导致传输失败。
命令:
echo 'oldboyedu' > /etc/rsync.password
检查:cat /etc/rsync.password
1.5.4 设置密码文件的权限
chmod 600 /etc/rsync.password
1.5.5 在客户端采用常规方式(也就是非免交互的方式)推送到服务端的命令格式如下
rsync -avzP /etc/hosts rsync_backup@172.16.1.41::backup_test
1.5.6 在客户端采用免交互的方式推送到服务端的命令格式如下
rsync -avzP /etc rsync_backup@172.16.1.41::backup_test --password-file=/etc/rsync.password
1.6 rsync错误问题收集
1.6.1 问题1:启动服务时提示:[root@backup ~]# rsync --daemon[root@backup ~]# failed to create pid file /var/run/rsyncd.pid: File exists
答: 这可能是通过强制结束进程导致的,rsyncd.pid 是在启动服务的时候创建的,当通过不恰当的方法结束 了进程会导致该文件存在,当再次启动的时候生成此文件发现文件已存在就会报错
解决办法: rm -rf /var/run/rsyncd.pid
1.6.2 问题2:@ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。
可以尝试修改所属组 所属主来解决此问题
1.6.3 问题3:@ERROR: auth failed on module tee rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:
服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
提供正确的用户名密码解决此问题。
1.6.4 问题4:@ERROR: Unknown module ‘tee_nonexists' rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
模块错误,这个是经常出现的问题,解决办法 检查模块是否写错。
1.7 客户端上可能出现的问题:
1.7.1 在client上遇到问题:
rsync -auzv --progress --password-file=/etc/rsync.pasword root@192.168.133.128::backup /home/
rsync: could not open password file "/etc/rsync.password": No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端没有设置/etc/rsync.password这个文件,而在使用rsync命令的时候,加了这个参
数 --password-file=/etc/rsync.pasword
1.7.2 问题2: rsync -auzv --progress --password-file=/etc/rsync.password root@192.168.133.128::backup /home/ @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码123456,和服务器一致,但是
服务器段设置有错误,服务器端应该设置/etc/rsync.password ,里面内容rsync_backup:123456 ,这里登陆 名不可缺少
1.7.3 问题3:rsync: write failed on "/backup": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
磁盘空间不够,所以无法操作。
可以通过df /backup 来查看可用空间和已用空间
1.7.4 问题4:
rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)
注意查看同步的目录权限是否为755
1.7.5 问题5 :@ERROR: access denied to www from unknown (192.168.1.123)rsync: connection unexpectedly closed (0 bytes received so far) [receiver]rsync error: error in rsync protocol data stream (code 12) at io.c(359)
说明:此问题很明显,是配置选项host allow的问题,初学者喜欢一个允许段做成一个配置,然后模块又是同一个,致使导致
1.7.6 问题6:rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]
说明:导致此问题多半是服务端服务没有被正常启动,到服务器上去查查服务是否有启动,然后查看下 /var/run/rsync.pid 文件是否存在,最干脆的方法是杀死已经启动了服务,然后再次启动服务或者让脚本加入系统启动服务级别然后shutdown -r now服务器