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

  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/lbnnbs/p/14714323.html
Copyright © 2011-2022 走看看