Sersync概述
Sersync 是周洋开发的一款基于 inotify + rsync 的大量文件的多服务器自动同步程,开源协议为 New BSD License。
工作原理 以及架构
  使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件,被监听目录下如果有文件发生修改,sersync 将通过内核自动捕获到事件,并将该文件利用 rsync 同步到多台远程服务器。sersync 仅仅同步发生增、删、改事件的单个文件或目录,不像rsync镜像同步那样需要比对双方服务器整个目录下数千万的文件,并且支持多线程同步,因此效率非常高。
spacer.gifSersync安装与部署_sersync+notify_02
(1)使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件,如果inotify有变化,则形成对列事件(队列过滤)
(2)过滤队列的建立是为了过滤短时间内产生重复的inotify信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里面的文件与删除文件夹的事情。通过过滤队列,当删除文件夹事件产生的时候,会将直接加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹事件,从而减轻了同步的服务器。同时对于修改文件的操作的时候,会产生临时文件的重复操作
(3)同组线程组是的等待队列的守护进程,当事件队列中有事情产生的时候,线程组守护进程就会逐个唤醒同步线程,当队列中的Inoitfy事件比较多的时候,同    步线程就会被全部唤醒一起工作。这样就可以同时并发的处理多个inotify事件。
(4)在每个线程工作的时候,线程会根据服务器上新写入文件的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步。
(5)同步的服务
(6)调用的一些插件
(7)失败队列
(8)对失败的队列进行一些处理如:

         首先处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,进

         行记录

        同时定期某个小时执行一次脚本,同时清空脚本(默认10个小时,可以在配置文件中进行修改)
        crontab功能,每隔某个时间段,将所有的路径整体同步一次


Sersync的应用:

  无论编辑通过 Web 还是 FTP 上传图片、视频、附件,还是直接去发布服务器上增加、修改、删除文件,干完这些事情后不用做任何处理,sersync 会自动将发生增、删、改事件的文件同步到远程服务器,并可以在文件同步完成后,自动调用 CDN(ChinaCache)缓存刷新接口,刷新发生修改、删除的文件的访问 URL。


一、Sersync部署前期准备工作
Sersync安装与部署_sersync原理_03

1.查看rsync的版本信息 (centos默认已经安装)

[root@Rsync_2 ~]# rsync --version|head -2
rsync version 3.0.6 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

2.查看操作系统内核版本

[root@Rsync_2 ~]# cat /etc/redhat-release
CentOS release 5.10 (Final)
[root@Rsync_2 ~]# uname -r
2.6.18-371.el5
[root@Rsync_2 ~]# uname -mi
i686 i386

3.部署192.168.1.2/3Rsync服务

注意:centos默认已经安装此服务

[root@Rsync_2 ~]# which rsync
/usr/bin/rsync

4.修改rsyncd服务的配置文件
默认是没有这个配置文件的,直接在/etc目录下面创建就好了。如果需要查看目录下面的详细参数可以man rsyncd.conf

同时在Rsync_1和Rsync_2上面同时增加如下配置文件:

[root@Rsync_2 ~]# vim /etc/rsyncd.conf
uid = root      #指定用户的uid
gid = root      #指定用户的gid
use chroot = no #指定是否能够使用chroot改变程序执行时所参考的根目录位置
max connections = 2000  #最大连接数
timeout = 600           #超时时间
pid file = /var/run/rsyncd.pid  #pid文件
lock file = /var/run/rsync.lock #指定lock存放文件
log file = /var/log/rsyncd.log  # 指定日志存放的文件
ignore errors     #忽略错误
read only = false #如果设置的false,是允许上传文件的
list = false                   #
hosts allow = 192.168.1.0/24   #允许访问的iP段
hosts deny = 0.0.0.0/32        #拒绝的访问的ip段
auth users = rsync_back        #认证的用户
secrets file = /etc/rsync.password   #指定rsync用户的密码文件
#####################################
[www]                  # 模块
comment = www          # 对于模块的描述
path = /data/www/www/  # 指定模块的路径
#####################################
[bbs]
comment = bbs
path = /data/www/bbs/
#####################################
[blog]
comment = blog
path = /data/www/blog/

5.新增Rsync验证的用户名和密码
注意:Rsync的验证文件,只能是600的权限,否则会保存。目标的同步的节点是用户名:密码,同步节点只要添加密码就好了。
[root@Rsync_2 ~]# vim /etc/rsync.password
rsync_backup:654321
[root@Rsync_2 ~]# chmod 600 /etc/rsync.password
[root@Rsync_2 ~]# ll /etc/rsync.password
-rw------- 1 root root 20 Jan 2 00:01 /etc/rsync.password
[root@Sersync www]# echo "654321" >>/etc/rsync.password
[root@Sersync www]# cat /etc/rsync.password
654321
[root@Sersync www]# chmod 600 /etc/rsync.password
[root@Sersync www]# ll /etc/rsync.password
-rw------- 1 root root 7 01-09 02:31 /etc/rsync.password


6.Rsync服务的启动与停止,已经启动状况查看

[root@Rsync_2 ~]# rsync --daemon   # rsync 服务启动
[root@Rsync_2 ~]# ps -ef|grep -v grep |grep rsync  # 查看启动服务的进程
root 4514 1 0 00:03 ? 00:00:00 rsync --daemon
[root@Rsync_2 ~]# netstat -ltn|grep 873  #查看启动服务的端口
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
[root@Rsync_2 ~]# lsof -i tcp:873        #根据启动服务的端口,查看进程
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 4514 root 3u IPv4 12189 0t0 TCP *:rsync (LISTEN)
[root@Rsync_2 ~]# pkill rsync    #rysnc服务的停止
[root@Rsync_2 ~]# ps -ef|grep -v grep |grep rsync
[root@Rsync_2 ~]# netstat -ltn|grep 873
[root@Rsync_2 ~]# lsof -i tcp:873


7.rsync服务测试

在三台服务器/data/www/上创建三个目录:www bbs blog 用于数据同步的目录


[root@Sersync sersync]# mkdir -p /data/www/www
[root@Sersync sersync]# cd /data/www/
[root@Sersync www]# mkdir bbs blog
[root@Sersync www]# tree
[root@ Rsync_2 ~]# mkdir -p /data/www
[root@ Rsync_2 ~]#cd /data/www
[root@ Rsync_2 www]# mkdir www bbs blog
[root@ Rsync_2 www]# tree
[root@ Rsync_1 ~]# mkdir -p /data/www
[root@ Rsync_1 ~]#cd /data/www
[root@ Rsync_1 www]# mkdir www bbs blog
[root@ Rsync_1 www]# tree
[root@Sersync www]# pwd
/data/www/www
[root@Sersync www]# touch abc  # 创建需要同步的文件


[root@Sersync www]# rsync -avzP /data/www/www/ rsync_back@192.168.1.2::www/ --password-file=/etc/rsync.password
sending incremental file list
./
abc
           0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 73 bytes received 30 bytes 8.96 bytes/sec
total size is 0 speedup is 0.00

命令解释:将本地的/data/www/www用户目录下面的文件,推送到192.168.1.2的www模块指定的用户目录下面(www模块指定的路径是/data/www/www/),

rysnc_back:表示是用户传送验证的用户名(/etc/rsync.password文件中和/etc/rsyncd.conf的auth users)
--password-file :只用用户的密码文件

详细的用法:man rsync

[root@Sersync www]# rsync -avzP /data/www/www/ rsync_back@192.168.1.3::www/ --password-file=/etc/rsync.password
sending incremental file list
./
abc
           0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 73 bytes received 30 bytes 9.81 bytes/sec
total size is 0 speedup is 0.00


在Rsync_1和Rsync_2目录上面查看同步的文件

[root@Rsync_1 www]# tree
.
|-- bbs
|-- blog
`-- www
 `-- abc
[root@Rsync_2 www]# tree
.
|-- bbs
|-- blog
`-- www
    `-- abc

同事出现abc文件说明同步成功


8.Sersync服务安装与部署

[root@Sersync ~]# mkdir -p /home/es/tools
[root@Sersync ~]# cd /home/es/tools/
[root@Sersync tools]# wget http://sersync.googlecode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz
[root@Sersync tools]# tar -zxvf sersync2.5_32bit_binary_stable_final.tar.gz -C /usr/local/
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml


9.规范化sersync文件的目录,便于管理

[root@Sersync tools]# cd /usr/local/
[root@Sersync local]#
[root@Sersync local]# mv GNU-Linux-x86 sersync
[root@Sersync local]# cd sersync/
[root@Sersync sersync]# ll
总计 1496
-rwxr-xr-x 1 root root 2214 2010-07-04 confxml.xml
-rwxr-xr-x 1 root root 1520176 2010-07-04 sersync2
[root@Sersync sersync]# mkdir conf bin logs
conf:用于存放配置文件
bin :    用于存放启动文件

logs :  用户存放日志文件

[root@Sersync sersync]# mv confxml.xml conf
[root@Sersync sersync]# mv sersync2 bin/sersync
[root@Sersync sersync]# tree
.
|-- bin
| `-- sersync
|-- conf
| `-- confxml.xml
`-- logs
3 directories, 2 files

9.修改sersync的配置文件
[root@Sersync sersync]# cp -a conf/confxml.xml conf/confxml.xml.back
[root@Sersync sersync]#vim conf/confxml.xml
       省略部分,下面是主要修改的文件
   <sersync>
       <localpath watch="/data/www/www">   # 指定目录
           <remote ip="192.168.1.3" name="www"/>  # 指定模块
           <remote ip="192.168.1.2" name="www"/>
       </localpath>
       <rsync>
           <commonParams params="-artuz"/>
           <auth start="true" users="rysnc_back" passwordfile="/etc/rsync.password"/> # 开启认证,指定用户名和密码文件
           <userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->  # 开启超时,默认100s
           <ssh start="false"/>
       </rsync>
       <failLog path="/usr/local/sersync/logs/www_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->  # 指定日志文件

 </sersync>


10.配置sersync的环境变量

[root@Sersync www]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Sersync www]# echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile
[root@Sersync www]# source /etc/profile
[root@Sersync www]# which sersync
/usr/local/sersync/bin/sersync

11.启动sersync服务

[root@Sersync www]# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -r rsync all the local files to the remote servers before the sersync work
option: -d run as a daemon
option: -o config xml name: /usr/local/sersync/conf/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is rsync_back
passwordfile is /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data/www/www && rsync -artuz -R --delete ./ --timeout=100 rsync_back@192.168.1.3::www --password-file=/etc/rsync.password >/dev/null 2>&1
[root@Sersync www]# run the sersync:
watch path is: /data/www/www
[root@Sersync www]# ps -ef|grep -v grep |grep sersync
root 6524 1 0 03:33 ? 00:00:01 sersync -r -d -o /usr/local/sersync/conf/confxml.xml
如果你仔细观看,你会发现其实sersync实际上就是使用rsync+inotify进行进行的文件同步
启动命令常用参数:
   sersync -r  :开启实时监控之前对主服务器目录与远程需要同步的目录主机目录进行一次整体的同步
   sersync -o :指定配置文件confxml.xml
   sersync -n num : 指定默认的线程总数
   sersync -d :后台启动服务
   sersync -m :不进行同步,只运行插件
   sersync -help : 帮助


12.文件同步测试

在Sersync服务器上创建文件,看在rsync服务器下面的同步目录能不能相同

[root@Sersync www]# pwd
/data/www/www
[root@Sersync www]# touch www.log
[root@Sersync www]# ll
总计 0
-rw-r--r-- 1 root root 0 01-09 03:34 www.log
[root@Rsync_1 www]# ll
总计 0
-rw-r--r-- 1 root root 0 01-09 03:34 www.log
[root@Rsync_2 www]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 9 2014 www.log


参考文档