实时复制服务介绍

1.1 企业数据备份方案介绍

在网站集群架构中,数据永远是网站最重要的,一旦数据造成丢失,将会给企业造成巨大损失,因此,企业网站和应用需要有完善的数据备份方案来确保数据安全。在真实企业中,数据备份方案通常有以下几种情况:

1、利用定时方式,实现周期备份重要数据信息

需要周期性备份的数据可分为两类:一是程序猿发布的程序代码以及运维人员对服务器等的配置变更文件,一般会使用定时任务执行脚本对该类文件进行备份,然后再配合rsync工具推送到远端服务器备份。二是对于数据库等的数据会用定时执行脚本备份,然后再配合rsync工具推送到远端服务器备份。

下图为周期性数据备份示意图:

7f932584-bbb5-4558-a7a3-c9144208fa12.jpg

2、利用实时复制方式,实现实时备份重要数据信息

实时复制是企业数据备份最重要的方式,主要用于用户提交的数据的备份,对于用户提交到服务器上的普通文件(压缩包、视频、文档等),可采用sersync+rsync实时备份方式。对于数据文件还有较复杂的分布式存储工具自身可以实现讲数据同时备份成多分。,列如:FastdfsGlusterFS等。对于提交到数据库中的数据,可使用数据库的主从复制(列如:MysqlOracle)方式备份,这是软件自带的实时复制备份方式。有的企业会采用更多思路实现数据同时变为多份,列如:程序业务逻辑在数据提交时,同时提交到两个服务器。

下图为普通数据文件实时数据备份示意图:

93c3f02a-786e-4b7b-bfb6-90ffb1e45d08.jpg

1.2 Sersync同步原理:

b7451a9c-cca2-43b5-abcf-97c99e8a53ab.jpg

1、用户实时的往sersync服务器(M)上写入更新文件数据

2、此时需要在同步主服务器(M)上配置sersync服务

3、在客户端1和客户端2上开启rsync守护进程服务,以同步拉取来自sersync服务器(M)上的数据

通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件。然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器(客户端1和客户端2),如此简单

1.2.1 实时复制细节实现说明

1、实时复制软件会监控磁盘文件系统的变化,比如:指定一个/data目录,实时复制软件服务器进程会实时监控这个/data目录中数据的变化,即文件系统blockinode信息的变化

2、一旦/data目录文件发生变化,就会执行rsync命令,将变化的数据信息推送到备份服务器相应的备份目录中,从而完成数据的实时备份。

1.3 实时复制软件介绍

随着互联网技术的不断发展,数据复制软件服务也层出不穷,目前企业中较为常用的实时复制软件有如下两种:

c0f159ed-2c13-4a9f-8203-fb5c080aa821.jpg

1.4 实时复制inotify机制介绍

1.4.1 inotify机制简介

Inotify是一种异步的件系统事件监控机制,Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加。删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。实际上inotify-tools是一个监控指定目录数据实时变化的软件程序

Inotify程序原理是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,可以做到对事件处理的实时响应。

  • inotify机制优点
    1、监控文件系统事件变化,通过复制工具实现实时数据复制
    2、支持多线程实时复制
  • inotify机制缺点
    实测并发如果大于200个文件(20-100k),复制会有延迟

1.5 sersync工具简介

sersync项目利用inotifyrsync技术实现对服务器数据实时复制的解决方案,其中inot用于监控sersync所在服务器上文件系统的事件变化,rsync是目前广泛使用的本地与异地数据复制工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行复制,所以其优势大大超过使用挂接文件系统或scp等方式进行镜像复制。

  • sersync优点
    1、使用c++编写,对linux系统文件产生的临时文件和重复的文件操作会进行过滤,再结合rsync复制的时候,会减少运行时消耗的本地及网络资源。因此速度更快
    2、sersync配置起来很简单
    3、使用多线程进行复制,尤其在复制较大文件时,能够保证多个服务器实时保持复制状态
    4、sersync自带出错处理机制,通过失败队列对出错的文件重新复制,如果仍旧失败,则每若干个小时对复制失败的文件再重新复制
    5、sersync自带crontab功能,只需在xml配置文件中开启,即可按预先的配置,隔一段时间整体复制一次
    6、sersync自带sockethttp的协议扩展,可以满足有特殊需求的公司二次开发

1.5.1 sersync软件原理图

5be7ce13-32c3-4443-9a68-6074138016a3.jpg

1.5.2 sersync实践

  1. #1、测试一下rsync服务是否可用
  2. [root@nfs-41 ~]# rsync -avz --no-o --no-g /backup/ rsync_backup@10.0.0.31::backup --password-file=/etc/rsync.password
  3. #2、安装inotify-tools
  4. [root@nfs-41 server]# ls #上传inotify-tools
  5. inotify-tools-3.14.tar.gz
  6. [root@nfs-41 server]# tar xf inotify-tools-3.14.tar.gz
  7. [root@nfs-41 server]# cd inotify-tools-3.14
  8. [root@nfs-41 inotify-tools-3.14]# ./configure
  9. [root@nfs-41 inotify-tools-3.14]# make && make install
  10. #3、部署sersync服务(客户端)
  11. [root@nfs-41 server]# ls #上传sersync客户端
  12. sersync2.5.4_64bit_binary_stable_final.tar.gz
  13. [root@nfs-41 server]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
  14. [root@nfs-41 server]# mv GNU-Linux-x86/ sersync
  15. [root@nfs-41 server]# cd sersync/
  16. [root@nfs-41 sersync]# ls
  17. confxml.xml #sersync配置文件 sersync2 #sersync启动程序
  18. [root@nfs-41 sersync]# echo "123456" > /iflytek/server/sersync/user.pass #配置下密码文件,因为这个密码是要服务端需要的密码和服务端密码必须一致(/etc/rsync.password)
  19. [root@nfs-41 sersync]# chmod 600 /iflytek/server/sersync/user.pass #修改权限
  20. [root@nfs-41 sersync]# vim confxml.xml #修改配置文件之前
  21. <?xml version="1.0" encoding="ISO-8859-1"?>
  22. <head version="2.5">
  23. #设置本地ip和端口
  24. <host hostip="localhost" port="8008"></host>
  25. #开启DUBUG模式
  26. <debug start="false"/>
  27. #开启xfs文件系统
  28. <fileSystem xfs="false"/>
  29. #同步时忽略推送的文件,默认关闭
  30. <filter start="false">
  31. <exclude expression="(.*)\.svn"></exclude>
  32. <exclude expression="(.*)\.gz"></exclude>
  33. <exclude expression="^info/*"></exclude>
  34. <exclude expression="^static/*"></exclude>
  35. </filter>
  36. <inotify>
  37. #设置要监控的事件
  38. <delete start="true"/>
  39. <createFolder start="true"/>
  40. <createFile start="false"/>
  41. <closeWrite start="true"/>
  42. <moveFrom start="true"/>
  43. <moveTo start="true"/>
  44. <attrib start="false"/>
  45. <modify start="false"/>
  46. </inotify>
  47. <sersync>
  48. #本地同步的目录路径
  49. <localpath watch="/opt/tongbu">
  50. #远程IP和rsync模块名
  51. <remote ip="127.0.0.1" name="tongbu1"/>
  52. <!--<remote ip="192.168.8.39" name="tongbu"/>-->
  53. <!--<remote ip="192.168.8.40" name="tongbu"/>-->
  54. </localpath>
  55. <rsync>
  56. #rsync指令参数
  57. <commonParams params="-artuz"/>
  58. #rsync同步认证
  59. <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
  60. #设置rsync远程服务端口,远程非默认端口则需打开自定义
  61. <userDefinedPort start="false" port="874"/><!-- port=874 -->
  62. #设置超时时间
  63. <timeout start="false" time="100"/><!-- timeout=100 -->
  64. #设置rsync+ssh加密传输模式,默认关闭,开启需设置ssh加密证书
  65. <ssh start="false"/>
  66. </rsync>
  67. #sersync传输失败日志脚本路径,每隔60秒会重新执行该脚本,执行完毕会自动清空
  68. <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
  69. #设置rsync+crontab定时传输,默认关闭
  70. <crontab start="false" schedule="600"><!--600mins-->
  71. <crontabfilter start="false">
  72. <exclude expression="*.php"></exclude>
  73. <exclude expression="info/*"></exclude>
  74. </crontabfilter>
  75. </crontab>
  76. #设置sersync传输后调用name指定的插件脚本,默认关闭
  77. <plugin start="false" name="command"/>
  78. </sersync>
  79. #插件脚本范例
  80. <plugin name="command">
  81. <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
  82. <filter start="false">
  83. <include expression="(.*)\.php"/>
  84. <include expression="(.*)\.sh"/>
  85. </filter>
  86. </plugin>
  87. #插件脚本范例
  88. <plugin name="socket">
  89. <localpath watch="/opt/tongbu">
  90. <deshost ip="192.168.138.20" port="8009"/>
  91. </localpath>
  92. </plugin>
  93. <plugin name="refreshCDN">
  94. <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
  95. <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
  96. <sendurl base="http://pic.xoyo.com/cms"/>
  97. <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
  98. </localpath>
  99. </plugin>
  100. </head>
  101. #修改后的局部脚本内容
  102. <sersync>
  103. <localpath watch="/data"> #本地端要实时推送的目录
  104. <remote ip="10.0.0.31" name="backup"/> #对端ip和对端的目录名称
  105. <!--<remote ip="192.168.8.39" name="tongbu"/>-->
  106. <!--<remote ip="192.168.8.40" name="tongbu"/>-->
  107. </localpath>
  108. <rsync>
  109. <commonParams params="-avz"/>
  110. <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> #开启rsync,rsync的模块名称和rsync的密码文件
  111. <userDefinedPort start="false" port="874"/><!-- port=874 -->
  112. <timeout start="true" time="100"/><!-- timeout=100 -->
  113. <ssh start="false"/>
  114. </rsync>
  115. #sersync传输失败日志脚本路径,每隔60秒会重新执行该脚本,执行完毕会自动清空
  116. <failLog path="/application/sersync_installdir_64bit/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--def
  117. #4、启动sersync服务
  118. [root@nfs-41 sersync]# nohup /iflytek/server/sersync/sersync2 -r -d -o /iflytek/server/sersync/confxml.xml &
  119. #5、添加开机自启动
  120. [root@nfs-41 sersync]# tail -1 /etc/rc.d/rc.local
  121. nohup /iflytek/server/sersync/sersync2 -r -d -o /iflytek/server/sersync/confxml.xml &
  122. #6、命令参数说明
  123. sersync:实时同步工具
  124. 主要选项:
  125. -d 启用守护进程模式
  126. -r 在监控前,将监控目录与远程主机用rsync命令推送一遍
  127. -n 指定开启守护进程的数量,默认为10
  128. -o 指定配置文件,默认使用confxml.xml文件
  129. https://github.com/wsgzao/sersync 以上软件都可以在官方下载