rsync的两位好友：`rsync+inotify-tools` & `rsync+sersync`

使用rsync进行异地文件实时同步，实际是使用了rsync的daemon守护进程模式。这种模式需要在源服务器端安装应用：rsync + inotify-tools工具或者rsync+inotify-tools工具，目标服务器端安装rsync即可。

rsync配置步骤

服务器信息

目标服务器：172.16.12.141

源端服务器：172.16.12.142

目标服务器配置（服务端配置）

创建配置文件：修改 /etc/rsync.conf，让其工作在守护进程模式

RedHat7以及CentOS7以下的默认没有，需要自己创建。

配置文件说明

Copy
#rsyncd.conf配置文件说明：

log file = /var/log/rsyncd.log # 日志文件位置，启动rsync后自动产生这个文件，无需提前创建
pidfile = /var/run/rsyncd.pid # pid文件的存放位置
lock file = /var/run/rsync.lock # 支持max connections参数的锁文件
secrets file = /etc/rsync.pass # 用户认证配置文件，里面保存用户名称和密码，必须手动创建这个文件

[etc_from_client] # 自定义同步名称
path = /tmp/ # rsync目标服务器数据存放路径，源服务器的数据将同步至此目录
comment = sync etc from client
uid = root # 设置rsync运行权限为root
gid = root # 设置rsync运行权限为root
port = 873 # 默认端口
ignore errors # 表示出现错误忽略错误
use chroot = no # 默认为true，修改为no，增加对目录文件软连接的备份
read only = no # 设置rsync源服务器为读写权限
list = no # 不显示rsync源服务器资源列表
max connections = 200 # 最大连接数
timeout = 600 # 设置超时时间
auth users = admin # 执行数据同步的用户名，可以设置多个，用英文状态下逗号隔开
hosts allow = 192.168.110.12 # 允许进行数据同步的源服务器IP地址，可以设置多个，用英文状态下逗号隔开
hosts deny = 192.168.110.11 # 禁止数据同步的源服务器IP地址，可以设置多个，用英文状态下逗号隔开

注意：host allow 与 host deny 两个参数

两个参数都没有 -- 所有用户都可以任意访问；

只有 allow -- 仅仅允许白名单中的用户访问模块；

只有 deny -- 仅仅黑名单中的用户禁止访问模块；

两个参数都存在 -- 优先检查白名单

如果匹配成功，则允许访问；

如果匹配失败，则去检查黑名单，如果匹配成功则禁止访问；

如果都没有匹配成功，则允许访问。

配置文件如下

注意：fake super = yes这个选项以前的版本是没有的，在新的版本中如果不加上这个参数，会报权限错误：rsync:chgrp ".hosts.G6sZha” (in backup) failed: Operation not permitted (1)

Copy
#rsyncd.conf配置文件：

uid = rsync #用户 远端命令使用rsync访问共享目录
gid = rsync #用户组
use chroot = no #安全相关
max connections = 200 #最大连接数
timeout = 300 #超时时间（不进行备份多长时间断开）
pid file = /var/run/rsyncd.pid #进程对应进程号文件（存放服务运行时进程id号）
lock file = /var/run/rsync.lock #锁文件
log file = /var/log/rsyncd.log #日志文件，显示出错信息
fake super = yes #在新版本中必须加这个
#模块信息：
[backup] # 自定义模块名称
comment = "backup"
path = /backup/web #模块对应的位置（路径）
ignore errors #忽略错误程序
read only = false #是否只读（这里是假，表示能写入）
list = false #是否可以列表*
hosts allow = 172.16.12.0/24 #准许访问rsync服务器客户范围（白名单）
#hosts deny = 0.0.0.0/32 #禁止访问rsync服务器客户范围（黑名单）
auth users = rsync_backup #不存在的用户，只用于认证
#设置进行连接认证的密钥文件：
secrets file = /etc/rsync.password #认证时密钥文件

创建密码文件，修改权限为600

Copy
# 将密码内容写入文件
echo "rsync_backup:123456" > /etc/rsync.password
# 为了安全，把认证用户的密码文件权限修改为600
chmod 600 /etc/rsync.password

创建系统用户

Copy
# 创建一个rsync的虚拟用户，只被程序使用
useradd rsync -s /sbin/nolgin -M

创建模块对应的目录，并修改目录的属主和属组为系统用户

Copy
mkdir /backup/web
chown -R rsync.rsync /bakcup/

启动rsync守护进程，并查看是否启动

Copy
rsync --daemon # 启动守护进程
ps -ef | grep rsync。# 查看是否启动进程
netstat -lntup | grep rsync # 查看是否监听873端口

# 查看是否已经正常启动并监听873端口
[root@fzfcdb ~]# ps -ef | grep rsync
root 19489 1 0 09:42 ? 00:00:00 rsync --daemon
root 27296 27115 0 15:09 pts/6 00:00:00 grep --color=auto rsync
[root@fzfcdb ~]# netstat -lntup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 19489/rsync
tcp6 0 0 :::873 :::* LISTEN 19489/rsync
[root@fzfcdb ~]#

源端服务器配置

安装rsync软件，只需要安装，不需要启动，不需要配置

Copy
yum -y install rsync
# 确认是否安装了 rsync
rpm -qa | grep rsync
rsync-3.1.2-10.el7.x86_64

创建密码文件

客户端密码文件中，只需要密码即可，密码文件的权限为600

Copy
echo "123456" > /etc/rsync.password
# 设置文件所有者具有读取、写入权限即可
chmod 600 /etc/rsync.password

传输测试，相关参数为服务端配置文件设置的

源端上传至服务端测试

/www/将本地www文件夹下所有文件上传至服务端，如果是/www，则是将整个www文件夹备份过去；

rsync_backup为服务器端中配置文件的auth users参数；

::backup 是以后的模块参数以及配置文件中的[backup]，后面接配置文件中的密码文件路径，免交互，不用输入密码就可以传输。

Copy
rsync -avz /www/ rsync_backup@172.16.12.141::backup --password-file=/etc/rsync.password

源端服务器下载测试

将服务器端的backup模块配置的path路径的文件下载到本地www目录下。

Copy
rsync -avz rsync_backup@172.16.12.141::backup --password-file=/etc/rsync.password /www

到此，rsync的配置完成。

使用 inotify-tools进行实时同步

安装inotify-tools工具，实时触发rsync进行同步

Copy
# 查看服务器内核是否支持 inotify
# 如果有这三个 max 开头的文件则表示服务器内核支持 inotify
[root@localhost ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 May 11 16:15 max_queued_events
-rw-r--r--. 1 root root 0 May 11 16:15 max_user_instances
-rw-r--r--. 1 root root 0 May 11 16:15 max_user_watches

# 安装 inotify-tools
yum -y install inotify-tools
# 查看是否安装
rpm -qa | grep inotify-tools
inotify-tools-3.21.9.6-1.16.el7.x86_64

写同步脚本

Copy
[root@localhost ~]# mkdir /scripts
[root@localhost ~]# touch /scripts/inotify.sh
[root@localhost ~]# chmod 755 /scripts/inotify.sh
[root@localhost ~]# ll /scripts/inotify.sh
-rwxr-xr-x 1 root root 0 Aug 10 13:02 /scripts/inotify.sh
[root@localhost ~]# vim /scripts/inotify.sh
host=172.16.2.4 # 目标服务器的ip(备份服务器)
src=/www # 在源服务器上所要监控的备份目录（此处可以自定义，但是要保证存在）
des=backup # 自定义的模块名，需要与目标服务器上定义的同步名称一致
password=/etc/rsync.password # 执行数据同步的密码文件
user=rsync # 执行数据同步的用户名
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

启动脚本

Copy
# & 表示后台运行
nohup bash /scripts/inotify.sh &

测试：在源服务器上生成一个新文件

查看 inotify生成的日志

使用 rsync+sersync 进行实时同步

sersync简介

sersync是基于inotify开发的，类似于inotify-tools的工具。所以同样内核需要先支持inotify，才能搭建。
sersync可以记录下被监听目录中发生变化的（包括增加、删除、修改）具体某一文件或者某一个目录的名字，然后使用rsync同步的时候，只同步发生变化的问价或目录。
相对于inotify-tools遍历更快，在同步大量数据时更有优势，搭建更快，无需额外编写脚本。

安装 sersync

sersync是国内一位牛人开发的，无法使用yum安装，直接在github或者google code上找，然后自己安装。
google code 地址：https://code.google.com/archive/p/sersync/
github 地址：https://github.com/wsgzao/sersync

源端服务器配置

下载 sersync

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

解压得到文件夹并移动改名

Copy
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 移动到 /usr/local 并改名为 sersync
mv GUN-Linux-x86 /usr/local/sersync

进入目录并修改xml配置文件

Copy
cd /usr/local/sersync #进入sersync安装目录
cp confxml.xml confxml.xml-bak #备份原文件
vim confxml.xml #编辑，修改下面的代码

配置内容修改几个地方：相关信息在自己rsync服务端到配置文件/etc/rsyncd.con可见。
原配置文件：

Copy
#服务器ip，文件路径及模块名设置
<localpath watch="/opt/tongbu">
#这里填写nfs存储服务器（源服务器）要同步的文件夹路径。

<remote ip="127.0.0.1" name="tongbu1"/>
#这里填写rsync备份服务器（目标服务器）的IP地址和模块名，可配置多个服务器
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>

#认证部分(rsync密码认证)
<rsync>
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
#启用密码认证，配置auth users+密码文件路径，rsync备份服务器的认证信息。
</rsync>

#修改同步失败日志位置，并且每60分钟对失败的log进行重新同步（可选配置，非必需）
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>

修改后的配置文件：

Copy
<sersync>
<localpath watch="/www">
<remote ip="172.16.12.141" name="backup"/>
</localpath>
<rsync>
<!--<commonParams params="-artuz"/> -->

<commonParams params="-artucb --suffix=_bak_`date +%Y%m%d%H%M%S --backup-dir=`date +%Y%m%d`"/>
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
<userDefinedPort start="false" port="874"/>
<timeout start="false" time="100"/>
<ssh start="false"/>
</rsync>
<failLog path="/var/log/rsync_fail_log.sh" timeToExecute="60"/>

注意：如果需要在服务端保留在源端中删除的文件，则需要修改以下配置。

Copy
<inotify>
<!--<delete start="true"/> 将true修改为false-->
<delete start="false"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify>

开启sersync守护进程同步数据并测试程序

开启sersync守护进程

Copy
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml

sersync 参数用法

-d ：启用守护进程

-r ：在监控前，将监控目录与远程主机用rsync命令推送一遍

-n ：指定开启守护线程的数量，默认为 10 个

-0 ：指定配置文件，默认使用confxml.xml文件

开启成功，不成功卡死

Copy
[root@localhost sersync]# /usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
set the system param
execute：echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute：echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d run as a daemon
option: -r rsync all the local files to the remote servers before the sersync work
option: -o config xml name： /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
will ignore the inotify delete event
daemon start，sersync run behind the console
use rsync password-file :
user is rsync_backup
passwordfile is /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ，use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /root/rsync_test/log && rsync -artuzb --suffix=._bak_`date +%Y%m%d%H%M%S` --backup-dir=`date +%Y%m%d` -R ./ rsync_backup@10.47.239.3::log_backup --password-file=/etc/rsync.password >/dev/null 2>&1
run the sersync:
watch path is: /root/rsync_test/log

文件测试