案例描述:

 

一个CMS内容发布系统,后端采用负载均衡集群部署方案,由一个负载调度节点,3个服务节点及一个内容发布节点构成。

内容发布节点负责将用户发布的数据生成静态页面,同时将静态页面传输给3个服务节点,而负载调度节点负责将用户请求根据负载算法调度到相应的服务节点上,实现用户访问。

用户要求在前端访问到的网页数据始终是最新的。

 

解决方案

 

为了保证用户访问到的数据的一致性和实时性,必须保证3个服务节点上的数据与内容发布节点上的数据始终是一致的,这就需要通过文件同步工具来实现,这里可以采用rsync。同时又要保证数据是实时性的,这就需要inotify,即利用inotify监视内容发布节点文件的变化,如果文件有变动,那么就启动rsync,将文件实时同步到3个服务节点上。

系统环境:

 

     Centos

              LInux操作系统的内核版本与节点信息               

节点名称

内核版本

用途

Ip地址

网页数据路径

Web1

2.6.18

服务节点1

192.168.12.131

/web1/wwwroot

Web2

2.6.18

服务节点2

192.168.12.132

/web2/wwwroot

Web3

2.6.18

服务节点3

192.168.12.133

/web3/wwwroot

server

2.6.18

内容发布节点

192.168.12..134

/web/wwwroot

步骤一、安装rsyncinotify-tools

 

 参照《rsync搭建远程容灾备份系统》和《rsync+inotify实现数据的实时备份》

 Inotify-tools是用来监控文件系统变化的工具,所以必须安装在内容发布节点上,服务节点上无需安装。另外需要在web1web2web3server节点上安装rsync

此案中,内容发布节点充当了rsync客户端的角色,而3个服务节点充当了rsync服务端的角色,整个数据同步的过程其实就是一个从客户端向服务器端发送数据的过程。

步骤二、在3个服务节点上配置rsync

 

 参考配置如下:

 

Web1节点的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 = /web1/wwwroot/

comment = web1 file

ignore errors

read only = no

write only = no

hosts allow = 192.168.12.134

hosts deny = *

list = false

uid = root

gid = root

auth users = web1user

secrets file = /etc/web1.pass

 

Web2节点和web3节点的配置类似,做相应改动即可。

 

在配置完3台服务节点的rsync.conf文件后,一次启动rsync守护进程。并将rsync服务加入到自启动文件中。

 

# echo /usr/local/bin/rsync --daemon” >>/etc/rc.local

 

步骤三、配置内容发布节点

 

配置内容发布节点的主要工作是将生成的静态网页实时同步到集群中3个服务节点上,这个过程可以通过一个shell脚本来完成。

 

脚本内容如下:

 

#!/bin/bash

host1=192.168.12.231

host2=192.168.12.232

host3=192.168.12.233

src=/web/wwwroot/

dst1=web1

dst2=web2

dst3=web3

user1=web1user

user2=web2user

user3=web3user

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y  %H:%M'  --format ' %T  %w%f%e'

-e modify,delete,create,attrib $src | while read files

do

/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1

/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2

/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user3@$host3::$dst3

echo "${files} was rsynced" >> /tmp/rsync.log 2>&1

done

 

注:

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

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

 

特殊情况:

 

有时会遇到这样的情况:向inotify监控的目录中写入一个很大的文件,当写入这个大文件需要一段时间,inotify会持续不断的输出该文件被更新的信息,这样就会持续不断的触发rsync执行同步操作,占用大量的资源。

针对这种情况,最理想的做法是等待文件写完后再触发rsync同步。可以修改inotify的监控事件,即“-e close_write,delete,create,attrib.

给脚本加执行权限,并放到后台执行

#chmod 755 /web/wwwroot/inotifyrsync.sh

#//web/wwwroot/inotifysync.sh &

并将脚本加入系统自启动文件中。

#echo "/web/wwwroot/inotifyrsync.sh  &" >>/etc/rc.local

 

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