zoukankan      html  css  js  c++  java
  • rsync 与 sersync 搭配实现实时同步

    假设源服务器(客户端)IP是192.168.0.20,目标服务器IP是192.168.0.10,从源服务器往目标服务器同步文件

    在源服务器和目标服务器上安装rsync,

    yum install -y rsync

    ---------------- 目标服务器配置 --------------

    编辑配置文件
    vim /etc/rsyncd.conf

    #公用配置部分
    uid = rsync #rsync进程使用的用户(rsync创建文件的所有者自然也是该用户),也可以放到具体的配置项里面,如果有其他进程用户(比如nginx的进程用户)也需要访问目的目录,也可以考虑填写其他进程用户相同的用户
    gid = rsync #rsync进程使用的用户组(rsync创建文件的所有组自然也是该用户组),也可以放到具体的配置项里面,如果有其他进程用户组(比如nginx的进程用户)也需要访问目的目录,也可以考虑填写其他进程用户相同的用户组
    secrets file = /etc/rsyncd.passwd #客户端同步时使用的用户和密码
    port = 873 #rsync进程使用的端口
    use chroot = no
    max connections = 200
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

    #同步任务配置项
    [sync1] #这个是rsync的一个配置项,可以建立多个这样的配置,以便可以用配置名来执行不同的任务
    auth users = user1 #客户端同步使用的用户,多个用户用英文逗号分隔
    path = /data/backup #同步的目的地目录,比如是/data/backup目录
    comment = from server1 to server2 #同步的备注说明
    ignore errors = yes #忽略错误
    read only = no
    list = no
    timeout = 600
    hosts allow = 192.168.0.20 #允许连接的客户端主机,多个ip用英文逗号分隔
    hosts deny = 0.0.0.0/32 #拒绝连接的客户端主机,多个ip用英文逗号分隔

    修改配置文件权限

    chmod 600 /etc/rsyncd.conf

    创建用户和密码
    vi /etc/rsyncd.passwd

    user1:password #用户名和密码用冒号分割

    修改密码文件权限
    chmod 600 /etc/rsyncd.passwd

    创建rsync进程使用的用户(和配置项里面的一致),如果有其他进程用户(比如nginx的进程用户)也需要访问目的目录,也可以考虑使用和其他进程用户相同的用户,就不需要在这里单独创建了

    useradd -s /sbin/nologin -M rsync

    修改目录的所有者和权限,以便rsync进程用户可以访问,如果是使用的其他用户,则对应修改为其他用户和适合的权限,保证该用户有对目标目录的修改写入权限即可

    chown -R rsync:rsync /data/backup

    启动服务,设置开机启动

    systemctl start rsyncd

    systemctl enable rsyncd

    systemctl daemon-reload

    如果启动失败,可以查看日志文件排查原因

    ---------------- 源服务器(客户端)配置 --------------

    创建用户和密码
    vi /etc/rsync.passwd

    password #注意,这里只需要填密码就可以了,密码必须和目标服务器配置项里的密码一致

    修改密码文件权限
    chmod 600 /etc/rsync.passwd

    测试同步

    rsync -rltuvz /data/www/ user1@192.168.10::backup --password-file=/etc/rsync.passwd

    参数说明:

    rsync -rltuvz递归模式、拷贝软链接、保留文件时间属性、只更新文件(不处理已经存在的旧文件)、显示详细信息、压缩传输 /data/www/需要同步的源目录 user1@192.168.10::backup目标服务器用户@目标服务器::目标服务器配置项 --password-file密码所在文件

    需要注意的是,如果指定源目录时没有加最后的/,则会把整个源目录同步到目录服务器配置项指定的目录里面,而不是只同步源目录里面的文件

    如果rsync是备份用途,建议参数为rsync -avz,-a选项等同于-rlptgoD,p保留文件权限属性、-g保留文件用户组属性、-o保留文件用户属性、-D同时拷贝linux字符设备和块设备文件以及特殊文件,如命名套接字,命名管道等

    如果只是同步文件,使用-rltuvz选项即可

    如果是实时性要求不高的场景或者只是备份用途,只需要使用crontab创建个定时任务就可以了

    如果是实时性要求高的场景,比如上传文件后马上要同步到静态资源服务器,则需要安装sersync来监控目录和文件编号,实现实时同步

    安装sersync

    https://code.google.com/archive/p/sersync/downloads 下载

    wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz

    tar -xzf sersync2.5.4_64bit_binary_stable_final.tar.gz

    mkdir /usr/local/sersync

    cp GNU-Linux-x86/* /usr/local/sersync

    修改配置文件

    cd /usr/local/sersync

    cp confxml.xml backup.xml 拷贝一份配置文件

    vi backup.xml

    配置监控过滤选项

        <debug start="true"/> <!--调试模式,会打印执行过程,调试完成后修改为false-->

        <filter start="false"> <!-- 实时同步监控过滤选项,注意:这个配置不会被应用到定时整体同步中,因为定时整体同步不需要监控 -->
            <exclude expression="(.*).svn"></exclude>
            <exclude expression="(.*).gz"></exclude>
            <exclude expression="^info/*"></exclude>
            <exclude expression="^static/*"></exclude>
        </filter>

    配置监控的文件变动行为,当文件有以下变动时触发

        <inotify>
            <delete start="false"/> <!--如果设置为true,sersync默认会给rsync添加 --delete参数,所以如果不需要删除文件的话,就设置为false-->
            <createFolder start="true"/>
            <createFile start="false"/>
            <closeWrite start="true"/> <!--结束文件写入,创建文件完成后同样有这个事件,所以createFile可以设置为false,除非写入文件的同时就要同步文件-->
            <moveFrom start="true"/>
            <moveTo start="true"/>
            <attrib start="false"/>
            <modify start="false"/>
        </inotify>

    同步选项

        <sersync>

            <!--如果有本地目录需要同步,可以写多个localpath配置项目-->
            <localpath watch="/data/www/"> <!--源目录-->
                <remote ip="192.168.0.10" name="backup"/> <!--目标服务器IP1、目标服务器配置项-->
                <!--<remote ip="192.168.0.11" name="backup1"/>--> <!--目标服务器2IP、目标服务器2配置项-->
            </localpath>
            <localpath watch="/data/www1/">
                <remote ip="192.168.0.12" name="backup"/>
            </localpath>

            <rsync>
                <commonParams params="-rltuz"/> <!--rsync参数-->
                <auth start="true" users="user1" passwordfile="/etc/rsync.passwd"/> <!--rsync用户和密码文件位置-->
                <userDefinedPort start="false" port="874"/> <!-- 目标服务器端口 -->
                <timeout start="false" time="100"/> <!-- 超时配置,单位秒 -->
                <ssh start="false"/>
            </rsync>
            <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> <!--default every 60mins execute once-->
            <crontab start="false" schedule="600"> <!--定时整体同步,防止实时同步有文件没有同步到,间隔600分钟-->
                <crontabfilter start="false"> <!-- 整体同步时的过滤选项,filter选项的过滤条件在整体同步时不会被应用,必须在这里独立设置-->
                    <exclude expression="*.php"></exclude>
                    <exclude expression="info/*"></exclude>
                </crontabfilter>
            </crontab>
            <plugin start="false" name="command"/>
        </sersync>

    修改inotify默认参数(inotify默认内核参数值太小)

    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 Queue Overflow **"错误,导致监控文件不准确
    max_user_watches:要同步的文件包含多少目录,可以用:find /data/www -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里data/www为同步文件目录)
    max_user_instances:每个用户创建inotify实例最大值 

    测试同步

    ./sersync2 -h 查看参数说明

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

    ./sersync2 -r -o /usr/local/sersync/backup.xml #按配置文件执行

    建立sersync守护脚本,并加入到crontab中,以便定时检查sersync是否死掉,死掉则重启

    vi /data/rsync.sh

    #!/bin/sh
    sersync="/usr/local/sersync/sersync2"
    confxml="/usr/local/sersync/backup.xml"
    status=$(ps -ef |grep /usr/local/sersync/backup.xml |grep -v grep |wc -l)
    if [ $status -eq 0 ];
    then
    $sersync -d -r -o $confxml &
    else
    exit 0;
    fi

    加入crontab

    * * * * * /data/rsync.sh

  • 相关阅读:
    R语言修改vector、matrix、dataframe列名
    R语言获取数据框的行数
    R语言的which函数,针对没有符合条件的返回值为integer(0),之后如何判断
    ArrayList总结
    经常涉及到的技术
    今天开始写博客啦!(测试..)
    [摘转] JS 数组合并问题
    t_category
    在 MySql 的 update 语句中使用 case when else end
    JSP 取当前时间
  • 原文地址:https://www.cnblogs.com/lbnnbs/p/14714323.html
Copyright © 2011-2022 走看看