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@localhost src]# ll /proc/sys/fs/inotify #查看服务器内核是否支持inotify,出现下面的内容,说明服务器内核支持inotify total 0 -rw-r--r-- 1 root root 0 Jul 27 10:32 max_queued_events -rw-r--r-- 1 root root 0 Jul 27 10:32 max_user_instances -rw-r--r-- 1 root root 0 Jul 27 10:32 max_user_watches [root@localhost src]# uname -r #Linux下支持inotify的内核最小为2.6.13 2.6.32-642.el6.x86_64 [root@localhost src]# sysctl -a|egrep -i "max_queued_events|max_user_watches|max_user_instances" #修改inotify默认参数(inotify默认内核参数值太小) fs.inotify.max_user_instances = 128 fs.inotify.max_user_watches = 8192 fs.inotify.max_queued_events = 16384 fs.epoll.max_user_watches = 201420 [root@localhost src]# vim /etc/sysctl.conf fs.inotify.max_user_instances = 65535 fs.inotify.max_user_watches = 99999999 fs.inotify.max_queued_events = 99999999 [root@localhost src]# cat /proc/sys/fs/inotify/{max_user_instances,max_user_watches,max_queued_events} 65535 99999999 99999999 [root@localhost src]#
max_queued_events inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches 要同步的文件包含多少目录,可以用:find /home/justin -type d | wc -l统计,必须保证max_user_watches值大于统计结果(这里/home/justin为同步文件目录)
max_user_instances 每个用户创建inotify实例最大值
2、安装、配置sersync
[root@localhost src]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz [root@localhost src]# mv GNU-Linux-x86 /app/sersync [root@localhost src]# cd /app/sersync/ [root@localhost sersync]# ls confxml.xml sersync2 [root@localhost sersync]# cp confxml.xml{,.default} [root@localhost sersync]# vim confxml.xml <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> #针对插件的保留字段,保留默认即可。 <debug start="true"/> #在sersync正在运行的控制台,打印inotify,rsync同步命令 <fileSystem xfs="false"/> #对于xfs文件系统用户,需要将这个选项开启才正常工作 <filter start="false"> #过滤系统的临时文件,被过滤的文件不会被监控提高,默认过滤系统的临时文件(以“.”开头,以“~”结尾) <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> #inotify监控文件模块 <delete start="true"/> #如果本地文件删除,不需要删除远程段的文件可以设置成false <createFolder start="true"/> #如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控; <createFile start="false"/> #把createFile(监控文件事件选项)设置为false来提高性能,减少rsync通讯;因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的时间close_write,同样可以实现文件完整同步; <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> <sersync> #进行数据同步的模块 <localpath watch="/app/rsync_client"> #定义本地要同步的目录 <remote ip="10.15.43.100" name="app_rsync_server"/>#远程接受同步的IP和rsync模块名 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> #自定义rsync参数,默认是-artuz <auth start="true" users="rsync" passwordfile="/etc/rsyncd.secret"/> #开启用户认证,定义用户名密码 <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> #设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书 </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> #对于失败的传输,会进行重新传送,再次同步失败后日志记录到/tmp/rsync_fail_log.sh,并且每60分钟对失败的log进行重新同步 <crontab start="true" schedule="600"><!--600mins--> #每隔600s会做一次完全同步 <crontabfilter start="false"> #如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的时候文件被过滤了,但crontab整体同步的时候 如果不单独设置crontabfilter,还会将需过滤的文件同步到远程, <exclude expression="*.php"></exclude> #crontab的过滤正则与filter过滤的不同,果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。 <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> #当设置为true的时候,将文件同步到远程服务器后会调用name参数指定的插件。 </sersync> <plugin name="command"> #name指定的插件 #当文件同步完成后,会调用command插件,例如同步文件是file.txt,file.txt文件在改动之后,调用rsync同步到远程服务器后,调用command插件,执行/bin/sh file.txt suffix >/dev/null 2>&1 #如果suffix 设置了,则会放在inotify事件file.txt之后,如果ignoreError为true,则会添加>/dev/null 2>&1 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> #当filter为ture,include可以只对正则匹配到的文件,调用command。 <include expression="(.*)\.sh"/> </filter> </plugin> #http插件,可以向指定域名的主机post,inotify监控的事件。 #socket插件,开启该模块,则向指定ip与端口发送inotify所产生的文件路径信息 <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> #在同步过程中将文件发送到目的服务器后刷新cdn接口。如果不想使用,则设置<plugin start="false" name="refreshCDN"/> #该模块根据chinaCDN的协议,进行设计,当有文件产生的时候,就向cdn接口发送需要刷新的路径位置 <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> #需要监控的目录 #cdnifo标签制定了cdn接口的域名,端口号,以及用户名与密码。 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> #sendurl标签是需要刷新的url的前缀 <sendurl base=" #regexurl标签中的,regex属性为true时候,使用match属性的正则语句匹配inotify返回的路径信息,并将正则匹配到的部分作为url一部分, <regexurl regex="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@localhost sersync]# /app/sersync/sersync2 -d -r -n 8 -o /app/sersync/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 option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -n thread num is: 8 option: -o config xml name: /app/sersync/confxml.xml parse xml config file host ip : localhost host port: 8008 Open debug, you will see debug infomation daemon start,sersync run behind the console Start the crontab Every 600 minutes rsync all the files to the remote servers entirely use rsync password-file : user is rsync passwordfile is /etc/rsyncd.secret config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 10 = 1(primary thread) + 1(fail retry thread) + 8(daemon sub threads) Max threads numbers is: 18 = 10(Thread pool nums) + 8(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... execute command: cd /app/rsync_client && rsync -artuz -R --delete ./ rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret crontab command:cd /app/rsync_client && rsync -artuz -R --delete ./ rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret run the sersync: watch path is: /app/rsync_client add watch: /app/rsync_client return wd is: 1 add watch: /app/rsync_client/test return wd is: 2 [root@localhost sersync]#
-d 后台启动
-r 同步前将已存在的文件全部同步过去,如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步;
-n 开启的线程总数默认10
-o 指定配置文件,指定 -o 参数可以指定多个不同的配置文件,从而实现sersync多进程多实例的数据同步
-m 不进行同步,只运行插件 ./sersync -m pluginName 例如:./sersync -m command,则在监控到事件后,不对远程目标服务器进行同步,而是直接运行command插件
[root@localhost sersync]# cat monitor_sersync.sh #监控Sersync运行状态的脚本,如果服务停止了就重启服务 #!/bin/bash server_file="/app/sersync/sersync2" conf_file="/app/sersync/confxml.xml" options="-d -r -n 8 -o" proc_num=$(ps -ef|grep -i sersync2|grep -v "grep"|wc -l) if [ $proc_num -lt 1 ];then cd $(dirname $server_file) nohup $server_file $options $conf_file & else exit 0; fi [root@localhost sersync]# chmod +x monitor_sersync.sh [root@localhost sersync]# crontab -l */5 * * * * /app/sersync/monitor_sersync.sh [root@localhost sersync]# /etc/init.d/crond restart [root@localhost sersync]# vim /etc/rc.d/rc.local #设置开机自动运行脚本 /app/sersync/sersync2 -d -r -n 8 -o /app/sersync/confxml.xml [root@localhost sersync]#
测试
在客户端监控的目录/app/rsync_client创建文件,然后查看服务器端app_rsync_server模块对应的目录是否同步更新
[root@localhost rsync_client]# touch file{1..9} inotify wd:1 name:file1 mask:256 inotify wd:1 name:file1 mask:8 inotify wd:1 name:file2 mask:256 inotify wd:1 name:file2 mask:8 inotify wd:1 name:file3 mask:256 inotify wd:1 name:file3 mask:8 inotify wd:1 name:file4 mask:256 inotify wd:1 name:file4 mask:8 inotify wd:1 name:file5 mask:256 [root@localhost rsync_client]# cd /app/rsync_client && rsync -artuz -R "./file2" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret inotify wd:1 name:file5 mask:8 inotify wd:1 name:file6 mask:256 inotify wd:1 name:file6 mask:8 inotify wd:1 name:file7 mask:256 inotify wd:1 name:file7 mask:8 inotify wd:1 name:file8 mask:256 inotify wd:1 name:file8 mask:8 inotify wd:1 name:file9 mask:256 inotify wd:1 name:file9 mask:8 cd /app/rsync_client && rsync -artuz -R "./file1" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file3" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file4" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file5" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file6" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file7" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file8" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret cd /app/rsync_client && rsync -artuz -R "./file9" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret [root@localhost rsync_client]# touch file1 inotify wd:1 name:file1 mask:8 [root@localhost rsync_client]# cd /app/rsync_client && rsync -artuz -R "./file1" rsync@10.15.43.100::app_rsync_server --password-file=/etc/rsyncd.secret [root@localhost sersync]#
压测
写入10K个文件批量同步测试结果:
[root@localhost rsync_client]# for n in {1..10000};do dd if=/dev/zero of=/app/rsync_client/"$n".txt bs=1M count=5;done
查看同步速度,当10K个文件同步完后,在/app/rsync_server里发现才同步了600多个文件
多实例情况
配置多个confxml.xml文件(比如:www、bbs、blog....等等),根据不同的需求同步对应的实例文件
[root@localhost rsync_client]# /app/sersync/sersync2 -d -r -n 8 -o /app/sersync/www_confxml.xml [root@localhost rsync_client]# /app/sersync/sersync2 -d -r -n 8 -o /app/sersync/bbs_confxml.xml [root@localhost rsync_client]# /app/sersync/sersync2 -d -r -n 8 -o /app/sersync/blog_confxml.xml
rsync使用时的常见问题
错误1: rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.2]
解决:很大可能是服务器端没有开启 rsync 服务。开启服务。 或者开启了防火墙指定的端口无法访问。
错误2:@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.2]
解决:服务器端同步目录没有权限,cwrsync默认用户是Svcwrsync。为同步目录添加用户Svcwrsync权限。
错误3:@ERROR: failed to open lock file
rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.2]
解决:服务器端配置文件 rsyncd.conf中添加 lock file = rsyncd.lock 即可解决。
错误4:@ERROR: invalid uid nobody
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.2]
解决:在rsyncd.conf文件中添加下面两行即可解决问题
UID = 0
GID = 0
错误5:@ERROR: auth failed on module test2
rsync error: error starting client-server protocol (code 5) at main.c(1296) [receiver=3.0.2]
解决:服务端没有指定正确的secrets file,请在 [test2]配置段添加如下配置行:
auth users = coldstar #同步使用的帐号
secrets file = rsyncd.secrets #密码文件
错误6:password file must not be other-accessible
解决:客户端的pass文件要求权限为600, chmod 600 /etc/rsync.pass 即可。
错误7:rsync: chdir /cygdrive/c/work failed
: No such file or directory (2)
解决:服务器端同步文件夹路径或名称写错了,检查path。
错误8:rsyncserver 服务启动时报错“rsyncserver服务启动后又停止了。一些服务自动停止,如果它们没有什么可做的,例如“性能日志和警报”服务。”
解决方法:将安装目录下的rsyncd.pid文件删除,再重新启动RsyncServer服务。一般是异常关机导致的。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HBase在阿里搜索中的应用实践
李钰,花名绝顶,WOTA全球架构与运维技术峰会分享嘉宾,现任阿里巴巴搜索事业部高级技术专家,HBase开源社区PMC & committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续3年基于HBase/HDFS设计和开发存储系统应对双十一访问压力,具备丰富的大规模集群生产实战经验。 HBase作为淘宝全网索引构建以及在线机器学习平台的核心存储系统,是阿里搜索基础架构的重要组成部分。本文我们将介绍HBase在阿里搜索的历史、规模,应用的场景以及在实际应用当中遇到的问题和优化。 HBase在阿里搜索的历史、规模和服务能力 历史:阿里搜索于2010年开始使用HBase,从最早到目前已经有十余个版本。目前使用的版本是在社区版本的基础上经过大量优化而成。社区版本建议不要使用1.1.2版本,有较严重的性能问题, 1.1.3以后的版本体验会好很多。 集群规模:目前,仅在阿里搜索节点数就超过3000个,最大集群超过1500个。阿里集团节点数远远超过这个数量。 服务能力:去年双十一,阿里搜索离线集群的吞吐峰值一秒钟访问超过4000万次,单机一秒钟吞吐峰值达到10万...
- 下一篇
利用Swarmkit构建Windows/Linux混合Docker集群
在很多公司都同时存在Windows+Linux两种操作系统,在Linux上跑Docker很方便各种资料文档齐全,但是在Windows上跑Docker相对比较少,同时也受到一些限制,如Windows上docker网络问题。下面就介绍下利用Windows IIS跑Web应用,同时使用Haproxy作为负载均衡器。 方案采用Windows原生container、docker swarmkit、负载均衡器采用Haproxy+Etcd+Confd 流程说明: 开发及运维修改dockerfile及代码提交至SVN服务器,同时触发SVN钩子进行镜像构建(Windows项目在Windows构建、Linux项目在Linux构建),并push至我们的Docker私有仓库 推送镜像之后,钩子同时触发Docker Swarmkit集群的leader服务器进行服务创建或者更新 启动IIS容器,需要提前启动haproxy+etcd+confd容器,以便服务注册 Windows Docker Swarm初始化集群集群,不可以只使用docker swarm init,而不指定IP及端口,否则就会一直卡在初始化的进程下...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主