使用rsync
进行异地文件实时同步,实际是使用了rsync
的daemon
守护进程模式。这种模式需要在源服务器端安装应用:rsync
+ inotify-tools
工具或者rsync
+inotify-tools
工具,目标服务器端安装rsync
即可。
rsync
配置步骤#
服务器信息#
- 目标服务器:172.16.12.141
- 源端服务器:172.16.12.142
目标服务器配置(服务端配置)#
创建配置文件:修改 /etc/rsync.conf
,让其工作在守护进程模式#
RedHat7
以及CentOS7
以下的默认没有,需要自己创建。
配置文件说明#
#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)
#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
#
# 将密码内容写入文件
echo "rsync_backup:123456" > /etc/rsync.password
# 为了安全,把认证用户的密码文件权限修改为600
chmod 600 /etc/rsync.password
创建系统用户#
# 创建一个rsync的虚拟用户,只被程序使用
useradd rsync -s /sbin/nolgin -M
创建模块对应的目录,并修改目录的属主和属组为系统用户#
mkdir /backup/web
chown -R rsync.rsync /bakcup/
启动rsync
守护进程,并查看是否启动#
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
软件,只需要安装,不需要启动,不需要配置#
yum -y install rsync
# 确认是否安装了 rsync
rpm -qa | grep rsync
rsync-3.1.2-10.el7.x86_64
创建密码文件#
客户端密码文件中,只需要密码即可,密码文件的权限为600
echo "123456" > /etc/rsync.password
# 设置文件所有者具有读取、写入权限即可
chmod 600 /etc/rsync.password
传输测试,相关参数为服务端配置文件设置的#
源端上传至服务端测试#
/www/
将本地www
文件夹下所有文件上传至服务端,如果是/www
,则是将整个www
文件夹备份过去;rsync_backup
为服务器端中配置文件的auth users
参数;::backup
是以后的模块参数以及配置文件中的[backup]
,后面接配置文件中的密码文件路径,免交互,不用输入密码就可以传输。
rsync -avz /www/ [email protected]::backup --password-file=/etc/rsync.password
源端服务器下载测试#
将服务器端的backup
模块配置的path
路径的文件下载到本地www
目录下。
rsync -avz [email protected]::backup --password-file=/etc/rsync.password /www
到此,rsync
的配置完成。
使用 inotify-tools
进行实时同步#
安装inotify-tools
工具,实时触发rsync
进行同步#
# 查看服务器内核是否支持 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
写同步脚本#
[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
启动脚本#
# & 表示后台运行
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
#
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
解压得到文件夹并移动改名#
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 移动到 /usr/local 并改名为 sersync
mv GUN-Linux-x86 /usr/local/sersync
进入目录并修改xml
配置文件#
cd /usr/local/sersync #进入sersync安装目录
cp confxml.xml confxml.xml-bak #备份原文件
vim confxml.xml #编辑,修改下面的代码
配置内容修改几个地方:相关信息在自己rsync
服务端到配置文件/etc/rsyncd.con
可见。
原配置文件:
#服务器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"/><!--default every 60mins execute once-->
修改后的配置文件:
<sersync>
<localpath watch="/www">
<remote ip="172.16.12.141" name="backup"/>
</localpath>
<rsync>
<!--<commonParams params="-artuz"/> -->
<!--修改原始文件是若需要备份原始文件就需要添加参数 b suffix:设置原始文件备份的后缀,backup-dir:原始元件备份的目录 -->
<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"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/var/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
注意:如果需要在服务端保留在源端中删除的文件,则需要修改以下配置。
<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
守护进程#
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
sersync
参数用法#
-d
:启用守护进程-r
:在监控前,将监控目录与远程主机用rsync
命令推送一遍-n
:指定开启守护线程的数量,默认为 10 个-0
:指定配置文件,默认使用confxml.xml
文件
开启成功,不成功卡死#
[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 ./ [email protected]::log_backup --password-file=/etc/rsync.password >/dev/null 2>&1
run the sersync:
watch path is: /root/rsync_test/log