老生常谈:rsync+inotify数据量百万级文件,大小将近1t的做实时同步

环境:Centos7系统,系统自带了rsync,就跳过怎么安装rsync了

源数据服务器ip:59.212.147.205(简写205)

接收205同步过来的服务器iip(备份服务器):59.212.25.124(简写124)

同步的附件夹,205根目录下的:/TRS/HyCloud/data      ====>   124相同的文件目录下::/TRS/HyCloud/data

 

下面的操作都在124上执行

1:创建密码账户文件

echo "trs:123456" >> /etc/rsync.pwd

2:修改权限

chmod 600 /etc/rsync.pwd

3:修改配置文件,无非就是ip,用户,密码,同步过来文件存放的路径等等,其他的不懂的多看看几篇博客

vim /etc/rsyncd.conf


uid = root       
gid = root
use chroot = no
max connections = 0            #0表示没有限制
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
timeout = 600                                           #时间设置600最好
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[test01]                                                     #要同步的模块
path = /TRS/HyCloud/data/                     #文件同步过来存放的目录
read only = false                                      #重要,设置为false,不然只能读,不能写数据进来
ignore errors                                            #忽略一些io错误
hosts allow = 59.212.125.0/255.255.255.0        #允许可以同步过来的网段,59.212.125.x
auth users = trs                                        #选择同步用户,第一步骤已经创建好了
secrets file = /etc/rsync.pwd                     #帐号密码文件所在路径

 

4:设置开机启动

systemctl enable rsyncd

5:开启rsync

systemctl start rsyncd

下面的操作都在源数据服务器上205上进行

1:安装inotify

tar -zxvf inotify-tools-3.13.tar.gz 

cd inotify-tools-3.13

./configure --prefix=/usr/local/inotify       (注意前面是:   ./)

make

make install

2:创建密码文件(简单点就行,不超过8位数,看其他人都是这么讲,原因未知,无所谓了)

直接运行下面的命令即可,创建rsync.pwd,并保存123456。这里文件名和随意取,不要跟系统中存在的文件名发生冲突就行。

echo "123456" >> /etc/rsync.pwd

cat命令可以检测下,看是否有密码:cat /etc/rsync.pwd

 

3:修改监控的文件数量

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

4:修改密码文件权限

chmod 600 /etc/rsync.pwd

5:创建脚本文件rsync.sh

rsync.sh作用:205上的data文件发生crud等等操作,就同步到124备份服务器上

这个脚本直接拷贝过来的,写得不错,稍微改一下就行。读书人的事不能叫抄袭吧~~更何况码农都是ctrl+c,ctrl+v,简称cv工程师

原文地址:https://www.cnblogs.com/ginvip/p/6430986.html

#!/bin/bash
src=/TRS/HyCloud/data                             # 需要同步的源路径
log_file=/var/log/rsync_client.log               #日志
des=test01                                                #126服务器上配置文件里的模块名
rsync_passwd_file=/etc/rsync.pwd           # rsync验证的密码文件
ip1=59.212.25.124                                   # 目标服务器1
#ip2=192.168.0.19                                   # 目标服务器2
user=trs                                                    # rsync --daemon定义的验证用户名
cd ${src}                                                   
    /usr/local/bin/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 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
    # INO_FILE变量代表路径哦  -c校验文件内容
            # && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
    #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端
    #环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
    #然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
            echo 'DELETE or MOVED_FROM'
            rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} 
            # && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${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 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}         
                # && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
            fi
        fi
    done

6:修改脚本权限:

 chmod +x /root/rsync.sh

7:加入软连接,不然上面脚本的命令不能执行

 ln -s /usr/local/inotify/bin/inotifywait /usr/local/bin/

8:后台运行rsync.sh脚本,

 nohup sh /root/rsync.sh &

  退出当前shell,使用exit命令,直接鼠标关闭当前shell窗口,nohup命令可能会失效

 

9:上面exit命令退出后,然后重新连接服务器,将脚本加入到开机启动

echo "nohup sh /root/rsync.sh &" >> /etc/rc.local

10:加入守护进程并设置开机启动

systemctl enable rsyncd

注意:先手动rsync命令完全同步一次,使两边的数据相同在运行实时同步的脚本

想要结束脚本,kill杀掉进程就可以

 

补充:排除data目录下的WCMData文件夹

命令:rsync -vzrtopg --delete --progress /TRS/HyCloud/IIP/data/ --exclude='WCMData/'  [email protected]::test01 --password-file=/etc/rsync.pwd

 

定时同步:每天的凌晨一点完全同步一次

命令:crontab -e ,敲入这个命令后,在文本中再敲入

这里的cron表达式只有五个,最小时间刻度是分钟


0 1 * * *  rsync -vzrtopg --delete --progress /TRS/HyCloud/IIP/data/ --exclude='WCMData/'  [email protected]::test01 --password-file=/etc/rsync.pwd

 

如果想要排除多个文件,写进一个列表文件即可:

先创建一个文件列表,vim  /etc/rsyslog.d/inotify_exclude.lst       加上WCMData,WCMDataw


WCMData/

WCMDataw/


 

排除多个文件后的同步脚本 rsync.sh

#!/bin/bash

src=/TRS/HyCloud/IIP/data/                           # 需要同步的源路径
log_file=/var/log/rsync_client.log                    #日志
INOTIFY_EXCLUDE='(WCMDataw|WCMData|(.*/*\.log|.*/*\.swp)$)'   # inotyfy排除的监控
RSYNC_EXCLUDE='/etc/rsyslog.d/inotify_exclude.lst'                        # rsync排除的监控

des=test01                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsync.pwd            # rsync验证的密码文件
ip1=59.212.25.122                 # 目标服务器1
#ip2=192.168.0.19                 # 目标服务器2
user=aaa                            # rsync --daemon定义的验证用户名
cd ${src}
# 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果

        /usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' --exclude ${INOTIFY_EXCLUDE}  -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 --exclude-from=${RSYNC_EXCLUDE}  --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
 # INO_FILE变量代表路径哦  -c校验文件内容
                        # && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端
        #环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
        #然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
                fi
                #删除、移动出事件
                if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
                then
                        echo 'DELETE or MOVED_FROM'
                        rsync -avzR --exclude-from=${RSYNC_EXCLUDE} --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                        # && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${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 --exclude-from=${RSYNC_EXCLUDE}  --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                                # && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                        fi
                fi
        done

 

 

 

 

 

 

 

你可能感兴趣的:(老生常谈:rsync+inotify数据量百万级文件,大小将近1t的做实时同步)