利用rsync+inotify搭建实时同步系统
1:单独使用rsync的不足:
rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,而且发生变化的往往是其中最少的一部分,因此rsync是非常低效的方式。其此,rsync不能实时监测,同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,可能导致服务器端和客户端数据不一致,无法在出现应用故障时完全恢复数据。基于以上原因,rsync+inotify组合出现了。
2:inotify的简介:
inotify是一种强大的,细粒度的,异步的文件系统事件监控机制,Linux内核从2.6.13版本起,加入了对inotify的支持。通过inotify可以监控文件系统中添加,删除,修改,移动等各种细微的事件,利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,inotify-tools就是这样的一个第三方软件。
3:安装inotify工具inotify-tools:
1)inotify的特性需要Linux内核的支持,内核版本需在2.6.13版本以上.
[root@analyse ~]# uname -r
2.6.18-194.32.1.el5
[root@analyse ~]# ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 04-05 14:46 max_queued_events
-rw-r--r-- 1 root root 0 04-05 14:46 max_user_instances
-rw-r--r-- 1 root root 0 04-05 14:46 max_user_watches
如果有上面3项输出,就表示系统默认支持inotify,可以安装inotify-tools了。
可以到http://inotify-tools.sourceforge.net/下载相应版本的inotify-tools,然后开始编译安装。过程如下:
[root@mail ~]# tar zxvf inotify-tools-3.14.tar.gz
[root@mail ~]# cd inotify-tools-3.14
[root@mail inotify-tools-3.14]# ./configure && make && make install
[root@mail inotify-tools-3.14]# ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 47208 04-05 15:11 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 43562 04-05 15:11 /usr/local/bin/inotifywatch
安装完inotify-tools后,会生成inotifywait和inotifywatch两个指令。其中,inotifywait用于等待文件或文件集的一个特定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次信息。
4:inotify相关参数:
inotify定义了一些接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内核参数,因此,可以根据应用需求,实时调节其大小。
[root@mail ~]# cat /proc/sys/fs/inotify/max_queued_events
16384
##表示调用inotify_init时分配到inotify instance中可排队的event数的最大值,超过这个值得事件被丢弃,但会触发In_q_overflow事件。
[root@mail ~]# cat /proc/sys/fs/inotify/max_user_instances
128
##表示每一个real user ID可创建的inotify instances的数量上限。
[root@mail ~]# cat /proc/sys/fs/inotify/max_user_watches
8192
##表示每一个inotify实例相关联的watchs的上限,也就是每一个inotify实例可监控的最大目录数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。例如:
[root@mail ~]# echo 30000000> /proc/sys/fs/inotify/max_user_watches
5:inotifywait相关参数:
inotifywait是一个监控等待事件,可以配合shell脚本使用它。
-m ,即“--monitor”,表示始终保持事件监听状态;
-r ,即“--recursive”,表示递归查询目录;
-q ,即“--quiet”,表示打印出监控事件;
-e ,即“--event”,通过此参数可以指定要监控的事件,常见的事件有modify,delete,create和attrib等。
应用案例:利用rsync+inotify搭建实时同步系统
系统环境:
Web1 192.168.0.189 服务节点
Web2 192.168.0.196 服务节点
Web3 192.168.0.249 服务节点
Server 192.168.0.176 ##充当的是内容分发系统:
1:安装rsync和inotify-tools:
inotify-tools是用来监控文件系统的工具,因此必须安装在内容分发节点上,服务节点上无需安装;所有都安装rsync。
在这个案例中,内容发布节点(即Server)充当rsync的客户端角色,而3个服务节点充当了rsync的服务器端的角色,整个数据同步的过程其实就是一个从客户端向服务器端发送数据的过程.
配置过程略简。
2:在三个服务节点上配置rsync:
Web1节点的rsyncd.conf配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
[web1]
path = /web1/www/
comment = 51auto www file
ignore errors
read only = no
write only = no
hosts allow = 192.168.0.176
hosts deny = *
list = false
uid = root
gid = root
auth users = web1user
secrets file = /etc/web1.passwd
Web2节点的配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
[web2]
path = /web2/www/
comment = 51auto www2 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.0.176
hosts deny = *
list = false
uid = root
gid = root
auth users = web2user
secrets file = /etc/web2.passwd
Web3配置:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
[web3]
path = /web3/www/
comment = 51auto www3 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.0.176
hosts deny = *
list = false
uid = root
gid = root
auth users = web3user
secrets file = /etc/web3.passwd
在配置完3台服务节点的rsyncd.conf文件后,依次启动rsync守护进程。接着将rsync服务加入开机启动:
[root@varnish ~]# /usr/local/bin/rsync --daemon
[root@varnish ~]# echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
-------------------------------------------------------------
3:配置内容分发节点:
配置内容分发节点的主要工作是将生成的静态网页实时同步到集群中3个服务节点上,这个过程可以通过一个shell脚本完成。内容如下:
~
~