码迷,mamicode.com
首页 > 其他好文 > 详细

使用sersync完成远程触发式文件同步

时间:2015-07-21 22:22:53      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:服务器   技术   监控   集群   

在做网站或者文件服务集群时,通常会用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)验证服务是否启动

[root@mail 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


使用sersync完成远程触发式文件同步

标签:服务器   技术   监控   集群   

原文地址:http://hld1992.blog.51cto.com/10543286/1676855

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!