Sersync实时同步工具选择

  • rsync + inotify 适合少量文件同步,麻烦。同步大文件太慢,遍历扫描,非常影响效率。

  • sersync 适合大量小文件同步。配置简单,多线程同步,同步快。

  • 实时同步案例

  • 实现web上传视频文件,实际是写入NFS存储,当NFS数据更新时,会实时同步到备份服务器backup


    分析:

    1. web上传视频至NFS存储/data目录

    2. 将NFS的/data目录数据实时同步到备份服务器的/data目录

    3. 准备:

      角色外网IP(NAT)内网IP(LAN)安装工具
      web01 eth0:10.0.0.7 eth1:172.16.1.7 nfs-utils + httpd + php
      nfs eth0:10.0.0.31 eth1:172.16.1.31 nfs-utils + rsync + inotify-tools + sersync
      backup eth0:10.0.0.41 eth1:172.16.1.41 rsync + nfs-utils

      注意: web01服务器需要上传文件代码一份


      backup服务器配置

      1. 安装rsyncnfs-utils

       [root@backup ~]# yum -y install rsync nfs-utils
      1. 配置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.password
       log file = /var/log/rsyncd.log
       #####################################
       [data]
       comment = /var/www/html in 172.16.1.7
       path = /data
      1. 根据配置文件创建对应需求:

        • 创建对应密码文件并授权

        • 创建对应用户

        • 创建对应目录并授权

       [root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.password
       [root@backup ~]# chmod 600 /etc/rsync.password
       [root@backup ~]# groupadd -g 666 www
       [root@backup ~]# useradd -u 666 -g 666 www
       [root@backup ~]# mkdir -p /data
       [root@backup ~]# chown -R www.www /data
      1. 配置nfs共享

       [root@backup ~]# cat /etc/exports
       /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
      

         5.启动rsyncnfs服务,并加入开机自启

    4.  [root@backup ~]# systemctl restart nfs rsyncd
      
      [root@backup ~]# systemctl enable nfs rsyncd
      

        6.验证共享目录和端口

    5.  [root@backup ~]# cat /var/lib/nfs/etab
       /data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
       [root@backup ~]# netstat -4tupnl | grep "rpc\|-"
       Proto Recv-Q Send-Q Local Address     Foreign Address         State       PID/Program name 
       tcp        0      0 0.0.0.0:39976     0.0.0.0:*               LISTEN      24969/rpc.statd   
       tcp        0      0 0.0.0.0:111       0.0.0.0:*               LISTEN      25446/rpcbind     
       tcp        0      0 0.0.0.0:20048     0.0.0.0:*               LISTEN      25458/rpc.mountd 
       tcp        0      0 0.0.0.0:33718     0.0.0.0:*               LISTEN      -                 
       tcp        0      0 0.0.0.0:2049      0.0.0.0:*               LISTEN      -                
       udp        0      0 0.0.0.0:111       0.0.0.0:*                           25446/rpcbind    
       udp        0      0 0.0.0.0:48407     0.0.0.0:*                           -                 
       udp        0      0 0.0.0.0:20048     0.0.0.0:*                           25458/rpc.mountd 
       udp        0      0 0.0.0.0:47703     0.0.0.0:*                           24969/rpc.statd   
       udp        0      0 0.0.0.0:604       0.0.0.0:*                           25446/rpcbind     
       udp        0      0 127.0.0.1:977     0.0.0.0:*                           24969/rpc.statd   
       udp        0      0 0.0.0.0:2049      0.0.0.0:*                           - 
      

        


    6. nfs服务器配置

      1. 安装nfs-utilsinotify-toolsrsync

       [root@nfs ~]# yum -y install rsync inotify-tools nfs-utils
      1. 根据backup服务器配置文件创建对应需求:

        • 创建对应密码文件并授权,文件中只有密码!!

        • 创建统一用户与backup服务器对应

        • 创建共享目录并授权

       [root@nfs ~]# echo "123456" > /etc/rsync.password
       [root@nfs ~]# chmod 600 /etc/rsync.password
       [root@nfs ~]# groupadd -g 666 www
       [root@nfs ~]# useradd -u 666 -g 666 www
       [root@nfs ~]# mkdir -p /data
       [root@nfs ~]# chown -R www.www /data
      1. 测试手动推送

       [root@nfs ~]# rsync -avz --password-file=/etc/rsync.password /data rsync_backup@172.16.1.41::data
      1. 配置nfs共享

       [root@nfs ~]# cat /etc/exports
       /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
      1. 启动rsyncnfs服务,并加入开机自启

       [root@nfs ~]# systemctl restart nfs rsync
       [root@nfs ~]# systemctl enable nfs rsync
      1. 验证共享目录和端口

       [root@nfs ~]# cat /var/lib/nfs/etab 
       /data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
       [root@nfs ~]# netstat -4tupnl | grep "rpc\|-"
       Proto Recv-Q Send-Q Local Address     Foreign Address         State       PID/Program name 
       tcp        0      0 0.0.0.0:39976     0.0.0.0:*               LISTEN      24969/rpc.statd   
       tcp        0      0 0.0.0.0:111       0.0.0.0:*               LISTEN      25446/rpcbind     
       tcp        0      0 0.0.0.0:20048     0.0.0.0:*               LISTEN      25458/rpc.mountd 
       tcp        0      0 0.0.0.0:33718     0.0.0.0:*               LISTEN      -                 
       tcp        0      0 0.0.0.0:2049      0.0.0.0:*               LISTEN      -                
       udp        0      0 0.0.0.0:111       0.0.0.0:*                           25446/rpcbind    
       udp        0      0 0.0.0.0:48407     0.0.0.0:*                           -                 
       udp        0      0 0.0.0.0:20048     0.0.0.0:*                           25458/rpc.mountd 
       udp        0      0 0.0.0.0:47703     0.0.0.0:*                           24969/rpc.statd   
       udp        0      0 0.0.0.0:604       0.0.0.0:*                           25446/rpcbind     
       udp        0      0 127.0.0.1:977     0.0.0.0:*                           24969/rpc.statd   
       udp        0      0 0.0.0.0:2049      0.0.0.0:*                           - 
      1. 安装sersync

        1. 创建文件存放目录并进入

         [root@nfs ~]# mkdir /usr/local/sersync
         [root@nfs ~]# cd /usr/local/sersync
        1. 下载sersync到Linux

          • 可以使用wget在线下载软件包

             [root@nfs sersync]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
          • 也可以使用rz拉取Windows上事先下载的软件包

             [root@nfs sersync]# rz
        2. 解压软件包,每个监控目录创建一个对应的配置文件

         [root@nfs sersync]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
         [root@nfs sersync]# cp confxml.xml backupconf.xml
      2. 配置sersync详解

      3.  
      4. [root@nfs sersync]# vim backupconf.xml
        5 <fileSystem xfs="true"/> <!-- 文件系统 -->
        6 <filter start="false"> <!-- 排除不想同步的文件-->
        7 <exclude expression="(.*)\.svn"></exclude>
        8 <exclude expression="(.*)\.gz"></exclude>
        9 <exclude expression="^info/*"></exclude>
        10 <exclude expression="^static/*"></exclude>
        11 </filter>
        12 <inotify> <!-- 监控的事件类型 -->
        13 <delete start="true"/>
        14 <createFolder start="true"/>
        15 <createFile start="true"/>
        16 <closeWrite start="true"/>
        17 <moveFrom start="true"/>
        18 <moveTo start="true"/>
        19 <attrib start="false"/>
        20 <modify start="false"/>
        21 </inotify>
        22
        23 <sersync>
        24 <localpath watch="/data"> <!-- 监控的目录 -->
        25 <remote ip="172.16.1.41" name="data"/> <!-- backup的IP以及模块 -->
        26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        28 </localpath>
        29 <rsync> <!-- rsync的选项 -->
        30 <commonParams params="-az"/>
        31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
        32 <userDefinedPort start="false" port="874"/><!-- port=874 -->
        33 <timeout start="true" time="100"/><!-- timeout=100 -->
        34 <ssh start="false"/>
        35 </rsync>
        <!-- 每60分钟执行一次同步-->
        36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--def
        ault every 60mins execute once-->查看sersync启动参数
        
        [root@nfs sersync]# ./sersync2 -h
        
        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
         参数-d:启用守护进程模式
         参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
         参数-n: 指定开启守护线程的数量,默认为10个
         参数-o:指定配置文件,默认使用confxml.xml文件
         参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
         参数-m:单独启用其他模块,使用 -m socket 开启socket模块
         参数-m:单独启用其他模块,使用 -m http 开启http模块
         不加-m参数,则默认执行同步程序
        1. 启动sersync服务守护进程

         [root@nfs ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/backupconf.xml
      5. 注意: 如果需要同步多个目录,那么需要启动多个守护进程指定多套配置文件
      6. web01服务器配置

        1. 安装httpdphpnfs-utils

         [root@web01 ~]# yum -y install httpd php nfs-utils
        1. 挂载nfs服务器提供的共享目录

         [root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html/
        1. 进入/var/www/html/目录,使用rz拉取Windows上事先准备的文件上传代码包到Linux,最后解压

         [root@web01 ~]# cd /var/www/html/
         [root@web01 html]# rz
         [root@web01 html]# tar xf upload.tar.gz
        1. 启动httpd服务,并设为开机启动

         [root@web01 ~]# systemctl start httpd
         [root@web01 ~]# systemctl enable httpd
        1. 使用浏览器打开网页http://10.0.0.7/,测试文件上传功能

        2. 创建统一用户www

         [root@web01 ~]# groupadd -g 666 www
         [root@web01 ~]# useradd -u 666 -g 666 www
        1. 让httpd也使用www用户,修改httpd配置文件

         [root@web01 ~]# vi /etc/httpd/conf/httpd.conf
         ... ...
         User www    # 默认User apache
         Group www   # 默认Group apache
         ... ...
        1. 默认上传文件最大2M,修改为2000M,需要修改php的配置文件vi/etc/php.ini

         [root@web01 ~]# vi /etc/php.ini
         ... ...
         upload_max_filesize = 2000M  # 上传文件最大限制,默认2M
         ... ...
         post_max_size = 2000M        # 端口数据最大限制,默认8M
         ... ...

        提示: httpd服务出现问题,可以查看报错信息

         [root@web01 ~]# cat /var/log/httpd/error_log

        解决NFS单点故障

        如果nfs服务器故障,将web客户端挂载的nfs服务器共享目录,替换成backup服务器共享目录


        1. 前提条件: nfs和backup两台服务器的nfs服务配置应该保持一样(nfs配置,nfs共享目录,nfs共享目录的权限,rpcbindnfs服务都启动)

        2. 进行一次数据推送,然后模拟nfs故障(挂起虚拟机)

        3. web01服务器强制卸载172.16.1.31:/data

         [root@web01 ~]# umount -lf /var/www/html
        1. web01服务器挂载172.16.1.41:/data

         [root@web01 ~]# mount -t nfs 172.16.1.41:/data /var/www/html
        1. 浏览器测试web服务http://10.0.0.7/是否恢复


        实时同步demo

         用户上传文件-->web-->写入-->nfs存储-->inotify-->action-->rsync--->backup
         用户上传文件-->web-->写入-->nfs存储(本地)--->实时的同步到-->存储(云端)
                      web-->卸载nfs存储(本地)--->重新挂载存储(云端)
         
        上传文件
        写入 
        action
        上传文件
        写入
        实时的同步到
        上传文件
        卸载
        重新挂载
        用户
        web
        nfs存储
        inotify
        rsync
        backup
        用户
        web
        nfs存储-本地
        存储-云端
        当nfs存储-本地故障
        用户
        web
        nfs存储-本地
        存储-云端
         

        第一个步骤:安装软件
        yum install -y inotify-tools
        第二个步骤:熟悉命令的使用
        /usr/bin/inotifywait --- 监控目录数据信息变化
        /usr/bin/inotifywatch --- 对监控的变化信息进行统计
        /data/ oldboy01.txt
        oldboy02.txt --- rsync --exclude
        oldboy03.txt
        inotifywait命令使用方法:
        inotifywait [参数] 监控的目录
        -m|--monitor --- 实现一直监控目录的数据变化
        -r|--recursive --- 进行递归监控
        -q|--quiet --- 尽量减少信息的输出
        --format <fmt> --- 指定输出信息的格式
        --timefmt --- 指定输出的时间信息格式
        -e|--event --- 指定监控的事件信息
        创建文件监控信息输出
        /data/ CREATE user13 --- 一个文件被创建
        /data/ OPEN user13 --- 打开创建的文件
        /data/ ATTRIB user13 --- 修改文件的属性信息
        /data/ CLOSE_WRITE,CLOSE user13 --- 保存关闭一个文件

        删除文件监控信息输出
        /data/ DELETE user13
        修改文件监控信息输出
        /data/ CREATE user10
        /data/ OPEN user10
        /data/ MODIFY user10
        /data/ CLOSE_WRITE,CLOSE user10
        sed命令修改文件原理
        /data/ OPEN user10 --- 打开文件
        /data/ CREATE sedpSAFR7 --- 创建出一个临时文件(内存)
        /data/ OPEN sedpSAFR7 --- 临时文件进行打开
        /data/ ACCESS user10 --- 读取源文件内容
        /data/ MODIFY sedpSAFR7 --- 修改临时文件
        /data/ ATTRIB sedpSAFR7 --- 临时文件属性变化
        /data/ CLOSE_NOWRITE,CLOSE user10 --- 不编辑直接关闭源文件
        /data/ CLOSE_WRITE,CLOSE sedpSAFR7 --- 写入关闭临时文件
        /data/ MOVED_FROM sedpSAFR7 --- 将临时文件移除
        /data/ MOVED_TO user10 --- 移入一个新的user10源文件
        inotify监控命令格式:
        inotifywait -mrq --timefmt "%F" --format "%T %w %f 事件信息:%e" /data -e CREATE
        create创建、delete删除、moved_to移入、close_write修改
        企业应用:防止系统重要文件被破坏
        需要用到inotify进行实时一直监控 /etc passwd /var/spool/cron/root
        3)部署sersync同步服务
        第一个里程:需要下载,保留上传到linux服务器中
        https://github.com/wsgzao/sersync
        上传linux服务器
        rz -y --- 选择需要上传的数据信息
        PS:软件尽量都统一保存在/server/tools目录中

        第二个里程:解压软件压缩包,将解压的数据进行保存
        unzip sersync_installdir_64bit.zip
        [root@nfs01 tools]# tree sersync_installdir_64bit
        sersync_installdir_64bit
        └── sersync
        ├── bin --- sersync软件命令目录
        │?? └── sersync
        ├── conf --- sersync软件配置目录
        │?? └── confxml.xml
        └── logs --- sersync软件日志目录
        [root@nfs01 tools]# mv sersync_installdir_64bit/sersync/ /usr/local/
        第三个里程:编写配置文件:
        vim conf/confxml.xml
        6 <filter start="false">
        7 <exclude expression="(.*)\.svn"></exclude>
        8 <exclude expression="(.*)\.gz"></exclude>
        9 <exclude expression="^info/*"></exclude>
        10 <exclude expression="^static/*"></exclude>
        11 </filter>
        说明:排除指定数据信息不要进行实时传输同步

        12 <inotify>
        13 <delete start="true"/>
        14 <createFolder start="true"/>
        15 <createFile start="false"/>
        16 <closeWrite start="true"/>
        17 <moveFrom start="true"/>
        18 <moveTo start="true"/>
        19 <attrib start="false"/>
        20 <modify start="false"/>
        21 </inotify>
        说明:定义inotify程序需要监控的事件

        24 <localpath watch="/opt/tongbu">
        25 <remote ip="127.0.0.1" name="tongbu1"/>
        26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        28 </localpath>
        29 <rsync>
        30 <commonParams params="-artuz"/>
        31 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
        32 <userDefinedPort start="false" port="874"/><!-- port=874 -->

        第四个里程:启动sersync服务程序
        [root@nfs01 bin]# export PATH="$PATH:/usr/local/sersync/bin"
        [root@nfs01 bin]# echo $PATH
        /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync/bin
        参数-d: 启用守护进程模式
        参数-r: 在监控前,将监控目录与远程主机用rsync命令推送一遍
        进行同步测试
        参数-o: 指定配置文件,默认使用confxml.xml文件
        -o /usr/local/sersync/conf/confxml.xml
        -o /usr/local/sersync/conf/confxml02.xml

        sersync -dro /usr/local/sersync/conf/confxml.xml 启动实时同步服务
        yum install -y psmisc
        killall sersync 停止实时同步服务
        /etc/rc.local <-- sersync -dro /usr/local/sersync/conf/confxml.xml 开机自动启动

        1) 实现实时同步的原理
        监控目录数据变化 --- inotify
        将数据进行传输 --- rsync
        将监控和传输进行整合 --- sersync
        2) 实现实时同步部署方法
        1. 部署rsync守护进程
        2. 部署inotify软件
        3. 部署sersync软件

        远程管理服务概念介绍
        SSH           安全的远程连接     数据信息是加密的    22                     SSH服务默认可以root用户远程连接 系统远程连接
        TELNET 不安全的远程连接     数据信息是明文的    23                     telnet服务默认不可以让root用户远程连接 网络设备远程连接

        补充: 什么是shell
        1. 每连接登录到一个linux系统中,就是一个shell
        2. 可以一个linux系统有多个会话连接,每一个会话都是一个shell
        3. 系统中用户可以实现相互转换,每转换一个用户就是一个shell
        shell特点说明:
        1. 一般命令行临时配置的信息,只会影响当前shell
        2. 命令配置的信息如果想生效,需要切换shell eg: 修改主机名称


        参考文章基于sersync海量文件实时同步

         

posted @ 2021-02-08 22:13  上善若水~小辉  阅读(194)  评论(0编辑  收藏  举报