• rsync + inotify 实现主机间数据实时同步的原理


    一、rsync实现两台服务器数据同步的原理:    

       Rsync 是基于rsync算法校验源(SRC)与目标(DEST)之间的差异实现数据同步的。也就是说,当使用rsync工具同步数据时候,只复制源(SRC)发生改变的文件,到目标(DEST),这类似于增量备份。所以rsync同步数据的速度是很快的。但是rsync的传输性能有点差,在海量小文件需要同步时,表现很差劲。因为rsync是基于文件同步的(不是块级别的),在传输之前还要进行校验。

       Rsync的工作模式有多中,使用rsync的服务模式来构建:主/从服务器的数据同步。此时rsync工作为守护进程监听在:TCP/873, 能接收客户端的数据同步请求。

    客户端发出的数据同步请求方式有两种:

    1、  从远程rsync服务器拉取数据到本地

    Pull:
        rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
     

    例:

      从远程rsync服务器拉取数据(把rsync导出的存储空间中的所有文件镜像到本地)到本地的/web目录

    [root@node1 web]# rsync -aprtogzl192.168.60.99::web/   /web
     
     [root@node1web]# rsync -arogtpz rsync://192.168.60.99/web/  /web
     

    2、往远程服务器推送数据   

    Push:
        rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
     

    例:

       往远程rsyn服务器导出的存储空间(web)推送数据(文件fstab)

     [root@node1/]# rsync /etc/fstab 192.168.60.9::web
     

     使用rsync协议向远程rsync服务器导出的存储空间(web)推送数据(镜像目录/etc)

     [root@node1/]# rsync -a /etc rsync://192.168.60.99/web
     

    二、那么如何实现:实现两台服务器的数据同步呢?

    要点:只要当数据改变时,rsync客户端往rsync服务器推送数据或从主服务器拉取数据,就可以实现两台服务器数据同步了。

    1、选择rsync客户端的工作模式:

    因为:rsync客户端向服务端发出的数据同步请求命令的方式有两种(推送数据/拉取数据):那么,Rsync客户端是从rsync服务器拉取数据(镜像数据)还是rsync客户端推送(上传)数据,这要视,同步数据源放在rsync服务器端还是放在rsync客户端?

    说明:本实验的同步数据源存放在rsync客户端192.168.60.40所在文件系统的:/web目录中,所以

    使用“推送模式”。

    2、选择触发rsyc客户端从rsync服务器端拉取数据或推送数据的方式?

    (1)、把rsync客户端发出的数据同步请求命令做成周期性任务计划,每隔一段时间同步一次数据。  不管有没有数据变化都发出一次数据同步请求命令。
    (2)、使用内核提供的inotify机制,当数据发生改变时(删除、修改等)就触发rsync客户端发出数据  同步请求。
     

    说明:

        第1种方式,不能保证两台服务器的数据是实时同步的,因为数据发生改变与rsync客户端发出同步请求命令不能联运起来。如果,我们的数据更新频度很快的话,往往会造成某台服务器的数据落后很多另一台服务器的。而第2种解决方案,只要数据发生改变就会发生数据同步请求,它是实时的。

    Rsync + inotify 机制实现的两台服务器数据同步如下图如示:

    三、在192.168.60.99主机搭建rsync服务器

    Rsync工作于服务模式,要为其提供配置文件,配置文件如下:

    [root@stu13 /]# cat /etc/rsyncd.conf
    #
    #
    uid = nobody   
    gid = nobody
    use chroot = no
    max connections = 10             # 最大并发连接数
    strict modes = yes               # 当启用基于口令认证客户端时,是否检查口令文件的权限
    pid file = /var/run/rsyncd.pid
    log file = /var/log/rsyncd.log   # 日志文件的输出路径
    
    [web]                            # rsync服务器输出的存储空间叫啥名
    path = /web                      # 定义rsync服务器输出的存储空间的位置
    ignore errors  =yes              # 在数据传输中,出现错误是否忽略继续传输数据
    read only = no                   # 允许客户端上传数据(往rsync服务器推送数据)
    write only = no                  # 允许客户端下载数据(从rsync服务器拉取数据)
    
    hosts allow = 192.168.60.0/24    # 允许访问rsync服务器的客户端地址
    hosts deny = *                   # 只允许hostsallow指令定义的客户端访问,其它的都不允许
    
    list = false                     # 当客户端请求服务器输出的存储空间列表时,是否列出来。
    uid = root
    gid = root
     

    四、在192.168.60.40安装inotifywatch工具;

    要使用inotifywatch工具定义inotify监控的对象和监控事件。Inotify工作在内核空间。

    Inotifywatch会把inotify监控到的事件输出到标准输出来。

    inotify-tools-3.14.tar.gz
     

    安装步骤:

    [root@node1 admin]# tar -xf  inotify-tools-3.14.tar.gz
    [root@node1 admin]#cd inotify-tools-3.14
    [root@node1 inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools
    [root@node1 inotify-tools-3.14]#Make && make install
     

    五、在客户端192.168.60.40设置inotify 与 rsync联动;

    联动原理:

        可以通过管道,把innotify监控到的事件送到while循环,由read读取到有监控事件发生,就执行while循环体内的rsync同步数据请求命令。这样就实现了inotify与rsync的联运。代码如下:

    [root@node1 ~]# cat inotify.sh
    #/bin/bash
    # rsync服务器
    rsyncServer=192.168.60.99
    # 初监控的文件系统(也就是同步数据源)
    src=/web/
    # 远程rsync服务器导出的存储空间
    dst=web
    # 一开始就进行数据同步
    rsync -azrtopg --delete $src $rsyncServer::$dst
    
    /usr/local/inotify-tools/bin/inotifywait -mrq  -e create,move,delete,modify  $src | while read files;do
       # 监测的事件为:create,move,delete,modify
       rsync -azrtopg --delete $src $rsyncServer::$dst
    done
     

    六、测试;

    1、启用服务

      说明:这里选择rsync由超级守护进行xinetd管理。所以,要启用xinetd服务。

    启动 xinetd服务

    [root@stu13 web]# service xinetd start
    Starting xinetd:                                           [  OK  ]
     

    开启rsync服务

    [root@stu13 web]# chkconfig rsync  on
     

    2、在rsync服务端运行inotify.sh脚本

    [root@node1 ~]# ./inotify.sh &
    [1] 6237
     

    说明:在后台运行。

    注意:rsync服务器监听的端口为:TCP/873

    [root@stu13 web]# netstat -anpt | grep rsync
    tcp        0      0 192.168.60.99:873           192.168.60.40:37795         ESTABLISHED 14681/rsync
     

    3、查看rsync服务器192.168.60.99输出的存储空间的数据文件

    [root@stu13 web]# ll
    total 0
     

    4、在rsync客户端192.168.60.40,复制一些文件到被inotify监控的目录/web中

    [root@node1 web]# cp -r /var/log/* ./
     

    5、查看rsync服务器输出的存储空间/web是否有对应的文件

    [root@stu13 web]# ls
    anaconda.ifcfg.log    btmp           dracut.log        messages-20140817  sa                 spooler-20140824
    anaconda.log          ConsoleKit     gdm               messages-20140824  samba              tallylog
    anaconda.program.log  cron           httpd             mysqld.log         secure             wpa_supplicant.log
    anaconda.storage.log  cron-20140817  lastlog           ntpstats           secure-20140817    wtmp
    anaconda.syslog       cron-20140824  maillog           pm-powersave.log   secure-20140824    Xorg.0.log
    anaconda.yum.log      cups           maillog-20140817  ppp                spice-vdagent.log  yum.log
    audit                 dmesg          maillog-20140824  prelink            spooler
    boot.log              dmesg.old      messages          rhsm               spooler-20140817
     

    OK!!!

  • 相关阅读:
    《代码整洁之道》之四 注释
    《代码整洁之道》之三 函数
    《代码整洁之道》之二 有意义的命名
    《代码整洁之道》
    Hibernate学习笔记
    Struts2复习笔记
    学习Spring必学的Java基础知识
    Eclipse下搭建Maven框架
    onvif实现
    rtmp服务端实现
  • 原文地址:https://www.cnblogs.com/surplus/p/14238844.html
Copyright © 2020-2023  润新知