zoukankan      html  css  js  c++  java
  • rsync+sersync自动同步备份数据

    一、为什么要用Rsync+sersync架构?
    1、sersync是基于Inotify开发的,类似于Inotify-tools的工具
    2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。

    二、Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?
    1、Rsync+Inotify-tools
    (1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
    (2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
    2、Rsync+sersync
    (1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
    (2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
    小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。


    环境:
    操作系统:CentOS 7.3
    源服务器:192.168.0.48  (Sersync+web)(Master 作为主发布服务器)
    目标服务器: 192.168.0.50、(Rsync+web)(此处可逐步增加集群的slave)
    目的:把源服务器上/home/Sync目录实时同步到目标服务器的/home/Sync下
    具体操作:
    第一部分:在目标服务器192.168.0.50上操作
    一、在目标服务器安装Rsync服务端
    1、关闭SELINUX
    2、关闭防火墙
    3、安装Rsync服务端软件
    #yum install rsync xinetd #安装
    # vi /etc/rc.d/rc.local      #设置开机启动
    /usr/bin/rsync --daemon --config=/etc/rsyncd.conf

    # chmod +x/etc/rc.d/rc.local   #否则重启不执行
     
    4、创建rsyncd.conf配置文件
    #vi /etc/rsyncd.conf #创建配置文件,添加以下代码
    log file =/var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
    pidfile =/var/run/rsyncd.pid #pid文件的存放位置
    lock file =/var/run/rsync.lock #支持max connections参数的锁文件
    secretsfile = /etc/rsync.pass  #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
    motd file =/etc/rsyncd.Motd #rsync启动时欢迎信息页面文件位置(文件内容自定义)
    [Sync] #自定义名称
    path = /home/Sync/#rsync服务端数据目录路径
    comment = Sync#模块名称与[md]自定义名称相同
    uid = root #设置rsync运行权限为root
    gid = root #设置rsync运行权限为root
    port=873  #默认端口
    use chroot= no #默认为true,修改为no,增加对目录文件软连接的备份
    read only =no  #设置rsync服务端文件为读写权限
    list = no #不显示rsync服务端资源列表
    maxconnections = 200 #最大连接数
    timeout =600  #设置超时时间
    auth users= Sync #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
    hosts allow= 192.168.0.48  #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts deny= 192.168.21.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

    5、创建用户认证文件
    #vi/etc/rsync.pass #配置文件,添加以下内容,添加允许传输用户和密码
    Sync:123  #格式,用户名:密码,可以设置多个,每行一个用户名:密码

     
    6、设置文件权限
    #chmod 600 /etc/rsyncd.conf  #设置文件所有者读取、写入权限
    #chmod 600 /etc/rsync.pass  #设置文件所有者读取、写入权限

    7、启动rsync
    # systemctl start rsyncd

    第二部分:在源服务器192.168.0.48上操作
    一、安装Rsync客户端
    1、关闭SELINUX
    2、关闭防火墙
    3、安装Rsync客户端端软件
    #yum install rsync
    # vi /etc/rc.local      #设置开机启动
    /usr/bin/rsync --daemon
    #vi /etc/reyncd.conf
    log file = /var/log/rsyncd.log
    pidfile = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    motd file = /etc/rsyncd.Motd
    [Sync]
    comment = Sync
    uid = root
    gid = root
    port=873

    # chmod +x /etc/rc.d/rc.local   #否则重启不执行
     
    #systemctl start xinetd  #启动(CentOS中是以xinetd来管理rsync服务的)
    4、创建认证密码文件
    #vi /etc/passwd.txt  #编辑文件,添加以下内容,该密码应与目标服务器中的/etc/rsync.pass中的密码一致,
    123 #密码

    #chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可

    5、测试源服务器192.168.0.48到目标服务器 192.168.0.50,之间的数据同步
    #mkdir -p /home/Sync/ceshi  #在源服务器上创建测试文件夹,然后在源服务器运行下面1行命令
    rsync -avH --port=873 --progress--delete  /home/Sync/ Sync@192.168.0.50::Sync--password-file=/etc/passwd.txt
    运行完成后,分别在目标服务器192.168.0.50上查看,在/home/Sync/目录下有ceshi文件夹,说明数据同步成功,命令中目录可以随意目
    录,传输到目标服务器目录时文件(或目录)均放到/etc/rsyncd.conf配置的服务器目录路径,如果源目录改变了,那么传输时两个目录将
    进行目录匹配,会有增删动作,因此需要注意。
     
    二、安装sersync工具,实时触发rsync进行同步
    1、查看服务器内核是否支持inotify
    ll /proc/sys/fs/inotify   #列出文件目录,出现下面的内容,说明服务器内核支持inotify
    -rw-r--r-- 1 root root 0 Mar  7 02:17 max_queued_events
    -rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_instances
    -rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_watches
    备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:#uname -a查看内核
    CentOS 7.0内核为3.10.0,默认已经支持inotify

    2、修改inotify默认参数(inotify默认内核参数值太小)
    查看系统默认参数值:
    sysctl -a | grep max_queued_events
    结果是:fs.inotify.max_queued_events= 16384
    sysctl -a | grep max_user_watches
    结果是:fs.inotify.max_user_watches= 8192
    sysctl -a | grep max_user_instances
    结果是:fs.inotify.max_user_instances= 128

    修改参数:
    #sysctl -w fs.inotify.max_queued_events="99999999"
    #sysctl -w fs.inotify.max_user_watches="99999999"
    #sysctl -w fs.inotify.max_user_instances="65535"
    #vi /etc/sysctl.conf #添加以下代码
    fs.inotify.max_queued_events=99999999
    fs.inotify.max_user_watches=99999999
    fs.inotify.max_user_instances=65535

    参数说明:
    max_queued_events:
    inotify队列最大长度,如果值太小,会出现"** Event QueueOverflow **"错误,导致监控文件不准确
    max_user_watches:
    要同步的文件包含多少目录,可以用:find /home/Sync-type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/
    home/Sync为同步文件目录)
    max_user_instances:
    每个用户创建inotify实例最大值

    3、安装sersync 在源服务器上
    下载
    sersync2.5.4_64bit_binary_stable_final.tar.gz

    #tar zxvfsersync2.5.4_64bit_binary_stable_final.tar.gz
    #mv GNU-Linux-x86  /usr/local/sersync  #移动目录到/usr/local/sersync

    4、配置sersync
    #cd  /usr/local/sersync #进入sersync安装目录
    #cp confxml.xml confxml.xml-bak  #备份原文件
    #vi confxml.xml  #编辑,修改下面的代码
    <?xmlversion="1.0" encoding="ISO-8859-1"?>
    <headversion="2.5">
    <host hostip="localhost"port="8008"></host>
    <debugstart="false"/>
    <fileSystemxfs="false"/>
    <filterstart="false">
    <excludeexpression="(.*).svn"></exclude>
    <excludeexpression="(.*).gz"></exclude>
    <excludeexpression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
    <deletestart="true"/>
    <createFolderstart="true"/>
    <createFilestart="false"/>
    <closeWritestart="true"/>
    <moveFromstart="true"/>
    <moveTostart="true"/>
    <attribstart="false"/>
    <modifystart="false"/>
    </inotify>
    <sersync>
    <localpath watch="/home/Sync">
    <remote ip="192.168.0.50" name="Sync"/>
    <!--<remoteip="192.168.8.40" name="tongbu"/>-->
    <!--<remoteip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>
    <commonParams params="-artuz"/>
    <auth start="true" users="Sync"passwordfile="/etc/passwd.txt"/>
    <userDefinedPortstart="false" port="874"/><!-- port=874 -->
    <timeoutstart="false" time="100"/><!-- timeout=100 -->
    <sshstart="false"/>
    </rsync>
    <failLogpath="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--defaultevery 60mins execute once-->
    <crontab start="true" schedule="60"><!--600mins-->

    <crontabfilterstart="false">

    <excludeexpression="*.php"></exclude>
    <excludeexpression="info/*"></exclude>
    </crontabfilter>
    </crontab>
    <plugin start="false"name="command"/>
    </sersync>
    <pluginname="command">
    <paramprefix="/bin/sh" suffix=""ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filterstart="false">
    <includeexpression="(.*).php"/>
    <includeexpression="(.*).sh"/>
    </filter>
    </plugin>
    <pluginname="socket">
    <localpathwatch="/opt/tongbu">
    <deshostip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <pluginname="refreshCDN">
    <localpathwatch="/data0/htdocs/cms.xoyo.com/site/">
    <cdninfodomainname="ccms.chinacache.com" port="80"username="xxxx" passwd="xxxx"/>
    <sendurlbase="http://pic.xoyo.com/cms"/>
    <regexurlregex="false"match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
    </head>

    参数说明:
    localpath watch="/home/Sync":#源服务器同步目录
     192.168.0.50:#目标服务器IP地址
    name="Sync": #目标服务器rsync同步目录模块名称
    users="Sync": #目标服务器rsync同步用户名
    passwordfile="/etc/passwd.pass": #目标服务器rsync同步用户的密码在源服务器的存放路径
    remote ip="192.168.0.50": #目标服务器ip,每行一个
    failLogpath="/tmp/rsync_fail_log.sh" #脚本运行失败日志记录
    start="true" schedule="60"  #设置为true,每隔60分钟执行一次全盘同步

    5、设置sersync监控开机自动执行
    #vi /etc/rc.d/rc.local  #编辑,在最后添加一行
    /usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml #设置开机自动运行脚本
    :wq!  #保存退出
    # chmod +x /etc/rc.d/rc.local   #否则重启不执行

    6、添加脚本监控sersync是否正常运行
    #mkdir  /home/crontab
    #vi  /home/crontab/check_sersync.sh   #编辑,添加以下代码
    #!/bin/sh
    sersync="/usr/local/sersync/sersync2"
    confxml="/usr/local/sersync/confxml.xml"
    status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
    if [ $status -eq 0 ];
    then
    $sersync -d -r -o $confxml &
    else
    exit 0;
    fi

    #chmod +x /home/crontab/check_sersync.sh#添加脚本执行权限
    #vi /etc/crontab #编辑,在最后添加下面一行
    */5 * * * * root /home/crontab/check_sersync.sh >/dev/null 2>&1  #每隔5分钟执行一次脚本
    #重新加载服务
    #systemctl restart crond.service

    6、测试sersync实时触发rsync同步脚本是否正常运行
    在源服务器192.168.0.48上创建文件inotify_rsync_ceshi
    #mkdir /home/Sync/inotify_rsync_ceshi
    重新启动源服务器:192.168.0.48
    等系统启动之后,查看两台目标服务器 192.168.0.50的/home/Sync下是否有inotify_rsync_ceshi文件夹22:25:17然后再在源服务器192.168.0.48创建文件夹inotify_rsync_ceshi_new
    mkdir /home/Sync/inotify_rsync_ceshi_new
    继续查看两台目标服务器 192.168.0.50的//home/Sync下是否有inotify_rsync_ceshi_new文件夹
    如果以上测试都通过,说明inotify实时触发rsync同步脚本运行正常。

    1   <?xml version="1.0" encoding="ISO-8859-1"?>
    2   <head version="2.5">
    3       <host hostip="localhost" port="8008"></host>
    hostip与port是针对插件的保留字段,对于同步功能没有任何作用,保留默认即可
    4       <debug start="false"/>
    设置为true,开启debug模式,会在sersync正在运行的控制台打印inotify事件与rsync同步命令
    5       <fileSystem xfs="false"/>
    对于xfs文件系统的用户,需要将这个选项开启,才能使sersync正常工作
    对于sersync监控的文件,会默认过滤系统的临时文件(以“.”开头,以“~”结尾),除了这些文件外,可以自定义需要过滤的文件
    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>
    将start设置为true后开启过滤功能,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以“.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info/*),可以根据需要添加,但开启的时候,自己测试一下,正则表达式如果出现错误,控制台会有提示。相比较使用rsync的exclude功能,被过滤的路径,不会加入监控,大大减少了rsync同步的通讯量
    对于inotify监控参数可以进行设置,根据项目的特点优化rsync
    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>
    对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事件close_write,同样可以实现文件完整同步。
    注意:需要将createFolder保持为true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。所以除非特殊需要,请开启。默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete参数设置为false,则不对删除事件进行监控。
    22 
    23      <sersync>
    文件监控与远程同步设置
    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>
    /opt/tongbu目录为sersync主服务器本地待同步的目录,ip=”192.168.8.39”为从服务器的IP地址,如果有多个从服务器,依次列出来即可。name=”tongbu”,这里的tongbu为rsyncd.conf中的模块名字,即中括号中的名称
    Rsync设置
    29      <rsync>
    30          <commonParams params="-artuz"/>
    31          <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
    32          <userDefinedPort start="false" port="874"/><!-- port=874 -->
    33          <timeout start="false" time="100"/><!-- timeout=100 -->
    34          <ssh start="false"/>
    35      </rsync>
    在commonParams项,我们可以自定义rsync的同步参数,默认是-artuz,auth start=”false”设置为true的时候,使用rsync的认证模式传送,需要配置user与passwordfile(--password-file=)来使用。userDenfinedPort当远程同步目标服务器的rsync端口不是默认端口的时候使.timeout这是rsync的timout事件。<ssh start=”false”/>如果开启,ssh使用rsync -e ssh的方式传输。
    失败日志脚本配置
    36      <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    如果文件同步传输失败,会重新传送,再次失败就会写入rsync_fail_log.sh,然后每个一段时间(timeToExecute进行设置)执行该脚本再次重新传送,然后清空该脚本。可以通过path来设置日子路径。
    Crontab定期整体同步功能
    37      <crontab start="false" schedule="600"><!--600mins-->
    38          <crontabfilter start="false">
    39          <exclude expression="*.php"></exclude>
    40          <exclude expression="info/*"></exclude>
    41          </crontabfilter>
    42      </crontab>
    Crontab可以对监控路径与远程目标主机每隔一段时间进行一次整体同步,可能由于一些原因再次重传失败,这个时候如果开启了crontab功能,还可以进一步保证各个服务器文件一致,如果文件量比较大,crontab的时间间隔要设大一些,否则可能增加通讯开销。Schedule这个参数设置crontab的时间间隔,默认是600分钟。如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的文件被过滤了,但是crontab整体同步的时候,如果不单独设置crontabfilter,还会将需过滤的文件同步到远程从服务器,,crontab的过滤正则与filter过滤的不同,也给出了两个实例分别对应与过滤文件与目录。总之如果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。
    插件设置
    43      <plugin start="false" name="command"/>
    当start=”false”处设置为true的时候,将文件同步到远程服务器后会调用插件。通过name参数指定需要执行的插件。目前支持的有command refreshCDN socket http四种插件。其中,http插件目前由于兼容性原因已经去除,以后会重新加入
    44      </sersync>
    45 
    Command插件
    46      <plugin name="command">
    47      <param prefix="/bin/sh" suffix="" ignoreError="true"/>    <!--prefix /opt/tongbu/mmm.sh suffix-->
    48      <filter start="false">
    49          <include expression="(.*).php"/>
    50          <include expression="(.*).sh"/>
    51      </filter>
    52      </plugin>
    当文件同步完成后,会调用command插件,如同步文件时test.php,则test.php文件再改动之后,调用rsync同步到远程服务器后,调用command插件,执行 :/bin/sh test.php  suffix>dev/null 2>&1
    如果suffix设置了,则会放在inotify事件test.php之后,如果ignoreError为true,则会添加>/dev/null 2>&1,当然还可以设置command的filter,当filter为true时,include可以只对正则匹配到的文件调用command.
    53 
    Socke插件,开启该模块,则向指定的ip与端口发送inotify所产生的文件路径信息
    54      <plugin name="socket">
    55      <localpath watch="/opt/tongbu">
    56          <deshost ip="192.168.138.20" port="8009"/>
    57      </localpath>
    58      </plugin>
    59      <plugin name="refreshCDN">
    60      <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
    61          <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
    62          <sendurl base="http://pic.xoyo.com/cms"/>
    63          <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    64      </localpath>
    “refreshCDN”,就在同步过程中将文件发送到目的服务器后刷新cdn接口。如果不想使用,则将start属性设为false即可。
    如果需要使用其他插件,则查看其他plugin标签,将插件名称改为xml中其他插件名称即可。该模块根据chinaCDN的协议进行设计,当有文件产生的时候,就向cdn接口发送需要刷新的路径位置。
    其中localpath watch=”/data0/hotdocs/cms.xoyo.com/site”是需要监控的目录。cdninfo标签制定了cdn接口的域名,端口号,以及用户名与密码。
    sendurl标签是需要刷新的url的前缀。regexurl标签中的,regex属性为true的时候,使用match属性的正则语句匹配inotify返回的路径信息,并将正则匹配到的部分作为url一部分。
    举例:
    如果产生的文件事件为:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/image/a/123.txt
    经过上面的match正则匹配后,最后的刷新路径是:http://pic.xoyo.com/cms/jx3/a/123.txt
    如果regex属性为false,最后刷新的路径是http://pic.xoyo.com/cms/jx3.xoyo.com/images/a/123.txt
    65      </plugin>
    66  </head>
     
    ###############################################################################################
    只调用command插件
    ./sersync -d -m command
    只调用refreshCDN插件
    ./sersync -d -m refreshCDN
    只调用socket插件
    ./sersync -d -m socket
    sersync配置详解
  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/randomlee/p/9109393.html
Copyright © 2011-2022 走看看