rsync+inotify实时数据同步搭建

1、由于rsync在实施大量数据备份时,工作方式是扫描整个数据文件,其实发生更改的只是一小部分,导致过多的占用系统资源。
2、rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

因此需要一个新的工具来解决这两个问题,inotify就运用而生。

inotify优点:

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。 rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

系统约定

源服务器IP:192.168.1.3

另外需要同步数据的三台服务器IP分别为

web1:192.168.1.4

web2:192.168.1.5

web3:192.168.1.6

三台web服务器安装rsync服务

详细安装配置请参考CentOS Rsync 服务器与客户端同步配置

由于源服务器是客户端推送到服务器端,所以read only = yes要改为read only = no

[web]
uid = root
gid = root
path = /web/
ignore errors
read only = no
list = no
auth users = rsync
secrets file = /etc/rsyncd.passwd

源服务器配置

安装inotify-tools
# yum -y install inotify-tools
修改inotify相关参数
# echo 50000000 > /proc/sys/fs/inotify/max_user_watches
创建inotify监控同步脚本
# vim /usr/local/sbin/inotify.sh

添加如下内容:

#!/bin/bash
web1=192.168.1.4
web2=192.168.1.5
web3=192.168.1.6

src=/www/
dst=web
user=rsync

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e create,move,delete,modify,attrib $src | while read files

do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $src $user@$web1::$dst
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $src $user@$web2::$dst
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $src $user@$web3::$dst
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

给予inotify.sh可执行权限

# chmod u+x /usr/local/sbin/inotify.sh
将inotify.sh 放在后台运行
# /usr/local/sbin/inotify.sh &

记得退出终端的时候用exit退出,否则关闭终端后,此脚本运行会结束,为避免出现这种情况,可以采用nohup命令

# nohup /usr/local/sbin/inotify.sh &
将脚本加到开机启动项
# echo "/usr/local/sbin/inotify.sh &" >> //etc/rc.local