美文网首页
rsync配合inotify同步文件

rsync配合inotify同步文件

作者: 夜清溟 | 来源:发表于2023-04-23 15:10 被阅读0次

    1、同步目的服务器作为服务端搭建rsync
    centos7: 一般已经自带rsync服务,可以直接使用
    修改配置文件:
    cat /etc/rsyncd.conf

    ### rsyncd.conf 文件的配置
    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证用户对文件有读取的权限;如果是从客户端=>服务端,要保证用户对文件有写权限。
    uid = root
    gid = root
    # 允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时必须使用root权限,且不能备份path路径外的链接文件
    use chroot = yes
    # read only =no #只读为假(可写)
    read only = no
    # 只写
    write only = no
    # 设定白名单,可以指定IP段(172.xx.xx.1/255.255.255.0),各个Ip段用空格分开
    hosts allow = *
    # 设置黑名单
    #hosts deny = *
    # 允许的客户端最大连接数,根据最多一次性同步的agent数量设置
    max connections = 10
    # rsync监听端口
    port = 888
    # IP地址,启动rsync报错failed: Cannot assign requested address (address-family 2) unable to bind any inbound sockets on port 873,把rsyncd.conf中的address改为127.0.0.1
    #address = 127.0.0.1
    # 欢迎(同步过程中展示的提示)文件的路径,非必须
    #motd file = /etc/rsync/rsyncd.motd
    # 进程对应的进程号pid文件路径
    pid file = /var/run/rsyncd.pid
    # 锁文件路径
    #lock file = /data/rsync/rsyncd.lock
    # 记录传输文件日志
    transfer logging = yes
    # 日志文件格式
    log format = %t %a %m %f %b
    # 指定日志文件
    log file = /var/log/rsync.log
    # 剔除某些文件或目录,不同步
    #exclude = lost+found/
    # 设置超时时间
    timeout = 900
    ignore nonreadable = yes
    # 设置不需要压缩的文件
    dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
    
    # 忽略错误
    ignore errors
    # 添加注释
    comment = just test
    # 模块验证的用户名称,可使用空格或者逗号隔开多个用户名
    auth users = rsync1
    # 模块验证密码文件 可放在全局配置里
    secrets file = /etc/rsyncd.passwd
    
    # 模块名称,同步时可以根据配置的模块名称找到要同步模块的目录,可以配置多个,使用如: sate@192.xx.xx.xxx::source
    [cv]
    # cv模块的根目录,同步目录,要注意权限
    path = /home/cv
    # 是否允许列出模块内容
    list = yes
    

    rsync设置的认证用户是rsync1,因此需要创建密码认证文件 /etc/rsyncd.passwd 并写入用户名密码:
    cat /etc/rsyncd.passwd

    rsync1:123456
    

    修改密码文件权限为600

    chmod 600 /etc/rsyncd.passwd
    

    启动:
    systemctl start rsyncd

    2、客户端,也就是需要同步的服务器上,安装inotify-tools工具。监控文件的更改事件。使用脚本同步仅发生改变的文件,而非每次都全量扫描和同步。

    yum -y install inotify-tools
    

    创建rsync认证服务端的密码文件,只需密码即可不需要账号:

    echo "123456" > /etc/rsyncd.passwd
    

    修改密码文件权限为600

    chmod 600 /etc/rsyncd.passwd
    

    3、执行同步脚本,在需要同步的源服务器上运行,文件会同步到目标服务器上。

    远程shell模式脚本如下,远程shell模式下,不需要配置启动rsyncd服务:

    #!/bin/bash
    src=/home/rsync/                           # 需要同步的源路径
    des=/home/rsync                             # 目标服务器上的路径。
    #rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
    ip1="192.168.1.2"                 # 目标服务器1
    user=root                            # ssh验证用户名
    cd ${src}                              # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
    inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把监控到有发生更改的"文件路径列表"循环
    do
            INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
            echo "-------------------------------$(date)------------------------------------"
            echo $file
            #增加、修改、写入完成、移动进事件
            #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
            if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
            then
                    echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                    rsync -avzcR  $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip1:$des        # INO_FILE变量代表路径哦  -c校验文件内容
                     #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
            fi
            #删除、移动出事件
            if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
            then
                    echo 'DELETE or MOVED_FROM'
                    rsync -avzR --delete $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip1:$des
                    #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
            fi
            #修改属性事件 指 touch chgrp chmod chown等操作
            if [[ $INO_EVENT =~ 'ATTRIB' ]]
            then
                    echo 'ATTRIB'
                    if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                    then
                            rsync -avzcR $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip:$des         
                    fi
            fi
    done
    

    rsync-daemon模式脚本如下,此模式下需配置启动rsyncd服务:

    #!/bin/bash
    src=/home/rsync/                           # 需要同步的源路径
    des=cv                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
    rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
    ip1="192.168.1.2"                 # 目标服务器1
    user=rsync1                            # rsync --daemon定义的验证用户名
    cd ${src}                              # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
    inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把监控到有发生更改的"文件路径列表"循环
    do
            INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
            echo "-------------------------------$(date)------------------------------------"
            echo $file
            #增加、修改、写入完成、移动进事件
            #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
            if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
            then
                    echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                    rsync -avzcRP --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd       # INO_FILE变量代表路径哦  -c校验文件内容
                     #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
            fi
            #删除、移动出事件
            if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
            then
                    echo 'DELETE or MOVED_FROM'
                    rsync -avzRP --delete --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd
                    #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
            fi
            #修改属性事件 指 touch chgrp chmod chown等操作
            if [[ $INO_EVENT =~ 'ATTRIB' ]]
            then
                    echo 'ATTRIB'
                    if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                    then
                            rsync -avzcRP --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd         
                    fi
            fi
    done
    

    相关文章

      网友评论

          本文标题:rsync配合inotify同步文件

          本文链接:https://www.haomeiwen.com/subject/ufcyjdtx.html