栏目头部广告

Rsync+sersync实现数据实时同步备份

一、Rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。

在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文件的原始位置,发起端应对该位置具有读取权限。

官方网站:http://rsync.samba.org/

Rsync+Inotify实现数据实时同步备份(图1)

二、rsync+inotify-tools与rsync+sersync架构对比

2.1 为什么要用rsync+sersync架构?

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

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

(1)rsync+inotify-tools

  •  a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
  •  b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低    

(2)rsync+sersync

  • a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
  • b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。 

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

 同步过程和原理:
(1)用户实时的往sersync服务器上写入更新文件数据;
(2)此时需要在同步主服务器上配置sersync服务;
(3)在另一台服务器开启rsync守护进程服务,以同步拉取来自sersync服务器上的数据;
通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器

三、部署Rsync

数据源服务器A:192.168.0.153

备份源服务器B:192.168.0.6

3.1 rsync数据同步参数解读

#rsync参数解读

#-v, --verbose 详细模式输出
#-z, --compress 对备份的文件在传输时进行压缩处理
#-r, --recursive 对子目录以递归模式处理
#-t, --times 保持文件时间信息
#-o, --owner 保持文件属主信息
#-p, --perms 保持文件权限
#-g, --group 保持文件属组信息
#--delete 删除那些DST中SRC没有的文件
#--exclude=PATTERN 指定排除不需要传输的文件模式
#--progress 在传输时现实传输过程#-H, --hard-links 保留硬链接#-P,显示进度
#--password-file=FILE 从FILE中得到密码,这个文件必须是600权限,chmod 600 /etc/rsync_users.pass
查看服务是否开机启动:
#  systemctl  list-unit-files                        --列出各种服务开机是否启动
#  systemctl  list-unit-files  |  grep  xinetd       --列出xinetd服务是否开机启动
#  systemctl  is-enabled  xinetd                     --列出xinetd服务是否开机启动

3.2 通过系统root用户直接同步

(1)服务器A(源)直接推送数据到服务器B(目标)

[root@a ~]# yum install -y rsync
[root@a ~]# rsync -avz /data/datadir/ root@192.168.0.6:/data/a_backup

Rsync+Inotify实现数据实时同步备份(图2)

(2)如果有端口的情况:

[root@a ~]# rsync -e 'ssh -p 22' -avl /data/datadir/ root@192.168.0.6:/data/a_backup

Rsync+Inotify实现数据实时同步备份(图3)

3.3 通过非系统用户同步

配置B服务器(备份源)

(1)准备工作

[root@b ~]# yum -y install xinetd rsync #安装Rsync服务端软件
[root@b ~]# mkdir /data/datadir

[root@b ~]# vim /etc/rc.d/rc.local  #设置开机启动
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
[root@b ~]# chmod +x /etc/rc.d/rc.local
[root@b ~]# systemctl start xinetd   #启动(CentOS中是以xinetd来管理Rsync服务的)

(2)在服务器B上编辑/etc/rsyncd.conf配置文件

[root@b ~]# vim /etc/rsyncd.conf
uid=root
gid=root
address=192.168.0.6 #本机地址
port=873  #监听的端口
hosts allow=192.168.0.0/24  #允许访问的客户机地址
use chroot=yes   #锁定家目录
max connections=5
pid file=/var/run/rsyncd.pid  
lock file=/var/run/rsync.lock #指max connectios参数的锁文件
log file=/var/log/rsyncd.log  #日志文件位置
[datadir]           #共享模块名称
path=/data/datadir/ #路径
comment=datadir
read only=false  #设置服务端文件读写权限
list=yes         #是否允许查看模块信息
auth users=rsyncuser   #不是系统用户,不需要提前创建 只是用来同步数据[授权账户,多个账号以空格分隔]
secrets file =/etc/rsync.passwd #存放用户的密码文件,格式是  用户名:密码

(3)在服务器B上创建用户认证信息文件,格式:[账号]:[密码],这里注意一点就是权限必须设置成600

[root@b ~]# vim /etc/rsync.passwd
rsyncuser:123456    #这个用户是虚拟用户,不是系统用户,只是用来同步数据

[root@b ~]#  chmod 600  /etc/rsync.passwd

(4)启动rsync和xinetd服务

[root@b ~]# systemctl enable xinetd.service 
[root@b ~]# systemctl restart xinetd.service 
[root@b ~]# rsync --daemon --config=/etc/rsyncd.conf

Rsync+Inotify实现数据实时同步备份(图4)

配置A服务器(数据源)

[root@a ~]# yum install rsync -y

rsync语法:rsync 选项 用户名@备份源服务器IP::共享模块名 目标目录

(1)备份传输测试

[root@a ~]# rsync -avz  /data/datadir/ rsyncuser@192.168.0.6::datadir
Password: 
sending incremental file list
./
file1
file100
file2
file3
file4

sent 319 bytes  received 114 bytes  78.73 bytes/sec
total size is 0  speedup is 0.00

Rsync+sersync实现数据实时同步备份(图5)

(2)配置密码文件

[root@a ~]# vim /etc/rsync.passwd
123456
[root@a ~]# chmod 600  /etc/rsync.passwd 
[root@a ~]# rsync -avz --delete /data/datadir/ rsyncuser@192.168.0.6::datadir --password-file=/etc/rsync.passwd #删除b上的文件重新同步
sending incremental file list
./
file1
file100
file2
file3
file4

sent 323 bytes  received 114 bytes  874.00 bytes/sec
total size is 0  speedup is 0.00

(3)编写脚本

[root@a ~]# vim auto_rsync_backup.sh
#!/bin/bash
rsync -avz --delete /data/datadir/ rsyncuser@192.168.0.6::datadir --password-file=/etc/rsync.passwd

[root@a ~]# chmod +x auto_rsync_backup.sh 
[root@a ~]# sh auto_rsync_backup.sh 
sending incremental file list
./
file1
file100
file2
file3
file4

sent 323 bytes  received 114 bytes  291.33 bytes/sec
total size is 0  speedup is 0.00

(4)设置定时任务

[root@a ~]# crontab -e
0 1 0 * * * sh auto_rsync_backup.sh  #每天凌晨1点自动备份

四、rsyncd+sersync 时时同步

【注】以下操作均在数据源侧进行,即a服务器。

4.1 部署sersync

sersync安装包下载Rsync+sersync实现数据实时同步备份(图6)1-210529150202426.gz

[root@a ~]# tar -zxvf sersync_64bit_binary_stable_final.tar.gz 
GNU-Linux-x86/
GNU-Linux-x86/sersync2    #二进制文件
GNU-Linux-x86/confxml.xml #配置文件

[root@a ~]# mv GNU-Linux-x86/ /usr/local/
[root@a ~]# cd /usr/local/
[root@a local]# mv GNU-Linux-x86/ sersync

4.2 配置sersync

[root@a sersync]# vim confxml.xml 
 24        <localpath watch="/data/datadir/">  #更改同步目录
 25             <remote ip="192.168.0.6" name="datadir"/>  #更改备份源服务器和共享模块名称
 26             
 27             
 28         </localpath>
 29         <rsync>
 30             <commonParams params="-artuz"/>
 31             <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>  #更改密码认证

【注】以上配置只截取了需要修改的部分配置行。

4.3 开启sersync守护进程同步数据

[root@a ~]# /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
daemon start,sersync run behind the console 
use rsync password-file :
user is	rsyncuser
passwordfile is 	/etc/rsync.passwd
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 /data/datadir && rsync -artuz -R --delete ./ rsyncuser@192.168.0.6::datadir --password-file=/etc/rsync.passwd >/dev/null 2>&1 
run the sersync: 
watch path is: /data/datadir

4.4 变更数据源目录文件,查看备份源服务器数据变化

[root@b datadir]# watch ls -l  #实时查看备份源服务器目录文件变化

[root@a datadir]# touch file102

Rsync+sersync实现数据实时同步备份(图7)

4.5 添加sersync健康检测脚本[自动拉起]

[root@a ~]# vim /usr/local/sersync/check_sersync.sh
 #!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
[root@a ~]# chmod +x /usr/local/sersync/check_sersync.sh  #添加可执行权限
[root@a ~]# crontab -e  #编写定时任务
1 0 0 * * * /usr/local/sersync/check_sersync.sh  #每分钟检查一次

五、其它需求场景

5.1 多目录备份场景

(1)配置多个confxml.xml文件(比如:www、blog....等等)
(2)根据不同的需求同步对应的实例文件

  • /usr/local/sersync/sersync2  -d -o /usr/local/sersync/www_confxml.xml
  • /usr/local/sersync/sersync2  -d -o /usr/local/sersync/blog_confxml.xml 

(3)修改配置之后需要重启rsync服务

  • systemctl restart xinetd  #重启 xinetd
  • systemctl restart rsyncd  #重启 rsyncd

5.2 筛选 rsync 的传输目标

 * 可以使用 ––exclude 选项排除源目录中要传输的文件;
 * 也可以使用 ––include 选项指定要传输的文件。

(1)案例1:192.168.0.153 主机上的 /www 目录(不包含 /www/logs 和 /www/conf子目录)复制到本地的 /backup/www/ 。

 rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/" --progress backup@192.168.0.153:/www/ /backup/www/

(2)案例2:仅复制目录结构而忽略掉目录中的文件

rsync -av --include '*/' --exclude '*' \ backup@192.168.0.101:/www/ /backup/www-tree/

(3)当 include/exclude 的规则较复杂时,可以将规则写入规则文件。使用规则文件可以灵活地选择传输哪些文件(include)以及忽略哪些文件(exclude)。

  • 若文件/目录在剔除列表中,则忽略传输。
  • 若文件/目录在包含列表中,则传输之。
  • 若文件/目录未被提及,也传输之。
  • 在 rsync 的命令行中使用 ––exclude-from=FILE 或 ––include-from=FILE 读取规则文件。

规则文件 FILE 的书写约定:
a. 每行书写一条规则 RULE
b. 以 # 或 ; 开始的行为注释行

包含(include)和排除(exclude)规则的语法如下:
a. include PATTERN 或简写为 + PATTERN
b. exclude PATTERN 或简写为 - PATTERN

PATTERN 的书写规则如下:
a. 以 / 开头:匹配被传输的根路径上的文件或目录
b. 以 / 结尾:匹配目录而非普通文件、链接文件或设备文件

使用通配符
*:匹配非空目录或文件(遇到 / 截止)
**:匹配任何路径(包含 / )
?:匹配除了 / 的任意单个字符
[:匹配字符集中的任意一个字符,如 [a-z] 或 [[:alpha:]]
可以使用转义字符 \ 将上述通配符还原为字符本身含义

案例展示:

例1:
# 不传输所有后缀为 .o 的文件
- *.o
# 不传输传输根目录下名为 foo 的文件或目录
- /foo
# 不传输名为 foo 的目录
- foo/
# 不传输 /foo 目录下的名为 bar 的文件或目录
- /foo/bar

例2:
# 传输所有目录和C语言源文件并禁止传输其他文件
+ */
+ *.c
- *

例3:
# 仅传输 foo 目录和其下的 bar.c 文件
+ foo/
+ foo/bar.c
- *
将规则写入规则文件之后,如何在命令行上使用它呢?下面给出一个例子:
首先将下面的规则存入名为 www-rsync-rules 的文件
# 不传输 logs 目录
- logs/
# 不传输后缀为 .tmp 的文件
- *.tmp
# 传输 Apache 虚拟主机文档目录(/*/ 匹配域名)
+ /srv/www/
+ /srv/www/*/
+ /srv/www/*/htdocs/
+ /srv/www/*/htdocs/**
# 传输每个用户的 public_html 目录(/*/ 匹配用户名)
+ /home/
+ /home/*/
+ /home/*/public_html/
+ /home/*/public_html/**
# 禁止传输其他
- *

作者:UStarGao
链接:https://www.starcto.com/application_of_operational/154.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`