web数据同步方案中,NFS方案所有的数据保存到nfs服务器,无论用户访问哪台Web服务器,都是通过nfs服务器获取数据,这样势必会造成nfs服务器性能损耗,且客户端对nfs服务器的依赖性较大。inotify+rsync方案通过对文件系统实时监控同时使用rsync进行同步是一个不错的选择。
rsync
rsync是一个远程数据同步工具,它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。适用于同步,备份等多个场合。
安装
rsync可以作为两种模式进行运行,以daemon模式作为服务端运行,也可以作为客户端去连接服务器,甚至可以抛弃服务端,直接在本地文件系统上进行同步。
当rsync以daemon模式作为服务端运行,默认监听在873端口,等待客户端来连接,对应的模式是一个服务端,多个客户端,比如
-
rsync -avz --delete 192.168.1.11::web/ /var/www/
在以上的代码中,服务端192.168.1.10是内容发布端。
在 inotify+rsync 场合中,工作模式是一个客户端,多个服务端,客户端掌握了权威内容,主动向服务端推送内容(服务端必须是可写的),例子如下:
-
rsync -avz --delete /var/www/ 192.168.1.11::web/
-
rsync -avz --delete /var/www/ 192.168.1.12::web/
-
rsync -avz --delete /var/www/ 192.168.1.13::web/
上面的例子,客户端将/var/www里的网页内容,push到3个服务端。
inofity-tools
inotify是Linux下的一个文件系统事件监控机制,从2.6.13开始Linux内核已默认集成。其允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
安装
-
yum install inotify-tools
在本次方案中,我们通过rsync客户端实时监控文件变动信息,将发布内容到服务端。
服务端配置
-
pid file = /var/run/rsyncd.pid
-
port = 873
-
uid = root
-
gid = root
-
use chroot = yes
-
-
read only = no
-
write only = no
-
-
hosts allow = 192.168.1.1/255.255.255.0
-
hosts deny = *
-
max connections = 5
-
-
log file = /var/log/rsyncd.log
-
lock file= /var/log/rsync.lock
-
timeout = 300
-
[web]
-
path=/var/www/
-
list=yes
-
ignore errors=yes
-
auth users = www1
-
secrets file=/etc/rsyncd.secrets
编辑授权信息/etc/rsyncd.secrets,并配置文件权限
-
echo "www1:wwwpass" > /etc/rsyncd.secrets
-
chmod 600 /etc/rsyncd.secrets
如果有多个服务端,同时配置多个服务端即可,启动服务端:
将上面一句命令加入/etc/rc.local ,可以让rsync 随系统启动
-
echo "rsync --daemon" >>/etc/rc.local
开放服务端监听端口防火墙
-
/sbin/iptables -A INPUT -s 192.168.1.1/24 -p tcp --dport 873 -j ACCEPT
客户端配置
创建账号信息
-
echo "wwwpass" > /root/client.pwd
-
chmod 600 /root/client.pwd
脚本监控一旦 inotify 发现变化,立即触发rsync 将变化推送到服务端。同步脚本参考:
-
#!/bin/bash
-
set -e
-
src=/var/www/
-
web01=192.168.1.11
-
web02=192.168.1.12
-
/usr/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/bin/rsync -avzrtopg --delete --progress --password-file=/root/client.pwd $src www1@$web01::web/
-
/usr/bin/rsync -avzrtopg --delete --progress --password-file=/root/client.pwd $src www1@$web02::web/
-
echo "${files} have been pushed to all web servers."
-
done
启动脚本,并在后台运行,或者让它开机启动
-
chmod +x inotify-rsync.sh
-
./inotify-rsync.sh&
-
echo "/opt/inotify-rsync.sh&" >>/etc/rc.local
(责任编辑:IT) |