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