Centos 6下利用rsync+inotify实现数据实时同步

  一个客户准备上一个项目,采用的是前台一台Nginx服务器用作反向代理+多台TOMCAT后端服务器(每台服务器代码内容相同,主要为防止一台机器宕机不会影响系统的正常使用)。考虑到后期业务量不断的增长,可能后端TOMCAT服务器的数量也会增加。所以,对TOMCAT服务器代码管理是需要考虑的一个问题。由于客户不准备上共享存储,经过商量最终准备选择rsync +inotify实现代码实时同步。

1.rsync介绍

  之前大多数项目采用的是共享存储,很少使用rsync。现在,首先了解一下什么是rsync。rsync是Linux/UNIX系统下文件同步和数据传输工具,它采用"rsync"算法使一个客户端和远程文件服务器之间进行文件同步。通过rsync可以将同一个服务器上得数据从一个分区备份到另外一个分区,也可以将本地系统的数据通过网络传输协议方式备份到任何一个远程主机上;rsync可以在中断之后恢复传输;rsync值传输源文件和目标文件之间不一致的部分;rsync可以执行完整备份或者增量备份。

2.rsync的功能特性

  大概了解了什么是rsync。接下来了解一下rsync的功能和特性,rsync有如下特性:

  • 可以将镜像保存整个目录树和文件系统。
  • 可以增量同步数据,文件传输效率高,因而同步时间很短。
  • 可以保持原有文件的权限、时间等属性。
  • 加密传输数据,保证了数据的安全性。
  • 可以使用rcp、ssh等方式来传输文件,当然也可以直接通过Socket连接传输文件。
  • 支持匿名传输。

3.rsync的应用模式

  rsync有四种应用模式,第一种是Shell应用模式,也称为本地模式;第二种是远程shell模式,它利用SSH执行底层连接和加密传输;第三种是查询模式,与ls命令实现功能类似;最后一种是服务器模式,平时所说的假设rsync服务器就是指这种模式。根据客户要求,我们准备选择第四种模式,即rsync服务器模式。

4.rsync服务器模式

  rsync服务器模式是基于C/S模式的,在这种模式下,rsync在后台启用了一个守护进程,这个守护进程在rsync服务器端永久运行,用于接收文件传输请求,因此,客户端既可以把文件发送给守护进程,也可以向守护进程请求文件。

 

5.搭建rsync环境

  • 系统环境
    客户所有的服务器均采用Linux操作系统,系统内核版本与详细信息如下:

     
        
        
        
        
    1. Web1:内核:2.6.32-71.el6.x86_64;用途:服务节点1;ip地址:133.96.7.100;网站根目录:/opt/www。  
    2. Web2:内核:2.6.32-71.el6.x86_64;用途:服务节点2;ip地址:133.96.7.101;网站根目录:/opt/www。  
    3. Web3:内核:2.6.32-71.el6.x86_64;用途:服务节点3;ip地址:133.96.7.102;网站根目录:/opt/www。  
    4. Server:内核:2.6.32-71.el6.x86_64;用途:服务节点4;ip地址:133.96.7.103;网站根目录:/opt/www。  
  • 拓扑图如下:

                    

6.安装rsync

   安装rsync可以使用源码包或者二进制包两种方式进行安装,在此案例中采用二进制包进行安装,代码如下:

  
  
  
  
  1. yum -y install rsync               //安装rsync 

  由于rsync安装比较简单,这里不再过多进行阐述安装。接下来,进行配置rsync。rsync默认可执行文件安装在/usr/bin/rsync;配置文件一般/etc/rsyncd.conf,配置文件需要自己进行创建,配置文件代码如下:  

  
  
  
  
  1. //web1节点的rsyncd.conf配置如下  
  2.  
  3. uid=nobody                           
  4. gid=nobody  
  5. user chroot=no  
  6. max connections=200  
  7. strict modes=no  
  8. timeout=600  
  9. pid file=/var/run/rsyncd.pid  
  10. lock file=/var/run/rsyncd.lock  
  11. log file=/var/log/rsyncd.log  
  12.  
  13. [web1]  
  14. path=/opt/www/  
  15. comment=web file  
  16. ignore errors  
  17. read only=no  
  18. write only=no  
  19. list=false  
  20. hosts allow=*  
  21. uid=root  
  22. gid=root  
  23. auth users=web1  
  24. secrets file=/etc/rsyncd.password  
  25.  
  26. //web2节点的rsyncd.conf配置如下  
  27. uid=nobody                           
  28. gid=nobody  
  29. user chroot=no  
  30. max connections=200  
  31. strict modes=no  
  32. timeout=600  
  33. pid file=/var/run/rsyncd.pid  
  34. lock file=/var/run/rsyncd.lock  
  35. log file=/var/log/rsyncd.log  
  36.  
  37. [web2]  
  38. path=/opt/www/  
  39. comment=web file  
  40. ignore errors  
  41. read only=no  
  42. write only=no  
  43. list=false  
  44. hosts allow=*  
  45. uid=root  
  46. gid=root  
  47. auth users=web2  
  48. secrets file=/etc/rsyncd.password  
  49.  
  50. //web3节点的rsyncd.conf配置如下  
  51. uid=nobody                           
  52. gid=nobody  
  53. user chroot=no  
  54. max connections=200  
  55. strict modes=no  
  56. timeout=600  
  57. pid file=/var/run/rsyncd.pid  
  58. lock file=/var/run/rsyncd.lock  
  59. log file=/var/log/rsyncd.log  
  60.  
  61. [web3]  
  62. path=/opt/www/  
  63. comment=web file  
  64. ignore errors  
  65. read only=no  
  66. write only=no  
  67. list=false  
  68. hosts allow=*  
  69. uid=root  
  70. gid=root  
  71. auth users=web3  
  72. secrets file=/etc/rsyncd.password  
  73.  
  74.  
  75. 注释:  
  76. uid:指定当该模块传输文件时守护进程应该具有的用户ID。  
  77. gid:指定当该模块传输文件时守护进程应该具有的用户组ID。  
  78. max connections:指定模块最大并发数,以保护服务器。超过限制的链接请求将被暂时限制。  
  79. strict modes:指定是否检查口令文件的权限。  
  80. pid file:指定守护进程对应的PID文件路径。  
  81. lock file:指定支持max connections的锁文件路径。  
  82. log file:指定rsync的日志输出文件路径。  
  83. [www1]:表示定义一个模块的开始,www1就是对应的模块名称  
  84. path:用来指定需要备份的文件或目录。  
  85. ignore errors:表示可以忽略一些无关的I/O错误。  
  86. read only:设置为no表示客户端可以上传文件,设置为yes表示只读。  
  87. write only:设置为no表示客户端可以下载文件,设置为yes表示不能下载。  
  88. hosts allow:设置可以连接rsync服务器的主机,"*"表示允许连接的任何主机。  
  89. hosts deny:设置禁止连接rsync服务器的主机地址。  
  90. list:用于设定当客户请求可以使用的模块列表时,该模块是否可以被列出。默认值是true,如果需要建立隐藏的模块,可以设置为false。  
  91. auth users:用于认证的用户。  
  92. secrets file:指定一个包含认证用户的密码文件,格式为"用户名:密码"。 

 接下来,需要在web1、web2和web3这三台服务器上创建用户名和密码认证文件:

  
  
  
  
  1. //首先登入到web1服务器  
  2. echo "web1:web1" >> /etc/rsyncd.password  
  3.  
  4. //然后登入到web2服务器  
  5. echo  "web2:web2" >> /etc/rsyncd.password  
  6.  
  7. 最后登入到web3服务器  
  8. echo "web3:web3" >> /etc/rsyncd.password 

  因为rsync是超级服务,所以需要通过xinetd进行启动。每台rsync主机需要安装和配置xinet服务:

  
  
  
  
  1. yum -y install xinetd               //安装xinetd服务  
  2.  
  3. //配置rsync服务  
  4. vi /etc/xinetd.d/rsync  
  5.  
  6. default: off  
  7. # description: The rsync server is a good addition to an ftp server, as it \  
  8. #       allows crc checksumming etc.  
  9. service rsync  
  10. {  
  11.         disable =       no  
  12.         flags           = IPv6  
  13.         socket_type     = stream  
  14.         wait            = no  
  15.         user            = root  
  16.         server          = /usr/bin/rsync  
  17.         server_args     = --daemon --config=/etc/rsyncd.conf  
  18.         log_on_failure  += USERID  
  19. }  
  20.  
  21. server_args   --daemon --config=/etc/rsyncd.conf   //指定rsync的配置文件路径  

 至此,rsync已经配置完毕。由于服务器都在局域网内,所以需要将iptables和selinux需要关闭:

  
  
  
  
  1. service  iptables stop              //关闭iptables防火墙  
  2. chkconfig --level 2345 iptables off //关闭iptables开机自动启动  
  3. setenforce 0                        //临时关闭SELINUX  
  4. sed -i  's/SELINUX=enforcing/SELINUX=disabled/'   
  5. /etc/selinux/config                 //永久关闭SELINUX 

          现在可以在Server端进行测试:

  
  
  
  
  1. //首先在server端测试web1服务器  
  2. 1.首先创建密码文件,进行验证。  
  3. echo "web1" >> /etc/rsyncd.password  
  4. 2.测试web1是否可以实现数据同步。  
  5. rsync -vzrtopg --delete  --progress  [email protected]::web1  /data/www --password-file=/etc/rsyncd.password  
  6.  
  7. //然后在server端测web2服务器  
  8. 1.首先创建密码文件,进行验证。  
  9. echo "web2" >> /etc/rsyncd.password  
  10. 2.测试web2是否可以实现数据同步。  
  11. rsync -vzrtopg --delete  --progress  [email protected]::web2  /data/www --password-file=/etc/rsyncd.password  
  12.  
  13. //最后在server端测试web3服务器  
  14. 1.首先创建密码文件,进行验证。  
  15. echo "web3" >> /etc/rsyncd.password  
  16. 2.测试web3是否可以实现数据同步。  
  17. rsync -vzrtopg --delete  --progress  [email protected]::web3  /data/www --password-file=/etc/rsyncd.password  

  至此,rsync的安装、配置和测试已经完成。

7.安装inotify工具inotify-tools

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

  前面已经介绍了rsync可以实现数据同步,但是rsync自身没有实时同步的功能。如果想实现数据同步,必须每次执行rsync命令。而inotify正好弥补了rsync的不足,可以实现实时功能。

  接下来安装inotify工具(该工具安装在server端,web端不需要安装),在安装inotify之前首先检查目前操作系统版本是否支持inotify:

  
  
  
  
  1. //首先查看Linux内核版本  
  2. [root@webserver ~]# uname -r  
  3. 2.6.32-71.el6.x86_64  
  4.  
  5. //然后查看inotify  
  6. [root@webserver ~]# ll /proc/sys/fs/inotify  
  7. total 0  
  8. -rw-r--r-- 1 root root 0 Apr 19 14:24 max_queued_events  
  9. -rw-r--r-- 1 root root 0 Apr 19 14:24 max_user_instances  
  10. -rw-r--r-- 1 root root 0 Apr 19 14:24 max_user_watches 

 通过如上结果,可以看出该系统是支持inotify的。所以,接下来可以安装inotify-tools工具:

  • 首先下载最新版本的inotify-tools软件包

  •  解压缩,并安装

        
        
        
        
    1. //解压缩软件包  
    2. [root@webserver src]# tar -zxvf inotify-tools-3.14.tar.gz  
    3.  
    4. //安装软件包  
    5. [root@webserver inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify && make && make install  
    6.  
  •  查看inotifywait相关参数

  inotify-tools安装完成。安装目录在/usr/local/inotify。其实主要用的/usr/local/inotify/bin/inotifywait命令:

               

  
  
  
  
  1. //inotifywait 是一个监控等待事件,可以配合shell脚本使用它。inotify具体参数:  
  2.  
  3. -m:即"--monitor",表示始终保持事件监控状态。  
  4. -r:即"--recursive",表示递归查询目录。  
  5. -q:即"--quiet",表示打印出监控事件。  
  6. -e:即"--event",通过此参数可以指定要监控的事件,常见的事件有modify、delete、create和attrib等。 
   

8.配置内容发布节点

 将代码放在Server端,实现其它web服务器同步。首先创建rsync.shell,rsync.shell代码如下

  
  
  
  
  1. #!/bin/bash  
  2. host1=133.96.7.100  
  3. host2=133.96.7.101  
  4. host3=133.96.7.102  
  5.  
  6. src=/data/www/  
  7. dst1=web1  
  8. dst2=web2  
  9. dst3=web3  
  10. user1=web1  
  11. user2=web2  
  12. user3=web3  
  13.  
  14. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src |while read files  
  15. do 
  16.     rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user1@$host1::$dst1 
  17.     rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user2@$host2::$dst2 
  18.     rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user3@$host3::$dst3 
  19. done  
  20.  
  
  
  
  
  1. //脚本中相关参数解释  
  2.  
  3. --timefmt:指定时间的输出格式。  
  4. --format:指定变化文件的纤细格式  
  5.  
  6. //接着,更改脚本权限,放到后台运行  
  7. chmod 755 /bin/rsync.sh  
  8. /bin/rsync.sh &  
  9.  
  10. //最后,将此脚本加入到系统自启动文件  
  11. echo "/bin/rsync.sh" >> /etc/rc.local 

 这样就完成了系统的整个部署工作。

你可能感兴趣的:(centos,rsync,inotify,6)