参考linux运维之道p224页
如果仅使用RSYNC进行数据同步,只能满足企业对数据实时性要求不高的环境,即使使用计划任务也仅可以实现定期的数据同步。而且使用RSYNC在进行数据同步前需要对所有文件进行对比,然后进
行差异数据同步。而且使用RSYNC在进行数据同步前需要对所有的文件进行比对,然后进行差异数据同步,然而我们的数据可能只是1TB数据中的1KB数据发生了改变,在不知道什么时候会发生数据
改变的情况下,为了同步1KB的数据,我们需要不停地进行RSYNC链接,对比客户端与服务器之间的数据差异,这样的机制在当前大数据的背景下是低效的。往往数据的变化随时都有可能发生,如果
多台主机之间要求当前数据发生变化后进行实时同步,就需要结合Inotify工具。目前Inotify已经被集成到Linux内核中,Inotify为用户态应用程序提供了文件系统事件的通告机制。比如,当发生
文件的访问、修改以及删除等事件时,可以立刻通告给用户态应用程序,通告Inotify可以实时了解文件系统发生的所有变化。
常见的文件系统变化情况如下:
IN_ACCESS 文件访问事件
IN_MODIFY 文件修改事件
IN_ATTRIB 文件属性修改事件
IN_OPEN 文件打开事件
IN_CLOSE_WRITE 可写文件被关闭事件
IN_CLOSE_NOWRITE 不可写文件被关闭事件
IN_MOVED_FROM
IN_MOVED_TO 文件移动或者重命名事件
IN_DELETE 文件删除事件
IN_DELETE_SELF 自删除事件
环境说明CentOS-6.2
yum -y install gcc make
tar -xzvf inotify-tools-3.14.tar.gz
cd /inotify-tools-3.14
./configure
make && make install
监控数据
inotify-tool提供了两个应用程序,分别为inotifywait与inotifywatch.其中,inotifywait命令的描述和用法如下:
描述:使用inotify机制等待文件系统事件,该命令非常适合实时监控文件系统的变化。
用法:
inotify [-hcmrq] [ -e
选项:-h:显示帮助信息;
@
--fromfile
-m,--monitor 接收到事件后退出,默认程序在接收一个事件信息后退出。
-d,与--monitor类似,但程序会进入后台执行
-o,将事件信息输出至文件,默认输出至标准输出
-s,将错误信息输出至syslog系统日志,默认输出至标准错误输出
-r,递归监控
-q,静默方式
--exclude 使用正则表达式匹配例外文件
--excludei 使用正则表达式匹配例外文件,不区分大小写
-t 在指定的时间,没有发生时间,则推出程序
-c 使用csv格式输出
-timefmt 设置时间格式
--format 指定输出格式
Rsync与inotify双剑合璧
单一的Rsync仅能够进行数据同步,单一的inotify仅可以实现实时文件监控,而两者的结合将能满足企业对数据中心实时数据同步的需求。接下来进行案例部署:
ABC公司需要部署一套web服务,然而随着用户访问量的增加单台服务器已经满足不了大量的并发访问。因此,ABC公司决定使用集群技术,整合多台服务器处理能力实现负载均衡,
从而满足不断增加的并发访问量。
分析:由于web服务器所提供的网站数据需要保持一致,但当服务器越来越多时,公司发现在这些主机之间同步哪些随时可能发生改变的网站数据就是一场噩梦。我们的解决方案是
在后端建立一个数据发布服务器,该服务器作为RSYNC客户端,通过Inotify机制实时监控网站数据,当数据发生变化后调用RSYNC命令上传数据至多个RSYNC服务器,这里的RSYNC服务器
就是提供web服务的web服务器。
web1
配置如下:
yum -y install rsync
mkdir -p /var/www/001
chmod 660 /var/www/001
chown nobody.nobody /var/www/001
vim /etc/rsyncd.conf
#/etc/rsyncd.conf
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
uid = nobody
gid = nobody
use chroot = no
ignore errors
read only = no
[web1]
comment =Web content
path = /var/www/001
auth users = tom
secrets file = /etc/rsyncd.secrets
hosts allow=172.16.100.1
hosts deny=*
list = false
echo "tom:pass" >/etc/rsyncd.secrets
rsync --daemon
echo "rsync --daemon" >>/etc/rc.local
iptables -I INPUT -p tcp --dport 873 -j ACCEPT
service iptables save
web2,web3,web4....参照web1的进行配置即可。
在数据发布服务器上需要下载inotify-tool软件包,并编写监控脚本,这里的脚本名称为inotify_rsync.sh。当监控到数据发生改变时,自动进行数据同步操作,将数据送至web服务器。
yum -y install rsync
yum -y install automake libtool
./configure
make && make install
echo "pass" >/root/rsync.pass
chmod 600 /root/rsync.pass
vim notify_rsync.sh
#!/bin/bash
export PATH=/bin:/usr/bin:/usr/local/bin
SRC=/web_data/
DEST1=web1
DEST2=web2
Client1=172.16.100.8
Client2=172.16.100.10
User=tom
Passfile=/root/rsync.pass
[ ! -e $Passfile ] && exit 2
inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e\' --event modify,create,move,delete,attrib $SRC |while read line
do
echo "$line" >/var/log/inotify_web 2>&10
/usr/bin/rsync -avz --delete --progress --password-file=$Passfile $SRC ${USER}@$Client1::$DEST1 >>/var/log/sync_web1 2&>/1
/usr/bin/rsync -avz --delete --progress --password-file=$Passfile $SRC ${USER}@Client2::$DEST2 >>/var/log/sync_web2 2>&1
done &
chmod a+x notify_rsync.sh
/root/notify_rsync.sh
echo "/root/notify_rsync.sh" >>/etc/rc.local