banner
十一

十一

Stay hungry, stay foolish.

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

使用rsync进行异地文件实时同步,实际是使用了rsyncdaemon守护进程模式。这种模式需要在源服务器端安装应用: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 allowhost 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

文件测试#

image

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。