rsync+inotify实现实时同步

  • 2020 年 8 月 11 日
  • 筆記
 rsync+inotify实现实时同步
测试机1:主    172.23.128.124
测试机2:从    172.23.132.91
实现主机/usr/local/www 有任何变动 从机/usr/local/www实现实时同步
一、主
1、 下载安装包rsync+inotify
cd /opt
wget //cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
wget //rsync.samba.org/ftp/rsync/rsync-3.0.9.tar.gz

2、解压安装rsync+inotify
   tar -zxvf rsync-3.0.9.tar.gz
   cd rsync-3.0.9
   ./configure --prefix=/usr/local/rsyncd
   make && make install
   tar –zxvf inotify-tools-3.14.tar.gz
   cd inotify-tools-3.14
   ./configure --prefix=/usr/local/inotify
   make && make install

3、 
mkdir /usr/local/www
#此处只需密码即可。
echo "123456" >/etc/rsyncd/rsyncd.password 
chmod 600 /etc/rsyncd/rsyncd.password

3、 编写同步脚本
#此脚本为完整同步!!
cd /opt
vim www_rsync.sh
#!/bin/bash
src=/usr/local/www
des=www
ip=172.23.132.91
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src | while read file
do
    /usr/local/rsyncd/bin/rsync -vzrtopg --delete --progress $src test@$ip::$des --password-file=/etc/rsyncd/rsyncd.password
Done


/usr/local/rsyncd/bin/rsync -vzrtopg --delete --progress /usr/local/www [email protected]::www --password-file=/etc/rsyncd/rsyncd.password

注:源目录/usr/local/www 此处www后不加/为同步www这个目录到目标目录里面,反之则是同步www目下的内容到目标目录里面。
例如:
1、 不加/,另一台rsync配置目录为/usr/local/www
/usr/local/rsyncd/bin/rsync -vzrtopg --delete --progress /usr/local/www [email protected]::www --password-file=/etc/rsyncd/rsyncd.password

该命令让/usr/local/www目录和另一台服务器的/usr/local/www目录保持一致
 
2、 加/,另一台rsync配置目录为/usr/local/www/
/usr/local/rsyncd/bin/rsync -vzrtopg --delete --progress /usr/local/www/ [email protected]::www --password-file=/etc/rsyncd/rsyncd.password

该命令让/usr/local/www目录和另一台服务器的/usr/local/www目录保持一致
 
此脚本为实时同步(没有操作不会同步,检测到操作同步操作内容,如需全部同步执行完整同步脚本)
#!/bin/sh
src=/usr/local/www
P1=${#src} 计算源的字符串长度
des=www
ip=172.23.132.91
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e close_write,delete,create,attrib ${src}| while read D T R F E
do
        case "${E}" in
                DELETE)
                        F1=${R}
                        echo "delete"
                ;;
                DELETE,ISDIR)
#                       F1=${R}
                        echo `date +%F-%H:%M:%S`" $R$F is going to delete" >> /opt/dir_delete_`date +%F`.log
#此处continue为回到开始重新执行,不在往下继续执行如果需要删除目录,需要注释掉continue
                        continue
                ;;
                *)
                        F1=${R}${F}
                        echo "${F1}"
                ;;
        esac
        SubDirectory=${R:${P1}}
/usr/local/rsyncd/bin/rsync -avz --progress --delete $F1  rsync_backup@$ip::$des$SubDirectory --password-file=/etc/rsyncd/rsyncd.password &
done

脚本解释
--timefmt 时间格式
%y年 %m月 %d日 %H小时 %M分钟
--format 输出格式
%T时间 %w路径 %f文件名 %e状态
-m 始终保持监听状态,默认触发事件即退出。
-r 递归查询目录
-q 打印出监控事件
-e 定义监控的事件,可用参数:
open   打开文件
access 访问文件
modify 修改文件
delete 删除文件
create 新建文件
attrb  属性变更
 
D 返回值为时间
T 返回值为时间
R 返回值为文件
F 返回值为目录
E 返回执行的指令

二、从
   1、安装rsync
tar -zxvf rsync-3.0.9.tar.gz
cd rsync-3.0.9
./configure --prefix=/usr/local/rsyncd
make && make install

2、创建rsync配置文件
mkedir /etc/rsyncd/
cd /etc/rsyncd/
vim rsyncd.conf

uid = root
gid = root
user chroot = no
max connections = 50
timeout = 180
pid file = /etc/rsyncd/rsyncd.pid
lock file= /etc/rsyncd/rsyncd.lock
log file = /var/log/rsyncd.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
secrets file = /etc/rsyncd/rsyncd.password
 
[www]  //同步目录名
path=/usr/local/www   //同步目录位置
ignore errors
hosts allow = 172.23.128.0/21
hosts deny = 0.0.0.0/32
secrets file = /etc/rsyncd/rsyncd.password
read only = no
list = no
auth users = test  //同步验证账号 要与主一样

3、 
echo "test:123456" >> /etc/rsyncd/rsyncd.password
chmod 600 /etc/rsyncd/rsyncd.password

4、 启动rsync
/usr/local/rsyncd/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf


三、测试
主: 可后台运行脚本
/usr/bin/nohup /opt/www_rsync.sh > /dev/null 2>&1 &
在/usr/local/www 创建文件目录
从:查看/usr/local/www 时候有实现同步

修改inotify相关配置:
#此为零时生效:
echo 1638400 > /proc/sys/fs/inotify/max_queued_events
echo 12800 > /proc/sys/fs/inotify/max_user_instances
echo  819200  > /proc/sys/fs/inotify/max_user_watches

#需要永久生效,需要修改/etc/sysctl.conf
#在文件末尾添加
fs.inotify.max_queued_events = 1638400
fs.inotify.max_user_instances = 12800
fs.inotify.max_user_watches = 819200
sysctl -p

/proc/sys/fs/inotify/max_user_instances:每个用户可创建的inotify实例最大上限数量
/proc/sys/fs/inotify/max_user_watches:每个inotify实例可监听的最大上限数量
/proc/sys/fs/inotify/max_queued_events:对应的inotify实例队列可容纳的最大上限事件数量

实时同步排除:
扫描排除/usr/local/inotify/bin/inotifywait --exclude=/data/htdocs/club/home/runtime排除此目录不同步
完全同步排除:
/usr/local/rsyncd/bin/rsync -avz --progress --delete --exclude-from=/etc/rsyncd/exclude.list
指定排除的文件在/etc/rsyncd/exclude.list里面
exclude.list要写入需要排除的相对目录
 
/usr/local/inotify/bin/inotifywait --fromfile=/etc/rsyncd/exclude.list 排除扫描多个文件
exclude.list里面需要写入绝对路径
@/data/htdocs/club/home/runtime 排除扫描在前面加@
@/data/htdocs/uc/click/

--exclude 
正则匹配需要排除的文件,大小写敏感。
--excludei 
正则匹配需要排除的文件,忽略大小写。
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。