参考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 ] [ -t ] [--format ] [--timefmt ]

选项:-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