Rsync备份案例
服务器网络规划
使用3台服务器主机名分别为web01、backup 、nfs主机信息见下表:
角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名 |
---|---|---|---|
WEB | eth0:10.0.0.7 | eth1:172.16.1.7 | web01 |
NFS | eth0:10.0.0.31 | eth1:172.16.1.31 | nfs |
RSYNC | eth0:10.0.0.41 | eth1:172.16.1.41 | backup |
客户端需求
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个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup
原理图
🦄 客户端配置(nfs)
1.创建一个存放客户端脚本文件的路径
mkdir -p /server/scripts
vim /server/scripts/client_rsync_data.sh
2.编辑客户端脚本(重点)
①定义变量(环境变量,和题目要求创建目录的后缀名)
1)环境变量:简单的说就是系统配置好的变量,全局生效这里如果不定义会在写任务计划执行脚本时不会识别脚本中的变量
1.找到环境变量
echo $PATH
(大写)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
把环境变量复制到脚本中
2)定义后缀名变量
我们看题目中/nfs_172.16.1.31_2018-09-02 要求的是这样的格式.
由三部分组成主机名_IP_时间戳
$()
这个圆符号中,括号里面放命令
${}
这个花括号中,括号里面放变量名
查找本服务器主机名命令是hostname
查找本服务器IP的命令是 ifconfig eth1| awk 'NR==2{print $2}'
查找本服务器时间戳的命令是date +%F
我们把这三个部分组合起来就是 $(hostname)_$(ifconfig eth1| awk 'NR==2{print $2}')_$(date +%F)
把他们写到脚本中就是定义变量表达
变量名首字母一定要大写
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Host=$(hostname)
Addr=$(ifconfig eth1 |awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=$Path/${Host}_${Addr}_${Date}
💗看客户端题目第一题需求💗:
客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
②创建备份目录
用脚本表示:
mkdir -p $Dest
$Dest 就是调用我们上面赋值后的变量名
💗看客户端第二题需求💗:
客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
③拷贝需要备份的文件到备份目录中,并进行打包
我们这里打包是为两个原因:
第一是节约空间
第二个原因我们题目中需要对备份的文件加上校验,我们用md5sum这个命令只能对文件进行校验
那么我们在这里把备份的文件分为两种一种是系统数据(/etc/fstab,/etc/hosts),一种是其他数据(/var/spool/cron).
我们把系统数据打包,打包名称取名为sys.tar.gz,把其他数据打包取名为other.tar.gz
正常命令表示:
cd / (相对路径打包)
tar -zcvf /backup/nfs_172.16.1.31_2020.10.18/sys.tar.gz etc/fstab etc/hosts
tar -zcvf /backup/nfs_172.16.1.31_2020.10.18/other.tar.gz var/spool/cron
命令 选项 打包的路径/打包名称 打包内容
用脚本表示
cd / && \
tar czf $Dest/sys.tar.gz etc/fstab etc/hosts && \
tar czf $Dest/other.tar.gz var/spool/cron
&& 是表示并且
\ 换行符,作用表示我这一行没有写完重启一行继续写
④对打包的文件进行添加标签,并把添加标签产生的随机数输入到新文件中
我们这里给备份文件加标签的工具是md5sum,md5sum只能对文件。
我们这里先做个小实验,让大家更好理解加标签和解标签的过程(对cry.txt这个文件)
把对cry.txt这个文件生产随机数导入到flag.txt,再对flag.txt 校验
md5sum -c flag.txt
我们这里是对备份打包文件进行添加标签(sys.tar.gz,other.tar.gz)
所以要先找到这两个文件再进行校验(这两个打包文件在备份目录下)
正常命令表示:
md5sum /backup/nfs_172.16.1.31_2020.10.18/*.tar.gz > /backup/nfs_172.16.1.31_2020.10.18/flag_时间戳
脚本中备份目录/backup/nfs_172.16.1.31_2020.10.18 =$Dest
脚本表示
md5sum $Dest/*.tar.gz >$Dest/flag_${Date}
💗看客户端第三题需求💗:
客户端最后将备份的数据进行推送至备份服务器
⑤推送备份打包数据到服务端
这里用的就是我们rsync第三种守护进程传输模式,那我们服务器端一定要先提前布置好rsync服务。
用正常命令表示:
rsync -avz /backup/ rsync_backup@172.16.1.41:backup
PASSWORD:(输入密码1)
这里其实推送给服务端的是备份目录(nfs_172.16.1.31_2020.10.18)及备份目录下的信息,所以是/backup/
用脚本表示
RSYNC_PASSWORD=1(非交互登陆)
rsync -avz $Path/ rsync_backup@172.16.1.41:backup
看客户端第五题需求💗:
客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
⑥本地保留最近7天数据
首先我们要知道我们客户端备份的数据都是放在备份目中下的
而备份目录是随着时间戳产生不同的备份目录的,那么我们保留最近7天的数据就是保留最近7天的备份目录。
正常命令表示
find /backup/ -type d -mtime +7|xargs rm -rf
把7天前的备份目录找出来删除就是保留最近7天
脚本表示
find $Path/ -type d -mtime +7 |xargs rm -rf
那我们这里客户端脚本就写完了,整合起来就是如下图:
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Host=$(hostname)
Addr=$(ifconfig eth1 |awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=$Path/${Host}_${Addr}_${Date}
#2创建对应备份目录
mkdir -p $Dest
#3.拷贝需要备份的文件到备份目录中,并进行打包
cd / && \
tar czf $Dest/sys.tar.gz etc/fstab etc/hosts && \
tar czf $Dest/other.tar.gz var/spool/cron
#4.添加标签
md5sum $Dest/*.tar.gz > $Dest/flag_${Date}
#5.推送备份数据到服务端
export RSYNC_PASSWORD=1
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
#6.保留最近7天数据
find $Path/ -type d -mtime +7 |xargs rm -rf
3.运行脚本
sh /server/scripts/client_rsync_data.sh
4.查看服务端/backup下是否有我们需要打包的数据
cd /bakcup (rsync服务 backup模块对应备份目录路径就是/backup)
ls 查看
🦄服务端配置(backup)
1.部署邮件服务
①安装邮件服务
yum -y install mailx
②配置邮件服务配置文件
[root@backup backup]# rpm -qc mailx 查询mailx服务配置文件路径
/etc/mail.rc
[root@backup backup]# vim /etc/mail.rc 编辑配置文件
进入配置文件再末行进行配置
set from=476764695@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=476764695@qq.com
set smtp-auth-password=#客户端授权码(这个就需要qq邮箱找,请看下一步)
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
③配置QQ邮箱设置
1)打开qq邮箱,点击进入设置
2)点击账户向下翻
3)找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 这一行
把红框中前三个服务开启
4)每个服务会进行密保验证,我这里用手机短信方式
5)开启三个服务下面就会出现这个温馨提示,这里的授权码就是我们放在配置文件中的授权码
6)复制授权码到配置文件中
7)重新编辑邮件服务配置文件(末行书写)
④测试邮件能否发送成功
mail -s "测试一下是否能成功" 476764695@qq.com < /etc/hosts
命令 选项 “标题” qq号@
成功!!!!
2.创建一个存放服务端脚本的路径
mkdir -p /server/scripts
3.编写服务端脚本(重点)
cd /server/scripts
vim server_check_data.sh
①定义变量
这里的变量和客户端定义的脚本是一样的,有环境变量和一些路径的变量需要提前定义
变量名首字母一定要大写
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Date=$(date +%F)
②查看flag文件,并对文件进行校验,然后将校验的结果存放到/backup/result_时间戳新文件下
我们再客户端对这个命令也进行了简单的小实验介绍,服务器这里用的命令是 md5sum -c 文件
我们要先把需要检验的文件找出来(用find命令),这个文件就是客户端的那个flag_时间戳
md5sum -c $(find $Path/ -type f -name "flag_${Date}") > $Path/result.txt
③将校验的结果通知给邮件服务器
mail -s "测试一下是否能成功" 476764695@qq.com < $Path/result.txt
④保留6个月的数据副本
find $Path/ -type d -mtime +180 | xargs rm -rf
最后整合在一起的脚本如下:
#1.定义变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Date=$(date +%F)
#2.服务器校验
md5sum -c $(find $Path/ -type f -name "flag_${Date}") > $Path/result.txt
#3.将校验的结果通知给邮件服务器
mail -s "测试一下是否能成功" 476764695@qq.com < $Path/result.txt
#4.保留6个月的数据副本
find $Path/ -type d -mtime +180 | xargs rm -rf
🦄任务计划
crontab -e 编辑任务计划
crontab -l 查看任务计划
我们看客户端第四题需求和服务端需求,客户端每天凌晨1点定时执行该脚本,都是用任务计划完成的。
我们这里为了实验效果能够看见我们设置客户端每隔一分钟执行一次客户端脚本,服务端每隔两分钟执行一次服务端脚本
客户端任务计划配置
crontab -e
*/1 * * * * /bin/bash /server/scripts/client_rsync_data.sh &>/dev/null
服务端任务计划配置
crontab -e
*/2 * * * * /bin/bash /server/scripts/server_check_data.sh &>/dev/null
配置好我们只需要等待一会,我们的邮箱就会收到邮件
🦄扩展另一台节点(web01)
1.我们通过链接克隆,克隆一台web01打开
在web上创建一个存放脚本的路径
mkdir -p /server/scripts
2.用rsync第二种远程传输模式将nfs虚拟机客户端脚本传输到web01上
在nfs虚拟机上推送/server/scripts/client_rsync_data.sh 到 web的/server/scripts/下
rsync -avz /server/scripts/client_rsync_data.sh root@172.16.1.7:/server/scripts
3.配置任务计划
在web01上配置任务计划
crontab -e
*/1 * * * * /bin/bash /server/scripts/client_rsync_data.sh &>/dev/null
4. 等等。。。。
成功!!
🦄优化脚本
一个好的脚本要使用在尽可能多的环境下 所以我们现在有的时候我们的脚本在有的步骤不完美,例如创建备份目录
如果已经存在我们就不要再次去执行这一步,所以这里会用到if语句,避免已经拥有的文件或者目录再次执行创建操作。
流程图
格式
最后完善脚本
客户端脚本
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Path=/backup
Host=$(hostname)
Addr=$(ifconfig eth1 |awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=$Path/${Host}_${Addr}_${Date}
#2创建对应备份目录
[ -d $Dest ] || mkdir -p $Dest
#3.拷贝需要备份的文件到备份目录中,并进行打包
cd / && \
[ -f $Dest/sys.tar.gz ] ||tar czf $Dest/sys.tar.gz etc/fstab etc/hosts && \
[ -f $Dest/other.tar.gz ] || tar czf $Dest/other.tar.gz var/spool/cron
#4.添加标签
[ -f $Dest/flag_${Date}] || md5sum $Dest/*.tar.gz > $Dest/flag_${Date}
#5.推送备份数据到服务端
export RSYNC_PASSWORD=1
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
#6.保留最近7天数据
find $Path/ -type d -mtime +7 |xargs rm -rf