上面是网络 可以有多个目标服务器,本机同步也可以(要同时开sersync服务和rsync守护进程)
需求:
1、源服务器上 要备份的是 /opt/tongbu1/ /opt/tongbu2/目录包括子目录下的 所有文件,其他文件不备份
2、备份服务器上 备份的路径 /home/bgi_tj/tongbu1 /home/bgi_tj/tongbu2 ,当然备份的服务器有可能不止一台
由于源服务器上文件比较多,一开始同步方案:写一个rsync脚本,然后定时执行同步,但是这样不能做到实时同步,后来使用rsync+inotify 写成脚本来做实时同步,也不行,是因为inotify可以做到实时监控文件或文件夹创建或是修改,然后通知rsync,但是rsync同步之前都会先构造一个Filelist(文件一多,构造这个列表的时间就长,系统负载也比较大),所以只要有文件创建或者修改,那么都会构造列表,所以这么做不适合大批量文件进行实时同步,这时可以用sersync,
sersync使用 inotify 监控操作系统对磁盘的操作事件,通过接收到的事件生成带特定参数的rsync命令行并执行,从而达到实时增量同步的目的。
前提是。你的linux 内核要2.16.1 以上
sersync项目介绍:
http://code.google.com/p/sersync/
使用指南
http://www.linuxidc.com/Linux/2012-02/53572.htm
http://www.linuxidc.com/Linux/2012-02/53571.htm
详细解读文件系统事件�Cinotify+rsync同步需要过滤事件!
对于Inotify的使用,IBM有一篇文章介绍很详细,不需要我赘述,链接如下:
也可以看我的博客:
http://lilinji.blog.51cto.com/5441000/1194739
http://www.ibm.com/developerworks/cn/linux/l-inotifynew/
大家往往使用inotify-tool比较熟悉,对于其监控文件系统的一些特性,却很少有人总结,有些人用开源的 Inotify脚本程序进行rsync同步,但我希望还是要对文件事件进行过滤,否则会做大量的重复操作和冗余操作,主要原因是,在我们队文件进行编辑操 作的时候会产生大量的冗余事件,这些事件有些是临时文件的产生,有些是对监控文件的冗余操作。详细见下面的测试。
测试环境:
ubuntu 文件系统Ext4
CentOS 文件系统Ext3
测试工具: Inotify api编写的监控程序,并将发生的事件打印如下:
如图所示,产生事件256与8,分别代表create事件与write_close事件。
2.使用vi语句创建test文件,vi test,产生事件如下:
如图所示,会产生一些临时文件,他们一swp与swpx进行结尾。其中512事件代表删除文件,可见我们在进行vi的时候,其实背后会有很多额外的操作开销。但具体问什么需要这么繁琐的过程,目前还不清楚。
3.对通过vi打开的文件,进行write操作,在vi命令提示符下执行w,产生如下8个事件
如图所示,这回会产生一些名字叫4913的事件,这个数字貌似是不变的,就是你write其他文件,也会产生4913事件。但如果创建的文件本身名字就叫4913,那么会产生其它数字的临时文件,真是奇怪…
其中64是move_from事件,是将文件mv出当前路径时产生事件,128代表将其他路径文件移入当前路径,移 出与移入操作可以通过cookie值,来确定是否是同一文件。可见,当移动操作时候,是将test移动为test~,其实是修改了名字,通过cookie 可以看出,它们是对同一文件的操作。
如果对vi打开的文件做退出操作,即执行q命令:
对同一个文件做write and close操作的时候,即在vi命令行下,执行wq,则产生10个事件如下:
可见,如果不对事件进行监控,一个简单的write操作都会产生很多冗余事件。
但也有些事件是唯一的,举例如下:
1.对已经产生的文件,重新进行touch操作,如test已经产生了,再次执行touch test操作时事件如下:
如图,只产生了write_close事件,覆盖了已经touch的文件。
2.从其他路径cp一个文件,到监控路径:
相当于进行了一次写覆盖操作。
3.从其他路径move一个文件到监控路径:
只产生了move_to事件。
4.刚才看到了,如果write名为test文件,产生临时文件4913,如果我write名为4913的文件时候,事件如下:
如果write为5036,时候,会产生数字为其它的临时文件,真的是有意思。
所以那些希望使用inotify与Rsync进行同步的用户,脚本里要加上过滤功能啊。
我在后续的文章里提到我自己写的服务器同步程序,功能如下:
1 .过滤临时文件和不需要的事件,比如在write的时候只产生一个事件,这样就之需要rsync一次即可。
2 .当rsync失败的时候,会进行稍后重新执行,如果仍旧失败,10小时候再次执行,确保服务器同步准确。
3 .对于本地没有的文件,我也会对远程文件路径进行删除,同时不会比较其他文件,那些使用 rsync �Cinclude=/* �Cinclude=xxx.php$ �Cexclude=* 的用户注意了,那种执行方式,效率很低,会递归比较所有目录。
4.支持主机到多个分机的同步,别且使用多线程同时执行,使文件在所有服务器上保持一致。并且同时同步inotiy产生的多个文件。
5.线程的数量可以根据服务器的性能,进行配置,好服务器可以开得多,同时执行的更多。
可执行文件及源码地址如下: http://code.google.com/p/sersync/
Sersync服务器同步程序 项目简介与设计框架
http://code.google.com/p/sersync/
项目简介:
本项目利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。
目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令。 相比较上面两个项目,本项目优点是:
1.sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(我稍后会提到),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
2.相比较上面两个项目,sersync配置起来很简单:在http://code.google.com/p/sersync/downloads /list 处下载源码(分为32版本,与64位版本),其中bin目录下已经有我编译好的2进制文件,配合bin目录下的xml文件直接使用即可。
3.另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4.本项目自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步。
5.本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。
6.本项目自带socket与http协议扩展,满足您二次开发的需要。
插件相关xml
03 |
< plugin start = "false" name = "command" /> |
05 |
< plugin name = "command" > |
06 |
< param prefix = "/bin/sh" suffix = "" ignoreError = "true" /> |
08 |
< include expression = "(.*)\.php" /> |
09 |
< include expression = "(.*)\.sh" /> |
13 |
< localpath watch = "/opt/tongbu" > |
14 |
< deshost ip = "192.168.138.20" port = "8009" /> |
17 |
< plugin name = "refreshCDN" > |
18 |
< localpath watch = "/data0/htdocs/cms.xoyo.com/site/" > |
19 |
< cdninfo domainname = "ccms.chinacache.com" port = "80" username = "xxxx" passwd = "xxxx" /> |
20 |
< sendurl base = "http://pic.xoyo.com/cms" /> |
21 |
< regexurl regex = "false" match = "cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images" /> |
如上面的xml所示,其中plugin标签设置为true时候,在同步文件或路径到远程之后后,调用插件。通过name参数指定需要执行的插件。目前支持的有command refreshCDN socket http四种插件。http插件目前由于兼容性原因去除,以后会重新加入。
以下模块(command refreshCDN http socket)可以单独使用(发生文件改变不同步只调用插件),只需在命令行下使用-m 参数即可。如果需要作为插件与同步程序一起使用,见同步程序说明的插件配置。
command插件
当文件同步完成后,会调用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为ture,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" passwd="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 是需要监控的目录。
cdnifo标签制定了cdn接口的域名,端口号,以及用户名与密码。
sendurl标签是需要刷新的url的前缀。
regexurl标签中的,regex属性为true时候,使用match属性的正则语句匹配inotify返回的路径信息,并将正则匹配到的部分作为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;
socket插件
socket插件,开启该模块,则向指定ip与端口发送inotify所产生的文件路径信息。
Http插件
http插件,可以向指定域名的主机post,inotify监控的事件。
单独运行插件
插件也可以单独使用,即不对远程目标机进行同步,直接调用插件:
只调用command插件
./sersync -d -m command
只调用refreshCDN插件
./sersync -d -m refreshCDN
只调用socket插件
./sersync -d -m socket
只调用http插件
./sersync -d -m http
sersync2完全安装配置说明
当前版本的sersync依赖于rsync进行同步。如下图所示,在同步主服务器上开启sersync,将监控路径中的文件同步到目标服务器,因此需要在主服务器配置sersync,在同步目标服务器配置rsync。对于rsync配置,在google上可以找到很多资料,以下只是一些必要的配置和使用说明,仅供参考,请根据您的实际情况修改。
如图所示,需要在同步主服务器上配置sersync,在同步目标服务器配置rsync,并在目标服务器开启rsync守候进程,这样在主服务器产生的文 件,就会被sersync实时同步到多个目标服务器。在centos系统下默认已经安装了rsync,只需进行配置,并开启rsync守候进程即可。
配置同步目标服务器rsync
rsync --daemon
在主服务器上安装配置sresync
在目标服务器上配置rsync
1.创建目录和文件
[root@router bookfm]# mkdir /etc/rsyncd/
[root@router rsyncd]# touch rsyncd.conf #创建rsync的配置文件
[root@router rsyncd]# touch rsyncd.secrets
#创建rsync的密码文件,里面包含用户名和密码,用冒号分开
[root@router rsyncd]#chmod -R 600 .
#只有root才能读取这些文件
[root@router rsyncd]# vim rsyncd.conf
uid = root
#系统中存在的用户,这个用户要能对备份的路径有写入权限
gid = root
#系统中存在的用户组,用户组要能对备份的路径有写入权限
max connections = 100 #最大连接数
use chroot = no
log file = /var/rsync/rsync.log #指定同步日志
pid file = /var/rsync/rsyncd.pid #指定运行时PID文件
lock file = /var/rsync/rsyncd.lock
[book]
path = /backup/bookfm #指定备份的路径
read only=no #可写入
ignore errors = yes #忽略错误
secrets file =/etc/rsyncd/rsyncd.secrets
#指定rsync自身的密码文件(非系统用户)
auth users = bookbackup #指定这个共享名验证的用户名
hosts allow = 192.168.100.246/24 #只允许这个IP地址
hosts deny = * #而禁止其他所有IP
[root@router rsyncd]# vim rsyncd.secrets
bookbackup:123456
2.启动rsync守护进程
[root@router rsyncd]#rsync --daemon --config=/etc/rsyncd/rsyncd.conf
如果不指定端口,默认是873,如果有启用iptables,那么请放行873端口
rsync --daemon --port=9091 --config=/etc/rsyncd/rsyncd.conf 自定义端口时记得防火墙放行该端口
四、在源服务器上,开启sersync服务
[root@server10 book]# /usr/local/GNU-Linux-x86/sersync2 选项
-r 进行整体同步一次
-d 后台运行
-o 指定配置文件路径
-n 指定默认的线程池的线程总数,如果不指定,默认启动线程池数量是10(适用于四核服务器)
/usr/local/GNU-Linux-x86/sersync2 -r -d -o /usr/local/GNU-Linux-x86/confxml.xml
通常情况下使用这种方式,对本地到远程整体同步一次后,在后台运行实时同步。
/usr/local/GNU-Linux-x86/sersync2 -d -o /usr/local/GNU-Linux-x86/confxml.xml
在源服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。
/usr/local/GNU-Linux-x86/sersync2 -r -o /usr/local/GNU-Linux-x86/confxml.xml
在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步
如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效
/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -o /usr/local/GNU-Linux-x86/confxml.xml
指定默认的线程池的线程总数,如果不指定,默认启动线程池数量是10(适用于四核服务器)
如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n调高线程总数。
基于上述情况,可以使用以下命令来启动sersync服务(如果同步时不过滤文件即filter start=false)
/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -d -o /usr/local/GNU-Linux-x86/confxml.xml
但是根据自身的情况(因为只备份original.xxx文件),所以必须要启用文件过滤(即filter start=true),一旦启用了这个参数,那么-r参数就无效,而-r参数又是进行整体同步的参数,那就无法进行一次整体同步。
基于这种情况,可以在源上开启rsync服务,然后在目标上用rsync进行一次整体同步,然后停止源上面的rsync服务,开启sersync服务,进行实时同步
/usr/local/GNU-Linux-x86/sersync2 -d -o /usr/local/GNU-Linux-x86/confxml.xml
五、测试
在源服务器上指定目录下创建original.pdf文件,然后看看目标上备份的路径里面有没有该文件,然后再创建aaaa文件,看sersync是否同步该文件。
经测试,备份时可以做到实时同步,而且系统负载也较小。
在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件,这里用sersync2.5进行说明,新版本配置形式类似。
1.在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。
./sersync -d
过程如下:
[root@localhost GNU-Linux-x86]# lsconfxml.xml sersync2
[root@localhost GNU-Linux-x86]# ./sersync2 -d
set 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
本文出自 “坚持就是胜利” 博客,转载请与作者联系!