CentOS6.8使用Rsync+sersync实现数据实时同步推荐

Sersync简介

Sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:

sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;

安装方便、配置简单;

使用多线程进行同步,能够保证多个服务器实时保持同步状态;

自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;

自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;

自带socket与http协议扩展,你可以方便的进行二次开发;

rsync+sersync与rsync+Inotify-tools区别

Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。

sersync是基于Inotify开发的,类似于Inotify-tools的工具;

sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;

rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

所以,当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

地址:http://code.google.com/p/sersync/,要翻墙才能下载

http://download.csdn.net/detail/hellopengyl/9918625

安装、配置

和Inotify-tools一样,只需要在数据源端安装

1、查看服务器内核是否支持inotify

[root@localhostsrc]#ll/proc/sys/fs/inotify#查看服务器内核是否支持inotify,出现下面的内容,说明服务器内核支持inotifytotal0-rw-r--r--1rootroot0Jul2710:32max_queued_events-rw-r--r--1rootroot0Jul2710:32max_user_instances-rw-r--r--1rootroot0Jul2710:32max_user_watches[root@localhostsrc]#uname-r#Linux下支持inotify的内核最小为2.6.132.6.32-642.el6.x86_64[root@localhostsrc]#sysctl-a|egrep-i"max_queued_events|max_user_watches|max_user_instances"#修改inotify默认参数(inotify默认内核参数值太小)fs.inotify.max_user_instances=128fs.inotify.max_user_watches=8192fs.inotify.max_queued_events=16384fs.epoll.max_user_watches=201420[root@localhostsrc]#vim/etc/sysctl.conffs.inotify.max_user_instances=65535fs.inotify.max_user_watches=99999999fs.inotify.max_queued_events=99999999[root@localhostsrc]#cat/proc/sys/fs/inotify/{max_user_instances,max_user_watches,max_queued_events}655359999999999999999[root@localhostsrc]#

max_queued_events inotify队列最大长度,如果值太小,会出现”** Event Queue Overflow **”错误,导致监控文件不准确

max_user_watches 要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)

max_user_instances 每个用户创建inotify实例最大值

2、安装、配置sersync

[root@localhostsrc]#tarzxvfsersync2.5.4_64bit_binary_stable_final.tar.gz[root@localhostsrc]#mvGNU-Linux-x86/app/sersync[root@localhostsrc]#cd/app/sersync/[root@localhostsersync]#lsconfxml.xmlsersync2[root@localhostsersync]#cpconfxml.xml{,.default}[root@localhostsersync]#vimconfxml.xml ?xmlversion="1.0"encoding="ISO-8859-1"?  headversion="2.5"  hosthostip="localhost"port="8008" /host #针对插件的保留字段,保留默认即可。 debugstart="true"/ #在sersync正在运行的控制台,打印inotify,rsync同步命令 fileSystemxfs="false"/ #对于xfs文件系统用户,需要将这个选项开启才正常工作 filterstart="false" #过滤系统的临时文件,被过滤的文件不会被监控提高,默认过滤系统的临时文件(以“.”开头,以“~”结尾) excludeexpression="(.*)\.svn" /exclude  excludeexpression="(.*)\.gz" /exclude  excludeexpression="^info/*" /exclude  excludeexpression="^static/*" /exclude  /filter  inotify #inotify监控文件模块 deletestart="true"/ #如果本地文件删除,不需要删除远程段的文件可以设置成false createFolderstart="true"/ #如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控; createFilestart="false"/ #把createFile(监控文件事件选项)设置为false来提高性能,减少rsync通讯;因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的时间close_write,同样可以实现文件完整同步; closeWritestart="true"/  moveFromstart="true"/  moveTostart="true"/  attribstart="false"/  modifystart="false"/  /inotify  sersync #进行数据同步的模块 localpathwatch="/app/rsync_client" #定义本地要同步的目录  remoteip="10.15.43.100"name="app_rsync_server"/ #远程接受同步的IP和rsync模块名  !-- remoteip="192.168.8.39"name="tongbu"/ --   !-- remoteip="192.168.8.40"name="tongbu"/ --  /localpath  rsync   commonParamsparams="-artuz"/ #自定义rsync参数,默认是-artuz  authstart="true"users="rsync"passwordfile="/etc/rsyncd.secret"/ #开启用户认证,定义用户名密码  userDefinedPortstart="false"port="874"/ !--port=874--   timeoutstart="false"time="100"/ !--timeout=100--   sshstart="false"/ #开启会使用rsync-essh的方式进行传输 /rsync  failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/ !--defaultevery60minsexecuteonce-- #对于失败的传输,会进行重新传送,再次同步失败后日志记录到/tmp/rsync_fail_log.sh,并且每60分钟对失败的log进行重新同步 crontabstart="true"schedule="600" !--600mins-- #每隔600s会做一次完全同步  crontabfilterstart="false" #如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的时候文件被过滤了,但crontab整体同步的时候如果不单独设置crontabfilter,还会将需过滤的文件同步到远程, excludeexpression="*.php" /exclude #crontab的过滤正则与filter过滤的不同,果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。 excludeexpression="info/*" /exclude   /crontabfilter  /crontab  pluginstart="false"name="command"/ #当设置为true的时候,将文件同步到远程服务器后会调用name参数指定的插件。 /sersync  pluginname="command" #name指定的插件#当文件同步完成后,会调用command插件,例如同步文件是file.txt,file.txt文件在改动之后,调用rsync同步到远程服务器后,调用command插件,执行/bin/shfile.txtsuffix /dev/null2 1#如果suffix设置了,则会放在inotify事件file.txt之后,如果ignoreError为true,则会添加 /dev/null2 1 paramprefix="/bin/sh"suffix=""ignoreError="true"/ !--prefix/opt/tongbu/mmm.shsuffix--  filterstart="false"   includeexpression="(.*)\.php"/ #当filter为ture,include可以只对正则匹配到的文件,调用command。  includeexpression="(.*)\.sh"/  /filter  /plugin #http插件,可以向指定域名的主机post,inotify监控的事件。#socket插件,开启该模块,则向指定ip与端口发送inotify所产生的文件路径信息 pluginname="socket"  localpathwatch="/opt/tongbu"   deshostip="192.168.138.20"port="8009"/  /localpath  /plugin #在同步过程中将文件发送到目的服务器后刷新cdn接口。如果不想使用,则设置 pluginstart="false"name="refreshCDN"/ #该模块根据chinaCDN的协议,进行设计,当有文件产生的时候,就向cdn接口发送需要刷新的路径位置 pluginname="refreshCDN"  localpathwatch="/data0/htdocs/cms.xoyo.com/site/" #需要监控的目录 #cdnifo标签制定了cdn接口的域名,端口号,以及用户名与密码。  cdninfodomainname="ccms.chinacache.com"port="80"username="xxxx"passwd="xxxx"/  #sendurl标签是需要刷新的url的前缀  sendurlbase=" #regexurl标签中的,regex属性为true时候,使用match属性的正则语句匹配inotify返回的路径信息,并将正则匹配到的部分作为url一部分,  regexurlregex="false"match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/  #如果产生文件事件为:/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; /localpath  /plugin  /head [root@localhostsersync]#/app/sersync/sersync2-d-r-n8-o/app/sersync/confxml.xmlsetthesystemparamexecute:echo50000000 /proc/sys/fs/inotify/max_user_watchesexecute:echo327679 /proc/sys/fs/inotify/max_queued_eventsparsethecommandparamoption:-d runasadaemonoption:-r rsyncallthelocalfilestotheremoteserversbeforethesersyncworkoption:-n threadnumis:8option:-o configxmlname:/app/sersync/confxml.xmlparsexmlconfigfilehostip:localhost hostport:8008Opendebug,youwillseedebuginfomationdaemonstart,sersyncrunbehindtheconsoleStartthecrontab Every600minutesrsyncallthefilestotheremoteserversentirelyusersyncpassword-file:useris rsyncpasswordfileis /etc/rsyncd.secretconfigxmlparsesuccesspleaseset/etc/rsyncd.confmaxconnections=0Manuallysersyncworkingthread10=1(primarythread)+1(failretrythread)+8(daemonsubthreads)Maxthreadsnumbersis:18=10(Threadpoolnums)+8(Subthreads)pleaseaccordingyourcpu,use-nparamtoadjustthecpurate------------------------------------------rsyncthedirectoryrecursivlytotheremoteserversonceworkingpleasewait...executecommand:cd/app/rsync_client rsync-artuz-R--delete./rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcrontabcommand:cd/app/rsync_client rsync-artuz-R--delete./rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretrunthesersync:watchpathis:/app/rsync_clientaddwatch:/app/rsync_clientreturnwdis:1addwatch:/app/rsync_client/testreturnwdis:2[root@localhostsersync]#

-d 后台启动

-r同步前将已存在的文件全部同步过去,如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步;

-n开启的线程总数默认10

-o指定配置文件,指定 -o 参数可以指定多个不同的配置文件,从而实现sersync多进程多实例的数据同步

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

[root@localhostsersync]#catmonitor_sersync.sh#监控Sersync运行状态的脚本,如果服务停止了就重启服务#!/bin/bashserver_file="/app/sersync/sersync2"conf_file="/app/sersync/confxml.xml"options="-d-r-n8-o"proc_num=$(ps-ef|grep-isersync2|grep-v"grep"|wc-l)if[$proc_num-lt1];thencd$(dirname$server_file)nohup$server_file$options$conf_file exit0;[root@localhostsersync]#chmod+xmonitor_sersync.sh[root@localhostsersync]#crontab-l*/5****/app/sersync/monitor_sersync.sh[root@localhostsersync]#/etc/init.d/crondrestart[root@localhostsersync]#vim/etc/rc.d/rc.local#设置开机自动运行脚本/app/sersync/sersync2-d-r-n8-o/app/sersync/confxml.xml[root@localhostsersync]#

测试

在客户端监控的目录/app/rsync_client创建文件,然后查看服务器端app_rsync_server模块对应的目录是否同步更新

[root@localhostrsync_client]#touchfile{1..9}inotifywd:1 name:file1 mask:256inotifywd:1 name:file1 mask:8inotifywd:1 name:file2 mask:256inotifywd:1 name:file2 mask:8inotifywd:1 name:file3 mask:256inotifywd:1 name:file3 mask:8inotifywd:1 name:file4 mask:256inotifywd:1 name:file4 mask:8inotifywd:1 name:file5 mask:256[root@localhostrsync_client]#cd/app/rsync_client rsync-artuz-R"./file2"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretinotifywd:1 name:file5 mask:8inotifywd:1 name:file6 mask:256inotifywd:1 name:file6 mask:8inotifywd:1 name:file7 mask:256inotifywd:1 name:file7 mask:8inotifywd:1 name:file8 mask:256inotifywd:1 name:file8 mask:8inotifywd:1 name:file9 mask:256inotifywd:1 name:file9 mask:8cd/app/rsync_client rsync-artuz-R"./file1"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file3"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file4"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file5"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file6"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file7"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file8"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secretcd/app/rsync_client rsync-artuz-R"./file9"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secret[root@localhostrsync_client]#touchfile1inotifywd:1 name:file1 mask:8[root@localhostrsync_client]#cd/app/rsync_client rsync-artuz-R"./file1"rsync@10.15.43.100::app_rsync_server--password-file=/etc/rsyncd.secret[root@localhostsersync]#

压测

写入10K个文件批量同步测试结果:

[root@localhostrsync_client]#fornin{1..10000};doddif=/dev/zeroof=/app/rsync_client/"$n".txtbs=1Mcount=5;done

查看同步速度,当10K个文件同步完后,在/app/rsync_server里发现才同步了600多个文件

多实例情况

配置多个confxml.xml文件(比如:www、bbs、blog….等等),根据不同的需求同步对应的实例文件

[root@localhostrsync_client]#/app/sersync/sersync2-d-r-n8-o/app/sersync/www_confxml.xml[root@localhostrsync_client]#/app/sersync/sersync2-d-r-n8-o/app/sersync/bbs_confxml.xml[root@localhostrsync_client]#/app/sersync/sersync2-d-r-n8-o/app/sersync/blog_confxml.xml

版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 rsync inotify sersync一个人去旅行,而且是去故乡的山水间徜徉。

CentOS6.8使用Rsync+sersync实现数据实时同步推荐

相关文章:

你感兴趣的文章:

标签云: