Sersync实时同步软件
一、Sersync项目简介与框架设计
1.1项目简介
Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目前广泛使用的本地及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的的部分进行同步,所以其优势大大超过使用挂接文件系统或scp等方式进行镜像同步.
目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令.
相比上面两个项目,sersync项目的优点是:
1.使用c++编写,对linux系统文件产生的临时文件和重复的文件操作会进行过滤(后面会提到),在结合rsync同步的时候,会减少运行时消耗的本地及网络资源.因此速度更快.
2.相比较上面两个项目,sersync配置起来很简单:在http://code.google.com/p/sersync/downloads/list处下载源码(分为32版本与64位版本),其中bin目录下是已经编译好的二进制文件,配合bin目录下的xml文件直接使用即可.
3.使用多线程进行同步(即可以并发同步多个不同文件),尤其在同步较大文件时,能够保证多个服务器实时保持同步状态.
4.sersync自带出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则每10个小时对同步失败的文件再重新同步.
5.sersync自带crontab功能,只需在xml配置文件中开启,即可按预先的配置,隔一段时间整体同步一次.
6.sersync自带socket与http的协议扩展,可以满足有特殊需求的公司二次开发.
1.2基本架构
1.3设计简析
如上图所示:
- 线程组线程是等待线程对列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程,当队列中inotify事件较多的时候就会被全部唤醒一起工作.这样设计的目的是能够同时处理多个inotify事件,从而提升服务器的并发同步能力(核数*2+2).
之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件.
- 服务线程的作用有三个:
- 首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件.
- 同时每隔10个小时执行脚本一次,同时清空脚本.
- 第三个作用是crontab功能,可以每隔一定事件,将所有路径整体同步一次.
- 过滤队列的建立是为了过滤短时间内产生的重复的inotify信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里的文件与删除文件夹的事件,通过过滤对列,当删除文件夹事件产生的时候,会将之前加入对列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹事件,从而减轻了同步的负担.同时对于修改文件的操作的时候,会产生临时文件的重复操作.
1.4
inotify事件举例
当我们在vi一个test文件后进行wq保存操作的时候会产生如下事件:
a)即使把”.”开头与”~”结尾的事件过滤了,对于test文件仍旧有3次操作,分别是删除,创建与保存,通过过滤队列,就只剩下一个事件,一定程度上也提高了同步的效率.
b)过滤队列的第二个作用,即当你在本机删除目录的时候,假设你删除一个有5个文件的目录,inotify会产生6个事件,分别是5个文件删除事件,和一个删除目录事件,如果使用过滤队列,正常情况下会只产生一个删除目录的事件,大大减少了inotify事件的产生,从而减少rsync无谓的同步次数.
(当然,这不是绝对的.如果这6个事件分多次进入队列,那么可能还没来得及过滤,就已经被同步线程从队列中取走同步了.但一定程度上可以减少删除文件夹的同步通信次数)
C)过滤队列的第三个作用,可以过滤监控目录下的文件夹,如果不想同步目录下的一些文件夹,或者一些后缀的文件.对于不需要监控的子文件夹,在inotify启动时候remove掉监控,对于不需监控的子文件,产生的文件事件就会从在入同步队列前过滤掉.如果使用rsync用-exclude参数虽然也可以过滤,但还是与rsync守护进程进行了一次交互.
关于inotify识别事件,详见:http://blog.johntechinfo.com/?p=122及
https://www.ibm.com/developerworks/cn/linux/l-inotifynew/
二、sersync安装配置
2.1Sersync同步需求逻辑图
当前版本的sersync依赖于rsync进行数据同步.如下图所示,在同步主服务器(Master)上开启sersync,sersync负责监控配置路径中的文件系统事件变化,然后调用rsync命令把更新的文件同步到目标服务器(Slave),因此,需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意,是rsync服务).
M-Sersync服务 (监控磁盘事件) |
S1-rsync服务 |
S2-rsync服务 |
如图所示,用户会实时的往左边的同步主服务器(M)上写入或更新文件数据,此时需要在左边的同步主服务器(M)上配置sersync服务,在右边的同步目标服务器S1和S2服务器上配置rsync守护进程服务,这样在主服务器M上产生的写入或更新的文件,就会被sersync服务实时的同步到多个目标服务器(S1,S2等).按照前面的讲解Centos安装过程,默认已经安装了rsync软件,因此在主服务器(M)上有rsync命令即可,在目标服务器(s1,s2)上只需进行简单的配置,并开启rsync守候进程即可.
提示:rsync的守护进程服务,实际上Sersync就是监控本地的数据写入或更新事件,然后,调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器(例如s1,s2)
2.2安装环境准备
2.2.1系统资源列表
角色 |
服务器配置 |
操作系统版本 |
IP |
机器名 |
Sersync服务(M) |
VM |
Centos6.6| 2.6.32-358.el6.i686 |
192.168.125.130 |
M-SERVER |
Rsync服务(s1) |
VM |
Centos6.6| 2.6.32-358.el6.i686 |
192.168.125.128 |
S1-SERVER |
Rsync服务(s2) |
VM |
Centos6.6| 2.6.32-358.el6.i686 |
192.168.125.129 |
S2-SERVER |
2.2.2检查系统环境
cat /etc/redhat-release
uname –r
uname –m
2.3配置同步服务器
2.3.1slave上部署rsync服务
提示:本文的slave机器即为s1,s2 server,即ip为10.0.0.182,10.0.0.183.
2.3.1.1升级rsync到3.0
检查rsync版本,此步操作在所有的机器上都要执行.
[wj@hcf ~]$ rsync --version|head -2
rsync version 3.0.6 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.
如果是较低的5.x系统,rsync的版本为3以下,可通过yum –y install rsync命令来升级,本节非必须操作.
2.3.1.2部署rsync服务
升级完毕后,在多台目标服务器(s1,s2)上配置如下:
/bin/cp /etc/rsyncd.conf /et/rsyncd.conf.wj.$(date+%F)
cat>/etc/rsyncd.conf<<EOF
#Rsync server
#created by wj 2014-6-6
##rsyncd.conf start##
uid=rsync
gid=rsync
use chroot=no
max connections=2000
timeout=600
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
ignore errors
read only=false
list=false
hosts allow=192.168.125.0/24
hosts deny=0.0.0.0/32
auth users=rsync_backup
secrets file=/etc/rsync.password
######################################
[www]
comment=www by wj 18:38 2014-10-13
path=/data0/www/www/
#####################################
[bbs]
comment=www by wj 18:38 2014-10-13
path=/data0/www/bbs/
#####################################
[blog]
comment=www by wj 18:38 2014-10-13
path=/data0/www/blog/
EOF
特别提示:s1,s2的机器192.168.125.128,192.168.125.129同时部署上述服务,本节特意举了一个多目录同步的 例子.实际上就本文而言,大家可以做/data0/www/一个路径就满足了.
less -N /etc/rsync.conf
上面的rsync服务的配置文件,表明允许Sersync主服务器(ip为192.168.125.128)访问,rsync同步模块名为[www],[bbs],[blog],将同步过来的文件分别放入对应path指定的目录/data0/www/bbs/,/data0/www/blog/下.如果有多台目标服务器,则每一台都需要进行类似的rsync服务配置,上面的uid,gid要换成您服务器的相应的同步用户,注意,rsync服务账户(本文用了root)要有对被同步目录(/data0/www)的写入更新权限.
创建相关待同步目录:
mkdir –p /data0/www/bbs/ /data0/www/www/ /data0/www/blog/
tree /data0
提示:此步在s2,s1上都要执行,否则,rsync服务会因为没有path路径而无法启动.
接下来配置相关权限认证:
echo “rsync_backup:wj123”>/etc/rsync.password
chmod 600 /etc/rsync.password
#for check
cat /etc/rsync.password
ll /etc/rsync.password
提示:仅列出可执行的命令列表
配置好之后,使用如下命令,开启rsync守护进程:
rsync –daemon
ps –ef|grep rsync
netstat –lnt|grep 873
lsof –i:873
设置开机自启动
echo “#rsync service daemon by wj 20140616”>>/etc/rc.local
echo “/usr/local/bin/rsync --daemon”>>/etc/rc.local
grep daemon /etc/rc.local
重启命令:
Pkill rsync
Rsync –daemon
ps –ef|grep rsync
提示:大家如果有时间可以写一个正常的启动停止脚本,在rsync课程里已经给出了简单的启动脚本.
2.3.2Master上配置rsync客户端
2.3.2.1Master上配置rsync权限
在Master上配置rsync客户端相关权限认证:
echo “wj123”>/etc/rsync.password
chmod 600 /etc/rsync.password
#for check
Cat /etc/rsync.password
Ll /etc/rsync.password
2.3.2.2Master上手工测试rsync同步情况
特别强调:此步非常关键,如果这里测试不成功,后面的Sersync配好了也不会同步数据.
1)分别创建待同步数据
mkdir –p /data0/www/bbs/ /data0/www/www/ /data0/www/blog/
touch /data0/www/bbs/bbs.log /data0/www/www/www.log /data0/www/blog/blog.log
tree /data0
- 执行同步命令
rsync -avzP /data0/www/www/ rsync_backup@10.0.0.182::www/ --password-file=/etc/rsync.password
rsync -avzP /data0/www/www/ rsync_backup@10.0.0.183::www/ --password-file=/etc/rsync.password
rsync -avzP /data0/www/bbs/ rsync_backup@10.0.0.182::bbs/ --password-file=/etc/rsync.password
rsync -avzP /data0/www/bbs / rsync_backup@10.0.0.183::bbs / --password-file=/etc/rsync.password
rsync -avzP /data0/www/blog/ rsync_backup@10.0.0.182::blog/ --password-file=/etc/rsync.password
rsync -avzP /data0/www/blog/ rsync_backup@10.0.0.183::blog/ --password-file=/etc/rsync.password
提示:在后面进行部署Sersync之前,Sersync主服务器上必须要确保手工可以把文件推送到s1,s2上,这样后续Sersync才能调用这些命令来自动推送.
同步完之后,S1,S2上的对应目录应该有*.log的文件,如下:
tree /data0
2.3.3Master上开始部署Sersync服务
2.3.3.1下载sersync
在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件,这里用sersync2.5进行说明,新版本配置形式类似.
Mkdir –p /home/wj/tools
Cd /home/wj/tools/
wget http://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
2.3.3.2安装sersync
tar –zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz /usr/local
cd /usr/local
mv GNU-Linux-x86 sersync
tree sersync/
2.3.3.3规范sersync目录结构
cd /usr/local/sersync/
mkdir conf bin logs
mv confxml.xml conf/
mv sersync2 bin/sersync
tree
2.3.3.4配置sersync
/bin/cp conf/confxml.xml conf/confxml.xml.wj.$(date+%F)
初始的配置文件:
cat –n conf/confxml.xml
更改优化sersync配置:
- 修改24-28行的部分,原内容为:
<localpath watch=”/opt/tongbu”>
<remote ip=”127.0.0.1” name=”tongbu1”/>
<!--<remote ip=”192.168.8.39” name=”tongbu”/>-->
<!--<remote ip=”192.168.8.40” name=”tongbu”/>-->
</localpath>
修改后内容为:
<localpath watch=”/data0/www/www”>
<remote ip=”10.0.0.182” name=”www”/>
<remote ip=” 10.0.0.183” name=” www”/>
</localpath>
<--#####################################-->
<localpath watch=”/data0/www/bbs”>
<remote ip=”10.0.0.182” name=” bbs”/>
<remote ip=” 10.0.0.183” name=” bbs”/>
</localpath>
<--#####################################-->
<localpath watch=”/data0/www/blog”>
<remote ip=”10.0.0.182” name=” blog”/>
<remote ip=” 10.0.0.183” name=” blog”/>
</localpath>
<--#####################################-->
提示:此步watch=”/data0/www/blog”就是定义服务端待同步的目录,和目标服务器的模块name=”blog”.
- 修改31-34行,认证部分
<auth start=”false” users=”root” passwordfile=”/etc/rsync.pas”/>
<userDefinePort start=”false” port=”874”/><!—timeout=100- ->
<timeout start=”false” time=”100”/><!—timeount=100-->
<ssh start=”false”/>
修改后内容为:
<rsync>
<commonParams params=”-aruz”/>
<auth start=”true” users=”rsync_backup” passwordfile=”/etc/rsync.pas”/>
<userDefinePort start=”false” port=”874”/><!—port=874- ->
<timeout start=”true” time=”100”/><!—timeount=100-->
<ssh start=”false”/>
</rsync>
提示:其实上面的几个配置就是在拼接rsync –avzP –timeout=100 /data0/www/www/rsync_backup@10.0.0.182::www/--password-file=/etc/rsync.password这个同步的命令而已.
- 修改36-37行
<failLogpath=”/tmp/rsync_fail_log.sh” timeToExecute=”60”/><!—default every 60mins execute once-->
修改后内容为:
<failLogpath=”/usr/local/sersync/logs/rsync_fail_log.sh” timeToExecute=”60”/><!—default every 60mins execute once-->
当同步失败后,日志记录到/usr/local/sersync/logs/rsync_fail_log.sh,并且每60分钟对失败的log进行重新同步.
修改后的完整配置文件为:
cat –n /usr/local/sersync/conf/confxml.xml
2.3.3.5开启sersync守护进程同步数据
1.配置sersync环境变量
echo ‘export PATH=$PATH:/usr/local/sersync/bin’>>/etc/profile
tail –l /etc/profile
source /etc/profile
which sersync
2.启动命令:
sersync –r –d –o/usr/local/sersync/conf/confxml.xml
测试结果:发现问题,仅能第一个模块的路径可以同步,其他下面的路径不能同步.
多实例:
sersync –d –o/usr/local/sersync/conf/www_confxml.xml
sersync –d –o/usr/local/sersync/conf/bbs_confxml.xml
sersync –d –o/usr/local/sersync/conf/blog_confxml.xml
多实例初始化同步命令:
sersync –r –d –o/usr/local/sersync/conf/www_confxml.xml
sersync –r –d –o/usr/local/sersync/conf/bbs_confxml.xml
sersync –r –d –o/usr/local/sersync/conf/blog_confxml.xml
写入10000个文件批量同步测试:
for in `seq 10000`;do echo dddd>www/$n.txt;done
ps –ef|grep rsync
提示:我们发现了本地已经写完了10000个,但是同步的线程,依然在同步,甚至才同步了1000多个.
Sersync参数说明:
Sersync参数 |
说明 |
|
|
./sersync -r |
-r参数作用是在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步.如果需要将sersync运行前,主服务器目录下已经存在的所有文件或目录全部同步到远端,则要以-r参数运行sersync,将本地与远程整体同步一次. 特别说明:如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步. |
|
|
./sersync –o old.xml |
不指定-o参数时,sersync会使用sersync可执行文件目录下的默认配置文件confxml.xml,如果需要使用其他的配置文件,可以使用-o参数指定其它配置文件,通过-o参数,我们可以指定多个不同的配置文件,从而实现sersync多进程多实例的数据同步,本文的例子就是如此. |
|
|
./sersync –n num |
-n 参数为指定默认的线程池的线程总数 例如./sersync –n 5则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n调高默认的线程总数,提升同步效率. |
|
|
./sersync -d |
-d 参数为后台启动服务,在通常情况下,使用-r参数对本地到远程整体同步一遍后,在后台运行此参数启动守护进程实时同步,在第一次整体同步时,-d和-r参数经常会联合使用。./sersync –d -r |
|
|
./sersync –m pluginName |
-m 参数为不进行同步,只运行插件./sersync –m pluginName例如./sersync –m command,则在监控到事件后,不对远程目标服务器进行同步,而是直接运行command插件. |
|
|
-n 8 –o wj.xml –r -d |
多个参数可以配合使用,例如:./sersync –n 16 –o config.xml –r –d,表示设置线程池工作线程为16个,指定wj.xml作为配置文件,在实时监控前作一次整体同步,以守护进程方式在后台运行. |
|
|
./sersync –help |
查看帮助的参数,有关sersync还有些小bug |
|
|
三.sersync配置文件说明
3.1xml配置文件说明
Sersync可选功能是通过xml配置文件来实现的,基本配置文件如下:
初始的配置文件:
cat –n conf/confxml.xml
下面进行解释说明:
xml配置文件注释不是”#”,而是<!—中间是注释内容-->
<host hostip=”localhost” port=”8008”></host>
Hostip与port是针对插件的保留字段,对于同步功能没有任何作用,保留默认即可.
3.2Debug开启开关
<debugstart=”false”/>
设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify事件与rsync同步命令.
3.3XFS文件系统开关
<fileSystemxfs=”false”/>
对于xfs文件系统的用户,需要将这个选项开启,才能使sersync正常工作.
3.4filter文件过滤功能
对于sersync监控的功能,会默认过滤系统的临时文件(以”.”开头,以”~”结尾),除了这些文件外,可以自定义其他需要过滤的文件.
<filter start=”false”>
<exclude expression=”(.*)\svn”></exclude>
<exclude expression=” (.*)\gz”></exclude>
<exclude expression=” ^info/*”></exclude>
<exclude expression=” ^static/*”></exclude>
</filter>
将start设置为true后开启过滤功能,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以”.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info/*),可以根据需要添加,但开启的时候,自己测试一下,正则表达式如果出现错误,控制台会有提示.相比较使用rsync的exclude功能,被过滤的路径,不会加入监控,大大减少rsync同步的通讯量.
3.5inotify监控参数设定(优化)
对于inotify监控参数可以进行设置,根据项目的特点优化sersync
<inotify>
<delete start=”true”/>
<createFolder start=”true”/>
<createFile start=”false”/>
<closeWrite start=”true”/>
<move From start=”true”/>
<move To start=”true”/>
<attrib start=”false”/>
<modify start=”false”/>
</inotify>
对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少rsync通讯.因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事件close_write,同样可以实现文件完整同步.
注意:要使得createFolder保持为true,如果将createFolder为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控.所以除非特殊需要,请开启.默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete参数设置为false,则不对删除事件进行监控.
3.6文件监控与远程同步设置
<localpath watch=”/opt/tongbu”>
<remote ip=”127.0.0.1” name=”tongbu1”/>
<!--<remote ip=”192.168.8.39” name=”tongbu”/>-->
<!--<remote ip=”192.168.8.40” name=”tongbu”/>-->
</localpath>
/opt/tongbu目录为sersync主服务器本地待同步的目录,ip=”192.168.8.39”,为从服务器的ip地址,如果有多个从服务器,依次列出来即可.name=”tongbu”,这里的tongbu为rsync.conf中的模块名字,即中括号中的名称.
3.7rsync相关参数配置
<rsync>
<commonParams params=”-artuz”/>
<auth start=”false” users=”root” passwordfile=”/etc/rsync.pas”/>
<userDefinePort start=”false” port=”874”/><!—port=874- ->
<timeout start=”false” time=”100”/><!—timeount=100-->
<ssh start=”false”/>
</rsync>
在commonParams项,我们可以自定义rsync的同步参数,默认是-artuz,auth start=”false”设置为true的时候,使用rsync的认证模式传送,需要配置user与passwordfile(-password-file=/etc/rsync.pas)来使用.userDefinedPort当远程同步目标服务器的rsync端口不是默认端口的时候使用(-port=874)timeout设置rsync的timeout时间(-timeout=100).<ssh start=””/>如果开启表示,ssh使用rsync –e ssh 的方式进行传输.
失败日志脚本配置
<failLog path=”/tmp/rsync_fail_log.sh” timeToExecute=”60”/><!—default every 60 mins executeonce-->
如果文件同步传输失败,会重新传送,再次失败就会写入rsync_fail_log.sh,然后每隔一段时间(timeToExecute进行设置)执行该脚本再次重新传输,然后清空该脚本.可以通过path来设置日志路径.
Crontab定期整体同步功能
<crontab start=”false” schedule=”600”><!—600-->
<contabfilter start=”false”>
<exclude expression=” .php”></exclude>
<exclude expression=” info/*”></exclude>
</crontabfilter>
</crontab>
Crontab可以对监控路径与远程目标主机每隔一段时间进行一次整体同步,可能由于一些原因两次失败重传都失败了,这个时候如果开启了crontab功能,还同步保证各个服务器文件一致,如果文件量比较大,crontab的时间间隔要设的大一些,否则可能增加通讯开销.schedule这个参数是设置crontab的时间间隔,默认是600分钟.
如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的时候文件被过滤了,crontabfilter,还会将需过滤的文件同步到远程从服务器,crontab的过滤正则与filter过滤的不同,也给出了两个实例分别对应与过滤文件与目录.总之如果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应.
插件设置
<plugin start=”false” name=”command”/>
当start=”false”处设置为true的时候,将文件同步到远程服务器后会调用name参数指定的插件.详见请看插件设置.
四.sersync插件基本配置和使用
4.1插件部分xml内容
<plugin name=”command”>
<param prefix=”/bin/sh” suffix=”” ignoreError=”true”/><!—prefix /opt/tongbu/mmm.sh suffix-->
<filter start=”false”>
<include expression=”(.*)\.php”/>
<include expression=”(.*)\.sh”/>
</filter>
</plugin>
<plugin name=”socket”>
<localpath watch=”/opt/tongbu”>
<deshost ip=”192.168.138.20” port=”8009”/>
</localpath>
</plugin>
<plugin name=”refreshCDN”>
<localpath watch=”data0/htdocs/cms.xoyo.com/site/”>
<cdninfo domainname=”ccms.chinacache.com” port=”80” username=”xxxx” password=”xxxx”/>
<sendurl base=”http://pic.xoyo.com/cms”/>
<regexurl regex=”false” match=”cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images”/>
</localpath>
</plugin>
如上面的xml所示,其中plugin标签设置为true时候,在同步文件或路径到远程服务器之后,会调用插件.通过name参数指定需要执行的插件.目前支持的有command refreshCDN socket http四种插件.其中,http插件目前由于兼容性原因已去除,以后会重新加入.
以下模块(command refreshCDN http socket)可以单独使用(发生文件改变不同步只调用插件),只需在命令行下使用-m参数即可.如果需要作为插件与同步程序一起使用,见同步程序说明的插件配置.
4.2command插件
<plugin name=”command”>
<param prefix=”/bin/sh” suffix=”” ignoreError=”true”/><!—prefix /opt/tongbu/mmm.sh suffix-->
<filter start=”false”>
<include expression=”(.*)\.php”/>
<include expression=”(.*)\.sh”/>
</filter>
</plugin>
当文件同步完成后,会调用command插件,如同步文件是test.php,则test.php文件在改动之后,调用rsync同步到远程服务器后,调用command插件,执行
/bin/sh test.php suffix>/dev/null 2>&1
如果suffix设置了,则会放在inotify事件test.php之后,如果ignoreError为true,则会添加>/dev/null 2>&1,当然还可以设置command的filter,当filter为true时,include可以只对正则匹配到的文件调用command.
“refreshCDN”,就在同步过程中将文件发送到目的服务器后刷新cdn接口.如果不想使用,则将start属性设为false即可.如果需要使用其他插件,则查看其他plugin标签,将插件名称改为xml中其它插件的名称即可.该模块根据chinaCDN的协议,进行设计,当有文件产生的时候,就向cdn接口发送需要刷新的路径位置.刷新CDN模块需要配置的xml文件如下.
<plugin name=”refreshCDN”>
<localpath watch=”data0/htdocs/cms.xoyo.com/site/”>
<cdninfo domainname=”ccms.chinacache.com” port=”80” username=”xxxx” password=”xxxx”/>
<sendurl base=”http://pic.xoyo.com/cms”/>
<regexurl regex=”false” match=”cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images”/>
</localpath>
</plugin>
其中localpath watch=”/data0/htdocs/cms.xoyo.com/site”是需要监控的目录.cdninfo标签制定了cdn接口的域名,端口号,以及用户名与密码.
Sendurl标签是需要刷新的url的前缀.regexurl标签中的,regex属性为true时候,使用match属性的正则语句匹配返回的路径信息,并将正则匹配到的部分作为url一部分.
举例:
如果产生文件事件为:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/image/a/123.txt
经过上面的match正则匹配后,最后刷新的路径是:http://pic.xoyo.com/cms/jx3/a/123.txt
如果regex属性为false,最后刷新的路径是http://pic.xoyo.com/cms/jx3.xoyo.com/images/a/123.txt;
4.3socket插件
socket插件,开启该模块,则向指定ip与端口发送inotify所产生的文件路径信息.
4.4http插件
http插件,可以向指定域名的主机post,inotify监控的事件,目前已去除.
4.5单独运行插件
插件也可以单独使用,即不对远程目标机进行同步,直接调用插件:
只调用command插件.
./sersync –d –m command
只调用refreshCDN插件
./sersync –d –m refreshCDN
只调用socket插件
./sersync –d –m socket
只调用http插件
./sersync –d –m http
五.sersync生产场景使用案例
六 分发数据免密码登录的几点须知
1.本例中免验证登录时单向的,即只能从A免验证登录到b,c
2.记住带authorized_keys公钥密钥端我们定义为server服务端或者锁端,另一端有id_dsa私钥密钥端定义为”钥匙端”.
3.所有密钥的默认目录~/.ssh目录,其中~为用户家目录。.ssh目录权限最好为700,以免秘钥数据泄露.
4.若要建立其它主机如D机(ip为10.0.0.151)可以被A机免验证登录,只需要从A端执行ssh-copy-id –i id_dsa.pub wj@10.0.0.151即可.
5.此种方法适用于生产环境分发数据(如hosts文件)/发布程序代码等生产场景.甚至查看所有机器的内存,cpu,负载,进程等所有需要的服务器信息,应用非常普遍.
6.对于前台以上的大规模服务器的公司,也可能考虑使用cfengine/puppet等分发同步工具,来实现本节功能.但其配置较复杂.读者,可以根据需求选用适合自己的.
特别提示:本文免验证连接是基于普通用户wj的,如果要实现hosts文件等的推送工作,是需要root权限的?
详见rsync4.1.2中
来源:https://blog.csdn.net/qq_34412985/article/details/98452094