在做网站或者文件服务集群时,通常会用rsync + inotify的方式实现各服务器间的文件同步,而使用脚本实现同步的效率较为低下,因此,这里我将使用sersync实现这一功能。
1.Inotify简介
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能,内核要求2.6.13以上,inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件,Inotify 可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
备注:上面的文件也包括目录。
2.rsync简介
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
rsync 包括如下的一些特性:
能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
3.sersync简介
sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;
安装方便、配置简单;
使用多线程进行同步,能够保证多个服务器实时保持同步状态;
自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
自带socket与http协议扩展,你可以方便的进行二次开发;
4.使用sersync实现触发式文件同步实例:
实验环境:
主服务器:192.168.1.60
从服务器:192.168.1.66
操作系统版本:Redhat5.8-32bit
(1)从服务器配置:
(a)安装rsync服务
yum install rsync -y
(b)编辑/etc/rsyncd.conf文件,(配置文件通常需要手动创建)
# Rsync configuration file uid = root gid = root port = 873 max connections = 20000 use chroot = yes timeout = 200 log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log format = %t %a %m %f %b auth users = root secrets file = /etc/rsyncd.secrets [webfile] #设置模板 path = /web/test/ #同步文件的目录 comment = "test directory file" list = yes #是否允许列出文件 read only = no ignore errors = yes hosts allow = 192.168.1.60/24 #访问权限 hosts deny = *
(c)rsync密码文件创建
echo "root:redhat" > /etc/rsync.secret chmod 600 /etc/rsync.secret #更改密码文件的权限
(d)启动rsync服务
rsync --daemon --config=/etc/rsyncd.conf
(e)验证服务是否启动
[[email protected] test]# netstat -lntup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7541/rsync tcp 0 0 :::873 :::* LISTEN 7541/rsync
(2)主服务器配置
(a)安装rsync
yum install -y rsync
(b)安装sersync
下载sersync http://www.jb51.net/softs/40308.html
解压并移动至相应目录
tar xf sersync_32bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ /usr/local/sersync/
(c)配置sersync
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <head version="2.5"> <!—服务器地址及端口 –> 3 <host hostip="192.168.1.60" port="8008"></host> 4 <debug start="false"/> 5 <fileSystem xfs="false"/> 6 <filter start="false"> 7 <exclude expression="(.*)\.svn"></exclude> 8 <exclude expression="(.*)\.gz"></exclude> 9 <exclude expression="^info/*"></exclude> 10 <exclude expression="^static/*"></exclude> <!—监控事件的过程中过滤特定文件,和特定文件夹的文件 –> 11 </filter> 12 <inotify> 13 <delete start="true"/> 14 <createFolder start="true"/> 15 <createFile start="false"/> 16 <closeWrite start="true"/> 17 <moveFrom start="true"/> 18 <moveTo start="true"/> 19 <attrib start="false"/> 20 <modify start="alse"/> 21 </inotify> 22 23 <sersync> 24 <localpath watch="/data/test"> <!—设置从服务器的地址和模块 –> 25 <remote ip="192.168.1.66" name="webfile"/> 26 </localpath> 27 <rsync> 28 <commonParams params="-artuz"/> <!—启用认证以及密码文件 –> 29 <auth start="true" users="root" passwordfile="/etc/rsync.secret"/> 30 <userDefinedPort start="false" port="873"/><!-- port=874 --> <!—定义超时时间 –> 31 <timeout start="true" time="100"/><!-- timeout=100 --> 32 <ssh start="false"/> 33 </rsync> 34 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> <!—设置是否启动完全同步,每多少分钟同步一次 –> 35 <crontab start="true" schedule="600"><!--600mins--> <!—完全同步时的过滤条件 –> 36 <crontabfilter start="false"> 37 <exclude expression="*.php"></exclude> 38 <exclude expression="info/*"></exclude> 39 </crontabfilter> 40 </crontab> 41 <plugin start="false" name="command"/> 42 </sersync> 43 44 <plugin name="command"> 45 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> 46 <filter start="false"> 47 <include expression="(.*)\.php"/> 48 <include expression="(.*)\.sh"/> 49 </filter> 50 </plugin> 51 52 <plugin name="socket"> 53 <localpath watch="/opt/tongbu"> 54 <deshost ip="192.168.138.20" port="8009"/> 55 </localpath> 56 </plugin> 57 <plugin name="refreshCDN"> 58 <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> 59 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> 60 <sendurl base="http://pic.xoyo.com/cms"/> 61 <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> 62 </localpath> 63 </plugin> 64 </head>
(d)创建密码文件
echo "redhat" > /etc/rsync.secret
只需要密码即可,否则会报错
(e)启动sersync
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
在主服务器上进行文件更新,检测从服务器是否能够同步成功。
至此,基于sersync实现触发式文件同步的实验完成。
附:
为防止sersync意外关闭,可使用如下脚本
#!/bin/bash #Purpose: Check sersync whether it is alive SERSYNC="/usr/local/sersync/sersync2" CONF_FILE="/usr/local/sersync/confxml.xml" STATUS=$(ps aux |grep ‘sersync2‘|grep -v ‘grep‘|wc -l) if [ $STATUS -eq 0 ]; then $SERSYNC -d -r -o $CONF_FILE & fi
添加至任务计划中
*/5 * * * * /root/script/check_sersync.sh &> /dev/null