几大实时同步方案比较

1.inotify + rsync

inotify + rsync,随着文件数量的增大到100W+,目录下的文件列表就达20M,在网络状况不佳或者限速的情况下,变更的文件可能10来个才几M,却因此要发送的文件列表就达20M,严重减低的带宽的使用效率以及同步效率;更为要紧的是,加入inotifywait在5s内监控到10个小文件发生变化,便会触发10个rsync同步操作,结果就是真正需要传输的才2-3M的文件,比对的文件列表就达200M。使用这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,比如排除同步的目录,同步多个模块或同步到多个主机。 缺陷——> 严重降低的带宽的使用效率以及同步效率

2.lsyncd

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。 我认为它最令人称道的特性是,完美解决了 inotify +rsync海量文件同步带来的文件频繁发送文件列表的问题

lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。 实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录),一个命令搞定。

3.sersync

sersync 这么个工具可以提高同步的性能,也解决了同步大文件时出现异常的问题, 能做到海量的文件的平滑迁移 缺陷——> 不能yum安装

  • sersync的功能:

    1.支持配置文件管理 2.真正的守护进程socket 3.可以对失败文件定时重传(定时任务功能) 4.第三方的HTTP接口(例:更新cdn缓存) 5.默认多线程rsync同步

优点:

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

缺点:

sersync有重传机制(内置的定时任务),但是只重传一次,如果重传失败就会清空重传队列,即清空/tmp/rsync_fail_log.sh文件。这样就会造成sersync服务恢复正常后(即可以同步文件),数据同步的两个服务器数据不一致的现象。因为,/tmp/rsync_fail_log.sh文件为空,而sersync只对发生变化的文件做实时同步(ps:sersync默认每隔十个小时做一次完整的数据同步)。


数据存放目录 10.0.0.31 /data 监控目录
实时备份目录 10.0.0.41 ::backup模块

一,基于inotify脚本部署全网备份服务:

1. 安装
1) 从内核和目录里面查看是否支持inotify

[root@nfs01 ~]# uname -r
2.6.32-573.el6.x86_64

2)检查是否有安装inotify 如果没有就安装
wget -O /etc/yum.repos.d/CentOS-Base.repo [http://mirrors.aliyun.com/repo/Centos-7.repo](http://mirrors.aliyun.com/repo/Centos-7.repo)

rpm -qa inotify-tools

3)了解怎么使用

/usr/bin/inotifywait        —- 实现监控目录数据变化信息 添加 修改 删除 关注 /usr/bin/inotifywatch       —- 实时统计目录数据变化信息 添加_10 修改_20 i

2.notifywait手册:

  1. inotifywait [ options ] /data 日志
  2. --exclude Exclude all events on files matching the extended regular expression .
  3. 实时同步数据时, 将部分文件排除进行同步操作
  4. --excludei Like --exclude but case insensitive.
  5. 实时同步数据时, 忽略文件大小写进行同步排除操作
  6. -m|--monitor Keep listening for events forever. Without this option, inotifywait will exit after one event is received.
  7. 维持事件永久监听状态. 如果没有此参数, 一次事件被接收后就退出监视过程
  8. -r|--recursive Watch directories recursively
  9. 递归监控目录数据信息变化
  10. -q|--quiet Print less (only print events).
  11. 输出很少的信息 (只输出事件信息)
  12. -qq Print nothing (not even events).
  13. 什么都没有(甚至事件信息也不要输出)
  14. --format Print using a specified printf-like format string; read the man page for more details.
  15. 设计规划命令输出信息格式
  16. --timefmt strftime-compatible format string for use with %T in --format string.
  17. 规划时间信息格式
  18. -e|--event [ -e|--event ... ]
  19. Listen for specific event(s). If omitted, all events are listened for.
  20. 指定监听事件信息, 如果忽略参数配置, 所有事件都要监视

同步时需要监控事件信息 close_write move create delete

  1. access file or directory contents were read
  2. modify file or directory contents were written 修改
  3. attrib file or directory attributes changed
  4. close_write file or directory closed, after being opened in writeable mode
  5. 文件或目录被写入新的信息后, 进行关闭操作
  6. close_nowrite file or directory closed, after being opened in read-only mode
  7. 文件或目录没有写入新的信息后, 进行关闭操作
  8. close file or directory closed, regardless of read/write mode
  9. open file or directory opened
  10. moved_to file or directory moved to watched directory
  11. 文件或目录有数据变化, 数据信息是从其他目录转移过来
  12. moved_from file or directory moved from watched directory
  13. 文件或目录有数据变化, 数据信息是从监控服务转到其它目录
  14. move file or directory moved to or from watched directory
  15. create file or directory created within watched directory
  16. 文件或目录进行创建时需要被监控
  17. delete file or directory deleted within watched directory
  18. 文件或目录进行删除时需要被监控
  19. delete_self file or directory was deleted
  20. unmount file system containing file or directory unmounted

3.inotify部署全网备份:

  • 基础使用方法

    inotifywait -mrq /data 扩展 : inotifywait -mrq /data —format “%T %w%f %e” —timefmt=”%F%A %T” 或者 inotifywait -mrq /data —format “%T %w%f %e” —timefmt=”%F%A %T” -e “close_write,move,create,delete”

  • 编写inotifly实时同步脚本

    1. #!/bin/bash
    2. inotifywait -mrq /data --format "%w%f" -e "close_write,move,create,delete" | while read line
    3. do
    4. rsync -az /data/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
    5. done
  • 使用脚本
    nohup sh /server/scripts/inotify.sh & #nohup
    该命令可以在你退出帐户/关闭终端之后继续运行相应的进程,& 后台运行


二,lsync部署实时同步服务

  • 安装部署lsync实时同步工具

    rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # 安装 epel 源
    yum -y install lsyncd rsync # 安装
    vim /etc/lsyncd.conf # 配置
    
  • 编写配置文件 (—才是注释)

[root@nfs01 tmp]#** vi /etc/lsyncd.conf **

--注释:sync{default.rsyncssh, source="/var/www/html", host="nfs01", targetdir="backup01  /data"}
settings {
    logfile      = "/var/log/lsyncd/lsyncd.log",
    statusFile   = "/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 1000,
    maxDelays    = 10,
    }

sync {
    default.rsync,
    source    = "/tmp/",
    target    = "rsync_backup@172.16.1.41::backup",
    delay     = 1,
    delete    = true,
    rsync     = {
        binary    = "/usr/bin/rsync",
        password_file = "/etc/rsync.password",
        archive   = true,
        compress = false,
        verbose   = true
        }
    }


说明: —表示注释 lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响 其他方式同步 详解 ![%E~U6Q6W~~O7VY~LG6O2K5.jpg


  • 启动服务
    systemctl start lsyncd

    启动报错处理:

    首先查看 /etc/lsycn.conf 配置文件内—-> 同步的源文件目录 && 推送的目标目录是否存在(远程的也要查看对端的文件目录是否存在)

三,sersync二进制部署实时同步服务。

接收机上的操作  Backup服务器

  • 安装rsync
    [root@backup ~]# yum install rsync -y
  • 配置rsync
    [root@backup ~]# cat /etc/rsyncd.conf
    uid = www
    gid = www
    port = 873
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 600
    ignore errors
    read only = false
    list = false
    auth users = rsync_backup
    secrets file = /etc/rsync.passwd
    log file = /var/log/rsyncd.log
    #####################################
    [backup]
    comment = welcome to oldboyedu backup!
    path = /backup
    

根据配置完成对应初始化操作

[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -u 666 -g666 www
[root@backup ~]# mkdir /backup /data
[root@backup ~]# chown -R www.www /backup/ /data/
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd   
[root@backup ~]# chmod 600 /etc/rsync.passwd
  • 重启Rsync服务
    [root@backup ~]# systemctl restart rsyncd

推送源机上的操作 NFS服务器:
1.下载并解压sersync软件包

如果大家网络不好上不去git,这里下载好的sersync二进制软件包。

[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs ~]# mv GNU-Linux-x86/ /usr/local/sersync

2.配置confxml.xml
[root@localhost conf]# cat /usr/local/sersync/confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
   # 设置本地IP和端口
   <host hostip="localhost" port="8008"></host>
   # 开启DUBUG模式  
   <debug start="false"/>
   # 是否为xfs文件系统
   <fileSystem xfs="false"/>
   # 同步时忽略推送的文件(正则表达式),默认关闭
   <filter start="false">
       <exclude expression="(.*)\.svn"></exclude>
       <exclude expression="(.*)\.gz"></exclude>
       <exclude expression="^info/*"></exclude>
       <exclude expression="^static/*"></exclude>
   </filter>
   <inotify>
   # 设置要监控的事件
       <delete start="true"/>
       <createFolder start="true"/>
       <createFile start="true"/>
       <closeWrite start="true"/>
       <moveFrom start="true"/>
       <moveTo start="true"/>
       <attrib start="true"/>
       <modify start="true"/>
   </inotify>
   <sersync>
   # 本地同步的目录路径
       <localpath watch="/home/data">
   # 远程IP和rsync模块名 
           <remote ip="192.168.1.35" name="rsyncmysql"/>  
           <!--<remote ip="192.168.8.39" name="tongbu"/>-->
           <!--<remote ip="192.168.8.40" name="tongbu"/>-->
       </localpath>
       <rsync>
   # rsync指令参数
           <commonParams params="-auvzP"/>
   # rsync同步认证
           <auth start="true" users="rsync" passwordfile="/etc/rsync.pas"/>
   # 设置rsync远程服务端口,远程非默认端口则需打开自定义
           <userDefinedPort start="false" port="873"/><!-- port=874 -->
   # 设置超时时间
           <timeout start="true" time="100"/><!-- timeout=100 -->
   # 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书
           <ssh start="false"/>
       </rsync>
    # sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。
       <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    # 设置rsync+crontab定时传输,默认关闭
       <crontab start="false" schedule="600"><!--600mins-->
           <crontabfilter start="false">
               <exclude expression="*.php"></exclude>
               <exclude expression="info/*"></exclude>
           </crontabfilter>
       </crontab>
   # 设置sersync传输后调用name指定的插件脚本,默认关闭
       <plugin start="false" name="command"/>
   </sersync>
   # 插件脚本范例
   <plugin name="command">
       <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
       <filter start="false">
           <include expression="(.*)\.php"/>
           <include expression="(.*)\.sh"/>
       </filter>
   </plugin>
   # 插件脚本范例
   <plugin name="socket">
       <localpath watch="/opt/tongbu">
           <deshost ip="192.168.138.20" port="8009"/>
       </localpath>
   </plugin>
   <plugin name="refreshCDN">
       <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
           <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxx"/>
           <sendurl base="http://pic.xoyo.com/cms"/>
           <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
       </localpath>
   </plugin>
</head>

3.启动
[root@nfs01 /usr/local/sersync]# chmod +x sersync2
[root@nfs ~]# /usr/local/sersync/sersync2 -h
[root@nfs ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

4.重启操作如下:
killall sersync2 && sersync2 -dro /usr/local/sersync/conf/confxml.xml

ps 无法由systemctl启动,只能手动/脚本启停,pkill sersync2,sersync2 -dro /usr/bin/xxxxx 可以通过多个配置文件实现,不同目录的备份服务

5.配置开机启动
echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.d/rc.local
echo "sersync2 -dro /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local
NFS故障了,如何实现切换?

1.停止nfs服务 [root@nfs ~]# systemctl stop nfs 2.web切换操作 [root@web01 ~]# umount -lf /var/www/html/data/User/admin/home && mount -t nfs 172.16.1.41:/data /var/www/html/data/User/admin/home