阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

sersync:基于 rsync + inotify 实现数据实时同步

183次阅读
没有评论

共计 6468 个字符,预计需要花费 17 分钟才能阅读完成。

sersync:基于 rsync + inotify 实现数据实时同步

 

前言

提到数据同步就必然会谈到 rsync,一般简单的服务器数据传输会使用ftp/sftp 等方式,但是这样的方式效率不高,不支持差异化增量同步也不支持实时传输。针对数据实时同步需求大多数人会选择 rsync+inotify-tools 的解决方案,但是这样的方案也存在一些缺陷(文章中会具体指出),sersync是国人基于前两者开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。

可靠高效的数据实时同步方式

 

原理

Synchronize files and folders between servers -using inotiy and rsync with c++ 服务器实时同步文件,服务器镜像解决方案

sersync主要用于服务器同步,web 镜像等功能。基于 boost1.43.0,inotify api,rsync command. 开发。目前使用的比较多的同步解决方案是inotify-tools+rsync,另外一个是 google 开源项目Openduckbill(依赖于 inotify- tools),这两个都是基于脚本语言编写的。相比较上面两个项目,本项目优点是:

  1. sersync 是使用 c ++ 编写,而且对 linux 系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合 rsync 同步的时候,节省了运行时耗和网络资源。因此更快。
  2. 相比较上面两个项目,sersync 配置起来很简单,其中 bin 目录下已经有基本上静态编译的 2 进制文件,配合 bin 目录下的 xml 配置文件直接使用即可。
  3. 另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
  4. 本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
  5. 本项目自带 crontab 功能,只需在 xml 配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置 crontab 功能。
  6. 本项目 socket 与 http 插件扩展,满足您二次开发的需要。

针对上图的设计架构,这里做几点说明,来帮助大家阅读和理解该图

1 ) 线程组线程 是等待线程队列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程。当队列中 Inotify 事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是为了能够同时处理多个 Inotify 事件,从而提升服务器的并发同步能力。同步线程的最佳数量 = 核数 x 2 + 2。

2 ) 那么之所以称之为 线程组线程,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量去建立子线程,子线程可以保证所有的文件与各个服务器同时同步。当要同步的文件较大的时候,这样的设计可以保证每个远程服务器都可以同时获得需要同步的文件。

3 ) 服务线程的作用有三个:

  • 处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。
  • 每隔 10 个小时执行 rsync_fail_log.sh 脚本一次,同时清空脚本。
  • crontab 功能,可以每隔一定时间,将所有路径整体同步一次。

4 ) 过滤队列 的建立是为了过滤短时间内产生的重复的 inotify 信息,例如在删除文件夹的时候,inotify 就会同时产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹的事件,从而减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件的重复操作。

 

角色

注意主从配置的区别,记得调整 SELinux 和防火墙

iptables 配置实践 – http://wsgzao.github.io/post/iptables/
LTMP 手动编译安装以及全自动化部署实践 – http://wsgzao.github.io/post/ltmp/

  1. 服务器 A(主服务器)
  2. 服务器 B(从服务器 / 备份服务器)
  3. rsync 默认 TCP 端口为 873

 

服务器 B

在服务器 B 上安装 rsync:

  1. cd /app/local
  2. wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
  3. tar zxf rsync-3.1.1.tar.gz
  4. cd rsync-3.1.1
  5. ./configure
  6. make && make install

设置 rsync 的配置文件:

  1. vi /etc/rsyncd.conf
  1. # 服务器 B 上的 rsyncd.conf 文件内容
  2. uid=root
  3. gid=root
  4. # 最大连接数
  5. max connections=36000
  6. # 默认为 true,修改为 no,增加对目录文件软连接的备份
  7. use chroot=no
  8. # 定义日志存放位置
  9. log file=/var/log/rsyncd.log
  10. # 忽略无关错误
  11. ignore errors = yes
  12. # 设置 rsync 服务端文件为读写权限
  13. read only =no
  14. # 认证的用户名与系统帐户无关在认证文件做配置,如果没有这行则表明是匿名
  15. auth users = rsync
  16. # 密码认证文件,格式(虚拟用户名: 密码)
  17. secrets file =/etc/rsync.pass
  18. # 这里是认证的模块名,在 client 端需要指定,可以设置多个模块和路径
  19. [rsync]
  20. # 自定义注释
  21. comment = rsync
  22. # 同步到 B 服务器的文件存放的路径
  23. path=/app/data/site/
  24. [img]
  25. comment = img
  26. path=/app/data/site/img

创建 rsync 认证文件 可以设置多个,每行一个用户名: 密码,注意中间以“:”分割

  1. echo "rsync:rsync">/etc/rsync.pass

设置文件所有者读取、写入权限:

  1. chmod 600/etc/rsyncd.conf
  2. chmod 600/etc/rsync.pass

启动服务器 B 上的 rsync 服务:

  1. # rsync --daemon -v
  2. rsync --daemon

监听端口 873:

  1. netstat -an | grep 873
  2. lsof -i tcp:873
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. rsync 31445 root 4uIPv44438720t0 TCP *:rsync (LISTEN)
  5. rsync 31445 root 5uIPv64438730t0 TCP *:rsync (LISTEN)

设置 rsync 为服务启动项(可选):

  1. echo "/usr/local/bin/rsync --daemon">>/etc/rc.local

要 Kill rsync 进程,不要用 kill -HUP {PID} 的方式重启进程,以下 3 种方式任选:

  1. # ps -ef|grep rsync|grep -v grep|awk '{print $2}'|xargs kill -9
  2. # cat /var/run/rsyncd.pid | xargs kill -9
  3. pkill rsync

再次启动:

  1. /usr/local/bin/rsync --daemon

 

服务器 A

安装 rsync:

  1. cd /app/local
  2. wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
  3. tar zxf rsync-3.1.1.tar.gz
  4. cd rsync-3.1.1
  5. ./configure
  6. make && make install

安装 inotify-tools:

  1. cd /app/local
  2. wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
  3. tar zxf inotify-tools-3.14.tar.gz
  4. cd inotify-tools-3.14
  5. ./configure --prefix=/app/local/inotify
  6. make && make install

安装 sersync:

  1. cd /app/local
  2. wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
  3. tar zxf sersync2.5.4_64bit_binary_stable_final.tar.gz
  4. mv /app/local/GNU-Linux-x86/ /app/local/sersync
  5. cd /app/local/sersync

配置下密码文件,因为这个密码是要访问服务器 B 需要的密码和上面服务器 B 的密码必须一致:

  1. echo "rsync">/app/local/sersync/user.pass

修改权限:

  1. chmod 600/app/local/sersync/user.pass

修改 confxml.conf:

  1. vi /app/local/sersync/confxml.xml

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <headversion="2.5">
  3. <hosthostip="localhost"port="8008"></host>
  4. <debugstart="true"/>
  5. <fileSystemxfs="false"/>
  6. <filterstart="false">
  7. <excludeexpression="(.*)\.php"></exclude>
  8. <excludeexpression="^data/*"></exclude>
  9. </filter>
  10. <inotify>
  11. <deletestart="true"/>
  12. <createFolderstart="true"/>
  13. <createFilestart="false"/>
  14. <closeWritestart="true"/>
  15. <moveFromstart="true"/>
  16. <moveTostart="true"/>
  17. <attribstart="false"/>
  18. <modifystart="false"/>
  19. </inotify>
  20. <sersync>
  21. <localpathwatch="/home/"><!-- 这里填写服务器 A 要同步的文件夹路径 -->
  22. <remoteip="8.8.8.8"name="rsync"/><!-- 这里填写服务器 B 的 IP 地址和模块名 -->
  23. <!--<remote ip="192.168.28.39" name="tongbu"/>-->
  24. <!--<remote ip="192.168.28.40" name="tongbu"/>-->
  25. </localpath>
  26. <rsync>
  27. <commonParamsparams="-artuz"/>
  28. <authstart="true"users="rsync"passwordfile="/app/local/sersync/user.pass"/><!-- rsync+ 密码文件 这里填写服务器 B 的认证信息 -->
  29. <userDefinedPortstart="false"port="874"/><!-- port=874 -->
  30. <timeoutstart="false"time="100"/><!-- timeout=100 -->
  31. <sshstart="false"/>
  32. </rsync>
  33. <failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60mins execute once--><!-- 修改失败日志记录(可选)-->
  34. <crontabstart="false"schedule="600"><!--600mins-->
  35. <crontabfilterstart="false">
  36. <excludeexpression="*.php"></exclude>
  37. <excludeexpression="info/*"></exclude>
  38. </crontabfilter>
  39. </crontab>
  40. <pluginstart="false"name="command"/>
  41. </sersync>
  42. <!-- 下面这些有关于插件你可以忽略了 -->
  43. <pluginname="command">
  44. <paramprefix="/bin/sh"suffix=""ignoreError="true"/><!--prefix /opt/tongbu/mmm.sh suffix-->
  45. <filterstart="false">
  46. <includeexpression="(.*)\.php"/>
  47. <includeexpression="(.*)\.sh"/>
  48. </filter>
  49. </plugin>
  50. <pluginname="socket">
  51. <localpathwatch="/home/demo">
  52. <deshostip="210.36.158.xxx"port="8009"/>
  53. </localpath>
  54. </plugin>
  55. <pluginname="refreshCDN">
  56. <localpathwatch="/data0/htdocs/cdn.markdream.com/site/">
  57. <cdninfodomainname="cdn.chinacache.com"port="80"username="xxxx"passwd="xxxx"/>
  58. <sendurlbase="http://cdn.markdream.com/cms"/>
  59. <regexurlregex="false"match="cdn.markdream.com/site([/a-zA-Z0-9]*).cdn.markdream.com/images"/>
  60. </localpath>
  61. </plugin>
  62. </head>

运行 sersync:

  1. nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/confxml.xml >/app/local/sersync/rsync.log 2>&1&
  2. nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/img.xml >/app/local/sersync/img.log 2>&1&
  • -d: 启用守护进程模式
  • -r: 在监控前,将监控目录与远程主机用 rsync 命令推送一遍
  • -n: 指定开启守护线程的数量,默认为 10 个
  • -o: 指定配置文件,默认使用 confxml.xml 文件

 

GitHub 源码仓库

sersync – https://github.com/wsgzao/sersync

RSync 实现文件备份同步详解   http://www.linuxidc.com/Linux/2014-09/106967.htm

利用 inotifywait 监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用 inotify+rsync 实现 Linux 文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync 实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

rsync 同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

CentOS 6.5 下 Rsync 远程同步 http://www.linuxidc.com/Linux/2014-05/101084.htm

Rsync 的详细介绍:请点这里
Rsync 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121900.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6468字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中