金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能,内核要求2.6.13以上,inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好
sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
- sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;
- 安装方便、配置简单;
- 使用多线程进行同步,能够保证多个服务器实时保持同步状态;
- 自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
- 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
- 自带socket与http协议扩展,你可以方便的进行二次开发;
步骤
1.主和从服务器都安装rsync,然后rsync的配置文件和密码文件配置都需要自己建立
vim /etc/rsyncd.conf 内容范例如下
id=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
[tlw.kk22.com]
path=/data0/web/tlw.kk22.com
#comment = 0019 web sersync
ignore errors = yes
read only = no
hosts allow = 192.168.1.237 192.168.1.238
hosts deny = *
auth users = root
secrets file = /etc/rsyncd.passwd
vim /etc/rsyncd.passwd 内容范例如下:
root:123456
需要设置密码文件为600权限,不然同步的时候可能会报错
2.启动rsync服务,一般有两种方式启动,通过daemon的方式启动或者xinetd集成启动方式
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
查看进程是否启动
ps -ef | grep rsync
3.安装sersync
下载sersync包,sersync2.5_64bit_binary_stable_final.tar.gz
解压后拷贝到安装路径 mv GNU-Linux-x86/* /usr/local/sersync
4.serysnc配置文件设置,vim /usr/local/sersync/confxml.xml
......
<sersync>
<localpath watch="/data0/web/tlw.kk22.com">
<!—-设置监控的目录-->
<remote ip="192.168.1.227" name="tlw.kk22.com"/>
<!—设置从服务器的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分钟全部同步一次-->
5.sersync密码文件配置
vim /etc/rsyncd.secret
123456
主服务器的密码配置文件不需要用户,如果添加用户的话同步的时候会报错
6.启动sersync
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
查看进程
ps -ef | grep sersync
将上面的命令添加进/etc/rc.local,以后开机自动启动
7.测试是否触发同步
8.脚本自动监控,防止sersync脚本关掉,自动的去检测该进程是否存在,不存在就启动,脚本内容如下:
#!/bin/bash
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
9.skill掉sersync,测试脚本自动启动