目的: 为了实现实时同步,我们使用inotify来监控需要同步的目录发生的改变,inotify只是内核中的一个监控文件变化的模块,提供了监控文件变化的API,而要连接这个API,需要安装inotify-tools工具。可以实现文件的新增,删除,修改,改变属性等,功能很强大。现在需要一台服务器做为发布服务器,来把改变的文件,通过rsync实时的同步到内容服务器。
先介绍一下rsync与inotify,都在在网上找的资料。先声明下面的rsync与inotify介绍不是我自己写的。
1、rsync
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
2、inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。在上面章节中,我们讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
3、测试环境,两台虚拟主机进行测试功能(web使用nginx部署):
192.168.10.170 这台主机上部署内容发布服务器,安装rsync-3.1.1.tar.gz 和 intoify-tools.tar.gz
192.168.10.190 这台主机上部署前端服务器,只安装rsync-3.1.1.tar.gz
实现功能:当内容发布服务器上的内容发生改变时,自动将数据同步到前端服务器
内容发布服务器:
4、安装rsync-3.1.1.tar.gz (192.168.10.170)
# tar xf rsync-3.1.1.tar.gz
# cd rsync-3.1.1/
# ./configure --prefix=/usr/local/rsync/
# make && make install
5、建立用户文件
# cd /usr/local/rsync/
# vim rsync.passwd
hadoop ##只保存用户的密码
# chmod 600 ./rsync.passwd ##修改文件的权限
6、安装intoify-tools-3.1.14.tar.gz
# tar xf intoify-tools-3.1.14.tar.gz
# cd intoify-tools-3.1.4/
# ./configure --prefix=/usr/local/intoify
# make && make install
7、创建rsync复制脚本
# vim /tmp/rsync.sh
#!/bin/bash
host=192.168.10.190 ##需要数据同步的主机ip
src=/usr/local/nginx/html/ftp ##本地需要同步的数据目录
des=nginx
user=hadoop
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
8、改变脚本文件的执行权限:
# chmod 764 rsync.sh
9、让其在后台运行
# sh /tmp/rsync.sh & 或 nohup /tmp/rsync.sh &
10、将rsync.sh脚本加入到开机启动项里
# echo "nohup /tmp/rsync.sh &" >> /etc/rc.local
前端服务器:
1、安装rsync-3.1.1.tar.gz (192.168.10.190)
# tar xf rsync-3.1.1.tar.gz
# cd rsync-3.1.1/
# ./configure --prefix=/usr/local/rsync/
# make && make install
2、创建用户密码文件
# vim /usr/local/rsync/rsync.passwd
hadoop:hadoop //在server端只有密码,在client端有密码和用户名
3、改变其权限
# chmod 600 rsync.passwd
4、添加配置文件
# vim /usr/local/rsync/rsync.conf
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[nginx]
path = /tmp/ ##数据同步到的目录
comment = web file
ignore errors
read only = no
write only = no
hosts allow = 192.168.10.170
hosts deny = *
list = false
uid = root
gid = root
auth users = hadoop
secrets file = /usr/local/rsync/rsync.passwd
5、启动rsync
# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf
6、把rsync的启动脚本加入到开机启动项里
# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local
PS: 进入/etc/xinetd.d/目录下看是否有rsync文件,有说明rsync是由xinetd进程管理的,可以通过xinetd来启动rsync
# chkconfig rsync on
# service xinetd restart