Rsync+sersync实现数据实时同步备份
一、Rsync简介
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文件的原始位置,发起端应对该位置具有读取权限。
二、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
(2)如果有端口的情况:
[root@a ~]# rsync -e 'ssh -p 22' -avl /data/datadir/ root@192.168.0.6:/data/a_backup
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
配置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
(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安装包下载: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
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云平台推荐
随便看看
- 2021-12-21MySQL5.7执行count(*)比MySQL5.6执行更慢
- 2021-07-21MySQL主从同步异常之Relay log异常1594
- 2021-09-09开源Wazuh安全平台容器化部署
- 2021-09-14Docker部署RabbitMQ集群并实现Haproxy代理
- 2021-08-20Jupyter Notebook工具介绍