标签:blog http ar io os 使用 sp for strong
序言:如果我们后端有多台网站服务器或者文件服务器,而且没有好的文件同步机制,那么当我们升级程序或者更新文件的时候,就需要每台服务器或者目录都要更新,这样很容易出问题,并很容易导致两边的文件不一致,从而出现很多莫民其妙的问题。因此我们需要使用好的文件同步方式来实现几个后端服务器文件的同步,目前广泛采用的方案是使用rsync+inotify的方式来实现文件的触发更新。原理是采用inotify来对文件进行监控,当监控到文件有文件发生改变的时候,就会调用rsync实现触发式实时同步!本文就来详细介绍金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步
一、 inotify简介
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能,内核要求2.6.13以上,inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件,Inotify 可以监视的文件系统事件包括:
备注:上面的文件也包括目录。
二、 Rsync简介
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
rsync 包括如下的一些特性:
三、 sersync简介
sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
四、 sersync实现触发式文件同步实战
a) 安装rsync
yum -y install rsync
b) 配置rsync
Rsync配置文件的配置
cat /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.secret
[test]
path = /data/test/
comment = "test directory file"
list = yes
read only = no
ignore errors = yes
hosts allow = 192.168.3.205
hosts deny = *
Rsync密码文件的配置
cat /etc/rsyncd.secret
root:abc123@#$
chmod 600 /etc/rsyncd.secret
需要设置密码文件为600权限,不然同步的时候会报password file must not be other-accessible错误!
c) Rsync的启动
Rsync的启动有两种方式,两种方式哪一种都可以,读者可以自行选择:
一种是采用daemon的方式启动:
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
另外一种是xinetd集成启动方式:
chkconfig xined on
chkconfig rsync on
/etc/init.d/xinetd start
d) 验证rsync是否启动
查看进程和端口是否存在
[root@test_machine test]# ps aux | grep rsync
root 3275 0.0 0.0 65516 472 ? Ss 13:44 0:00 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
root 3306 0.0 0.1 71812 936 ? S 14:49 0:00 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
[root@test_machine test]# netstat -lnp | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3275/rsync
tcp 0 0 :::873 :::* LISTEN 3275/rsync
u 安装rsync
yum -y install rsync
u 安装sersync
下载安装文件
wget http://sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz
解压并拷贝到安装目录
tar xzvf sersync2.5_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 /usr/local/sersync
u 配置sersync
Sersync的配置
cat confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>
<sersync>
<localpath watch="/data/test">
<!—-设置监控的目录-->
<remote ip="192.168.3.203" name="test"/>
<!—设置从服务器的IP-->
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/etc/rsyncd.secret"/>
<!—-设置同步的用户名和密码文件-->
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<!—-设置rsync的端口,要和从那边开启的端口一致-->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="300"><!--600mins-->
<!—-设置300分钟全部同步一次-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
</head>
密码文件的配置
cat /etc/rsyncd.secret
abc123@#$
主服务器的密码配置文件不需要用户,如果添加用户的话同步的时候会报
rsync error: error starting client-server protocol (code 5) at main.c(1296) [sender=2.6.8]错误
u 启动sersync
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
将上面的命令添加进/etc/rc.local,以后重启系统以后才能正常同步
u 脚本监控sersync
因为有的时候sersync脚本会自动关掉,因此需要写一个脚本自动的去检测该进程是否存在,不存在就启动,脚本内容如下:
cat /var/script/check_sersync.sh
#!/bin/bash
#Purpose: Check sersync whether it is alive
#Author: Carl Zhang
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 &
else
exit 0;
fi
脚本写好以后,添加到计划任务中去
*/5 * * * * /var/script/check_sersync.sh > /dev/null 2>&1
总结:通过以上几步以后,你从服务器的/data/test就能够从主服务器实时更新,升级的时候只升级主服务器的文件,从服务器也会自动同步过去,减少你的工作量以及出错的概率!
如果读者想了解更多的信息,请直接访问sersync开发者的博客,博客里有更详细的说明!
http://blog.johntechinfo.com/sersyncguild
标签:blog http ar io os 使用 sp for strong
原文地址:http://www.cnblogs.com/liqing1009/p/4172063.html