Rsync简介
- Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
小提示:利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令!
-
一个rsync相当于scp,cp,rm,但是还优于他们每一个命令。
-
在同步备份数据时,默认情况下,Rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。
提示:传统的cp,scp工具拷贝每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。
-
CentOS5,rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。
-
CentOS6,rsync3.x比对方法,一边比对差异,一边对差异的部分进行同步。
rsync 命令常用参数选项说明:
-v,--verbose 详细模式输出,传输时的进度等信息 -z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩。 -a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgD1(字母1)
-r,--recursive | 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r |
---|---|
-t,--times | 保持文件时间信息 |
-o,--owner | 保持文件属主信息 |
-p,--perms | 保持文件权限 |
-g,--group | 保持文件属组信息 |
-P,--progress | 显示同步的过程及传输时的进度等信息 |
-D,--devices | 保持设备文件信息 |
-l,--links | 保留软链接 |
-e,--rsh=COMMAND | 使用的信道协议(remote shell),指定替代rsh的shell程序。例如:ssh --exclude=PATTERN 指定排除不需要传输的文件模式(和tar参数一样) |
--bwlimit=RATE | limit socket I/O bandwidth |
--delete | 让源目录SRC和目标目录数据DST一致 |
例:
rsync -avz dbfile 10.0.0.41:/backup #没有给带宽做限制 rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup #限定了带宽
借助ssh通道在不同主机之间传输数据
示例1:推送:将当前主机内容推送到远程主机
rsync -avzP -e 'ssh -p 22'/etc/ root@192.168.197.129:/tmp/ #命令说明 -e 'ssh -p 22' 表示以ssh的方式通过22端口推送,如果不写默认22端口
示例2:将远程主机内容拉取到当前主机
rsync -avzP -e 'ssh -p 22' root@192.168.197.129:/opt /tmp 关键语法说明: 1)-avz相当于-vzrtopgDI,表示同步时文件和目录属性不变。 2)-P显示同步的过程,可以用--progress替换。 3)-e ‘ssh -p 22’表示通过ssh通道传输数据,可省略 4)root@chensiqi2:/opt 远程主机系统用户,地址,路径 5)/tmp本地的路径 可以去掉 -e ‘ssh -p 22’(默认22端口) rsync -avzP root@192.168.197.129:/opt /tmp/
以守护进程(socket)的方式传输数据(重点)
A-Server:192.168.50.129服务端
B-Server:192.168.50.128客户端
开始部署rsync服务--Rsync服务端A-Server
首先安装: yum -y install rsync 然后创建rsyncd.conf文件,并添加如下内容(文件默认不存在) vim /etc/rsyncd.conf #rsync_config_____start #created by chensiqi 13:40 2017-3-6 ##blog:http://www.cnblogs.com/chensiqiqi/ ##rsyncd.conf start## # 用户 uid = rsync # 组 gid = rsync # 程序安全设置
fake super = yes use chroot = no # 客户端连接数 max connections = 200 # 超时时间 timeout = 300 # 进程号文件位置 pid file = /var/run/rsyncd.pid # 进程锁 lock file = /var/run/rsync.lock # 日志文件位置 log file = /var/log/rsyncd.log ########################################## [backup] # 使用目录 path = /backup/ # 有错误时忽略 ignore errors # 可读可写(true或false) read only = false # 阻止远程列表(不让通过远程方式看服务端有啥) list=false # 允许IP hosts allow = 192.168.50.0/24 # 禁止IP hosts deny = 0.0.0.0/32 # 虚拟用户 auth users = rsync_backup # 存放用户和密码的文件 secrets file = /etc/rsync.password ##rsync_config______end##
useradd -M -s /sbin/nologin rsync #创建rsync用户 mkdir /backup #创建共享目录 #启动服务:rsync --daemon rsync --daemon netstat -antup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1803/rsync
tcp6 0 0 :::873 :::* LISTEN 1803/rsync
将A-Server上的/backup文件夹更改属主rsync chown -R rsync /backup 创建rsync虚拟账户名和密码 echo "rsync_backup:123456" >/etc/rsync.password 将账户密码文件的权限设置为600(必须否则失败) chmod 600 /etc/rsync.password 加入开机启动 echo "rsync --daemon" >> /etc/rc.local
如何重启rsync服务
pkill rsync #关闭rsync服务
rsync --daemon #启动rsync服务
开始部署rsync服务--Rsync客户端B-Server
只需要创建密码文件
只需要创建密码文件 yum -y install rsync echo "123456" > /etc/rsync.password 将密码文件的权限设置为600(必须否则失败) chmod 600 /etc/rsync.password 至此rsync客户端B-Server配置完毕。
Rsync同步测试
推送1:将客户端B指定目录内容推送到服务器端A的rsync指定目录下。
rsync -avz /backup/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password 命令说明: -avz:保持稳健各项属性不变,-v显示同步信息 -P显示具体同步过程 /backup/:要推送的内容所在目录 rsync_backup:服务器端rsync服务的同步的用户名(非Linux用户) 192.168.50.128:rsync服务器IP地址 backup:rsync服务器配置文件里的模块名 --password-file=/etc/rsync.password:免密码的操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)
推送2:将客户端B任意目录推送到rsync服务器A端指定目录下
rsync -avzP /tmp/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password
拉取1:将rsync服务器A端指定目录全部内容同步到客户端B
rsync -avzP rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 命令说明: 和推送相比,只是两个目录换了个位置。
拉取2:将rsync服务器端A指定目录下的指定内容同步到客户端B
rsync -avzP rsync_backup@192.168.50.129::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password
拉取3: 将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端
方法一:通过命令行实现排除
ls a b c chen d e ls chen 1 2 3 4 5 说明: a,b,c,d,e为文件,chen是目录。目录下有1,2,3,4,5文件 rsync -avz --exclude=a --exclude=chen/3 --exclude=chen/4 rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exlude=文件名 :排除的文件
方法二:通过列表文件实现排除
创建排除列表文件 cat /root/exclude.txt 1 3 5 b e
测试命令:
rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exclude-from=文件的绝对路径 :引用一个排除列表,列表里只需要输入排除的文件名即可
rsync同步拉取测试:让rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致
1.和rsync服务器目录内容始终保持一致:始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件
rsync -avz --delete rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 命令说明: --delete :表示同步增,删,改(文件内容出现变化,也会同步的)
2.排除某文件后,再和服务器进行同步.
rsync -avz --delete --exclude=c rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exclude=c:同步时不考虑文件名为c的文件
rsync同步推送测试:让Rsync服务器端共享目录始终和rsync客户端指定目录内容一致。
1)和rsync客户端目录内容始终保持一致
始终保持一致的意思是说,当Rsync客户端指定目录增加文件,那么服务器端共享目录也增加,客户端指定目录删除文件,那么服务器端共享目录也删除文件
rsync -avz --delete /backup/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password 命令说明: --delete :表示同步增,删,改(文件内容出现变化,也会同步的) 与同步拉取相比:只是客户端目录放在了服务器端的前边
Rsync企业应用之风险提示
特别说明:
执行--delete参数从rsync服务器端往rsync客户端拉取数据时,一定要小心,最好不用,它比从rsync客户端带--delete参数往rsync服务端推送危险的多。客户端带--delete参数往服务端推送仅删除服务端模块下的数据,而前者有能力删除rsync客户端本地的所有数据包括跟下的所有目录。
rsync推送企业工作场景:
1)备份 --delete 风险
本地有啥,远端就有啥,本地没有的远端有也要删除。服务器端的目录数据可能丢失。
rsync拉取企业工作场景:
1)代码发布,下载。--delete风险
远端有啥,本地(客户端)就有啥,远端没有的本地有也要删除。本地的目录数据可能丢失
rsync优点:
1,增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)。
2,远程SHELL通道模式还可以加密(SSH)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
rsync缺点:
1,大量小文件时候同步的时候,比对时间较长,有的时候,同步过程中,rsync进程可能会停止,僵死了。
2,同步大文件,10G这样的大文件有时也会出问题,中断。未完整同步前,是隐藏文件,可以通过续传(--partial)等参数实现传输
3,一次性远程拷贝可以用scp,大量小文件要打成一个包再拷贝。(重要)
rsyncd.conf配置文件常用参数说明:
rsyncd.conf参数 | 参数说明 |
---|---|
uid=rsync | rsync使用的用户。 |
gid=rsync | rsync使用的用户组(用户所在的组) |
use chroot=no | 如果为true,daemon会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所以不配也没关系 |
max connections=200 | 设置最大连接数,默认0,意思无限制,负值为关闭这个模块 |
timeout=400 | 默认为0,表示no timeout,建议300-600(5-10分钟) |
pid file | rsync daemon启动后将其进程pid写入此文件。如果这个文件存在,rsync不会覆盖该文件,而是会终止 |
lock file | 指定lock文件用来支持“max connections”参数,使得总连接数不会超过限制 |
log file | 不设或者设置错误,rsync会使用rsyslog输出相关日志信息 |
ignore errors | 忽略I/O错误 |
read only=false | 指定客户端是否可以上传文件,默认对所有模块为true |
list=false | 是否允许客户端可以查看可用模块列表,默认为可以 |
hosts allow | 指定可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数,即都可以连接 |
hosts deny | 指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接 |
auth users | 指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问 |
secrets file | 指定用户名和密码存放的文件,格式;用户名;密码,密码不超过8位 |
[backup] | 这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护 |
path | 这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题 |
特别说明:
1)模块中的参数项可以拿到全局配置中使用
2)以上配置文件中的参数,为生产中经常使用的参数,初学者掌握这些足够了。
3)以上配置文件中没有提到的参数请参考man rsyncd.conf查看
开发rsync服务启动脚本
#!/bin/bash #author:wk # chkconfig:35 13 91 # description:This is Rsync service management shell script # Source function library . /etc/rc.d/init.d/functions start(){ rsync --daemon if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ];then action "Starting Rsync:" /bin/true sleep 1 else action "Starting Rsync:" /bin/false sleep 1 fi } stop(){ pkill rsync;sleep 1;pkill rsync if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then action "Stopping Rsync: " /bin/true sleep 1 else action "Stopping Rsync:" /bin/true sleep 1 fi } case "$1" in start) start; ;; stop) stop; ;; restart|reload) stop; start; ;; *) echo $"Usage: $0 {start|stop|restart|reload}" ;; esac
sersync 需要配置在rsync客户端
sersync需要依赖inotify和rsync,所以需要安装对应软件
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install inotify-tools #之前rsync装过了只需装inotify
安装sersync
cd /usr/local/ wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ /usr/local/sersync
配置sersync
详解
vim /usr/local/sersync/confxml.xml <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host><!--本地主机地址--> <debug start="false"/><!--是否打开调试信息--> <fileSystem xfs="false"/><!--文件系统是否支持xfs文件系统--> <filter start="false"><!--排除不想同步的文件--> <exclude expression="(.*)\.svn"></exclude><!--不想同步的文件--> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify><!--监控的事件类型--> <delete start="true"/> <!--监控删除文件或目录--> <createFolder start="true"/> <!--监控创建文件夹--> <createFile start="true"/> <!--监控创建文件--> <closeWrite start="true"/> <!--文件或目录封闭,写模式--> <moveFrom start="true"/> <!--监控移动进来的文件--> <moveTo start="true"/> <!--监控移动出去的文件--> <attrib start="false"/> <!--监控文件或目录属性被改变--> <modify start="false"/> <!--监控文件或目录内容被修改--> </inotify> <sersync><!--本地需要监视的目录--> <localpath watch="/www"><!--本地监视/www目录--> <remote ip="192.168.50.179" name="backup"/><!--rsync服务端的IP及模块名--> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <!--sersync调用rsync时的参数配置段--> <commonParams params="-az"/><!-- rsync使用az参数 --> <!--开启虚拟用户密码认证 用户名 密码存放位置--> <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> <userDefinedPort start="false" port="874"/><!--port=874--><!--指定rsync服务端的端口 默认874--> <timeout start="ture" time="100"/><!--timeout=100 --><!-- 超时时间--> <ssh start="false"/> </rsync> <!--指定如果同步失败,记录到哪个文件,以便在60分钟后尝试重传--> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> <!--指定多长时间间隔执行一次完整同步--> <crontab start="false" schedule="600"><!--600mins--> <!--可以过滤哪些不同步--> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
启动sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -o config xml name: /usr/local/sersync/confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 will ignore the inotify createFile event daemon start,sersync run behind the console use rsync password-file : user is rsync_backup passwordfile is /etc/rsync.password config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... execute command: cd /www && rsync -az -R --delete ./ rsync_backup@192.168.50.179::backup --password-file=/etc/rsync.password >/dev/null 2>&1 run the sersync: watch path is: /www
测试是否成功
cd /www && rsync -az -R --delete ./ rsync_backup@192.168.50.179::backup --password-file=/etc/rsync.password
#如果不报错 基本成功
[root@wk media]# > 113 [root@wk media]# ls 113 [root@wk backup]# ls 113