在分布式应用中会遇到一个问题,就是多个服务器间的文件如何能始终保持一致。一种经典的办法是将须要保持一致的文件存储在NFS上,这种方法虽然简单方便但却将原本多点的应用在文件存储上又变成了单点,这违背了分布式应用部署的初衷。为了保留多点特性,文件仍然保存在各服务器上,那就须要在每一个服务器中保持文件的同步。linux
服务器同步的解决方案有不少。比较流行的有inotify-tools+rsync和Openduckbill(依赖于inotify-tools)。如今介绍一个解决方案sersync,相对上面两个项目有如下优势:c++
当前版本的sersync依赖于rsync进行同步。以下图所示,在同步主服务器上开启sersync,将监控路径中的文件同步到目标服务器,所以须要在主服务器配置sersync,在同步目标服务器配置rsync。对于rsync配置,在google上能够找到不少资料,如下只是一些必要的配置和使用说明,仅供参考,请根据您的实际状况修改。ssh

如图所示,须要在同步主服务器上配置sersync,在同步目标服务器配置rsync,并在目标服务器开启rsync守候进程,这样在主服务器产生的文 件,就会被sersync实时同步到多个目标服务器。在centos系统下默认已经安装了rsync,只需进行配置,并开启rsync守候进程便可。socket
配置同步目标服务器rsync
在多台目标服务器上配置以下:
vi /etc/rsyncd.conf
uid=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
[tongbu1]
path=/opt/tongbu1
comment = xoyo video files
ignore errors = yes
read only = no
hosts allow = 192.168.0.100/24
hosts deny = *
上面配置文件,代表容许主服务器(假设ip为192.168.0.100)访问,rsync同步模块名为[tongbu1],将同步过来的文件放入path指定的目录/opt/tongbu1。若是有多台从服务器,则每一台都须要进行相似的rsync配置,上面的uid gid要换成您服务器的相应用户,主意rysnc要有对被同步目录的操做权限。配置好以后,使用以下命令,开启rsync守护进程:
rsync --daemon
在主服务器上安装配置sresync
在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件,这里用sersync2.5进行说明,新版本配置形式相似。
1.在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。
./sersync -d
过程以下:
[root@localhost GNU-Linux-x86]# ls
confxml.xml sersync2[root@localhost GNU-Linux-x86]# ./sersync2 -dset the system paramexecute:echo 50000000 > /proc/sys/fs/inotify/max_user_watchesexecute:echo 327679 > /proc/sys/fs/inotify/max_queued_eventsparse the command paramdaemon thread num: 10parse xml config filehost ip : localhost host port: 8008config xml parse successplease set /etc/rsyncd.conf max connections=0 Manuallysersync 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 raterun the sersync:watch path is: /opt/tongbu
代表,sersync已经开启,能够在本地监控路径下创建文件,查看远程是否同步成功。
2.在开启实时监控的以前对主服务器目录与远程目标机目录进行一次总体同步
./sersync -r
若是须要将sersync运行前,已经存在的全部文件或目录所有同步到远程,要以-r参数运行sersync,将本地与远程总体同步一次。
若是设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行总体同步。-r参数将会无效。
3.查看启动参数帮助
./sersync --help
4.指定配置文件
./sersync -o XXXX.xml
对于sersync使用可执行文件目录下的默认配置文件confxml.xml,若是须要使用另外一个配置文件,可使用-o参数指定其它配置文件。
5.指定默认的线程池的线程总数
./sersync -n num
例如 ./sersync -n 5 则指定线程总数为5,若是不指定,默认启动线程池数量是10,若是cpu使用太高,能够经过这个参数调低,若是机器配置较高,能够用-n跳高线程总数。
6.不进行同步,只运行插件
./sersync -m pluginName
例如./sersync -m command,则在监控到文件事件后,不对远程目标服务器进行同步,而是直接运行command插件。
7.多个参数能够配合使用
./sersync -n 8 -o abc.xml -r -d
表示,设置线程池工做线程为8个,指定abc.xml做为配置文件,在实时监控前做一次总体同步,以守护进程方式在后台运行。
8.一般状况下,对本地到远程总体同步一遍后,在后台运行实时同步。
./sersync -d
XML文件说明
sersync可选功能是经过xml配置文件来实现的,基本配置文件以下:
01 |
<? xml version = "1.0" encoding = "ISO-8859-1" ?> |
03 |
< host hostip = "localhost" port = "8008" ></ host > |
05 |
< exclude expression = "(.*)\.gz" ></ exclude > |
06 |
< exclude expression = "^info/*" ></ exclude > |
10 |
< createFolder start = "true" /> |
11 |
< createFile start = "true" /> |
15 |
< localpath watch = "/opt/tongbu" > |
16 |
< remote ip = "192.168.0.104" name = "tongbu1" /> |
21 |
< commonParams params = "-artuz" /> |
22 |
< auth start = "false" users = "root" passwordfile = "/etc/rsync.pas" /> |
23 |
< userDefinedPort start = "false" port = "874" /> |
24 |
< timeout start = "false" time = "100" /> |
27 |
< failLog path = "/tmp/rsync_fail_log.sh" timeToExecute = "60" /> |
28 |
< crontab start = "false" schedule = "600" > |
29 |
< crontabfilter start = "false" > |
30 |
< exclude expression = "*.gz" ></ exclude > |
31 |
< exclude expression = "info/*" ></ exclude > |
34 |
< plugin start = "false" name = "command" /> |
下面作逐行的进行解释说明:
<host hostip="localhost" port="8008"></host>
hostip与port是针对插件的保留字段,对于同步功能没有任何做用,保留默认便可。
filter文件过滤功能
对于sersync监控的文件,会默认过滤系统的临时文件(以“.”开头,以“~”结尾),除了这些文件外,能够自定义其余须要过滤的文件。
<filter start="true">
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
</filter>
将start设置为 true,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以”.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info /*),能够根据须要添加,但开启的时候,本身测试一下,正则表达式若是出现错误,控制台会有提示。相比较使用rsync 的exclude功能,被过滤的路径,不会加入监控,大大减小rsync的通信量。
inotify监控参数设定(优化)
对于inotify监控参数能够进行设置,根据您项目的特色优化srsync。
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
</inotify>
对于大多数应用,能够尝试把createFile(监控文件事件选项)设置为false来提升性能,减小 rsync通信。由于拷贝文件到监控目录会产生create事件与close_write事件,因此若是关闭create事件,只监控文件拷贝结束时的事 件close_write,一样能够实现文件完整同步。
注意:强将createFolder保持为true,若是将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。因此除非特殊须要,请开启。默认状况下对建立文件(目录)事件与删除文件(目录)事件都进行监控,若是项目中不须要删除远程目标服务器的文件(目录),则能够将delete 参数设置为false,则不对删除事件进行监控。
Debug开启
<debug start="false"/>
设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify事件与rsync同步命令。
XFS文件系统
<fileSystem xfs="false"/>
对于xfs文件系统的用户,须要将这个选项开启,才能使sersync正常工做.
文件监控与远程同步设置
<localpath watch="/opt/tongbu">
<remote ip="192.168.0.104" name="tongbu1"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
详见sersync2 彻底安装配置说明(一) —-基本功能使用
Rsync参数配置
<rsync>
<commonParams params="-artuz"/>
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
commonParams能够用户自定义rsync参数,默认是-artuz
auth start=”false” 设置为true的时候,使用rsync的认证模式传送,须要配置user与passwrodfile(–password-file=/etc/rsync.pas),来使用。userDefinedPort 当远程同步目标服务器的rsync端口不是默认端口的时候使用(–port=874)。timeout设置rsync的timeout时间(–timeout=100)。ssh 使用rsync -e ssh的方式进行传输。
失败日志脚步配置
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>
对于失败的传输,会进行从新传送,再次失败就会写入rsync_fail_log,而后每隔一段时间(timeToExecute进行设置)执行该脚本再次从新传送,而后清空该脚本。能够经过path来设置日志路径。
Crontab按期总体同步功能
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.gz"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
crontab能够对监控路径与远程目标主机每隔一段时间进行一次总体同步,可能因为一些缘由两次失败重传都失败了,这个时候若是开启了crontab功 能,还能够进一步保证各个服务器文件一致,若是文件量比较大,crontab的时间间隔要设的大一些,不然可能增长通信开销。schedule这个参数是设置crontab的时间间隔,默认是600分钟
若是开启了filter文件过滤功能,那么crontab总体同步也须要设置过滤,不然虽然实时同步的时候文件被过滤了,但crontab总体同步的时候 若是不单独设置crontabfilter,还会将需过滤的文件同步到远程,crontab的过滤正则与filter过滤的不一样,也给出了两个实例分别对 应与过滤文件与目录。总之若是同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。
插件设置
<plugin start="false" name="command"/>
当设置为true的时候,将文件同步到远程服务器后会调用name参数指定的插件。详见请看插件设置。