Loading... <p style="text-indent: 2em"><strong>前言</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。</p> <p style="text-indent: 2em"><strong>rsync相关介绍</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">rsync(remote sync)是一款快速增量备份工具(远程同步),支持本地复制,或者与其他SSH(安全传输)、rsync主机同步。<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>特点</strong><br style="text-indent: 2em" /></p> </p> <p style="text-indent: 2em">①可以镜像保存整个目录树或文件系统</p> <p style="text-indent: 2em">②较高的数据传输效率</p> <p style="text-indent: 2em">③可以借助于ssh实现安全数据传输</p> <p style="text-indent: 2em">④支持匿名传输</p> <p style="text-indent: 2em"><strong>工作模式<br style="text-indent: 2em" /></strong></p> <p style="text-indent: 2em">①shell模式,也称作本地模式</p> <p style="text-indent: 2em">②远程shell模式,可以利用ssh协议承载其远程传输过程</p> <p style="text-indent: 2em">③列表模式,仅列出源中的内容,-nv</p> <p style="text-indent: 2em">④服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求</p> <p style="text-indent: 2em"><strong>命令选项</strong><br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">-n: 同步测试,不执行真正的同步过程; -v: 详细输出模式 -q: 静默模式 -c: checksum,开启校验功能 -r: 递归复制 -a: 归档,保留文件的原有属性; -p: 保留文件的权限; -t: 保留文件的时间戳; -l: 保留符号链接 -g: 保留属组 -o: 保留属主 -D:保留设备文件 -e ssh: 使用ssh作为传输承载; -z: 压缩后传输; --progress: 显示进度条 --stats: 显示如何执行压缩和传输</pre> <pre class="brush:bash;toolbar:false">注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要; 如:rsync -r /var/log/ /tmp #复制/var/log目录下的所有文件,不包括log本身 rsync -r /var/log /tmp #复制/var/log整个目录</pre> <p style="text-indent: 2em">rsync同步数据的时候,需要完整扫描文件,比对变化的文件,如果文件数量过于庞大,这样扫描是非常耗时的,而且rsync虽然可以通过crontab实现定期同步,但是也达不到实时同步的要求,要想解决这一弊端,就需要inotify了</p> <p style="text-indent: 2em"><strong>数据实时同步实现</strong></p> <p style="text-indent: 2em"><strong>inotify相关介绍</strong></p> <p style="text-indent: 2em">可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,就通知rsync进行数据同步,以此实现实时同步<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>部署过程</strong></p> <p style="text-indent: 2em">我们通过一个实例来看一下rsync+inotify是如何实现数据同步的</p> <p style="text-indent: 2em">案例要求<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">web服务器1:172.16.10.100(主服务器)</p> <p style="text-indent: 2em">web服务器2:172.16.10.212(辅服务器)</p> <p style="text-indent: 2em">两台web服务器,要求在主服务器上更新数据,辅服务器要自动更新数据</p> <p style="text-indent: 2em">rsync角色说明:因为inotify是监控在rsync的客户端,而且是主动同步,所以在此应用场景中主服务器为rsync客户端,辅服务器为rsync服务器端</p> <p style="text-indent: 2em">rsync服务器端配置</p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# yum install xinetd -y #安装守护进程,rsync系统自带,如果没有安装即可 [root@scholar ~]# vim /etc/xinetd.d/rsync #修改此项 disable = no #启用rsync [root@scholar ~]# vim /etc/rsyncd.conf #为rsync创建配置文件,默认没有此文件 # Global Settings uid = nobody #运行rsync用户 gid = nobody #运行rsync组 use chroot = no #关闭chroot max connections = 10 #最大并发连接数 strict modes = yes #开启严格模式 pid file = /var/run/rsyncd.pid #pid文件位置 log file = /var/log/rsyncd.log #日志文件位置 # Directory to be synced [web] #文件共享名 path = /web #共享文件路径 ignore errors = yes #忽略错误 read only = no #不允许读 write only = no #不允许写 hosts allow = 172.16.0.0/16 #白名单 hosts deny = * #黑名单 list = false #不允许列出文件 uid = root #共享已root用户运行,可覆盖全局配置 gid = root #共享已root组运行,可覆盖全局配置 auth users = scholar #用户认证 secrets file = /etc/rsync.passwd #认证文件 [root@scholar ~]# vim /etc/rsync.passwd #创建认证文件 #格式:username:password,此文件不能允许其它用户有访问权限,且密码不能超过8个字符 scholar:scholar [root@scholar ~]# chmod 600 /etc/rsync.passwd #设置权限</pre> <p style="text-indent: 2em">启动服务,设置开机自启,查看监听端口<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160313-3.jpg" title="1430132393306859.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em">rsync客户端配置</p> <p style="text-indent: 2em">创建认证文件,只需密码即可</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160313-80.jpg" title="1430132408945959.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">测试数据同步的方法</p> <pre class="brush:bash;toolbar:false">Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 如:rsync --password-file=/etc/rsync.passwd scholar@172.16.10.212::web /web rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 如:rsync --password-file=/etc/rsync.passwd rsync://scholar@172.16.10.212/web /web Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 如:rsync --password-file=/etc/rsync.passwd /web scholar@172.16.10.212::web rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 如:rsync --password-file=/etc/rsync.passwd /web rsync://scholar@172.16.10.212/web </pre> <p style="text-indent: 2em">安装inotify-tools<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# tar xf inotify-tools-3.14.tar.gz [root@scholar ~]# cd inotify-tools-3.14 [root@scholar inotify-tools-3.14]# ./configure [root@scholar inotify-tools-3.14]# make && make install</pre> <p style="text-indent: 2em">创建rsync脚本</p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# vim /usr/local/bin/rsyncd #!/bin/bash SRC=/web/ DEST=web HOST=172.16.10.212 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $SRC | while read files; do rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $SRC scholar@$HOST::$DEST done #inotifywait参数详解: #-m,表示始终保持事件监听状态 #-r,表示递归查询目录 #-q,表示打印出监控事件 #-e,指定要监控的事件,包括modify、delete、create、attrib等 #--timefmt:指定时间的输出格式 #--format:指定变化文件的详细信息</pre> <p style="text-indent: 2em">设置开机自动运行</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160313-9.jpg" title="1430132427466168.jpg" alt="3.jpg" /></p> <p style="text-indent: 2em"><strong>测试同步</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">我们在主服务器上增加一个站点,站点已做好我们直接复制进去<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160313-93.jpg" title="1430132442104585.jpg" alt="4.jpg" /></p> <p style="text-indent: 2em">我们去辅服务器上看一下,数据有没有同步过来</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160313-96.jpg" title="1430132464369149.jpg" alt="5.jpg" /></p> <p style="text-indent: 2em">同步成功,至此基于rsync + inotify实现数据实时同步配置完成</p> <p style="text-indent: 2em"><strong>The end </strong></p> <p style="text-indent: 2em">好了,rsync + inotify就讲到这里了,如果要实现多台从服务器同步,多设几个rsync服务器端就好了,相应的主服务器inotify的脚本也需要略加修改,过程并不麻烦,实验过程中遇到问题可留言。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信