通过rsync+inotify实现数据的实时同步备份

      rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样就可以解决同步数据的实时性问题。


一、rsync的优点与不足

rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过Linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify可以解决这个问题。


二、 初识inotify

        Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

         我们上面讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。


三、inotify相关参数

    inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令,

inotifywait        用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。路径为/usr/bin/inotifywait

inotifywatch    用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。路径为/usr/bin/inotifywatch


/proc/sys/fs/inotify/max_queued_evnets    
        表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。


/proc/sys/fs/inotify/max_user_instances
       表示每一个real user ID可创建的inotify instatnces的数量上限。


/proc/sys/fs/inotify/max_user_watches
       表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:
               echo 30000000 > /proc/sys/fs/inotify/max_user_watches


四、inotifywait相关参数

Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数:


-m, 即--monitor,表示始终保持事件监听状态。
-r, 即--recursive,表示递归查询目录。
-q, 即--quiet,表示打印出监控事件。

-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。


五、rsync+inotify应用案例

现在有两台web主机,由于没有共享存储,我们现在要实现的是对它们的根目录实现即时同步更新。

服务器主机 IP地址 网页根目录
www1(内容发布方) 172.16.251.50 /www/a/
www2 (服务方) 172.16.251.34 /www/e/


5.1、www2主机的配置

在www2主机上安装xinetd,rsync

[root@station34 ~]# yum -y install xinetd rsync


配置/etc/rsyncd.conf

# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Directory to be synced
[mydata]
path = /www/e/
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.251.50  //只允许从172.16.251.50主机上同步数据过来
hosts deny = *
list = false
uid = root
gid = root
auth users =tom   //用户名为tom
secrets file = /etc/rsyncd.passwd  //用户密码文件,需创建


创建密码文件

[root@station34 ~]# vim /etc/rsyncd.passwd

   内容如下:

tom:tom

注:密码文件格式(明文):username:password


密码文件权限要设置为600

[root@station34 ~]# chmod 600 /etc/rsyncd.passwd


然后重启xinetd

[root@station34 ~]# service xinetd restart


5.2、配置www1主机

创建个/etc/rsyncd.passwd 密码文件

[root@station50 a]# echo "tom" >/etc/rsyncd.passwd

[root@station50 a]# chmod 600 /etc/rsyncd.passwd


创建个脚本rsync.sh

这个脚本的作用是通过inotify监控文件目录的变化,进而触发rsync进行同步操作。

[root@station34 ~]# vim /root/rsync.sh

内容如下:

#!/bin/bash
src=/www/a/
des=mydata
ip=172.16.251.34
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file
do
rsync -vzrtopg --delete --progress $src tom@$ip::$des --password-file=/etc/rsyncd.passwd &&
echo "$src was rsynced"
done


脚本相关解释如下:

       --timefmt:指定时间的输出格式。
       --format:指定变化文件的详细信息。

       -e close_write,delete,create,attrib:表示inotify监控的事件(添加,删除,更新),close_write表示等待文件写完后再去触发rsync同步


给定可执行权限,放到后台运行:

[root@station50 a]#  chmod 755 /root/rsync.sh


[root@station50 a]# /root/rsync.sh &


将此脚本加入系统自启动文件:

echo  “/root/rsync.sh &”>>/etc/rc.local


5.3、测试rsync+inotify实时同步功能

在www1主机/www/a目录里创建个tom目录

wKioL1M1dxejB5IxAADFgDFdBu8880.jpg


查看www2主机上是否更新

wKiom1M1d1_QPcEaAABfI3KxVTI800.jpg


在www1上创建个luxi文件,内容为“luxi is a girl"

wKiom1M1d4XBaz5OAAKxo-_RApY792.jpg


www2上看是否同步

wKiom1M1d8uwuzViAACXQeIDt20312.jpg


从上面这些图看出,/www/a目录下文件发生变化,/www/e目录下文件发生同步变化,那么我们这个系统就配置成功了。

你可能感兴趣的:(rsync+inotify)