rsync+inotify实现实时同步
测试机1:主 172.23.128.124
测试机2:从 172.23.132.91
实现主机/usr/local/www 有任何变动 从机/usr/local/www实现实时同步
一、主
1、 下载安装包rsync+inotify
cd /opt
wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
wget http://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 test@172.23.132.91::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 test@172.23.132.91::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/ test@172.23.132.91::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
正则匹配需要排除的文件,忽略大小写。
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。