前言

与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。

rsync相关介绍

rsync(remote sync)是一款快速增量备份工具(远程同步),支持本地复制,或者与其他SSH(安全传输)、rsync主机同步。

特点


①可以镜像保存整个目录树或文件系统

②较高的数据传输效率

③可以借助于ssh实现安全数据传输

④支持匿名传输

工作模式

①shell模式,也称作本地模式

②远程shell模式,可以利用ssh协议承载其远程传输过程

③列表模式,仅列出源中的内容,-nv

④服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求

命令选项



-n: 同步测试,不执行真正的同步过程;         


          -          v          : 详细输出模式         


          -q: 静默模式         


          -c: checksum,开启校验功能         


          -r: 递归复制         


          -a: 归档,保留文件的原有属性;         


          -p: 保留文件的权限;         


          -t: 保留文件的时间戳;         


          -l: 保留符号链接         


          -g: 保留属组         


          -o: 保留属主         


          -D:保留设备文件         


          -e           ssh          : 使用          ssh          作为传输承载;         


          -z: 压缩后传输;         


          --progress: 显示进度条         


          --stats: 显示如何执行压缩和传输




注意:          rsync          命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;         


          如:          rsync           -r           /var/log/           /tmp           #复制/var/log目录下的所有文件,不包括log本身         


                    rsync           -r           /var/log            /tmp           #复制/var/log整个目录




rsync同步数据的时候,需要完整扫描文件,比对变化的文件,如果文件数量过于庞大,这样扫描是非常耗时的,而且rsync虽然可以通过crontab实现定期同步,但是也达不到实时同步的要求,要想解决这一弊端,就需要inotify了

数据实时同步实现

inotify相关介绍

可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,就通知rsync进行数据同步,以此实现实时同步

部署过程

我们通过一个实例来看一下rsync+inotify是如何实现数据同步的

案例要求

web服务器1:172.16.10.100(主服务器)

web服务器2:172.16.10.212(辅服务器)

两台web服务器,要求在主服务器上更新数据,辅服务器要自动更新数据

rsync角色说明:因为inotify是监控在rsync的客户端,而且是主动同步,所以在此应用场景中主服务器为rsync客户端,辅服务器为rsync服务器端

rsync服务器端配置



[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 #设置权限




启动服务,设置开机自启,查看监听端口

rsync协议安全吗 rsync使用什么协议来传输_shell

rsync客户端配置

创建认证文件,只需密码即可

rsync协议安全吗 rsync使用什么协议来传输_开发工具_02

测试数据同步的方法



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




安装inotify-tools



[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




创建rsync脚本



[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:指定变化文件的详细信息




设置开机自动运行

rsync协议安全吗 rsync使用什么协议来传输_服务器_03

测试同步

我们在主服务器上增加一个站点,站点已做好我们直接复制进去

rsync协议安全吗 rsync使用什么协议来传输_shell_04

我们去辅服务器上看一下,数据有没有同步过来

rsync协议安全吗 rsync使用什么协议来传输_开发工具_05

同步成功,至此基于rsync + inotify实现数据实时同步配置完成

The end 

好了,rsync + inotify就讲到这里了,如果要实现多台从服务器同步,多设几个rsync服务器端就好了,相应的主服务器inotify的脚本也需要略加修改,过程并不麻烦,实验过程中遇到问题可留言。以上仅为个人学习整理,如有错漏,大神勿喷~~~




北城书生  51CTO博客,原文链接:http://blog.51cto.com/scholar/1639713