rsync+inotify 实现数据实时同步

  1. 云栖社区>
  2. 博客>
  3. 正文

rsync+inotify 实现数据实时同步

余二五 2017-11-08 00:08:00 浏览1674
展开阅读全文

 Rsync (Rmote sync)是一款非常好的数据同步工具,能够通过对比同步双方的数据变动,实现增量同步,还可以通过LAN/WAN实现远程多台主机间文件的同步,还能结合crond任务计划来执行自动备份,又可以结合ssh实现远程数据备份的安全,种种特性使他看起来相当优秀。但如果需备份数据十分庞大时,它的不足之处就显现出来了,比如每次执行同步操作时,rsync都会扫描全部数据进而计算出增量部分,而后再同步增量数据,这将会十分耗时,使其变得低效;并且受限于crond计划任务最小时间间隔为一分钟,会导致同步源端和目的段数据不一致,这在高可用环境中是不被允许的。这个时候我们就可以构建Rsync+Inotify架构来解决此应用瓶颈。

    一、实验拓扑

      blob.png

    二、实验环境  

      (1)、实验平台

         VMware Workstation 10

      (2)、实验主机以及系统环境

         主机Rclient:

           IP地址:192.168.2.204 启用rsync客户端,安装Inotify-tools

           系统环境:CentOS-6.5-x86_64

         主机Rserver1:

           IP地址:192.168.2.205 启用rsync服务器功能

           系统环境:CentOS-6.5-x86_64

         主机Rserver2:

           IP地址:192.168.2.205 启用rsync服务器功能

           系统环境:CentOS-6.5-x86_64

    三、实验所需软件以及版本

      blob.png

    四、实验目的

      主机Rclient创建有/data/{tom,jerry}非空目录并担任rsync客户端角色并且结合inotify-tools工具;Rserver1和Rserver2主机分别创建有/data/test1和/data/test2担任rsync服务器端角色本实验旨在验证当主机Rclient的/data/{tom,jerry}目录内内容发生变化时能够实时同步到服务器端的同/data/test1和/data/test1目录中。

    五、rsync

      1、rsync特性

          (1)、可以镜像备份整个目录树或者文件系统。

          (2)、可以借助于rcp(remote file copy)、rsh(remote shell)、ssh(secure shell)传输文件,又可以通过sockets直接连接传输。

          (3)、基于增量备份机制,有较高的同步效率。

          (4)、支持匿名和认证的进程模式传输,方便数据传输与镜像。

          (5)、可以指定排除同步部分目录或文件。

          (6)、支持拷贝设备文件、链接等特殊文件。

          (7)、文件或目录的拷贝可以保留其权限、时间戳、软硬链接等所有属性。

      2、rsync工作模式(工作模式演示示例在主机Rclient上进行)

        (1)、在了解rsync工作模式之前,我们先安装rsync,有两种方式,在此只演示编译安装,实验过程使用yum安装版本

           第一种,yum方式自动安装

           # yum -y install rsync   \\安装rsync

           # yum -y install xinetd  \\由于rsync是瞬时守护进程,因此安装xinetd超级守护进程代为管理

           # chkconfig xinetd on   \\设置超级守护进程开机启动 

           # service xinetd start  \\启动超级守护进程

           # chkconfig rsync on    \\启动rsync

           blob.png

           rsync安装并启动完成

           第二种,编译安装

           注:本次编译安装源码存放目录为/root

           # tar -xf rsync-3.1.1.tar.gz \\展开源文件

           # cd rsync-3.1.1             \\进入到源文件目录

           # ./configure –prefix=/usr/local/rsync 

           # make && make install 

           导出环境变量

           # vim /etc/profile.d/rsync.sh

           blob.png

           注意,默认编译安装的版本xinetd超级进程是不支持管理的我们要修改其相应配置文件

           # vim /etc/xinetd.d/rsync 

           blob.png

            

        (1)、列表模式,功能类似于ls命令,但rsync的列表模式可以列出远程文件

           rsync列出文件,跟ls有所不同我们可以验证一下,事先创建测试文件

           # touch /data/tom/{a,b,c,d}

           # ll /data/tom

           blob.png

           我们看到,ll后面跟的参数如果是目录的话,最末尾带不带/没有影响,我们再看看rsync

           blob.png

           并且,rysnc不能在当前文件夹直接使用,会报错,后面必须跟参数,而ll则不同,看下图

           blob.png

           blob.png   

           还可以列出远程文件目录(本文事先已将Rserver2主机/etc/inittab文件拷贝至其/data/test2中)

           blob.png

           小结:

             1、rsync列表模式,后面参数为目录并且/结尾,则列出该目录以及目录中的所有文件;否则,只列出目录本身 

             2、rsync列表模式中,rsync命令后面必须跟参数,直接在当前目录下列出当前目录会报错。

        (2)、shell模式

          shell即本地模式,可实现在本机磁盘进行数据同步,不过不同于copy,rsync可以搭配起选项来扩展其功能。

          语法:

          rsync [option]…SRC [SRC]…DEST [DEST]

          option是rsync能够使用的选项,如下

            -n : 同步测试,不执行同步    

            -v :  –verbose,详细输出模式,显示详细过程    

            -q : –quiet,静默模式,尽可能输出少的信息    

            -c : –checksum,可以对传输的文件进行较验的,强制对文件传输进行校验    

            -r  : –recursive,递归复制    

            -p : –perms,保存文件的权限    

            -t  : –times,保留文件的时间戳    

            -l  : –links,保留文件的符号链接    

            -g : –group,保留文件的属组    

            -o : –owner,保留文件的属主    

            -D : –devices,保留设备文件

            -A : –acls,保留acl访问控制列表

            -a : –archives归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性。等同于-rlptgoD    

            -e SSH : 远程复制时,表示使用ssh协议作承载。如果ssh端口不是22,可以用-e ‘ssh -p 22’    

            -z : 基于网络时使用,对文件压缩后传输   

            –progress : 显示压缩进度条的,简写-P   

            –stats : 显示如何执行压缩和传输的,也就是显示传输状态的

          [SRC]  需要拷贝的分区,文件或目录

          [DEST] 目的分区或目录

          如果没有源或目的分区或目录,即时列表模式

          小结:

           1、使用该模式,要特别留意拷贝的源目录的末尾是否有/,若果有则是拷贝目录下所有文件到目标而不会拷贝目录本身,如果没有则会将目录本身以及其内所有文件拷贝到目标。

           

       (3)、远程shell模式

          远程shell模式与本地shell模式类似,只是需要指定另外一台主机的ip地址,该模式中需要手动输入验证用户的密码,一般为系统用户。该模式有两种使用方式

              拉取 rsync [option] …[USER]@HOST:SRC DEST  //拉取模式既是从远程主机拉取文件到本地目录

              推送 rsync [option]…SRC [USER]@HOST:DEST   //推送模式即时将本地文件推送至远程主机目录中

          示例:将本机/data/tom/*推送至Rserver主机的/data/test1/中

          # rsync -avz –progress -e 'ssh -p 22' /data/test1/ 192.168.1.205:/data/test1

          blob.png

          将主机Rserver2 /data/test2/inittab 文件拉取到本地/data/jerry/中

          # rsync -avz –progress -e 'ssh -p 22' 192.168.1.206:/data/test2/inittab /data/jerry/

          blob.png

          小结:

           1、本例中使用安全文件传输,借助与ssh通道,使用系统用户验证。

           2、注意,本模式下,本地端和远程主机端都必须安装rsync软件。

       (4)、服务模式(daemon mode)

          服务模式下,rsync以服务进程形式监听与TCP 873端口,接受客户端的匿名或者认证请求进行文件备份或者恢复,本模式依赖于配置文件/etc/rsync.conf(该配置文件默认不存在,需手动创建,后述)启动服务进程,依赖于/etc/rsync.passwd文件实现认证。   

      3、配置rsync服务模式并验证

       (1)、在主机Rserver1上进行服务器配置

        创建/etc/rsync.conf配置文件          

        # vim /etc/rsyncd.conf

          # Global setting

        uid = root   //rsync同步共享用户的身份(如在模块中定义则覆盖全局定义)

        gid = root  //rsync同步共享用户组的身份(如在模块中定义则覆盖全局定义)

        use chroot = no //不使用chroot

        port = 873    //定义监听端口默认873,使用873端口时此项可以省略

        max connections =200  //服务器最大并发数

        timeout = 300       //会话超时时长

        pid file = /var/run/rsyncd.pid  //pid文件存放路径

        lock file = /var/run/rsyncd.lock //lock文件存放路径,服务启动停止时会用到

        log file = /var/log/rsyncd.log  //日志文件存放路径

        log format = %h %o %l %b      //日志记录格式

        motd file = /etc/rsyncd.motd    //登陆提示信息

        ignore errors             //忽略错误信息

        read only = false          //是否允许用户上传文件,默认为true 

        list = false             //是否允许用户列出文件,默认为true 

        write only = false         //是否允许

        hosts allow = 192.168.2.0/24  //允许哪些主机访问

        hosts deny = *           //拒绝哪些主机访问

        auth users = test          //同步时认证所需的用户

        secrets file = /etc/rsyncd.passwd //认证时所需的密码文件

        #Directory to be synced   

        [test1]   //模块名称,客户端需精确指定该模块名称

        path = /data/test1 //模块对应的目录路径

        创建认证文件/etc/rsyncd.passwd

         # vim /etc/rsyncd.passwd

          test:123456  //用户名和密码格式,存放方式明文。

        修改密码文件权限,仅使属主有权限

         # chmod 600 /etc/rsyncd.passwd

        确认模块中path定义的目录的属组属主与/etc/rsyncd.conf文件中定义的一致

         blob.png

        创建登陆提示信息文件(此步默认为空,并且生产环境不建议使用)

         # vim /etc/rsyncd.motd

         blob.png 

        启动服务

         由于rsync为瞬时进程,需超级进程xinetd管理,确保xinetd安装并启动

         # chkconfig xinetd on

         # chkconfig rsync on 

         # chkconfig –list | grep rsync    

         blob.png   

         873端口已监听,服务成功启动    

         blob.png             

         小结: 

           一、在配置文件/etc/rsyncd.conf中部分选项在全局和模块下均可做配置,例如ignore errors,read only,write only,hosts allow,hosts deny,auth users,secrets file,exclude,pre-xfer exec,post-xfer exec等,全局配置中的选项对所有模块有效;模块下定义的仅对当前模块有效;另外,模块中定义选项值优先于全局配置。

           二、模块中定义的共享目录的属主、数组必须与配置文件中的uid、gid一致,否则要修改。

           三、认证时用到的密码文件属组和其它不能有权限,否则要更改。

       (2)、服务器主机Rserver2主机配置主机Rserver1,此处不再赘述。

       (3)、在客户端主机上创建密码文件,使其能认证连接到rsync服务器

         # vim /etc/rsyncd.passwd

           123456

         小结: 

          1、客户端的密码文件中,只填写密码即可。

       (4)、示例

         同样有两种方式,推送和拉取,不过在该模式中,这两种方式又分别有两种不同的格式

         将客户端中的/data/tom目录内的文件推送至服务器Rserver1的/data/test1中

         推送:(在主机Rserver1测试模块对应路径/data/test1;认证信息:test:123456)

         格式1:

         # rsync -avz –password-file=/etc/rsyncd.passwd /data/tom/ test@192.168.2.205::test1 

         blob.png

         格式2:测试时,请将格式1已同步过去的文件手动清空

         # rsync -avz –password-file=/etc/rsyncd.passwd –progress /data/tom/ rsync://test@192.168.2.205:/data/test1/

         blob.png

         拉取:(在主机Rserver2上进行,模块路径为/data/test2,该路径中事先存有inittab文件)

         格式1:

         # rsync -avz –progress –password-file=/etc/rsyncd.passwd test@192.168.2.206::test2 /data/jerry/

         格式2:

         # rsync -avz –progress –password-file=/etc/rsyncd.passwd rsync://test@192.168.2.206:/test2 /data/jerry

         

    六、inotify-tools

      1、inotify

        (1)、 inotify,linux内核版本2.6.13以及更新版本支持,提供强大的文件系统监控,通过打开一个独立的文件描述符并以此监控一个或则多个文件的打开、关闭、移动/重命名、删除创建或者改变属性的事件。由于notify是内核功能,因此需要使用时,需要通过其接口程序inotify-tools接口程序调取使用。

        (2)、inotify可调用函数

           inotify_init    //创建inotify实例系统调用,返回指向该实例文件描述符

           inotify_init1   //带有附带标志的描述符生成

           inotify_add_watch //增加对文件或目录的监控,并指定监控时间 

           inotify_rm_wacth  //移除制定监控项目

           read  //读取包含事件信息的缓存

           close //关闭文件描述符,移除此描述符上所有监控,当实例所有描述符关闭,将释放资源和下层对象。

        (3)、监控程序创建流程

           1、使用inotify_init创建实例并生成文件描述符

           2、添加监控

           3、等待事件

           4、处理事件,完成后继续等待事件

           5、监控不在活动或者受到关闭信号时,关闭描述符,清空相关信息,退出。

        (4)、inotify可监控事件

           IN_ACCESS  被监控项目或者目录中文件被访问过。

           IN_MODIFY  被监控项目或者目录文件被修改过

           IN_ATTRIB  被监控项目或者目录文件的元数据被修改过

           IN_CLOSE_WAITE 一个打开的等待修改的文件或目录被关闭

           IN_CLOSE_NOWRITE 一个以只读方式打开的文件或目录被关闭

           IN_CLOSE   包含上两个事件

           IN_OPEN    文件或目录被打开

           IN_MOVED_FROM 被监控项目或目录中的文件被移除监控区域,该事件包含于IN_MOVED_TO关联的cookie

           IN_MONED_TO   项目或者目录被移进监控区域

           IN_MOVE    包含上两个事件

           IN_CREATE  在监控区域中新建目录或文件

           IN_DELETE  在监控区域中删除目录或文件

           IN_DELETE_SELF 监控项目本身被删除,监控中止并收到IN_IGNORED事件

           IN_MOVE_SELF   监控项目本身被移动

      2、inotify-tools

        (1)、inotify-tools是基于linux平台为inotify的提供的C语言开发的接口工具,并提供一系列命令行工具并利用这些工具监控文件系统的事件。

        (2)、inotify-tools安装流程

           检查安装环境,确认系统支持             

           blob.png //内核支持

           查看内核inotify参数

           blob.png

             1、/proc/sys/fs/inotify/max_queued_events

               该参数值是调用inotify_init时分配给实例的event队列最大值,超出该值的event被丢弃,并触发IN_Q_OVERFLOW事件。默认值:16384

               注意,该参数定义的是events队列长度,若文件庞大且变化频繁需调整该值以适应监控。

             2、/proc/sys/fs/inotify/max_user_instances

               该参数值定义了用户创建inotify实例的上限。默认值:128

             3、/proc/sys/fs/inotify/max_user_watches

               该参数定义了每个inotify示例可监控的最大目录数,如果监控文件庞大需调大该值。默认值:8192

            参数调整示例:

               可使用重定向方式修改   

               echo 10000000 > /proc/sys/fs/inotify/max_user_watches

        (3)、安装inotify-tools(编译安装源文件放在/root下,工作目录/root)

             # tar -xf inotify-tools-3.13.tar.gz

             # cd inotify-tools-3.13

             # ./configure

             # make && make install 

             这样就编译安装完成了,并在/usr/local/bin/生成下面两个可执行文件

             # ll /usr/local/bin/inotify*

            -rwxr-xr-x 1 root root 38582 Jul 17 03:32 /usr/local/bin/inotifywait

               该文件执行阻塞,等待inotify事件,用以监控文件和目录或监控整个目录树(可递归监控),还可以结合shell脚本实现高级功能。

            -rwxr-xr-x 1 root root 40353 Jul 17 03:32 /usr/local/bin/inotifywatch

               该文件收集inotify的统计数据,包括事件类型以及同一事件发生的次数

       (4)、inotifywait和inotifywatch用法

            inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [–format <fmt> ] [–timefmt <fmt>  

         参数

            -h,–help     //输出帮助信息 

            @          //排除不需要监视的文件,可以是相对路径,也可以是绝对路径 

            –fromfile    //从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头 

            -m,–monitor   //接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出 

            -d,–daemon    //跟–monitor一样,除了是在后台运行,需要指定 –outfile把事情输出到一个文件。也意味着使用了–syslog 

            -o,–outfile    //输出事情到一个文件而不是标准输出。 

            -s,–syslog    //输出错误信息到系统日志 

            -r,–recursive  //监视一个目录下的所有子目录。 

            -q,–quiet     //指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。 

            –exclude      //正则匹配需要排除的文件,大小写敏感。 

            –excludei     //正则匹配需要排除的文件,忽略大小写。 

            -t,–timeout#  //设置超时时间,如果为0,则无限期地执行下去。 

            -e,–event    //指定监视的事件。 

            -c,–csv      //输出csv格式。 

            –timefmt     //指定时间格式,用于–format选项中的%T格式。 

            –format      //指定输出格式。 

               %w 表示发生事件的目录 

               %f 表示发生事件的文件 

               %e 表示发生的事件 

               %Xe 事件以“X”分隔 

               %T 使用由–timefmt定义的时间格式

           可监听的事件:

            access

             文件读取

            modify

             文件更改。

            attrib

             文件属性更改,如权限,时间戳等。 

            close_write

             以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。 

            close_nowrite

             以只读模式打开的文件被关闭。 

            close

             文件被关闭,不管它是如何打开的。 

            open

             文件打开。 

            moved_to

             一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。 

            moved_from

             一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。 

            move

             包括moved_to和 moved_from 

            move_self

             文件或目录被移除,之后不再监听此文件或目录。 

            create

             文件或目录创建 

            delete

             文件或目录删除

            delete_self

             文件或目录移除,之后不再监听此文件或目录

            unmount

             文件系统取消挂载,之后不再监听此文件系统。

         inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ … ]       

            参数

            -h,–help    # 输出帮助信息 

            -v,–verbose  # 输出详细信息 

            @          # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。 

            –fromfile    # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。 

            -z,–zero    # 输出表格的行和列,即使元素为空 

            –exclude     # 正则匹配需要排除的文件,大小写敏感。 

            –excludei    # 正则匹配需要排除的文件,忽略大小写。 

            -r,–recursive # 监视一个目录下的所有子目录。 

            -t,–timeout  # 设置超时时间 

            -e,–event    # 只监听指定的事件。 

            -a,–ascending # 以指定事件升序排列。 

            -d,–descending# 以指定事件降序排列

    七、搭建rsync+inotify架构,实现实时同步

     1、上文中rsync客户端和服务器端已经配置完毕。

     2、在rsync客户端主机配置自动实时同步

       (1)、创建自动实时同步脚本

        blob.png

       (3)、赋予脚本可执行权限

         # chmod +x /usr/sbin/auto_synced.sh    

       (3)将该脚本添加到rc.local中使其能开机运行

         # vim /etc/rc.local

         blob.png

       (4)、启动脚本程序

         # bash /usr/sbin/auto_rsynced.sh &>> /var/log/auto_rsynced.log &

     3、测试同步效果     

       (1)、在客户端/data/tom/目录下,创建10个.txt文件

         # for i in {1..10}; do dd if=/dev/zero of=/data/tom/$i.txt bs=10M count=1; done 

         blob.png

         查看完整时间属性

         blob.png

         在同步服务器端查看同步后的文件属性

         blob.png

         可以看到实时同步效果还是很不错的。

               










本文转自 zouqingyun 51CTO博客,原文链接:http://blog.51cto.com/zouqingyun/1678271,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注