• rsync+sersync多线程实时同步


    一、sersync优点

    1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快。

    2)相比较inotify-tools,sersync配置起来简单,https://code.google.com/archive/p/sersync/downloads下载源码,其中bin目录下是已经编译好的二进制文件,配合bin目录下的xml文件直接使用即可。

    3)使用多线程同步(可以并发同步多个不同的文件),尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。

    4)sersync自带出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则每若干个小时对同步失败的文件再重新同步。

    5)sersync自带crontab功能,只需在xml配置文件中开启,即可按预先的配置,隔一段时间整体同步一次

    6)sersync自带socket与http的协议扩展,可以满足有特殊需求的公司的二次开发。

    7)当同步的目录数据量不大时,建议使用rsync+inotify;当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync

    二、分析

    1)线程组线程是等待线程队列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程,当队列中inotify事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件,从而提升服务器的并发能力(核数*2+2)。之所以称之为线程组,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。

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

      a)首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件。

      b)每隔10隔小时执行脚本一次,同时清空脚本。

      c)第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次。

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

    三、rsync服务,下面只有关于这个项目的一些简单配置,具体请看http://www.cnblogs.com/bill2014/p/7398760.html

    1)服务端的rsyncd.conf

    [root@rsyncserver ~]# cat >rsyncd.conf<<EOF
    #Rsync server
    ##rsyncd.conf start##
    uid = root    这个就是共享目录的权限
    gid = root    这个就是共享目录的权限
    use chroot = no
    max connections = 2000
    timeout = 600
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 192.168.222.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
    #####################################
    [www]
    comment = www by old0boy   注释
    path = /data0/www/www/
    #####################################
    [bbs]
    comment = bbs by old0boy 
    path = /data0/www/bbs/
    #####################################
    [blog]
    comment = blog by old0boy 
    path = /data0/www/blog/
    

    2)接着在服务端创建目录

    [root@rsyncserver ~]# mkdir -p /data0/www/www/ /data0/www/bbs/ /data0/www/blog/
    

    3)客户端部署

    3.1)在客户端创建目录和文件

    [root@rsyncclient ~]# mkdir -p /data0/www/bbs/ /data0/www/www/ /data0/www/blog
    [root@rsyncclient ~]# touch /data0/www/bbs/bbs.log /data0/www/www/www.log /data0/www/blog/blog.log
    

    3.2)推送

    [root@rsyncclient ~]# rsync -avzP /data0/www/bbs/ rsync_backup@192.168.222.140::bbs/  --password-file=/etc/rsync.password
    [root@rsyncclient ~]# rsync -avzP /data0/www/www/ rsync_backup@192.168.222.140::www/  --password-file=/etc/rsync.password
    [root@rsyncclient ~]# rsync -avzP /data0/www/blog/ rsync_backup@192.168.222.140::blog/  --password-file=/etc/rsync.password
    

    四、下载sersync,并配置xml

    4.1)下载,,https://code.google.com/archive/p/sersync/downloads,翻墙

    [root@rsyncclient tools]# tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
    [root@rsyncclient local]# mv GNU-Linux-x86 sersync
    [root@rsyncclient local]# tree sersync/
    sersync/
    ├── confxml.xml
    └── sersync2
    
    0 directories, 2 files
    

    4.2)规范化目录

    [root@rsyncclient sersync]# mkdir conf bin logs
    [root@rsyncclient sersync]# mv confxml.xml conf
    [root@rsyncclient sersync]# mv sersync2 bin/sersync
    [root@rsyncclient sersync]# tree
    .
    ├── bin
    │   └── sersync
    ├── conf
    │   └── confxml.xml
    └── logs
    
    3 directories, 2 files
    

    4.3)更改优化sersync配置,24-28行,因为我只用了一个服务端一个客户端,所以只有一个同步服务器

    原内容为:
    	<localpath watch="/opt/tongbu">
                    <remote ip="127.0.0.1" name="tongbu1"/>
    		<!--<remote ip="192.168.8.39" name="tongbu"/>-->
                    <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    	</localpath>
    改为:
    	<localpath watch="/data0/www/www">
    		<remote ip="192.168.222.140" name="www"/>
    	</localpath>
    	<localpath watch="/data0/www/bbs">
                    <remote ip="192.168.222.140" name="bbs"/>
            </localpath>
    	<localpath watch="/data0/www/blog">
                     <remote ip="192.168.222.140" name="blog"/>
            </localpath>
    

    4.4)更改31-34行,认证部分

    <commonParams params="-artuz"/>
    <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
    <userDefinedPort start="false" port="874"/><!-- port=874 -->
    <timeout start="false" time="100"/><!-- timeout=100 -->
    <ssh start="false"/>
    
    改为:
    	<rsync>
    	    <commonParams params="-aruz"/>
    	    <auth start="true" users="rsync_backup" 
                passwordfile="/etc/rsync.password"/>
    	    <userDefinedPort start="false" port="874"/><!-- port=874 -->
    	    <timeout start="true" time="100"/><!-- timeout=100 -->
    	    <ssh start="false"/>
    	</rsync>
    

    上面这个配置就是在拼接rsync -zvzP --timeout=100 /data0/www/www/ rsync_backup@192.168.222.140::www/ --password-file=/etc/rsync.password这个命令

    4.5)修改36-37行

    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
      
      改为:
    <failLog path="/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    当同步失败后,日志记录到/usr/local/sersync/logs/rsync_fail_log.sh,并且每60分钟对失败的log进行重新同步。
    

    五、开启sersync守护进程同步数据

    5.1)配置sersync环境变量

    [root@rsyncclient conf]# echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile
    [root@rsyncclient conf]# tail -1 /etc/profile
    export PATH=$PATH:/usr/local/sersync/bin
    [root@rsyncclient conf]# source /etc/profile
    [root@rsyncclient conf]# which sersync
    /usr/local/sersync/bin/sersync
    

    5.2)启动命令:

    [root@rsyncclient conf]# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
    测试结果:发现问题,仅能第一个模块的路径可以同步,其他下面的路径不能同步。
    

    只同步了第一个目录

    [root@rsyncclient conf]# sersync -r -d -o /usr/local/sersync/conf/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: -r 	rsync all the local files to the remote servers before the sersync work
    option: -d 	run as a daemon
    option: -o 	config xml name:  /usr/local/sersync/conf/confxml.xml
    daemon thread num: 10
    parse xml config file
    host ip : localhost	host port: 8008
    daemon start,sersync run behind the console 
    use rsync password-file :
    user is	rsync_backup
    passwordfile is 	/etc/rsync.password
    after each synchronize run the plugin 	plugin name is: command
    config xml parse success
    please set /etc/rsyncd.conf max connections=0 Manually
    sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
    Max threads numbers is: 22 = 12(Thread pool nums) + 10(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 /data0/www/www && rsync -aruz -R --delete ./  --timeout=100 rsync_backup@192.168.222.140::www --password-file=/etc/rsync.password >/dev/null 2>&1 
    run the sersync: 
    watch path is: /data0/www/www
    

    5.3)多实例

    5.3.1)多实例,在conf下,拷贝xml

    [root@rsyncclient conf]# cp confxml.xml www_confxml.xml
    [root@rsyncclient conf]# cp confxml.xml bbs_confxml.xml
    [root@rsyncclient conf]# cp confxml.xml blog_confxml.xml
    

    5.3.2)然后再各个xml下还需要修改错误日志文件的名字,例如bbs_rsync_fail_log.sh

    <failLog path="/usr/local/sersync/logs/bbs_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    

    5.3.3)在localpath段内也只需要保留该实例的的ip和模块,否则只会跟上面第一次同步的情况一样,依旧是第一个目录

         <localpath watch="/data0/www/bbs">
                    <remote ip="192.168.222.140" name="bbs"/>
         </localpath>
    

    5.3.4)多实例初始化同步:

    sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml
    sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml
    sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml
    

    如果已经初始化过了,下次就可以不加-r选项

    5.3.5)开机自动执行

    将上面的命令除去-r加入rc.local

    六、参数

    参数-d:启用守护进程模式
    参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍,如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步
    c参数-n: 指定开启守护线程的数量,默认为10个
    参数-o:指定配置文件,默认使用confxml.xml文件
    参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
    参数-m:单独启用其他模块,使用 -m socket 开启socket模块
    参数-m:单独启用其他模块,使用 -m http 开启http模块
    不加-m参数,则默认执行同步程序

  • 相关阅读:
    Sys 模块
    Select,poll,epoll复用
    Urllib模块
    多线程模块
    设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器
    设计模式三:适配器,桥接,组合,装饰,外观,享元,代理
    设计模式二:建造者,原型,单例
    【Unix 网络编程】TCP状态转换图详解(转)
    Mysql系列:MySql 数据库设计与基本使用
    lombok builder源码解读
  • 原文地址:https://www.cnblogs.com/bill2014/p/7416289.html
Copyright © 2020-2023  润新知