Rsync+inotify实现文件实时同步
Rsync+inotify 实现文件实时同步
背景说明:
1、需要将交换服务器的 /opt/ftp/com 目录的内容实时同步到内网web服务器的 /opt/www 目录;
2、需要将内网web服务器的 /opt/www 目录的内容实时同步到 /opt/ftp/out 目录。
192.168.232.128 192.168.232.129 交换服务器 内网Web服务器 | | /opt/ftp/out <-------- /opt/www | | | | /opt/ftp/com --------> /opt/www
具体步骤
环境准备:
实验环境准备:(centos6平台)
两台服务器均需配置
# service iptables stop //关闭防火墙 # sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux //关闭selinux,重启生效 # setenforce 0 //关闭selinux,临时生效 # yum -y install rsync xinetd //安装rsync xinetd 软件
1) 交换服务器准备测试文件
[root@exchange ~]# mkdir -p /opt/ftp/{com,out} [root@exchange ~]# touch /opt/ftp/com/com_test{1..10} [root@exchange ~]# touch /opt/ftp/out/out_test{1..10} [root@exchange ~]# ls /opt/ftp/com/ com_test1 com_test10 com_test2 com_test3 com_test4 com_test5 com_test6 com_test7 com_test8 com_test9 [root@exchange ~]# ls /opt/ftp/out/ out_test1 out_test10 out_test2 out_test3 out_test4 out_test5 out_test6 out_test7 out_test8 out_test9
2) web服务器准备测试文件
[root@web ~]# mkdir -p /opt/www [root@web ~]# touch /opt/www/www_test{1..10} [root@web ~]# ls /opt/www/ www_test1 www_test10 www_test2 www_test3 www_test4 www_test5 www_test6 www_test7 www_test8 www_test9
交换服务器配置
3) 配置xinetd配置文件,将disable = yes 改成 no
[root@exchange ~]# vi /etc/xinetd.d/rsync # default: off # description: The rsync server is a good addition to an ftp server, as it \ # allows crc checksumming etc. service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID }
4) 编辑rsync配置文件,该文件不存在,需要手动创建
[root@exchange ~]# vi /etc/rsyncd.conf uid = root gid = root [com] path = /opt/ftp/com auth users = com_user secrets file = /etc/rsyncd.secrets read only = false [out] path = /opt/ftp/out auth users = out_user secrets file = /etc/rsyncd.secrets read only = false
5) 编辑账号认证文件,并给予600权限
[root@exchange ~]# vi /etc/rsyncd.secrets com_user:ComFtpUser@qaz out_user:OutFtpUser@zaq [root@exchange ~]# chmod 600 /etc/rsyncd.secrets
6) 启动xinetd服务
[root@exchange ~]# service xinetd start
7) web服务器测试
[root@web ~]# rsync -a 192.168.232.128:: //查看共享出来的标签 com out
web服务器配置
8) 配置web服务器上面的rsync服务(和上面交换服务器上一样配置方法)
[root@web ~]# vim /etc/rsyncd.conf uid = root gid = root [www] path = /opt/www auth users = www_user secrets file = /etc/rsyncd.secrets read only = false [root@web ~]# vim /etc/xinetd.d/rsync disable = no [root@web ~]# vim /etc/rsyncd.secrets www_user:WebServerUser@qaz [root@web ~]# chmod 600 /etc/rsyncd.secrets [root@web ~]# service xinetd start
9)在交换服务器上测试
[root@exchange ~]# rsync -a 192.168.232.129:: www
整体测试
# 整体测试
1)在web服务器上将 /opt/www目录下的文件同步到交换服务器的 /opt/ftp/out 目录
[root@web ~]# rsync -avt /opt/www/ out_user@192.168.232.128::out
2)在交换服务器上将 /opt/ftp/com 目录下的文件同步到web服务器的/opt/www目录
[root@exchange ~]# rsync -avt /opt/ftp/com/ www_user@192.168.232.129::www
上面测试成功后接着配置 inotify 实时同步
1)安装inotify-tools,两台都需要安装
下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar xf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make # make install # cp /usr/local/bin/inotifywa* /usr/sbin/
2) 在web服务器上面创建密码文件,用于保存交换服务器上面的密码,(此处是需要同步web服务器的文件到交换服务器的/opt/ftp/out目录,所以对应是 out_user 用户的密码)
[root@web ~]# mkdir -p /home/work/ftppass [root@web ~]# vim /home/work/ftppass/passwd OutFtpUser@zaq [root@web ~]# chmod 600 /home/work/ftppass/passwd // 测试:rsync -avt --password-file=/home/work/ftppass/passwd /opt/www/ out_user@192.168.232.128::out
3) 在交换服务器上面创建密码文件,用于保存web服务器上面的密码,(此处是需要同步交换服务器的文件到web服务器的/opt/www目录,所以对应的是 www_user 用户的密码)
[root@exchange ~]# mkdir -p /home/work/ftppass [root@exchange ~]# vim /home/work/ftppass/passwd WebServerUser@qaz [root@exchange ~]# chmod 600 /home/work/ftppass/passwd // 测试:rsync -avt --password-file=/home/work/ftppass/passwd /opt/ftp/com/ www_user@192.168.232.129::www
4) 编辑web服务器上面同步脚本,并放置后台运行
[root@web ~]# vim www_to_out.sh #!/bin/sh #Desc: 用于从web服务器/opt/www目录中的文件同步到交换器服务器的/opt/ftp/out目录 #Date: 2019-04-16 #By: Lee-YJ inotifywait -mrq -e modify,create,move,delete,attrib /opt/www |while read events do rsync -avt --password-file=/home/work/ftppass/passwd /opt/www/ out_user@192.168.232.128::out echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log done [root@web ~]# nohup bash www_to_out.sh &
5) 编辑交换服务器上面同步脚本,并放置后台运行
[root@exchange ~]# vim com_to_www.sh #!/bin/sh #Desc: 用于从交换服务器/opt/ftp/com目录中的文件同步到web服务器的/opt/www目录 #Date: 2019-04-16 #By: Lee-YJ inotifywait -mrq -e modify,create,move,delete,attrib /opt/ftp/com |while read events do rsync -avt --password-file=/home/work/ftppass/passwd /opt/ftp/com/ www_user@192.168.232.129::www echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log done [root@exchange ~]# nohup bash com_to_www.sh &
6)测试(根据上面架构图的说明,也就是说现在我们在交换服务器上面的 /opt/ftp/com 目录中创建了文件,那么会自动同步到web服务器上面的 /opt/www 目录中,并且 web服务器又会自动同步到 交换服务器的 /opt/ftp/out 目录里面即为成功)
先查看当前两个服务器的文件
// 交换服务器 [root@exchange ~]# ls /opt/ftp/com/ com_test1 com_test2 com_test4 com_test6 com_test8 com_test10 com_test3 com_test5 com_test7 com_test9 [root@exchange ~]# [root@exchange ~]# ls /opt/ftp/out/ out_test1 out_test2 out_test4 out_test6 out_test8 out_test10 out_test3 out_test5 out_test7 out_test9 // web服务器 [root@web ~]# ls /opt/www/ www_test1 www_test2 www_test4 www_test6 www_test8 www_test10 www_test3 www_test5 www_test7 www_test9
在交换服务的 /opt/ftp/com 目录创建文件
[root@exchange ~]# touch /opt/ftp/com/inotify{1..10}
等待几秒再次查看 web 服务器的 /opt/www 目录 和 交换服务器的 /opt/ftp/out 目录
// web服务器 [root@web ~]# ls /opt/www/ com_test1 com_test4 com_test8 inotify2 inotify6 www_test1 www_test4 www_test8 com_test10 com_test5 com_test9 inotify3 inotify7 www_test10 www_test5 www_test9 com_test2 com_test6 inotify1 inotify4 inotify8 www_test2 www_test6 com_test3 com_test7 inotify10 inotify5 inotify9 www_test3 www_test7 // 交换服务器 [root@exchange ~]# ls /opt/ftp/out/ com_test1 com_test5 inotify1 inotify5 out_test1 out_test5 www_test1 www_test5 com_test10 com_test6 inotify10 inotify6 out_test10 out_test6 www_test10 www_test6 com_test2 com_test7 inotify2 inotify7 out_test2 out_test7 www_test2 www_test7 com_test3 com_test8 inotify3 inotify8 out_test3 out_test8 www_test3 www_test8 com_test4 com_test9 inotify4 inotify9 out_test4 out_test9 www_test4 www_test9
通过上面测试结果可以看出,已经实现了自动同步。