rsync+inotify实现实时同步
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 正则匹配需要排除的文件,忽略大小写。 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。