Rsync备份服务和inotify实现实时同步
目录
一、备份
1.1、备份
企业中的服务器中最重要的、最具价值的部分有两个,代码和数据。代码是程序运行的基石,而数据不仅对企业很重要,对用户也是同样重要。所以为了预防故障,我们需要对重要数据进行备份,就是把重要数据或文件再次复制一份保存起来,保证数据不丢失,可以快速恢复。
1.2、备份常用工具
本地复制 : cp
远程传输 : scp 、 rsync
在企业正常工作中,数据丢失一般是由磁盘损坏造成的,此时本地复制就没有什么意义,因为磁盘一旦损坏,本地所有数据都将丢失,所以我们就需要使用到远程传输。
二、远程传输
2.1、scp
2.1.1、使用格式
1.将本地文件上传至对应服务器上(推送)
scp [源文件本地路径] [用户名]@[IP]:[目标路径]
2.将远程服务器上的文件下载到本地服务器(拉取)
scp [用户名]@[IP]:[源文件路径] [目标本地路径]
2.1.2、使用实例
例1.将本地的init.sh文件远程传输到web01服务器上root用户的家目录下
[root@rsync ~]# scp init.sh root@web01:/root
例2.将web01服务器上root用户家目录下的init.sh文件拉取到本地
[root@rsync ~]# scp root@web01:/root/init.sh .
2.2、rsync
2.2.1、rsync介绍
rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
全量拷贝 : 把文件整体拷贝过来
增量拷贝 : 差异化拷贝(同步有变化的内容)
2.2.2、rsync特性
支持拷贝特殊文件,如连接文件、设备等
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)
可以使用rpc、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)
可以通过socket(进程方式)传输文件和数据(服务端和客户端)
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像
2.2.3、rsync备份方式
全量备份 : 把数据完全的备份下来

增量备份 : 只备份有差异的部分

三、rsync应用场景
3.1、rsync的传输方式
推送 : 客户端将需要的数据上传到服务端

拉取 : 客户端讲需要的数据下载下来

3.2、传输存在的问题
推:如果推送的客户端机器过多,容易造成推送数据缓慢
拉:如果拉取的客户端机器过多,下载数据会对服务端造成压力过大
3.3、rsync多server端
建立多个备份源,将客户端机器分组,一个备份源备份一组客户端机器,然后再将多个备份源备份到总备份服务端

3.4、异地备份

四、rsync传输模式
4.1、传输模式
1.本地方式
2.远程方式
3.守护进程方式
4.2、本地方式
格式 : rsync [参数] [源文件] [目标位置]
示例 :
[root@rsync ~]# rsync -avz init.sh /tmp/
类似于cp,但是cp是全量复制,每次都提示覆盖,rsync是增量备份,只要文件没有变化就不会再传输,如果有任意改变则传输
4.3、远程传输方式
格式 :
拉取 rsync [参数] [用户名]@[IP]:[源文件远程路径] [本地路径]
推送 rsync [参数] [本地源文件路径] [用户名]@[IP]:[远程目标路径]
示例 :
拉取 [root@web01 ~]# rsync -avz root@rsync:/root/init.sh .
推送 [root@rsync ~]# rsync -avz init.sh root@web01:/root
注意 :
1.当不写用户推送或拉取时,默认使用当前用户连接远端主机同样的用户
2.普通用户也可以推送,只能推送用普通用户有权限的目录下
4.4、守护进程传输模式
4.4.1、为什么使用守护进程模式
1.rsync远程传输时,需要使用系统用户与密码,不安全
2.如果使用普通用户,会出现权限不足的情况
4.4.2、守护进程模式格式
拉取 : rsycn [参数] [用户名]@[IP]::[模块名] [路径]
推送 : rsycn [参数] [本地源文件路径] [用户名]@[IP]::[模块名]
示例 :
拉取
[root@web01 ~]# rsync -avz rsync_backup@rsync::backup ./
推送
[root@web01 ~]# rsync -avz init.sh rsync_backup@rsync::backup
注意 :
1.拉取服务端模块名对应的目录下的文件,拉取的文件可以使任意属主属组
2.推送时,远端模块对应的目录权限一定是rsyncd服务配置的用户
五、rsync守护进程模式设置
5.1、设置前准备
5.1.1、服务端与客户端
| 主机 | 公网IP | 私网IP | 主机名 |
|---|---|---|---|
| 服务端 | 192.168.177.21 | 172.16.1.21 | rsync |
| 客户端 | 192.168.177.7 | 172.16.1.7 | web01 |
5.1.2、安装rsync(服务端和客户端都要安装)
[root@web01 ~]# yum install -y rsync
[root@rsync ~]# yum install -y rsync
5.1.3、关闭防火墙与selinux
1.关闭防火墙
[root@rsync ~]# systemctl stop firewalld
2.关闭selinux
[root@rsync ~]# vim /etc/selinux/config
[root@rsync ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@rsync ~]# setenforce 0
setenforce: SELinux is disabled
5.2、配置服务端
5.2.1、设置配置文件
[root@rsync ~]# vim /etc/rsyncd.conf
[root@rsync ~]# cat /etc/rsyncd.conf
uid = rsync #运行进程的用户
gid = rsync #运行进程的用户组
port = 873 #服务的监听端口
fake super = yes #无需让rsync以root身份运行,保证文件属性的安全机制
use chroot = no #操作那个目录就不允许跳出该目录
max connections = 200 #最大连接数
timeout = 600 #超时时间
ignore errors #忽略错误信息
read only = false #只读,配置成false,文件可读写
list = false #查看模块信息
auth users = rsync_backup #定义虚拟用户(rsync传输时使用的用户)
secrets file = /etc/rsync.passwd #定义虚拟用户的密码文件
log file = /var/log/rsyncd.log #日志文件
#####################################
[backup] #定义模块的名字
comment = welcome to oldboy backup! #注释,备注
path = /backup #定义真实文件目录
5.2.2、创建系统用户
[root@rsync ~]# useradd rsync -s /sbin/nologin -M
5.2.3、创建虚拟用户的密码文件并授权
[root@rsync ~]# echo "rsync_backup:123456">/etc/rsync.passwd
[root@rsync ~]# chmod 600 /etc/rsync.passwd
5.2.4、创建目录并设置目录用户与用户组
[root@rsync ~]# mkdir /backup
[root@rsync ~]# chown -R rsync.rsync /backup/
[root@rsync ~]# ls -dl /backup
drwxr-xr-x. 2 rsync rsync 6 Aug 2 14:41 /backup/
5.2.5、启动服务
[root@rsync ~]# systemctl start rsyncd
[root@rsync ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2021-08-02 14:47:57 CST; 2h 42min ago
Main PID: 1384 (rsync)
CGroup: /system.slice/rsyncd.service
└─1384 /usr/bin/rsync --daemon --no-detach
Aug 02 14:47:57 rsync systemd[1]: Started fast remote file copy program daemon.
Aug 02 14:47:57 rsync rsyncd[1384]: params.c:Parameter() - Ignoring badly forme...rs
Aug 02 14:47:57 rsync rsyncd[1384]: rsyncd version 3.1.2 starting, listening on...73
Aug 02 14:50:01 rsync rsyncd[1391]: params.c:Parameter() - Ignoring badly forme...rs
Aug 02 14:50:01 rsync rsyncd[1391]: connect from nfs (172.16.1.31)
Hint: Some lines were ellipsized, use -l to show in full.
5.3、客户端验证
5.3.1、方式一 : 输入密码的方式
[root@web01 ~]# rsync -avz init.sh rsync_backup@rsync::backup
Password:
sending incremental file list
init.sh
sent 1,517 bytes received 43 bytes 346.67 bytes/sec
total size is 4,544 speedup is 2.91
5.3.2、方式二 : 指定密码文件的方式
# 客户端添加密码文件
[root@web01 ~]# echo '123456' > /etc/rsync.passwd
[root@web01 ~]# chmod 600 /etc/rsync.passwd
[root@web01 ~]# rsync -avz init.sh rsync_backup@rsync::backup --password-file=/etc/rsync.passwd
sending incremental file list
init.sh
sent 1,517 bytes received 43 bytes 3,120.00 bytes/sec
total size is 4,544 speedup is 2.91
5.3.3、方式三 : 配置环境变量的方式
[root@web01 ~]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz init.sh rsync_backup@rsync::backup
sending incremental file list
init.sh
sent 1,517 bytes received 43 bytes 1,040.00 bytes/sec
total size is 4,544 speedup is 2.91
5.4、rsync常见报错
1.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1648)
[Receiver=3.1.2]
原因:模块名字配置错误
2.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1648)
[Receiver=3.1.2]
原因:
1.服务端密码文件不存在(名字写错了/没有创建/配置文件错了)
2.密码文件权限不是600
3.服务端密码文件用户名或密码错误
4.客户端密码输入错误或密码文件内容与服务端不一致
3.报错内容
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host
(113)
rsync error: error in socket IO (code 10) at clientserver.c(125)
[Receiver=3.1.2]
原因:服务端防火墙开启
systemctl stop firewalld(关闭防火墙)
4.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::/backup ./backup
ERROR: The remote path must start with a module name not a /rsync error: error starting client-server protocol (code 5) at main.c(1648)
[Receiver=3.1.2]
原因:“::”守护进程模式双冒号后面为模块名,不能使用目录
5.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
sending incremental file list
rsync: failed to write xattr user.rsync.%stat for "backup" (in backup):
Permission denied (13)
rsync: failed to write xattr user.rsync.%stat for "backup/file1" (in
backup): Permission denied (13)
backup/
sent 215 bytes received 1,099 bytes 2,628.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors)
(code 23) at main.c(1178) [sender=3.1.2]
原因:服务端推送文件的目录权限不足
6.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): Connection refused
(111)
rsync error: error in socket IO (code 10) at clientserver.c(125)
[sender=3.1.2]
原因:服务端rsyncd服务没有启动
7.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1648)
[sender=3.1.2]
原因:服务端模块对应的目录不存在
8.报错内容:
[root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data
Password:
sending incremental file list
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission
denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission
denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission
denied (13)
rsync: recv_generator: failed to stat "11_class.xlsx" (in data): Permission
denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission
denied (13)
sent 81 bytes received 476 bytes 222.80 bytes/sec
total size is 12,437 speedup is 22.33
rsync error: some files/attrs were not transferred (see previous errors)
(code 23) at main.c(1178) [sender=3.1.2]
# 原因:selinux没有关闭 # 关闭selinux后一定要reboot重启机器
5.5、rsync命令参数
-a #归档模式传输, 等于-tropgDl -t -r -o -p -g -D -l
-v #详细模式输出, 打印速率, 文件数量等
-z #传输时进行压缩以提升效率
-r #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t #保持文件时间信息
-o #保持文件属主信息
-p #保持文件权限
-g #保持文件属组信息
-l #保留软连接
-P #显示同步的过程及传输时的进度等信息
-D #保持设备文件信息
-L #保留软连接指向的目标文件
-e #使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--bwlimit=100 #限速传输
--partial #断点续传
--delete #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件
5.5.1、排除参数 --exclude --exclude-from
# 推送当前目录下除了dir10以外的所有文件
[root@web01 ~]# rsync -avz ./* rsync_backup@rsync::backup --exclude=dir10
# 排除文件里指定的文件
[root@web01 ~]# rsync -avz ./* rsync_backup@rsync::backup --exclude-from 1.txt
5.5.2、限速参数 --bwlimit=100(默认单位为M)
# 指定速度每秒1M
[root@web01 ~]# rsync -avzP --bwlimit 1 ./1.txtrsync_backup@rsync::backup
5.5.3、数据一致 --delete(无差异同步)
拉:数据与服务端一致,以服务端的数据为准
推:数据与客户端一致,以客户端的数据为准
数据始终与数据来源的一端保持一致
# 拉取数据时与服务端一致
[root@web01 ~]# rsync -avz rsync_backup@rsync::backup ./ --delete
五、Rsync备份案例
1.准备服务器
| 主机名 | 外网IP | 内网IP |
| web01 | 10.0.0.7 | 172.16.1.7 |
| backup | 10.0.0.41 | 172.16.1.41 |
需求:
客户端:
1.客户端提前准备存放的备份的?录,?录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2.客户端在本地打包备份(系统配置?件、应?配置等)拷??/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进?推送?备份服务器
4.客户端每天凌晨1点定时执?该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空
服务端需求:
1.服务端部署rsync,?于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个?的备份数据,其余的全部删除
2.客户端
1)创建备份目录
[root@web01 ~]# hostname
web01
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7
[root@web01 ~]# date +%F
2020-02-13
[root@web01 ~]# mkdir /backup/`hostname`_`hostname -I | awk '{print$2}'`_`date +%F` -p
[root@web01 ~]# mkdir /backup/$(hostname)_$(hostname -I | awk '{print$2}')_$(date +%F) -p
[root@web01 ~]# cd /backup/
[root@web01 backup]# ll
total 0
drwxr-xr-x 2 root root 6 Feb 13 11:35 web01_172.16.1.7_2020-02-13
2)打包文件并放到指定目录下
[root@web01 backup]# tar zcf /backup/`hostname`_`hostname -I | awk '{print$2}'`_`date +%F`/file2.tar.gz /etc/passwd
3)推送文件
[root@web01 backup]# rsync -avz /backup/web01_172.16.1.7_2020-02-13rsync_backup@172.16.1.41::backup
4)写成脚本并优化
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.推送文件
export RSYNC_PASSWORD=123
rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup
5)客户端每天凌晨1点定时执行该脚本
[root@web01 backup]# crontab -e (添加定时任务) -l(查看定时任务)
#每天凌晨1点执行脚本
0 1 * * * /bin/bash /scripts/client.sh
6)保留七天的数据
#创建一个月数据
[root@web01 backup]# for i in {1..30};do date -s 2020/02/$i;sh/scripts/client.sh;done
#删除七天前数据
[root@web01 backup]# find /backup/ -type d -mtime +7 | xargs rm -rf
7)最后客户端脚本完善
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.给文件添加验证信息
md5sum $SRC/$DEST/file.tar.gz > $SRC/$DEST/flag.txt
#5.推送文件
export RSYNC_PASSWORD=123
rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup
#6.只保留七天的数据
find $SRC -type d -mtime +7 | xargs rm -rf
8)客户端脚本判断文件是否存在
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
HOST=$(hostname)
ADDR=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F)
DEST=${HOST}_${ADDR}_${DATE}
#2.创建目录
mkdir -p $SRC/$DEST
#3.备份文件
cd / && \
[ -f $SRC/$DEST/sys.tar.gz ] || tar czf $SRC/$DEST/sys.tar.gz etc/fstabetc/passwd && \
#4.使用md5sum做标记
[ -f $SRC/$DEST/flag_$DATE ] || md5sum $SRC/$DEST/sys.tar.gz > $SRC/$DEST/flag_$DATE
#5.本地推送到备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $SRC/$DEST rsync_backup@172.16.1.41::backup
#6.保留最近七天数据
find $SRC/ -type d -mtime +7|xargs rm -rf
3.服务端
1)服务端脚本
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
DATE=$(date +%F)
#2.验证文件的完整性
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
#3.将验证结果发送给管理员
mail -s "数据验证结果" 1240206455@qq.com < $SRC/result_$DATE
#4.只保留180天数据
find $SRC -type d -mtime +180 | xargs rm -rf
六、Rsync结合inotify实现实时同步
1.安装inotify
[root@web01 backup]# yum install -y inotify-tools
2.命令测试
[root@web01 backup]# inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup/
3.参数详解
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实?件内容
open 打开
create 创建
delete 删除
umount 卸载
4.实时监控同步数据的脚本
1)粗糙版
[root@backup ~]# vim rsync-inotify.sh
#!/bin/bash
dir=/backup
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
cd $dir && rsync -az -R --delete ./* rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
done &
2)精油版
#!/bin/bash
src=/data
des=backup
rsync_passwd_file=/etc/rsync.passwd
ip1=172.16.1.41
user=rsync_backup
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] ||
[[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~'MOVED_TO' ]]
then
rsync -azcR --password-file=${rsync_passwd_file}${INO_FILE} ${user}@${ip1}::${des}
fi
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -azR --delete --password-file=${rsync_passwd_file}$(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
if [ ! -d "$INO_FILE" ]
then
rsync -azcR --password-file=${rsync_passwd_file}$(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
fi
done &
配置邮件
1.配置邮件
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=123@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=123@qq.com
set smtp-auth-password=xxxxxx
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
2.验证能否成功的发送邮件
[root@backup ~]# mkdir /server/scripts -p
[root@backup ~]# cat /server/scripts/check_client_data.sh
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
DATE=$(date +%F)
#1.使用md5进行校验,并保存校验的结果
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
#2.将保存的结果文件发送给管理员
mail -s "Rsync Backup $DATE" 572891887@qq.com <$SRC/result_$DATE

浙公网安备 33010602011771号