• Rsync+inotify自动同步数据


    一、简介

      随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。

    首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
      其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

      基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。在使用rsync首次全量同步后,结合inotify对源目录进行实时监控,只有有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效使用!

    二、部署rsync

      操作系统: CentOs 7

      Rsync Server: 172.16.200.160

      Rsync Client : 172.16.200.143

      2.1 Rsync Server安装rsync服务

      centos7上默认已经安装了xinetd和rsync

    # rpm -qa | grep xinetd
    
    xinetd-2.3.15-13.el7.x86_64
    
    # rpm -qa | grep rsync
    rsync-3.0.9-18.el7.x86_64
    

      vim /etc/rsync

    service rsync
    {
    disable = no
    flags = IPv6
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
    }
    

      vim /etc/rsyncd.conf

    log file = /var/log/rsyncd.log          #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
    pidfile = /var/run/rsyncd.pid           #pid文件的存放位置
    lock file = /var/run/rsync.lock        #支持max connections参数的锁文件
    secrets file = /etc/rsync.pass         #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
    motd file = /etc/rsyncd.Motd          #rsync启动时欢迎信息页面文件位置(自己创建这个文件,内容随便自定义)
    
    [backup]                            #自定义名称
    path = /data/backup/rsync           #rsync服务端数据目录路径,即同步到目标目录后的存放路径
    comment = backup                                             #模块名称与[backup]自定义名称相同
    uid = rsync                                #设置rsync运行的uid权限。这个要保证同步到目标目录后的权限和源目录一致,即都是nobody!
    gid = rsync                                #设置rsync运行的gid权限。
    port=873                                    #默认的rsync端口
    use chroot = no                          #默认为true,修改为no或false,增加对目录文件软连接的备份
    read only = no                            #设置rsync服务端文件为读写权限
    list = no                                      #不显示rsync服务端资源列表
    max connections = 200              #最大连接数
    timeout = 600                           #设置超时时间
    auth users = RSYNC_USER          #执行数据同步的用户名,需要后面手动设置。可以设置多个,用英文状态下逗号隔开
    hosts allow = 172.16.200.143       #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts deny = 172.16.200.150      #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开(如果没有禁止,就不用设置这一行)
    

      创建用户认证文件

      vim /etc/rsync.pass 

    RSYNC_USER:123@rsync
    

      

      设置文件权限

    # chmod 600 /etc/rsyncd.conf
    # chmod 600 /etc/rsync.pass
    

      创建备份目录

    # mkdir -p /data/backup/rsync
    #  groupadd -g 1011 rsync
    #  useradd -g 1011 -u 1011 rsync
    # chown -R rsync.rsync /data/backup/rsync 

      启动rsync服务

    # systemctl start xinetd
    # lsof -i:873
    

      2.2 Rsync_Client安装rsync

      安装rsync和xinetd 

    # yum -y install rsync xinetd
    

      vim /etc/rsync

    service rsync
    {
    disable = no
    flags = IPv6
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
    }
    

      设置认证文件

      vim /etc/rsync.pass

    123@rsync
    

      启动

    # systemctl start xinetd
    

      2.3 测试

      在Rsync_Client虚拟机上新建一个文件

      

    # cd /data/test
    # touch test1.txt
    # rsync -avz /data/test/test1.txt RSYNC_USER@172.16.200.160::backup --password-file=/etc/rsync.pass
    

      

      在Rsync_Server虚拟机上同步过来了

     三、安装inotify 

    # wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
    
    # mkdir -p /data/inotify
    
    # tar -zxvf  inotify-tools-3.14.tar.gz
    
    # cd inotify-tools-3.14
    
    # ./configure --prefix=/data/inotify
    
    # make && make install
    
    # ll /data/inotify
    

      设置环境变量

    # echo 'export PATH=$PATH:/data/inotify/bin' > /etc/profile.d/inotify.sh
    
    # source /etc/profile.d/inotify.sh 
    

      添加库文件

    # vim /etc/ld.so.conf.d/inotify.conf
    
    # vim /etc/ld.so.conf
        include ld.so.conf.d/*.conf

    # ldconfig

      修改inotify默认参数

    查看系统默认参数值
    [root@static-img ~]# sysctl -a | grep max_queued_events
    fs.inotify.max_queued_events = 16384
    [root@static-img ~]# sysctl -a | grep max_user_watches
    fs.inotify.max_user_watches = 8192
    [root@static-img ~]# sysctl -a | grep max_user_instances
    fs.inotify.max_user_instances = 128
    
    修改参数:
    [root@static-img ~]# sysctl -w fs.inotify.max_queued_events="99999999"
    [root@static-img ~]# sysctl -w fs.inotify.max_user_watches="99999999"
    [root@static-img ~]# sysctl -w fs.inotify.max_user_instances="65535"
    
    参数说明:
    max_queued_events:
    inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
    max_user_watches:
    要同步的文件包含多少目录,可以用:find /Data/xqsj_upload -type d | wc -l 统计这些源目录下的目录数,必须保证max_user_watches值大于统计结果(这里/Data/xqsj_upload为同步的源文件目录)
    max_user_instances:
    每个用户创建inotify实例最大值

    四、编写自动同步脚本

    #!/bin/bash
    
    SRCDIR="/data/test"             # 需要备份的文件夹
    USER="RSYNC_USER"           
    IP="172.16.200.160"             # server地址
    DSTDIR="backup"                  
    
    cd /data
    /data/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
    do
    /usr/bin/rsync -avz --delete $SRCDIR $USER@$IP::$DSTDIR --password-file=/etc/rsync.pass
    echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
    done
    

      后台运行

    # nohup sh rsync.sh &
    

      经测试新建文件和目录、修改和删除都能同步

  • 相关阅读:
    6 网络爬虫引发的问题及Robots协议
    WEB测试方法总结-笔记(转)
    最全的Http协议、get和post请求的整理
    random()函数的应用---面试
    求两个列表的交集、差集、并集---面试
    python中函数参数传递--引用传递(面试)
    linux重定向命令>和>>---面试
    正则表达式re.findall和re.search的使用---面试
    关于可迭代对象的详解
    sorted()函数排序的灵活运用---面试
  • 原文地址:https://www.cnblogs.com/bigberg/p/7886486.html
Copyright © 2020-2023  润新知