假设源服务器(客户端)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

 

posted on 2021-04-28 15:29  lbnnbs  阅读(140)  评论(0编辑  收藏  举报