一个客户准备上一个项目,采用的是前台一台Nginx服务器用作反向代理+多台TOMCAT后端服务器(每台服务器代码内容相同,主要为防止一台机器宕机不会影响系统的正常使用)。考虑到后期业务量不断的增长,可能后端TOMCAT服务器的数量也会增加。所以,对TOMCAT服务器代码管理是需要考虑的一个问题。由于客户不准备上共享存储,经过商量最终准备选择rsync +inotify实现代码实时同步。
1.rsync介绍
之前大多数项目采用的是共享存储,很少使用rsync。现在,首先了解一下什么是rsync。rsync是Linux/UNIX系统下文件同步和数据传输工具,它采用"rsync"算法使一个客户端和远程文件服务器之间进行文件同步。通过rsync可以将同一个服务器上得数据从一个分区备份到另外一个分区,也可以将本地系统的数据通过网络传输协议方式备份到任何一个远程主机上;rsync可以在中断之后恢复传输;rsync值传输源文件和目标文件之间不一致的部分;rsync可以执行完整备份或者增量备份。
2.rsync的功能特性
大概了解了什么是rsync。接下来了解一下rsync的功能和特性,rsync有如下特性:
3.rsync的应用模式
rsync有四种应用模式,第一种是Shell应用模式,也称为本地模式;第二种是远程shell模式,它利用SSH执行底层连接和加密传输;第三种是查询模式,与ls命令实现功能类似;最后一种是服务器模式,平时所说的假设rsync服务器就是指这种模式。根据客户要求,我们准备选择第四种模式,即rsync服务器模式。
4.rsync服务器模式
rsync服务器模式是基于C/S模式的,在这种模式下,rsync在后台启用了一个守护进程,这个守护进程在rsync服务器端永久运行,用于接收文件传输请求,因此,客户端既可以把文件发送给守护进程,也可以向守护进程请求文件。
5.搭建rsync环境
- Web1:内核:2.6.32-71.el6.x86_64;用途:服务节点1;ip地址:133.96.7.100;网站根目录:/opt/www。
- Web2:内核:2.6.32-71.el6.x86_64;用途:服务节点2;ip地址:133.96.7.101;网站根目录:/opt/www。
- Web3:内核:2.6.32-71.el6.x86_64;用途:服务节点3;ip地址:133.96.7.102;网站根目录:/opt/www。
- Server:内核:2.6.32-71.el6.x86_64;用途:服务节点4;ip地址:133.96.7.103;网站根目录:/opt/www。
6.安装rsync
安装rsync可以使用源码包或者二进制包两种方式进行安装,在此案例中采用二进制包进行安装,代码如下:
- yum -y install rsync //安装rsync
由于rsync安装比较简单,这里不再过多进行阐述安装。接下来,进行配置rsync。rsync默认可执行文件安装在/usr/bin/rsync;配置文件一般/etc/rsyncd.conf,配置文件需要自己进行创建,配置文件代码如下:
- //web1节点的rsyncd.conf配置如下
- uid=nobody
- gid=nobody
- user chroot=no
- max connections=200
- strict modes=no
- timeout=600
- pid file=/var/run/rsyncd.pid
- lock file=/var/run/rsyncd.lock
- log file=/var/log/rsyncd.log
- [web1]
- path=/opt/www/
- comment=web file
- ignore errors
- read only=no
- write only=no
- list=false
- hosts allow=*
- uid=root
- gid=root
- auth users=web1
- secrets file=/etc/rsyncd.password
- //web2节点的rsyncd.conf配置如下
- uid=nobody
- gid=nobody
- user chroot=no
- max connections=200
- strict modes=no
- timeout=600
- pid file=/var/run/rsyncd.pid
- lock file=/var/run/rsyncd.lock
- log file=/var/log/rsyncd.log
- [web2]
- path=/opt/www/
- comment=web file
- ignore errors
- read only=no
- write only=no
- list=false
- hosts allow=*
- uid=root
- gid=root
- auth users=web2
- secrets file=/etc/rsyncd.password
- //web3节点的rsyncd.conf配置如下
- uid=nobody
- gid=nobody
- user chroot=no
- max connections=200
- strict modes=no
- timeout=600
- pid file=/var/run/rsyncd.pid
- lock file=/var/run/rsyncd.lock
- log file=/var/log/rsyncd.log
- [web3]
- path=/opt/www/
- comment=web file
- ignore errors
- read only=no
- write only=no
- list=false
- hosts allow=*
- uid=root
- gid=root
- auth users=web3
- secrets file=/etc/rsyncd.password
- 注释:
- uid:指定当该模块传输文件时守护进程应该具有的用户ID。
- gid:指定当该模块传输文件时守护进程应该具有的用户组ID。
- max connections:指定模块最大并发数,以保护服务器。超过限制的链接请求将被暂时限制。
- strict modes:指定是否检查口令文件的权限。
- pid file:指定守护进程对应的PID文件路径。
- lock file:指定支持max connections的锁文件路径。
- log file:指定rsync的日志输出文件路径。
- [www1]:表示定义一个模块的开始,www1就是对应的模块名称
- path:用来指定需要备份的文件或目录。
- ignore errors:表示可以忽略一些无关的I/O错误。
- read only:设置为no表示客户端可以上传文件,设置为yes表示只读。
- write only:设置为no表示客户端可以下载文件,设置为yes表示不能下载。
- hosts allow:设置可以连接rsync服务器的主机,"*"表示允许连接的任何主机。
- hosts deny:设置禁止连接rsync服务器的主机地址。
- list:用于设定当客户请求可以使用的模块列表时,该模块是否可以被列出。默认值是true,如果需要建立隐藏的模块,可以设置为false。
- auth users:用于认证的用户。
- secrets file:指定一个包含认证用户的密码文件,格式为"用户名:密码"。
接下来,需要在web1、web2和web3这三台服务器上创建用户名和密码认证文件:
- //首先登入到web1服务器
- echo "web1:web1" >> /etc/rsyncd.password
- //然后登入到web2服务器
- echo "web2:web2" >> /etc/rsyncd.password
- 最后登入到web3服务器
- echo "web3:web3" >> /etc/rsyncd.password
因为rsync是超级服务,所以需要通过xinetd进行启动。每台rsync主机需要安装和配置xinet服务:
- yum -y install xinetd //安装xinetd服务
- //配置rsync服务
- vi /etc/xinetd.d/rsync
- # default: off
- # description: The rsync server is a good addition to an ftp server, as it \
- # allows crc checksumming etc.
- service rsync
- {
- disable = no
- flags = IPv6
- socket_type = stream
- wait = no
- user = root
- server = /usr/bin/rsync
- server_args = --daemon --config=/etc/rsyncd.conf
- log_on_failure += USERID
- }
- server_args --daemon --config=/etc/rsyncd.conf //指定rsync的配置文件路径
至此,rsync已经配置完毕。由于服务器都在局域网内,所以需要将iptables和selinux需要关闭:
- service iptables stop //关闭iptables防火墙
- chkconfig --level 2345 iptables off //关闭iptables开机自动启动
- setenforce 0 //临时关闭SELINUX
- sed -i 's/SELINUX=enforcing/SELINUX=disabled/'
- /etc/selinux/config //永久关闭SELINUX
现在可以在Server端进行测试:
- //首先在server端测试web1服务器
- 1.首先创建密码文件,进行验证。
- echo "web1" >> /etc/rsyncd.password
- 2.测试web1是否可以实现数据同步。
- rsync -vzrtopg --delete --progress [email protected]::web1 /data/www --password-file=/etc/rsyncd.password
- //然后在server端测web2服务器
- 1.首先创建密码文件,进行验证。
- echo "web2" >> /etc/rsyncd.password
- 2.测试web2是否可以实现数据同步。
- rsync -vzrtopg --delete --progress [email protected]::web2 /data/www --password-file=/etc/rsyncd.password
- //最后在server端测试web3服务器
- 1.首先创建密码文件,进行验证。
- echo "web3" >> /etc/rsyncd.password
- 2.测试web3是否可以实现数据同步。
- 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:
- //首先查看Linux内核版本
- [root@webserver ~]# uname -r
- 2.6.32-71.el6.x86_64
- //然后查看inotify
- [root@webserver ~]# ll /proc/sys/fs/inotify
- total 0
- -rw-r--r-- 1 root root 0 Apr 19 14:24 max_queued_events
- -rw-r--r-- 1 root root 0 Apr 19 14:24 max_user_instances
- -rw-r--r-- 1 root root 0 Apr 19 14:24 max_user_watches
通过如上结果,可以看出该系统是支持inotify的。所以,接下来可以安装inotify-tools工具:
首先下载最新版本的inotify-tools软件包
解压缩,并安装
- //解压缩软件包
- [root@webserver src]# tar -zxvf inotify-tools-3.14.tar.gz
- //安装软件包
- [root@webserver inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify && make && make install
查看inotifywait相关参数
inotify-tools安装完成。安装目录在/usr/local/inotify。其实主要用的/usr/local/inotify/bin/inotifywait命令:
- //inotifywait 是一个监控等待事件,可以配合shell脚本使用它。inotify具体参数:
- -m:即"--monitor",表示始终保持事件监控状态。
- -r:即"--recursive",表示递归查询目录。
- -q:即"--quiet",表示打印出监控事件。
- -e:即"--event",通过此参数可以指定要监控的事件,常见的事件有modify、delete、create和attrib等。
8.配置内容发布节点
将代码放在Server端,实现其它web服务器同步。首先创建rsync.shell,rsync.shell代码如下:
- #!/bin/bash
- host1=133.96.7.100
- host2=133.96.7.101
- host3=133.96.7.102
- src=/data/www/
- dst1=web1
- dst2=web2
- dst3=web3
- user1=web1
- user2=web2
- user3=web3
- /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
- do
- rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user1@$host1::$dst1
- rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user2@$host2::$dst2
- rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user3@$host3::$dst3
- done
- //脚本中相关参数解释
- --timefmt:指定时间的输出格式。
- --format:指定变化文件的纤细格式
- //接着,更改脚本权限,放到后台运行
- chmod 755 /bin/rsync.sh
- /bin/rsync.sh &
- //最后,将此脚本加入到系统自启动文件
- echo "/bin/rsync.sh" >> /etc/rc.local
这样就完成了系统的整个部署工作。