inotify+rsync 实时同步

痴心易碎 提交于 2020-11-08 09:25:40

服务器A 192.168.28.1
服务器B 192.168.28.2

把A服务器的/www/的数据备份到B服务器的/www/上

A,B服务器都要安装rsync 一般系统会默认安装了
[root@web1~]# rpm -q rsync
rsync-2.6.8-3.1

在rsync-daemon认证方式下,默认监听毒tcp的873端口
在rsync-daemon认证下,rsync可以把密码写入到一个文件中。
注意:被同步端(B服务器)的rsync必须启动,配置文件。同步端(A服务器)可以不起动服务,但必须有这个应用。

B服务器上操作,手动生动配置文件和密码文件
新建配置文件:
[root@cbd88 ~]# vi /etc/rsyncd.conf 
#Rsync server
#created by yty 21:12 2015-05-23
##rsyncd.conf start##
uid = root
gid = root
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.28.1
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsyncd.password
#####################################
[web]
comment = www by yty 21:13 2015-05-23
path = /www/

密码文件:
[root@cbd88 ~]# vi /etc/rsyncd.password 
rsync_backup:123456

daemon方式运行rsync
rsync --daemon

以下都从A服务器操作:

下载安装inotify-tools
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz    
tar -zvxf inotify-tools-3.14.tar.gz  
cd inotify-tools-3.14    
[root@ inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@ inotify-tools-3.14]# make  [root@ inotify-tools-3.14]# make install 


inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果                   默认情况下,正常的结果返回至标准输出,
    诊断类的信息则返回至标准错误输出。
    它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

优化 Inotify
[root@web ~]# ll /proc/sys/fs/inotify/
总用量0
-rw-r--r--1 root root 09月923:36 max_queued_events
-rw-r--r--1 root root 09月923:36 max_user_instances
-rw-r--r--1 root root 09月923:36 max_user_watches
-----------------------------
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events
echo 50000000>/proc/sys/fs/inotify/max_user_watches
echo 50000000>/proc/sys/fs/inotify/max_queued_events

生成密码文件
[root@localhost ~]# cat /etc/rsync.passwd 
123456

首次全量同步
rsync -avz --exclude-from=/tools/exclude.txt --password-file=/etc/rsync.passwd /www/ rsync_backup@192.168.28.2::web
/tools/exclude.txt为排除文件,内容如下:
[root@localhost ~]# cat /alidata/shell/exclude.txt 
Admin/Runtime/*
Home/Runtime/*
Waphome/Runtime/*
other2017/runtime/*

每10小时进行一次全量同步
* */10 * * * rsync -avz --exclude-from=/tools/exclude.txt --password-file=/etc/rsync.passwd /www/ rsync_backup@192.168.28.2::web


时时同步监控脚本:
vi /tools/everyworking.sh
#!/bin/bash
src=/www/   # 需要同步的源路径
des=web
exclude_file=/tools/exclude.txt                
rsync_passwd_file=/etc/rsync.passwd            # rsync验证的密码文件
ip1=192.168.28.2                 # B服务器
user=rsync_backup                # rsync --daemon定义的验证用户名 
cd ${src}                            
# 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
/usr/local/inotify/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
# 把监控到有发生更改的"文件路径列表"循环
do
        echo "***************************************************************************"
        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=${exclude_file} --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=${exclude_file} --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${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 --exclude-from=${exclude_file} --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                fi
        fi
done

添加执行权限
chmod a+x /tools/everyworking.sh

运行时时同步脚本:
sh /alidata/shell/awaystime.sh &

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!