Linux - 全网备份项目

11.全网备份项目

0.建议先看这篇博客,搭建基础的环境

https://blog.csdn.net/qq_42267081/article/details/109060337

1.基本备份要求

已知 3 台服务器主机名分别是 web01 backup nfs01,主机信息如下表:

服务器说明外网IP(NAT)内外IP(NAT)主机名称
nginx web服务器10.0.0.7/24172.16.1.7/24web01
NFS 存储服务器10.0.0.31/24172.16.1.31/24nfs01
rsync 备份服务器10.0.0.41/24172.16.1.41/24backup

要求:每天晚上 00 点整在 Web 服务器打包备份系统文件,网站程序目录及访问日志并通过 rsync 命令推送到备份服务器 backup 上备份保留(备份思路可以是先在本地按日期打包,然后再推到备份服务器 backup 上),nfs 存储服务器 同 web 服务器,实际工作中就是全部服务器
具体要求如下:
(1)所有服务器的备份目录必须都为 /backup
(2)要备份的系统配置文件包括但不限于:
a.定时任务服务的配置文件(/var/spool/cron/root)(适合web 和 nfs 服务器)
b.开机自启动的配置文件(/etc/rc.local)(适合web 和 nfs 服务器)
c.日常脚本的目录(/server/scripts)
d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)
e.自己思考下还有什么需要备份呢?
(3)Web 服务器站点目录假定为(/var/html/www)
(4)Web 服务器访问日志路径假定为(/app/logs)
(5)Web服务器保留打包后的 7 天的备份数据即可(本地留存不能多于 7 天,因为太多硬盘会满)
(6)备份服务器上,保留每周一的所有数据副本,其它的要保留6个月的数据副本

6个月以内 周一~周日
6个月以前 周一保留,其他的删除
00点整备份 周一备份的其实是周二的数据
5月5日 周日
5月6日 周一 :00:00备份 ,因该备份的是周日的数据,但是执行命令 date +%F,最终数据显示的是5月6日的,但其实数据是5月5日的
5月7日 周二 :00:00 备份的数据是周一的,但显示的日期是周二的
所以要调整一下时间,date +%F-1day

(7)备份服务器上要按照备份数据服务器的内网 ip 为目录保存备份,备份的文件按照时间名字保存
(8)需要确保备份的数据尽量完整,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果发送给系统管理员邮箱中

验证数据完整性:MD5
发邮件??

2.本项目架构图

在这里插入图片描述

3.实践

客户端要做的事情(NFS服务器 和 Web服务器)

# 创建备份目录
mkdir -p /backup 
# 日常脚本的目录
mkdir -p /server/scripts
# 防火墙配置文件(因为Centos7 没有该文件,所以创建一个,假装有)
mkdir /etc/sysconfig/iptables
# Web服务器创建站点目录
[root@web01 /]# mkdir /var/html/www -p
#Web服务器创建站点日志文件
root@web01 /]# mkdir /app/logs -p
==================================================================

# NFS服务器和Web服务器压缩需要备份的文件
tar -zcvf /backup/system_backup.tar.gz /var/spool/cron/root /etc/rc.local /server/scripts/ /etc/sysconfig/iptables
## 思考:就这样压缩就行了么?有没有什么其他隐患?
(1)检查是否压缩成功?
[root@web01 /backup]# tar -tf system_backup.tar.gz 
var/spool/cron/root
etc/rc.local
server/scripts/
etc/sysconfig/iptables/
(2)上一步看似没问题,检查彻底一点,解压缩看看
[root@web01 /backup]# tar -zxvf system_backup.tar.gz 
var/spool/cron/root
etc/rc.local
server/scripts/
etc/sysconfig/iptables/
(3)解压缩也没问题,但是当我们进入 etc/ 目录的时候,发现有个链接文件
[root@web01 /backup/etc]# ll
lrwxrwxrwx 1 root root 13 11月 19 00:01 rc.local -> rc.d/rc.local
drwxr-xr-x 3 root root 21 11月 21 15:05 sysconfig
(4)rc.local 只是一个链接文件,它的真正的文件我们并没有压缩到这里,
就可能会导致这个文件丢失之后找不回来。所以它的源文件也要备份才对。
重新备份,加上一个参数:h,记得要加在 f 前面
[root@web01 /backup]# tar -zcvhf /backup/system_backup.tar.gz /var/spool/cron/root /etc/rc.local /server/scripts/ /etc/sysconfig/iptables
(5)这次解压缩之后再看,就对了。rc.local 不再是链接文件
[root@web01 /backup]# tar -zxvf system_backup.tar.gz 
[root@web01 /backup]# ll etc/
-rw-r--r-- 1 root root 473 10月  2 01:08 rc.local
drwxr-xr-x 3 root root  21 11月 21 15:10 sysconfig
(6)h:把链接文件指向的源文件压缩保存
(7)这样还不行,我们发现执行这个tar 压缩命令,总是会有报错信息
tar:Removing leading '/' from member names,我们不希望有这样的信息。做法:切换到根目录下,然后用相对路径压缩
[root@web01 /backup/etc]# cd /
[root@web01 /]# tar -zcvhf /backup/system_backup.tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts/ ./etc/sysconfig/iptables
./var/spool/cron/root
./etc/rc.local
./server/scripts/
./etc/sysconfig/iptables/
(8)以后压缩目录是要写在脚本中的,所以也不用参数 v 来显示压缩过程。最终应该是:
[root@web01 /]# cd /
[root@web01 /]# tar -zchf /backup/system_backup.tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts/ ./etc/sysconfig/iptables

=================================================================

# Web服务器压缩 /var/html/www 和 /app/logs文件目录,分开压缩
[root@web01 /]# cd /
[root@web01 /]# tar -zchf /backup/www_backup.tar.gz ./var/html/www
[root@web01 /]# tar -zchf /backup/www_log_backup.tar.gz ./app/logs

==================================================================

# Web 删除七天以前的压缩数据(减少磁盘压力)
(1)发现,如果像上面那样压缩,前一天的数据就会被今天的数据给覆盖,所以压缩文件要增加点内容,压缩文件名加上日期信息
[root@web01 /backup]# tar -zcvhf /backup/system_backup_$(date +%F).tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts/ ./etc/sysconfig/iptables
(2)查找七天以前的数据
[root@web01 /backup]# find /backup/ -type f -mtime  7
(3)删除七天以前的数据
[root@web01 /backup]# find /backup/ -type f -mtime  7 | xargs rm

=============================================================

# 将NFS服务器和Web服务器中的备份数据备份到 备份服务器中
[root@web01 /backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
(1)如果只是上面这样,会有问题,因为如果有多个服务器备份,就分不清是哪台服务器的备份数据了。所以还应该有一个目录,对于的服务器备份到对映的目录下
第一种方法:在传输的时候指定目录,它会自动为我们创建的
[root@web01 /backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup/10.0.0.31 --password-file=/etc/rsync.pass

第二种:客户端创建对应的目录文件,把备份文件放在/backup/10.0.0.7中
(1)客户端中:
[root@web01 /backup]# mkdir -p /backup/10.0.0.7
[root@backup /backup]# mv /backup/*.tar.gz /backup/10.0.0.7
[root@web01 /]# tree /backup/
/backup/
└── 10.0.0.7
    ├── system_backup_2020-11-21.tar.gz
    ├── system_backup_.tar.gz
    ├── system_backup.tar.gz
    ├── www_backup.tar.gz
    └── www_log_backup.tar.gz

1 directory, 5 files
(2)客户端传输文件的命令不变
[root@web01 /]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass

(3)那么两种方法哪个好呢?
第二种更好。因为要保证客户端和服务端的目录结构一致,如果不一直,后面的数据校验将很难进行
================================================================
补充说明:
保留周一数据的方法:
第一种:
1.客户端:在数据名称信息上加上周几的信息(备份数据压缩的时候)
[root@web01 /]# tar -zcvhf /backup/10.0.0.7/system_backup_$(date +%F_week%w).tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts/ ./etc/sysconfig/iptables
[root@web01 /]# tree /backup/
/backup/
└── 10.0.0.7
    └── system_backup_2020-11-21_week6.tar.gz
2.服务器端:找出6个月以前周一的备份数据保留,6个月以前的其他的删除
先找出所有周一的数据
[root@backup /backup/10.0.0.7]# find /backup/ -type f -name "*.week1.tar.gz"
找出6个月以前的不是周一的数据
[root@backup /backup/10.0.0.7]# find /backup/ -type f -mtime +180 ! -name "*.week1.tar.gz"
删除
[root@backup /backup/10.0.0.7]# find /backup/ -type f -mtime +180 ! -name "*.week1.tar.gz" | xargs rm

第二中:在服务端进行检查,将每周一传输的数据进行单独保存(可以写个定时任务,这里就演示了)

===============================================================

如何验证数据的完整性?
md5sum 工具
[root@backup /backup/10.0.0.7]# md5sum /etc/hosts
0e91dad6dc1a1b210963dbb5ca12adbc  /etc/hosts

客户端给/backup目录生成对应的MD5,并保存在文件中,并且该文件也一起备份到备份服务器,然后备份服务器再根据文件中的MD5值,进行校验
## 生成当天数据文件的MD5值
[root@backup /backup/10.0.0.7]# find /backup/ -type f -mtime -1 | xargs md5sum 
## 将MD5值保存到文件中
[root@web01 /]#  find /backup/ -type f -mtime -1 | xargs md5sum  > /backup/10.0.0.7/finger.txt
[root@backup /backup/10.0.0.7]# cat finger.txt 
a34374876569807420bc7e22b300cf33  /backup/10.0.0.7/system_backup_2020-11-21_week6.tar.gz
cdfe2b51cf336c82fe76fa82817e1aab  /backup/finger.txt

## 指纹文件不用生成md5校验码,需要排除它
[root@web01 /backup]#  find /backup/ -type f -mtime -1 ! -name "finger*" | xargs md5sum  > /backup/10.0.0.7/finger.txt
[root@web01 /backup]# cat /backup/10.0.0.7/finger.txt 
a34374876569807420bc7e22b300cf33  /backup/10.0.0.7/system_backup_2020-11-21_week6.tar.gz

## 然后再 备份到 备份服务器
[root@web01 /backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
## 备份服务器中:
[root@backup /backup]# tree /backup/
/backup/
├── 10.0.0.31
└── 10.0.0.7
    ├── finger.txt
    └── system_backup_2020-11-21_week6.tar.gz

2 directories, 2 files

## 根据指纹文件校验数据完整性
[root@backup /backup]# md5sum -c /backup/10.0.0.7finger.txt 
/backup/10.0.0.7/system_backup_2020-11-21_week6.tar.gz: 确定
## 上面不够通用
[root@backup /backup/10.0.0.7]# find /backup/ -type f -name "finger.txt" | xargs md5sum -c




## 验证数据完整性命令
md5sum -c 指纹文件
### 命令原理
1.打开一个指问文件,将信息记录到缓存中
2.根据文件的路径信息,生成MD5数值信息
3.将新生成的MD5数值和原有指纹文件中的数值进行比较
4.如果相同显示结果为ok,如果有一个不同,显示结果failed

==========================================================
如何实现发送邮件(这里就不搭建邮件服务器了,直接用企业邮箱,例如qq 163)
往下看

原理:
在这里插入图片描述
用qq邮箱来演示
登录qq邮箱,点击设置 -> 用户
在这里插入图片描述点击开启IMAP/SMTP服务,记录授权密码
在这里插入图片描述安装邮箱服务

首先检测相关服务是否已安装
[root@ProxyServer ~]# rpm -qa|grep mail
若服务未安,则执行以下命令进行服务安装
[root@ProxyServer ~]# yum install sendmail
s[root@ProxyServer ~]# yum install mailx –y
[root@ProxyServer ~]# yum update libreport-plugin-mailx
[root@ProxyServer ~]# yum -y install sharutils
[root@ProxyServer ~]# yum install mutt

编辑 /etc/mail.rc 文件,再末尾加上如下语句

set from=xxx(你的邮箱账号) smtp=smtp.qq.com    		     
set smtp-auth-user=xxx(你的邮箱账号) smtp-auth-password=(授权码) smtp-auth=login

重新加载
[root@backup /etc]# systemctl restart postfix.service 

发送邮件

echo "邮件发送测试"|mail -s "邮件测试" 邮箱地址 

## 将信息放在一个文件里,利用  <(标准输入重定向) 发送
mail -s "邮件测试" 邮箱地址 < /etc/hosts

在这里插入图片描述
最终:把备份的结果发送到管理员邮箱中:

[root@backup /backup/10.0.0.7]# find /backup/ -type f -name "finger.txt" | xargs md5sum -c &> /temp/check,txt
[root@backup /backup/10.0.0.7]# mail -s "邮件测试" 邮箱地址 < /tmp/check.txt

4.全网备份脚本

客户端脚本

#/bind/bash
Backup_dir="/backup"
IP_info=$(hostname -i)

# create backup dir
mkdir -p $Backup_dir/$IP_info/

cd /

# tar backup data
tar -zchf $Backup_dir/$IP_info/system_backup_$(date +%F_week%w -d -1day).tar.gz ./var/spool/cron/root ./etc/rc.local ./service/scripts/ ./etc/sysconfig/iptables

# del 7day ago data
find $Backup_dir -type f -mtime +7 | xargs rm 2>/dev/null

# create finger file
find $Backup_dir/ -type f -mtime -1 ! -name "finger*" | xargs md5sum > $Backup_dir/$IP_info/finger.txt

# backup push data info
rsync -az $Backup_dir/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password


PS:将编写的脚本放在固定的目录。例如/server/scripts

服务端

#/bin/bash

# del 180 day ago data
find /backup/ -type f -mtime +180 ! -name "*week1.tar.gz" | xargs rm 2>/dev/null

# check backup data
find /backup/ -type f -name "finger.txt" | xargs md5sum -c > /temp/check.txt

# send check mail
mail -s "check info for $(date +%F)" xxxxxxxxxxxx@qq.com < /temp/check.txt

定时任务

客户端:

[root@web01 scripts]# crontab -e
# backup data
0 0 * * * /bin/sh /service/scripts/backup.sh &> /dev/null

服务端

[root@web01 scripts]# crontab -e
# check backup data
0 5 * * * /bin/sh /service/scripts/backup.sh &>/dev/null
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值