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

在上一篇中介绍了rsync的应用和一些rsync的优点、缺点等,并在最后提到了inotify这个工具,下面就来说一下inotify这个工具。
先来说一下rsync的不足之处吧。

1、rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到百万甚至千万量级,扫描所有文件将是非常耗费时间的,而且发生变化的往往是其中的很少一部分,因此在这种情况下rsync的工作效率是非常低的,

2、rsync不能实时监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是在两次触发动作一定会有时间差,可能就导致服务器端与客户端数据出现不一致,无法在出现应用故障时完全恢复数据。

基于以上原因,rsync+inotify组合出现了。

关于inotify

    inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13版本就开始加入对inotify的支持。

    通过inotify可以监控文件系统中添加、删除、修改、移动等各种细微事件,利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,inotify-tools就是这样的一个第三方软件。

    正由于inotify这些特性能够弥补rsync的不足。两者的工作方式是:用inotify可以监控文件系统和各种变化,当文件有任何变动时,会触发rsync同步。

安装inotify工具inotify-tools

    由于inotify的特性需要Linux内核的支持,在安装之前要确认Linux系统内核是否在2.6.13版本之上,如果低于这个版本,就要重新编译内核加入对inotify的支持。可以用以下方式来判断是否支持inotify

   
   
   
   
  1. [root@localhost ~]# uname -r 
  2. 2.6.18-164.el5 
  3. [root@localhost ~]# ll /proc/sys/fs/inotify/ 
  4. total 0 
  5. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_queued_events 
  6. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_instances 
  7. -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_watches 

    如果有上面3行的输出说明系统默认支持inotify,可以安装inotify-tools了。可以到http://inotify-tools.sourceforge.net/下载相应版本的inotify-tools

   
   
   
   
  1. [root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz  
  2. [root@localhost inotify-tools-3.14]# cd inotify-tools-3.14 
  3. [root@localhost inotify-tools-3.14]# ./configure  
  4. [root@localhost inotify-tools-3.14]# make 
  5. [root@localhost inotify-tools-3.14]# make install 
  6. [root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa* 
  7. -rwxr-xr-x 1 root root 37260 Jun 21 18:20 /usr/local/bin/inotifywait 
  8. -rwxr-xr-x 1 root root 35434 Jun 21 18:20 /usr/local/bin/inotifywatch 
  9. 安装完成后,会生成inotifywait和inotifywatch两个指令。 

  inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;

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

    从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

-m 即“--monitor”,表示始终保持事件监听状态。

-r 即“--recursive”,表示递归查询目录

-q 即“--quiet”,表示打印出监控事件

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

要想更多的了解可以用man inotifywait

下面针对rsync和inotify来做个小设计:

有两个台服务器也就是两个节点 A 、B

还有一个服务器C是来将静态的页面同步到A、B两个服务器上的。

这三台服务器的相关信息:

       内核版本     用途 ip地址             网页数据路径

A 2.6.18-164.el5  服务节点1 192.168.35.4       /web1/wwwroot

B 2.6.18-164.el5  服务节点2     192.168.35.5       /web2/wwwroot

C 2.6.18-164.el5  内容发布节点  192.168.35.6       /web/wwwroot

 

1、安装rsync与inotify-tools

     inotify-tools是用来监控文件系统变化的工具,因此必须安装在内容发布节点上,服务节点不用安装。

    还有就是这三台服务器都要安装上rsync这个工具。安装方式在上篇博客中提到在这里就不再说了。

安装完成后,下面来说一下各服务器节点的配置

对于两台服务器节点上的配置如下:

A 节点的rsyncd.conf配置如下:

   
   
   
   
  1. uid = nobody 
  2. gid = nobody 
  3. use chroot = no 
  4. max connections = 10 
  5. strict modes = yes 
  6. pid file = /var/run/rsyncd.pid 
  7. lock file = /var/run/rsync.lock 
  8. log file = /var/log/rsyncd.log 
  9.  
  10. [web1] 
  11. path = /web1/wwwroot/ 
  12. comment = web1 file 
  13. ignore errors 
  14. read only = no 
  15. write only = no 
  16. hosts allow = 192.168.35.6 
  17. hosts deny = * 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = web1user 
  22. secrets file = /etc/web1.pass 

 

B 节点的rsyncd.conf配置如下:

   
   
   
   
  1. uid = nobody 
  2. gid = nobody 
  3. use chroot = no 
  4. max connections = 10 
  5. strict modes = yes 
  6. pid file = /var/run/rsyncd.pid 
  7. lock file = /var/run/rsync.lock 
  8. log file = /var/log/rsyncd.log 
  9.  
  10. [web2] 
  11. path = /web2/wwwroot/ 
  12. comment = web2 file 
  13. ignore errors 
  14. read only = no 
  15. write only = no 
  16. hosts allow = 192.168.35.6 
  17. hosts deny = * 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = web2user 
  22. secrets file = /etc/web2.pass 

 

这两个配置文件完成了,下面还要在这两台服务器上分别创建web1.pass和web2.pass这两个文件

所要添加的内容是:

# vim /etc/web1.pass

web1user:zhou

# vim /etc/web2.pass

web2user:zhou

在配置完成后,就可以启动rsync守护进程了。

/usr/local/bin/rsync --daemon

 

 

下面在内容发布节点上来做一下配置,主要工作是将变化的内容实时同步到2个服务节点上,来创建一个脚本来实现这个功能。

脚本内容如下:

   
   
   
   
  1. #!/bin/bash 
  2. host1=192.168.35.4 
  3. host2=192.168.35.5 
  4.  
  5. src=/web/wwwroot/ 
  6. dst1=web1 
  7. dst2=web2 
  8. user1=web1user 
  9. user2=web2user 
  10.  
  11. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modfiy,delete,create,attrib $src | while read files 
  12.   do 
  13.     /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1 
  14.     /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2 
  15.     echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 
  16.   done 

 

在这个脚本完成后还创建一个文件在

# vim /etc/server.pass

内容就是上面两个服务器中的用户的密码。zhou

# more /etc/server.pass

zhou

 

脚本的一些参数如下:

--timefmt: 指定时间的输出格式

--format: 指定变化文件的详细信息

这个参数要配合使用,通过指定输出格式输出类似以下的内容

15/06/10 12:00 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced

 

这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作。由于这个过程是一个主动触发操作的过程,是通过系统内核完成的,所以比那些遍历整个目录的扫描方式效率要高很多。

有时会出现这样的情况,当在监控的目录中写入一个很大的文件,也就写入的文件需要一段时间,inotify会持续不停地输出该文件被更新的信息,这样就会持续不断地触发rsync执行同步操作,占用大量系统资源。出现这种情况,最理想的做法就是等待文件写完后再触发rsync同步。在这种情况下,可以修改inotify的监控事件,即,“-e close_write,delete,create,attrib”。

给上面的脚本添加执行权限,放到后台运行就可以了。

下面就可在发布节点上的/web/wwwroot/目录下添加,删除或者修改某个文件来测试一下,是否能正常工作。如果看到有变化说明这个实时同步的功能就配置成功了。

如果有什么不对的地方,还请指出来,谢谢大家!