aliyun linux 5.7配置使用rsync和inotify实现集群配置时文件的自动同步
客户这次的网站要求使用多个服务器结合前置负载均衡的方式进行部署,服务器使用阿里云的ecs,操作系统选择了aliyun linux 5.7,使用SLB做负载均衡,网站选用鸿雪径网站内容管理系统进行建设。
上线之初使用3台ECS服务器,清单如下:
mainServer:具有1M互联网带宽,部署nginx、2个tomcat、squid(正向代理)
appServer1:不具有互联网带宽,部署nginx、2个tomcat
appServer2:不具有互联网带宽,部署nginx、2个tomcat
内容管理系统管理节点部署在mainServer,程序文件等均在此文件发布,需要实时同步到appServer1和appServer2。
考虑到实时性,最终采用了rsync结合inotify的方案。
该方案需要在mainServer部署rsync客户端和inotify tools;在appServer1/2部署rsync服务端。
首先我们在mainServer安装inotify tools,这个比较简单,aliyun linux基于2.6.18内核,已经默认支持inotify。我们只要安装扩展的工具即可。
[root@abcdefg ~]# ll /proc/sys/fs/inotify total 0 -rw-r--r-- 1 root root 0 Mar 7 14:53 max_queued_events -rw-r--r-- 1 root root 0 Mar 7 14:53 max_user_instances -rw-r--r-- 1 root root 0 Mar 7 14:53 max_user_watches
只要执行ll /proc/sys/fs/inotify,输出如上内容,那么就是支持inotify的。
inotify最新版本是3.1.4的,已经好长时间没更新,不过不影响我们的使用。不要从官网下载,按个版本里边没有configure,需要使用autogen.sh来生成,会用到libtool等各种宏扩展,会碰到不少障碍,找已经做好configure的版本,这里我分享一个,大家可以拿来用。
解压后正常进行 ./configure
make
make install
编译完成后执行:
ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 47224 Mar 7 09:04 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 43570 Mar 7 09:04 /usr/local/bin/inotifywatch
看到已经有两个监听。
另外,有一些参数根据需要进行调整:
inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小。下面分别做简单介绍。
/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 888888 > /proc/sys/fs/inotify/max_user_watches
---------------
下面给mainServer安装rsync客户端(在 https://download.samba.org/pub/rsync/ 查看最新版本 )
cd /usr/local/src
wget https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz
tar -zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure
make
make install
----------------------------
同理给appserver1/2分别安装rsync,过程与刚才mainserver的一致。
在appserver1配置rsync的服务,
vi /etc/rsyncd.conf
-------
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web1]
path = /webservers/webapps/
comment = www01
ignore errors
read only = no
write only = no
hosts allow = mainserver的ip地址
hosts deny = *
list = false
uid = root
gid = root
auth users = www01
secrets file = /etc/rsyncServer.pass
------
我们需要生成/etc/rsyncServer.pass的用户名密码文件
vi /etc/rsyncServer.pass
内容格式是用户名:密码,一行一个。
比如我们写入:
www01:abcdefg
注意要把这个文件设置成600
chmod 600 /etc/rsyncServer.pass
配置完成之后我们启动rsync,执行
rsync --daemon
不报错,那么我们的rsync服务端就启动了。
检查873端口是否已经监听:
netstat -na|grep 873
可以成功监听那把rsync服务加入开机启动:
echo "rsync --daemon" >> /etc/rc.local
同理配置appserver2
都配置完成后,回到mainserver
我们建立一个/etc/server.pass文件
vi /etc/server.pass
内容就是密码。例如:abcdefg
注意这里与服务端的差异,这里没有用户名!!!
同样需要chmod 600
配置完成之后我们测试一下是否可以联通
输入如下命令:
rsync -vzrtopg --delete --progress --password-file=/etc/server.pass /webservers/webapps/rsync.txt www01@appserver1的ip地址::web1
如果传输正常,那么我们就可以继续了。
新建一个inotifyrsync.sh文件
vi inotifyrsync.sh
---------------
#!/bin/bash
www01=appserver1的ip
src=/webservers/webapps/
dst1=web1
user1=www01
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src
| while read files
do
/usr/local/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$www01::$dst1
#这里可以放第二个目的 /usr/local/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$www01::$dst1
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
----------
保存后加入执行权限
chmod +x inotifyrsync.sh
把这个脚本加入到/etc/rc.local,以便开机自动运行。
我们进入自己的目录传一些文件进行一下测试,看看在appserver1、2是否正常进行了同步!
- 卸载aliyun linux 15预装的java运行环境openjdk 1.6(2016-01-30)
- aliyun linux配置vsftpd及配置iptables允许连接(2015-03-11)
- aliyun linux 5.7直接使用aliyun提供的源(2015-02-01)
- 在aliyun linux 5.7下配置nginx服务器(senginx)(2014-09-24)
- aliyun linux 5.7更换使用centos的yum源(2014-09-23)
- 在aliyun linux下安装libmcrypt库(2014-09-21)