运维管理 ·

Linux 下部署 sersync+rsync 数据自动同步备份

一、为什么要用rsync+sersync架构?

1、sersync是基于inotify开发的,类似于inotify-tools的工具

2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录

二、rsync+inotify-tools与rsync+sersync架构的区别?

1、rsync+inotify-tools

a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低

2、rsync+sersync

a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;

b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
总结:

当同步的目录数据量不大时,建议使用rsync+inotify

当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync

三、sersync+rsync 安装配置

3.0.1 sersync同步逻辑图

当前版本的sersync依赖于rsync进行数据同步;

Linux 下部署sersync+rsync 实现数据实时自动同步备份

3.0.2 原理步骤:

  1. 1.  在同步服务器(work231)上开启sersync服务,sersync负载监控配置路径中的文件系统事件变化;
  2. 2.  调用rsync命令把更新的文件同步到目标服务器(work232 和work233);
  3. 3.  需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)

同步原理:

1.  用户实时的往sersync服务器(work231)上写入更新文件数据;

2.  此时需要在同步主服务器(work231)上配置sersync服务;

3.  在work232 和work233上开启rsync守护进程服务,以同步拉取来自sersync服务器(work231)上的数据;

通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器(work232 和work233),如此简单;

3.0.3 安装环境准备

A.系统资源列表

角色 IP 机器名
sersync服务 192.168.99.231 work231
rsync服务 192.168.99.232 work232
rsync服务 192.168.99.233 work232

B.检查系统环境

[root@work231 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@work231 ~]# uname -r
2.6.32-642.el6.x86_64
[root@work231 ~]# uname -m
x86_64

四、配置同步服务器

4.0.1.部署rsync服务,在work231 work232 work233上部署rsync和xinetd服务
4.0.2.安装xinetd服务来管理rsync服务
[root@work231 ~]# yum install -y xinetd

xinetd管理rsync服务工作原理

 4.0.3. 编辑配置文件,设置rsync执行路径

[root@work231 ~]# vim /etc/xinetd.d/rsync

disable = yes   改为:

disable = no
server          = /usr/bin/rsync  改为:
server          = /webserver/rsync/bin/rsync

 4.0.4. rsync监听端口873添加到/etc/services服务里
[root@work231 ~]# vim /etc/services

       rsync           873/tcp                         # rsync
       rsync           873/tcp                         # rsync

 4.0.5. 升级rsync到3.1.2版本
[root@work231 ~]# rsync --version|head -2

rsync version 3.0.6 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

[root@work232 /]# mkdir -p /webserver/rsync/temp                # 临时文件目录
[root@work232 /]# mkdir -p /webserver/rsync/log                 # 日志目录
[root@work232 /]# mkdir -p /webserver/rsync/etc                 # 配置文件目录
[root@work232 /]# wget https://rsync.samba.org/ftp/rsync/rsync-3.1.2.tar.gz
[root@work232 /]# tar zxf rsync-3.1.2.tar.gz
[root@work232 /]# cd rsync-3.1.2
[root@work232 /]# ./configure --prefix=/webserver/rsync --disable-ipv6
[root@work232 rsync-3.1.2]# make
[root@work232 rsync-3.1.2]# make install
[root@work232 /]# ln -s /webserver/rsync/bin/rsync /usr/local/bin
  4.0.6. 创建 rsyncd.conf 配置文件
uid = 0
gid = 0
use chroot = true
max connections = 0
port = 8730
#charset = utf8
timeout = 600
log format = %t-%a-%o-%a-%m-%u-%f-%l
syslog facility = local3
pid file = /webserver/rsync/temp/rsyncd_Pid.pid
lock file = /webserver/rsync/temp/rsyncd_lock.lock
log file = /webserver/rsync/log/rsyncdlog.log
motd file = /webserver/rsync/etc/rsyncd.motd
strict modes = false
ignore errors
ignore nonreadable
transfer logging = yes
list = true
secrets file = rsyncd.secrets
#exclude = blank.png;spinner.gif;downsimple.png;rails.png;WEB-INF/
#exclude = cygdrive

#################################################
[www]
comment = www.fooher.com 实战测试项目
path = /data/www/
auth users = wwwfoohercom 
hosts allow = *
read only = no
write only = no

#################################################
[bbs]
comment = bbs.fooher.com 实战测试项目 
path = /data/bbs/
auth users = bbsfoohercom
hosts allow = *
read only = no
write only = no

#################################################
[blog]
comment = blog.fooher.com 实战测试项目 
path = /data/blog/
auth users = blogfoohercom
hosts allow = *
read only = no
write only = no

rsyncd.mod 文件不存在,客户端登陆之后弹出的消息,需要创建

[root@work232 rsync-3.1.2]# touch /webserver/rsync/etc/rsyncd.motd

#++++++++++++++++++++++++++++++++++++++++++++++

   Welcome to use the fooher.com rsync services!

#++++++++++++++++++++++++++++++++++++++++++++++

配置文件详细说明,请查看 Linux下使用 rsync+inotify 实现同步服务器数据自动备份 文章

特别提示: work232,work233的机器 同时部署上述服务;

上面rsync服务的配置文件,表面允许sersync主服务器(ip:192.168.99.231)访问rsync同步模块名为[www][bbs][blog] 将同步过来的文件分别放入对应的path指定的目录/data/{www,bbs,blog}下面; 如果有多台目标服务器,则每一台都需要进行类似的rsync服务配置,上面的uid、gid要换成您服务器的相应的同步用户;注意,rsync服务账户(本文用的是root)要有对被同步目录(/data/)的写入更新权限;

 7. 创建rsync同步密码文件,并设置权限为 600
[root@work231 rsync-3.1.2]# echo >/webserver/rsync/etc/bbs.password
[root@work231 rsync-3.1.2]# echo >/webserver/rsync/etc/blog.password
[root@work231 rsync-3.1.2]# echo >/webserver/rsync/etc/www.password
[root@work231 rsync-3.1.2]# chmod 600 /webserver/rsync/etc/rsync.password
[root@work231 rsync-3.1.2]# echo "bbsfoohercom" >/webserver/rsync/etc/bbs.password
[root@work231 rsync-3.1.2]# echo "wwwfoohercom" >/webserver/rsync/etc/www.password
[root@work231 rsync-3.1.2]# echo "blogfoohercom" >/webserver/rsync/etc/blog.password
[root@work231 rsync-3.1.2]# chmod 600 *.password        #设置权限为 600

-rw------- 1 root root 26 May 27 16:24 /webserver/rsync/etc/rsyncd.secrets

[root@work232 rsync-3.1.2]# vim  /webserver/rsync/etc/rsyncd.secrets

对应的用户名和密码内容如下:

wwwfoohercom:wwwfoohercom
bbsfoohercom:bbsfoohercom
blogfoohercom:blogfoohercom

8. 启动守护进程,并写入开机自启动
[root@work232 rsync-3.1.2]# /webserver/rsync/bin/rsync --daemon --config=/webserver/rsync/etc/rsyncd.conf
#配置开机启动
[root@work232 rsync-3.1.2]# /webserver/rsync/bin/rsync --daemon --config=/webserver/rsync/etc/rsyncd.conf >> /etc/rc.local
[root@work232 rsync-3.1.2]# service xinetd start              #启动 xinetd 服务
[root@work232 rsync-3.1.2]# netstat -antlupt|grep rsync

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      10702/rsync

[root@work232 rsync-3.1.2]# lsof -i :873

        COMMAND   PID     USER   FD   TYPE    DEVICE    SIZE/OFF    NODE NAME

        rsync   10702      root    3u  IPv4       20793             0t0     TCP *:rsync (LISTEN)

 9. 添加 873 端口到防火墙
[root@work231 rsync]# iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
[root@work231 rsync]# service iptables save
[root@work231 rsync]# service iptables restart
10. 创建同步的目录
[root@work232 rsync-3.1.2]# mkdir -p /data/{www,bbs,blog} #
[root@work231 rsync]# touch /data/www/www.log /data/bbs/bbs.log /data/blog/blog.log  日志目录

提示: 此步骤在work232,work233都要执行,否则rsync serync 服务会因为没有PATH路径而无法启动

11. 在work231上配置rsync客户端,生成 bbs.password ,blog.password,www.password 密码文件
[root@work231 rsync-3.1.2]# echo "bbsfoohercom" >/webserver/rsync/etc/bbs.password
[root@work231 rsync-3.1.2]# echo "wwwfoohercom" >/webserver/rsync/etc/www.password
[root@work231 rsync-3.1.2]# echo "blogfoohercom" >/webserver/rsync/etc/blog.password
[root@work231 rsync-3.1.2]# chmod 600 *.password        #设置权限为 600
 12. 在work231上手工测试rsync同步情况

特别提示:此步非常关键,如果测试不成功,后面的sersync配好了也不会同步数据;

根据不同的需求同步对应的实例文件,执行同步命令

rsync -avzP /data/wwwroot/* wwwfoohercom@192.168.99.232::www --port=873 --password-file=/webserver/rsync/etc/www.password
rsync -avzP /data/wwwroot/* bbsfoohercom@192.168.99.232::bbs --port=873 --password-file=/webserver/rsync/etc/bbs.password
rsync -avzP /data/wwwroot/* blogfoohercom@192.168.99.232::blog --port=873 --password-file=/webserver/rsync/etc/blog.password

rsync -avzP /data/wwwroot/* wwwfoohercom@192.168.99.233::www --port=873 --password-file=/webserver/rsync/etc/www.password
rsync -avzP /data/wwwroot/* bbsfoohercom@192.168.99.233::bbs --port=873 --password-file=/webserver/rsync/etc/bbs.password
rsync -avzP /data/wwwroot/* blogfoohercom@192.168.99.233::blog --port=873 --password-file=/webserver/rsync/etc/blog.password
13. 推送的命令是在 work231端(也就是 sersync服务器上)操作的,同步后查看work232,work233

[root@work232 etc]# tree /data/
/data/
├── bbs
│ └── bbs.log
├── blog
│ └── blog.log
└── www
└── www.log

五、在 work231 上开始部署sersync服务

5.0.1. 下载sersync

在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件,这用

[root@work231 ~]# tar fxzsersync2.5.4_64bit_binary_stable_final.tar.gz
[root@work231 ~]# cd GNU-Linux-x86
[root@work231 GNU-Linux-x86]# /bin/cp confxml.xml /webserver/rsync/etc/confxml.xml
[root@work231 GNU-Linux-x86]# /bin/cp sersync2 /webserver/rsync/bin/sersync2
[root@work231 etc]# cd /webserver/rsync/etc/
5.0.2 配置多个confxml.xml文件(比如:www、bbs、blog....等等)
[root@work231 etc]# cp confxml.xml bbs_confxml.xml
[root@work231 etc]# cp confxml.xml blog_confxml.xml
[root@work231 etc]# cp confxml.xml www_confxml.xml
5.0.3. 下载sersync更改优化sersync配置文件:

a) 修改24--28行,默认内容如下:

<localpathwatch="/opt/tongbu"> # 定义本地要同步的目录
<remote ip="127.0.0.1"name="tongbu1"/>
<!--<remoteip="192.168.8.39" name="tongbu"/>--> # 同步到哪台机器上 tongbu模块rsync端模块名字
<!--<remoteip="192.168.8.40" name="tongbu"/>--> # 同步到哪台机器上 tongbu模块
</localpath>
分别修改后的对应文件内容为:
bbs_confxml.xml:
<localpath watch="/data/wwwroot/">
      <remote ip="192.168.99.232" name="bbs"/>
      </localpath>

blog_confxml.xml
<localpath watch="/data/wwwroot/">
<remote ip="192.168.99.232" name="blog"/>
</localpath>

www_confxml.xml
<localpath watch="/data/wwwroot/">
<remote ip="192.168.99.232" name="www"/> 
</localpath>
b)修改31--34行,认证部分【rsync密码认证】

默认内容如下:

<rsync>
	<commonParamsparams="-artuz"/>
    <auth start="false"users="root" passwordfile="/etc/rsync.pas"/>
    <userDefinedPortstart="false" port="874"/><!-- port=874 -->
    <timeoutstart="false" time="100"/><!-- timeout=100 -->
    <sshstart="false"/>
</rsync>

修改后的内容如下:

<rsync>
 <commonParams params="-artuzP"/>
 <auth start="true" users="bbsfoohercom" passwordfile="/webserver/rsync/etc/bbs.password"/>
 <userDefinedPort start="true" port="873"/>
 <timeout start="false" time="100"/><!-- timeout=100 --> 
 <ssh start="false"/>
</rsync>

<rsync>
 <commonParams params="-artuzP"/>
 <auth start="true" users="blogfoohercom" passwordfile="/webserver/rsync/etc/blog.password"/> 
 <userDefinedPort start="true" port="873"/>
 <timeout start="false" time="100"/><!-- timeout=100 --> 
 <ssh start="false"/>
</rsync>

<rsync>
 <commonParams params="-artuzP"/>
 <auth start="true" users="wwwfoohercom" passwordfile="/webserver/rsync/etc/www.password"/>
 <userDefinedPort start="true" port="873"/>
 <timeout start="false" time="100"/><!-- timeout=100 --> 
 <ssh start="false"/>
</rsync>

c)修改37行,默认内容如下:

<failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60mins execute once-->

修改后的内容如下:

<failLog path="/webserver/rsync/log/rsync_bbs_log.log" timeToExecute="60"/>
<failLog path="/webserver/rsync/log/rsync_blog_log.log" timeToExecute="60"/>
<failLog path="/webserver/rsync/log/rsync_www_log.log" timeToExecute="60"/>

修改后的完整sersync服务配置文件参数详解:

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
		<!-- 设置本地IP和端口 -->
		<host hostip="localhost" port="8008"></host>
		<!-- 开启DUBUG模式 测试用ture-->
		<debug start="ture"/>
		<!-- 对于xfs文件系统的用户,需要将这个选项开启,才能使用sersync正常工作  -->
		<fileSystem xfs="false"/>
		<!-- 同步时忽略推送的文件(正则表达式),默认关闭 -->
		<filter start="false">
				<exclude expression="(.*)\.svn"></exclude>
				<exclude expression="(.*)\.idea"></exclude>
				<exclude expression="(.*)\.gz"></exclude>
				<exclude expression="^info/*"></exclude>
				<exclude expression="^static/*"></exclude>
		</filter>

		<!-- 设置要监控的事件 -->
		<inotify>
				<delete start="true"/>
				<createFolder start="true"/>
				<createFile start="false"/>
				<closeWrite start="true"/>
				<moveFrom start="true"/>
				<moveTo start="true"/>
				<attrib start="false"/>
				<modify start="false"/>
		</inotify>

    <sersync>
	    <!-- 本地服务器同步的目录路径 work231的文件夹路径-->
		<localpath watch="/data/wwwroot/">
	    	<!--  这里填写服务器work232 work233的IP地址和模块名 -->
				<remote ip="192.168.99.232" name="www"/>
        </localpath>
    <rsync>
	    <!-- rsync指令参数 -->
	    <commonParams params="-artuzP"/>
		  <!-- rsync同步认证密码文件 这里是work232 work233 服务器认证信息-->
	    <auth start="true" users="wwwfoohercom" passwordfile="/webserver/rsync/etc/rsyncd.password"/>
			<!-- 设置rsync远程服务端口 874 -->
	    <userDefinedPort start="true" port="873"/>
			<!-- 设置超时时间 -->
	    <timeout start="false" time="100"/><!-- timeout=100 -->
			<!-- 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书 -->
	    <ssh start="false"/>
		</rsync>
		<!-- 当同步失败后,日志记录到rsync_fail_log.sh文件中,并且每60分钟对失败的log进行重新同步 -->
    <failLog path="/webserver/rsync/log/rsync_www_log.log" timeToExecute="60"/>
	    <!-- 设置rsync+crontab定时传输,默认关闭 这里设置为true,每隔600秒执行一次全盘同步--><crontab start="true" schedule="1"><!--600mins-->
	    <crontabfilter start="false"><exclude expression="*.php"></exclude><exclude expression="info/*"></exclude>
	    </crontabfilter>
    </crontab>
	<!-- 设置sersync传输后调用name指定的插件脚本,默认关闭 -->
	<plugin start="false" name="command"/>
    </sersync>
</head>
5.0.4. 开启sersync守护进程同步数据
[root@work231 etc]# /webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/www_confxml.xml
[root@work231 etc]# /webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/bbs_confxml.xml
[root@work231 etc]# /webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/blog_confxml.xml
5.0.5. 多实例初始化同步命令
[root@work231 etc]# /webserver/rsync/bin/sersync2 -r -d -o /webserver/Program/rsync/etc/www_confxml.xml
[root@work231 etc]# /webserver/rsync/bin/sersync2 -r -d -o /webserver/Program/rsync/etc/bbs_confxml.xml
[root@work231 etc]# /webserver/rsync/bin/sersync2 -r -d -o /webserver/Program/rsync/etc/blog_confxml.xml
5.0.6. 配置开机启动,修改 rc.local
[root@work231 etc]# cat >> /etc/rc.local << EOF
#sync data to 25 26
/webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/www_confxml.xml
/webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/bbs_confxml.xml
/webserver/rsync/bin/sersync2 -d -o /webserver/Program/rsync/etc/blog_confxml.xml
EOF
5.0.7. 添加脚本监控sersync是否正常运行:
[[root@work231 etc]# vim /webserver/rsync/etc/check_sersync.sh
[[root@work231 etc]# chmod +x /webserver/rsync/etc/check_sersync.sh  #设置执行权限

#!/bin/sh
sersync2="/webserver/rsync/bin/sersync2"
www="/webserver/rsync/etc/www_confxml.xml"
bbs="/webserver/rsync/etc/bbs_confxml.xml"
blog="/webserver/rsync/etc/blog_confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
${sersync2} -d -r -o ${www} &
${sersync2} -d -r -o ${bbs} &
${sersync2} -d -r -o ${blog} &
else
exit 0;
fi

5.0.8. 设置计划任务每分钟检查一次:
[[root@work231 etc]# vim /etc/crontab

*/5 * * * * root /webserver/rsync/etc/check_sersync.sh > /dev/null 2>&1

5.0.9. 压测:写入10K个文件批量同步测试结果:
[[root@work231 etc]# service crond reload         #重新加载服务
[root@work231 etc]# for n in `seq 1000`; do echo "www.fooher.com" >/data/wwwroot/$n.txt;done
[root@work231 etc]# ps -ef |grep rsync

提示:我们发现本地已经写完了10000个,但是同步的线程,依然在同步;甚至才同步了1000多个,work232 work231 同步同步时可以用 du 对比命令查看 du /data/wwwroot

六、sersync2 命令参数说明

Sersync参数 说明
 

./sersync -r

-r参数作用是:开启实时监控的之前对主服务器目录与远程目标机器的目录进行一次整体同步;如果需要将sersync运行前,主服务器目录下已经存在的所有文件或目录全部同步到远端,则要以 -r参数运行sersync,将本地与远程整体同步一次;

提别说明:如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步;

 

./sersync -o xx.xml

不指定 -o参数: sersync使用sersync可执行文件目录下的默认配置文件confxml.xml

指定 -o 参数:可以指定多个不同的配置文件,从而实现sersync多进程多实例的数据同步

 

./sersync -n num

-n参数为:指定默认的线程池的线程总数;

例如: ./sersync -n 5 则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过该参数调低,如果机器配置较高,可以调高默认的线程总数,提升同步效率;

./sersync -d -d参数为:后台服务,通常情况下使用 -r参数对本地到远端整体同步一遍后,在后台运行此参数启动守护进程实时同步;在第一次整体同步时,-d 和 -r参数经常会联合使用;
./sersync -m

pluginName

-m参数:不进行同步,只运行插件 ./sersync -m pluginName

例如:./sersync -m command,则在监控到事件后,不对远程目标服务器进行同步,而是直接运行command插件

组合命令使用说明:
-n 8 -o liubl.xml -r -d 多个参数可以配合使用,例如:./sersync -n 16 -o config.xml -r -d 表示设置线程池工作线程为16个,指定liubl.xml作为配置文件,在实时监控前 做一次整体同步,以守护进程方式在后台运行;
./sersync --help 很遗憾,它没有查看帮助(需要的话2条路,要么看源代码,要么自测求验证)

对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少rsync通讯;

因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的时间close_write,同样可以实现文件完整同步;

注意:强将creatFolder保持为true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控;所以除非特殊需要,请开启; 默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete参数设置为false,则不对删除事件进行监控。

评论已关闭