架构 – rsync补充
rsync -avz /var root@172.16.1.41: /tmp
## rsync 参数
-a #归档模式传输, 等于-tropgDl -t -r -o -p -g -D -l
-v #详细模式输出, 打印速率, 文件数量等
-z #传输时进行压缩以提高效率
--exclude=PATTERN #指定排除不需要传输的文件
--partial #断点续传
–exclude-from=file #排除参数
--bwlimit=100 #限速传输
#指定排除文件推送内容
[root@web01 ~]# rsync -avz ./* rsync_mm@172.16.1.41::backup --exclude=1.txt
sending incremental file list
txt10
txt5
txt6
txt7
2)–bwlimit=100 限速传输
#创建一个1G的文件
[root@web01 ~]# dd if=/dev/zero of=/root/a.tt bs=100M count=10
#限速1M每秒推送 (默认以 M 为传输单位)
[root@web01 ~]# rsync -avzP 1.txt rsync_mm@172.16.1.41::backup --bwlimit=1
sending incremental file list
1.txt
–delete 数据一致,删除多余的东西
(无差异同步)
#查看客户端数据
[root@web01 ~]# ll
-rw-r--r--. 1 root root 0 Nov 19 09:17 a.txt
-rw-r--r--. 1 root root 0 Nov 19 09:17 b.txt
-rw-r--r--. 1 root root 0 Nov 19 09:17 c.txt
#删除数据
[root@web01 ~]# rm -rf a.txt
[root@web01 ~]# rm -rf b.txt
#执行数据一致同步
[root@web01 ~]# rsync -avz ./ rsync_mm@172.16.1.41::backup --delete
sending incremental file list
deleting txt4
./
sent 332 bytes received 52 bytes 768.00 bytes/sec
total size is 7,746 speedup is 20.17
#查看服务端
[root@backup backup]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 19 09:17 a.txt
-rw-r--r--. 1 root root 0 Nov 19 09:17 b.txt
-rw-r--r--. 1 root root 0 Nov 19 09:17 c.txt
#注意:
拉取时:客户端数据与服务端数据一致,以服务端数据为准(服务端有什么,客户端就有什么)
推送时:服务端数据一客户端数据一致,以客户端数据为准(客户端有什么,服务端就有什么)
二、Rsync备份案例
主机 IP 主机角色
web01 10.0.0.7 rsync客户端
backup 10.0.0.41 rsync服务端
了解需求
客户端需求:
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个月的备份数据,其余的全部删除
客户端
###### 创建备份目录
#尝试获取信息
[root@web01 ~]# mkdir /backup -- 创建目录
[root@web01 ~]# hostname
web01
[root@web01 ~]# hostname -I
10.0.0.7 172.16.1.7
[root@web01 ~]# hostname -I | awk '{print $2}' -- IP地址第二个
172.16.1.7
[root@web01 ~]# date +%F -- 时间
2021-3-27
#结合信息创建目录
[root@web01 ~]# mkdir /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F)
------ 第一种格式
[root@web01 ~]# mkdir /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`
------ 第二种格式
#查看backup里面内容
[root@web01 ~]# ll /backup/
drwxr-xr-x. 2 root root 6 Nov 19 10:00 web01_172.16.1.7_2021-3-27
打包数据
#打包文件
第一种方式
#打包
[root@web01 ~]# tar zcf conf.tar.gz /var/log/maillog
#移动
[root@web01 ~]# mv conf.tar.gz /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F)/
第二种方式
#直接打包到目录
[root@web01 ~]# tar czf /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`/conf.tar.gz /var/log/maillog
推送文件
[root@web01 ~]# rsync -avz /backup/ rsync_mm@172.16.1.41::backup
将以上步骤写成脚本
[root@web01 ~]# vim client.sh
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2.创建表备份目录
mkdir $SRC -p
#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./log/maillog
#4.推送文件
export RSYNC_PASSWORD=123
rsync -az $DIR/ rsync_mm@172.16.1.41::backup
# 5.将脚本加入定时任务
[root@web01 ~]# crontab -e
#每天凌晨1点执行备份脚本
0 1 * * * /bin/bash /root/client.sh
6)只保留七天 的数据
#模拟30天数据
[root@web01 ~]# for i in {1..30};do date -s 2021/03/$i;sh client.sh;done
#删除七天前的数据
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
客服端完整脚本
客户端先判断文件是否存在
[root@web01 ~]# vim client.sh
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2.创建表备份目录
[ -d $SRC ] || mkdir $SRC -p
#3.打包文件
[ -f $SRC/conf.tar.gz ] || cd /var && tar zcf $SRC/conf.tar.gz ./log/maillog
#4.推送文件
export RSYNC_PASSWORD=123
rsync -az $DIR/ rsync_mm@172.16.1.41::backup
#5.删除七天前数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
web客户端脚本
[root@web01 ~]# vim client.sh
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2.创建表备份目录
[ -d $SRC ] || mkdir $SRC -p
#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./log/maillog
#4.生成校验码
md5sum $SRC/conf.tar.gz > $SRC/flag
#5.推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_mm@172.16.1.41::backup
#6.删除七天前数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
服务端
##服务端
1)部署rsync服务端
2)客户端脚本加入生成校验码的操作
校验文件
[root@backup backup]# md5sum -c web01_172.16.1.7_2021-03-27/flag
/backup/web01_172.16.1.7_2021-03-27/conf.tar.gz: OK
[root@backup backup]# md5sum -c /backup/*_$(date +%F)/flag
服务端使用邮件发送消息
1.服务端配置邮件功能vim /etc/mail.rc
1 set from=171554782@qq.com #更改为你的邮箱
2 set smtp=smtps://smtp.qq.com:465
3 set smtp-auth-user=171554782@qq.com #更改为你的邮箱
4 set smtp-auth-password=nvaeranunveledja #更改为你的邮箱密文(查看复制)
5 set ssl-verify=ignore
6 set nss-config-dir=/etc/pki/nssdb/
最正确的邮件发送
set from=1715554782@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1715554782
set smtp-auth-password=mmrqawgxtcejihba
set smtp-auth=login
[root@backup ~]# echo hello word | mail -s " title" 1715554782@qq.com
保存退出;执行命令:输入想发送的内容,
mail -s "what are you doing?" 1710724925@qq.com < 1.txt
2.测试发送邮件
[root@backup ~] mail -s "what are you doing?" 171554782@qq.com <1.txt
服务端脚本
[root@backup ~]# vim client.sh
服务端脚本
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2.校验文件
md5sum -c $DIR/*_$DATE/flag > $DIR/result.txt
#3.将校验结果发送给管理员邮箱
mail -s "$DATE备份文件 校验结果" 1715554782@qq.com < $DIR/result.txt
#4.删除6个月之前的数据
find $DIR/ -type d -mtime +180 | xargs rm -rf
6)将服务端脚本加入定时任务
[root@backup ~]# crontab -e
#服务端每天12点10分将校验备份结果发给管理员
10 12 * * * /bin/bash /root/server.sh &> /dev/null
了解 – Rsync结合inotify
1.安装inotify (inotify-tools软件包)软件包
2.常用参数
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
3.测试命令
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup
4.实时备份脚本编写
1粗略版(推荐,简洁直接)
[root@backup ~]# vim rsyn-inotify.sh
#!/bin/bash
dir=/backup
export RSYNC_PASSWORD=123
/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_mm@172.16.1.41::backup =/etc/rsync.passwd >/dev/null 2>&1
done &