目前业内比较靠谱的同步解决方案有:

rsync+inotify-tools,Openduckbill+inotify-tools和rsync+sersync

前两者由于是基于脚本语言编写,所以规范程度,执行效率相对rsync+sersync就稍微弱一些。

sersync是使用c++编写,基于boost1.43.0,inotify api,rsync command开发,主要用于服务器同步,web镜像等功能。其对linux系统文件系统产生的临时文件和重复的文件操作能够进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快,更适合线上使用。

配置同步目标服务器 rsync

但使用rsync+sersync做实时同步时,用于推送文件的服务器运行sersync服务,用于接收文件的服务器则运行rsync守护进程,简单来说就是sersync会利用rsync命令将文件推送到rsync服务器,实际线上使用一般会把sersync作为主服务器,rsync作为镜像服务器,实现数据同步备份,web镜像等功能

 


在同步主服务器上配置sersync (可以不开启 rsync 服务,这样则可以从主服务器向目标服务器推送数据,但不可以从目标服务器向主服务器拉取数据),在同步目标服务器配置 rsync 并开启rsync守候进程,这样在主服务器产生的文件,就会被sersync实时同步到多个目标服务器。在centos系统下默认已经安装了rsync,只需进行配置,并开启rsync守候进程即可。

wKioL1PQxJnDxWX4AAChPq6g4-U389.jpg

主服务器:   192.168.10.10

目标服务器:192.168.10.20 (可以多台目标服务器)

 


 目标服务器

一.安装rsync(centos6.3默认已安装)

# yum install rsync -y


二.新建同步接收目录

#mkdir /data



在多台目标服务器上配置如下,手动配置 rsyncd.conf 配置文件:

三.新建配置文件(此配置文件系统没有,需自己手工建立)

vi /etc/rsyncd.conf 


uid = root 

gid = root 

max connections = 10

use chroot = no 

log file = /var/log/rsyncd.log 

pid file = /var/run/rsyncd.pid 

lock file = /var/run/rsyncd.lock 


[tongbu] 

path = /data 

comment = data 

ignore errors = yes 

read only = no 

hosts allow = 192.168.10.20 

hosts deny = *


    上面配置文件,表明允许主服务器(ip为192.168.10.20 )访问,rsync同步模块名为[tongbu] ,将同步过来的文件放入目标服务器指定的目录 /data 。如果有多台从服务器,则每一台都需要进行类似的配置。


配置好之后,开启rsync守护进程:


#rsync --daemon –-config=/etc/rsync.conf 

#echo "rsync --daemon –-config=/etc/rsync.conf " >> /etc/rc.local (放入开机启动脚本)

四.查看rsync服务是否开启

# netstat -npl |grep 873

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      16921/rsync         

tcp        0      0 :::873                      :::*                        LISTEN      16921/rsync  




在主服务器上安装配置sresync 

在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件,这里用sersync2.5进行说明,新版本配置形式类似。



一.下载sersync源码包

# wget http://sersync.googlecode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz

注:若在64位平台安装则可下载64位sersync源码包,本例用32位

# wget http://sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz


tar -zxvf sersync2.5_64bit_binary_stable_final.tar.gz

cd GNU-Linux-x86



二.创建sersync目录结构

# mkdir /usr/local/sersync

# mkdir /usr/local/sersync/conf

# mkdir /usr/local/sersync/bin

# mkdir /usr/local/sersync/log

# tar zxvf sersync2.5_32bit_binary_stable_final.tar.gz

# cd GNU-Linux-x86/

# cp confxml.xml /usr/local/sersync/conf

# cp sersync2 /usr/local/sersync/bin


三.修改配置文件


#cd /usr/local/sersync/conf/

vi confxml.xml 


修改如下部分:


<sersync> 

        <localpath watch= "/data" > 

           <remote ip= "192.168.10.30" name= "tongbu" />

           <!--<remote ip="0.0.0.0" name="tongbu"/>多个目标服务器则配置多个--> 

        </localpath> 


表示要将主服务器上本地的 /data 路径下的文件,同步到远程服务器   192.168.1.126 上的 tongbu 模块 。


四.设置环境变量:

# echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile

# source /etc/profile



五.在主服务器上开启sersync守护进程 ,使sersync在后台运行,开启实时同步。


#sersync2 -r -d -o  /usr/local/sersync/conf/confxml.xml

#echo "sersync2 -r -d -o  /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local

(加入rc.local自动启动,防止重启后忘记启动) 



六.建立data目录,测试

#mkdir /data

#cd /data

#touch  a b c d e

在rsync目表服务器上查看

#ls /data

a b c d e


实验到此成功。


提示如下:

[root@localhost GNU-Linux-x86]# sersync2 -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 

daemon thread num : 10 

parse xml config file 

host ip : localhost     host port : 8008 

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) 

please according your cpu ,use -n param to adjust the cpu rate 

run the sersync : 

watch path is : /data

---------------------------------------------------------------------------------------------------

表明,sersync已经开启,可以在本地监控路径下建立文件,查看远程是否同步成功。

 

-----------------------------------------------------------------------------------------------------------------------------------------------


运行参数说明:


./sersync -r 在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步


如果需要将sersync运行前,已经存在的所有文件或目录全部同步到远程,要以-r参数运行sersync,将本地与远程整体同步一次。

如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效


./sersync --help 查看启动参数帮助 

 

./sersync -o XXXX.xml 指定配置文件 


./sersync -n num 指定默认的线程池的线程总数 

例如 ./sersync -n 5 则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n跳高线程总数。

 

./sersync -m pluginName 不进行同步,只运行插件 

       例如./sersync -m command,则在监控到文件事件后,不对远程目标服务器进行同步,而是直接运行command插件。

 

-----------------------------------------------------------------------------------------------------------------------------------------------

 

常见错误: 


ERROR: module is read only

rsync error: syntax or usage error (code 1) at main.c(747) [receiver=2.6.8]

rsync: connection unexpectedly closed (4 bytes received so far) [sender]

rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]

解决: 提示打开了read only,将配置文件 read only = no

 

cat /var/log/rsyncd.log

2011/12/14 11:58:37 [22377] name lookup failed for XX.XX.XX.XX: Name or service not known

2011/12/14 11:58:37 [22377] connect from UNKNOWN (XX.XX.XX.XX)

2011/12/14 11:58:37 [22377] rsync to html/ from unknown (XX.XX.XX.XX)

解决:需要在服务端这台机上上的/etc/hosts里面添加客户端机的ip和机器名

 

[root@Dell-R710 ~]# rsync -artuz -R --delete ./ 192.168.1.233::gex

rsync: failed to connect to 61.145.118.206: Connection refused (111)

rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

解决:

一、查看防火墙

二、查看服务端是否开启守护进程

ps ax|grep rsync

rsync --daemon --config=/etc/rsyncd.conf