一、项目总览

1.内容介绍

本文以 3 台 CentOS 7.9 服务器(Web 服务器、NFS 服务器、备份服务器)为载体,详解如何在全防火墙开启的前提下,搭建一套自动化数据备份平台:每日自动打包 Web 站点、NFS 共享数据及系统关键配置,通过 rsync 增量同步至备份服务器,同时实现旧数据智能清理、备份完整性校验与邮件告警。

2.核心目标

  • 自动备份:Web/NFS 服务器每日 0 点自动打包关键数据(系统配置、网站目录、日志等),通过 rsync 推送到备份服务器;
  • 存储优化:本地保留 7 天备份,备份服务器保留 7 天内所有数据 + 6 个月内每周一数据;
  • 监控告警:备份完成后自动校验完整性,每日 8 点通过邮件发送成功 / 失败报告;
  • 防火墙兼容:仅开放 rsync(873)、SMTPs(465)等必要端口,保障安全性。

3.备份要点

  • 所有服务器统一备份目录:均为/backup,便于标准化管理;
  • Web 服务器需备份内容:
    • 系统配置:定时任务(/var/spool/cron/root)、开机自启脚本(/etc/rc.local)、运维脚本(/server/scripts);
    • 业务数据:网站目录(/www)、访问日志(/var/log/nginx);
    • 本地保留策略:仅保留 7 天备份,避免磁盘占满。
  • NFS 服务器需备份内容:
    • 系统配置:同 Web 服务器(定时任务、开机自启等);
    • 业务数据:共享目录(/nfsfile)、挂载状态日志(/var/log/mount.log)。
  • 备份服务器要求:
    • 按源服务器内网 IP 创建目录(如/backup/192.168.120.131),文件命名包含时间(如2025-08-07_Week04);
    • 保留 7 天内所有数据 + 6 个月内每周一数据(满足合规性与长期归档需求);
    • 每日校验备份完整性,通过邮件推送结果。

4.实施大纲

在这里插入图片描述

5.选择Rsync的原因:增量同步机制

在这里插入图片描述

  • 算法优势:仅传输文件差异块(delta编码),比全量传输快90%

  • 硬链接优化:–link-dest参数创建硬链接,节省存储空间

避坑点:

  • 权限问题:必须设置secrets file权限为600

  • 防火墙:需开放873端口(firewall-cmd --add-port=873/tcp --permanent)

  • 连接限制:配置文件中的max connections需根据服务器性能调整

6.软硬件环境清单

主机名IP地址硬件软件
web01192.168.120.131cpu:1颗2核
内 存:2GB
HDD:20GB
网 络:NAT
VmWare17
Centos7.9
nginx1.20
rsync3.1.2
nfs01192.168.120.132cpu:1颗2核
内 存:2GB
HDD:20GB
网 络:NAT
VmWare17
Centos7.9
nfs
rpcbind
rsync3.1.2
backup192.168.120.133cpu:1颗2核
内 存:2GB
HDD:20GB
网 络:NAT
VmWare17
Centos7.9
mailx12.5
rsync3.1.2

二、项目环境(所有服务器通用步骤)

项目拓扑图

在这里插入图片描述

1. 安装 CentOS 7.9 系统

通过 VmWare 17 创建 3 台虚拟机,配置如下:

  • 内存:2GB,硬盘:20GB,CPU:2 核
  • 镜像:CentOS-7-x86_64-DVD-2207-02.iso
  • 网络模式:NAT(确保三台机器在同一网段)

2.初始化系统(以web1为例,nfs1/backup步骤相同)

(1)关闭 SELinux(重启生效)

SELinux 是 Linux 的安全子系统,默认开启会严格限制文件访问权限,可能导致 rsync 同步、脚本执行失败。

# 永久关闭SELinux
[root@web1 ~]# sed -i '7s/enforcing/disabled/gp' /etc/selinux/config

(2)开启并配置防火墙

所有服务器均开启 firewalld,需按角色开放特定端口,既保障安全又不阻碍备份流程:

# 启动firewalld并设置开机自启  
[root@web1 ~]# systemctl enable --now  firewalld
# 验证防火墙状态(确保显示“active (running)”)  
[root@web1 ~]# systemctl status firewalld
# 开放SSH端口(远程管理必备) 
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-service=ssh
# 允许本地回环地址(服务内部通信)
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-interface=lo
# 重新加载规则(使配置生效) 
[root@web1 ~]# firewall-cmd --reload
# 验证规则(应包含“ssh”和“lo”) 
[root@web1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: 

(3)配置时间服务器同步

多服务器协同工作时,时间不一致会导致定时任务执行偏差(如备份时间不同步),需通过 chrony 同步时间:

[root@web1 ~]# yum install chrony -y
# 启动服务并设置开机自启
[root@web1 ~]# systemctl enable --now chronyd
[root@web1 ~]# vim /etc/chrony.conf 
#配置阿里时间服务器(国内访问速度快,稳定性高)
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony# 重启服务使配置生效
[root@web1 ~]# systemctl  restart chronyd
# 验证同步结果(出现"*"表示成功同步到阿里服务器)
[root@web1 ~]# chronyc sources -v
210 Number of sources = 1.-- Source mode  '^' = server, '=' = peer, '#' = local clock./ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17     1  -1982us[-8372us] +/-   94ms

(4)配置静态 IP

动态 IP 可能导致服务器重启后 IP 变化,破坏 rsync 同步、NFS 挂载等依赖固定 IP 的服务:

主机名IP地址网关DNS
web1192.168.120.131192.168.120.2114.114.114.114
nfs1192.168.120.132192.168.120.2114.114.114.114
backup192.168.120.133192.168.120.2114.114.114.114

在这里插入图片描述

注意!!!别忘了使用以下命令,使配置生效(建议在虚拟机做)

[root@web1 ~]# nmcli connection reload
[root@web1 ~]# nmcli connection up ens32

(5)安装基础工具

安装常用工具:vim(编辑文件)、tree(目录树形展示)、tar(打包)、net-tools(网络工具)、rsync(同步)

[root@web1 ~]# yum install vim  tree tar net-tools rsync -y

(6)替换yum源

CentOS 默认 YUM 源在国内访问较慢,替换为阿里源可加速软件下载:

# 第一步:修改自带yum配置文件,使其失效
[root@web1 ~]# cd /etc/yum.repos.d/
[root@web1 yum.repos.d]# cd ..
[root@web1 etc]# rm -rf yum.repos.d/
[root@web1 etc]# mkdir yum.repos.d
[root@web1 etc]# cd yum.repos.d/
#xftp上传配置文件
[root@web1 yum.repos.d]# ls
Centos-7.repo
[root@web1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@web1 yum.repos.d]# yum makecache
[root@web1 yum.repos.d]# ls
Centos-7.repo  epel.repo

三、服务部署

1.Web服务器部署

(1)防火墙专项配置(开放 Web 和备份端口)

Web 服务器需开放 HTTP 端口(供外部访问网站)和 rsync 端口(向备份服务器推送数据):

[root@web1 ~]# firewall-cmd --get-default-zone
public
# 开放HTTP服务
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-service=http
success
# 开放rsync端口(873端口,向backup推送备份数据)
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
# 重新加载规则
[root@web1 ~]# firewall-cmd --reload
# 验证(应包含“http”和“873/tcp”)
[root@web1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client http mountd sshports: 873/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: 

(2)部署 Nginx Web 服务

[root@web1 ~]# yum install nginx -y > /dev/null && systemctl start nginx
[root@web1 ~]# systemctl status nginxActive: active (running) since 四 2025-08-07 18:24:12 CST; 22s ago
[root@web1 ~]# mkdir -p /www
[root@web1 ~]# cd /www
#xftp上传代码包(模拟实际业务)
[root@web1 www]# ls
sczl
[root@web1 www]# grep -n "/usr/share/nginx/html" /etc/nginx/nginx.conf
42:        root         /usr/share/nginx/html;
62:#        root         /usr/share/nginx/html;
# 定位到"root"配置行(默认第42行),替换为自定义目录
[root@web1 www]# sed -i '42s#/usr/share/nginx/html#/www/sczl#' /etc/nginx/nginx.conf
[root@web1 www]# systemctl enable --now nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@web1 www]# systemctl restart nginx
# 验证网站访问
[root@web1 www]# curl 192.168.120.131
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>FullPage</title>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<link type="text/css" rel="stylesheet" href="css/common.min.css" />
<link type="text/css" rel="stylesheet" href="css/font-awesome.css" />
<link rel="stylesheet" href="css/swiper-3.3.1.min.css">
<link rel="stylesheet" href="css/animate.min.css">
<link rel="stylesheet" href="css/style.css">

2.Nfs服务器部署

(1)防火墙专项配置(开放 NFS 和备份端口)

NFS 服务依赖 rpc-bind(端口 111)、mountd(动态端口)、nfs(端口 2049),需开放相关服务:

[root@nfs1 ~]# firewall-cmd --get-default-zone
public
# 开放rpcbind
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
success
# 开放NFS
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=nfs
success
# 开放mountd
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=mountd
success
# 开放rsync端口
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[root@nfs1 ~]# firewall-cmd --reload
success
[root@nfs1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client mountd nfs rpc-bind sshports: 873/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: 

(2)部署 NFS 服务

[root@nfs1 ~]# yum install rpcbind nfs-utils -y
# 启动服务并设置开机自启,注意启动顺序
[root@nfs1 ~]# systemctl enable --now rpcbind
[root@nfs1 ~]# systemctl enable --now nfs-server
# 创建共享目录并添加测试数据
[root@nfs1 ~]# mkdir -p /nfsfile
[root@nfs1 ~]# echo "张德帅长的真帅!!!" > /nfsfile/zds
[root@nfs1 ~]# chmod -R 777 /nfsfile
[root@nfs1 ~]# cat /nfsfile/zds 
张德帅长的真帅!!!
[root@nfs1 ~]# vim /etc/exports
# 说明:
# /nfsfile:共享目录;192.168.120.0/24:允许访问的网段;
# rw:读写权限;all_squash:将客户端用户映射为匿名用户;sync:同步写入磁盘(数据更安全)
/nfsfile   192.168.120.0/24(rw,all_squash,sync)
[root@nfs1 ~]# systemctl restart rpcbind
[root@nfs1 ~]# systemctl restart nfs-server# 在Web服务器验证NFS挂载(确保共享正常)
[root@web1 ~]# yum install nfs-utils -y
[root@web1 ~]# showmount -e 192.168.120.132
Export list for 192.168.120.132:
/nfsfile 192.168.120.0/24
[root@web1 ~]# mkdir /web_nfs
[root@web1 ~]# mount -t nfs 192.168.120.132:/nfsfile /web_nfs
[root@web1 ~]# ls /web_nfs/
zds
[root@web1 ~]# cat /web_nfs/zds 
张德帅长的真帅!!!

3.backup服务器部署

(1)防火墙专项配置(开放接收备份和邮件端口)

备份服务器需接收 rsync 同步数据(873 端口),并通过 SMTPs 发送邮件(465 端口):

[root@backup ~]# firewall-cmd --get-default-zone 
public
# 开放rsync端口(873,接收web01/nfs01的备份数据)  
[root@backup ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
# 开放SMTPs端口(465,向QQ邮箱发送告警邮件)  
[root@backup ~]# firewall-cmd --permanent --zone=public --add-port=465/tcp
success
[root@backup ~]# firewall-cmd --reload
success
[root@backup ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client sshports: 873/tcp 465/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: 

(2)部署 rsync 服务端(接收备份数据)

rsync 服务端负责接收 Web/NFS 服务器的备份数据,需配置用户、权限、共享目录:

① 配置 rsync 服务
[root@backup ~]# vim /etc/rsyncd.conf
#配置内容
uid = rsync  			# 运行rsync的用户(非root,更安全)  
gid = rsync  			# 运行rsync的组  
use chroot = no  		# 关闭安全限制(简化配置)  
max connections = 200  	# 最大连接数  
timeout = 300  			# 超时时间(秒)  
pid file = /var/run/rsyncd.pid  	# 进程ID文件  
lock file = /var/run/rsync.lock  	# 锁文件  
log file = /var/log/rsyncd.log  	# 日志文件  
fake super = yes  		# 允许非root用户处理文件权限  [backup]  				# 模块名(客户端需指定此名称)  path = /backup  	# 存储备份数据的目录  ignore errors  		# 忽略传输错误  read only = false  	# 允许客户端写入  list = false  		# 禁止客户端查看模块列表  hosts allow = 192.168.88.0/24  		# 仅允许内网服务器访问  hosts deny = 0.0.0.0/32  			# 禁止其他网段  auth users = rsync  				# 认证用户(虚拟用户)  secrets file = /etc/rsync.password  # 密码文件路径  
②初始化 rsync 服务
# 创建rsync用户(无需登录权限)
[root@backup ~]# useradd -M -s /sbin/nologin rsync
# 创建备份目录并修改属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync /backup
# 验证服务 
[root@backup ~]# ps -ef | grep rsync
root       4037      1  0 19:02 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root       4047   3325  0 19:02 pts/1    00:00:00 grep --color=auto rsync# 创建密码文件(格式:用户名:密码)
[root@backup ~]# echo "rsync:zds612612" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# systemctl enable --now rsyncd

四、备份实施

1.脚本开发

(1)配置web1备份脚本

①配置web1客户端本地备份脚本
  • web服务器需要备份的目录:/var/log/nginx ; /www ; /var/spool/cron/root ;/etc/rc.local ; /server/scripts
[root@web1 ~]# mkdir -p /server/scripts
[root@web1 ~]# vim /server/scripts/backup.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:定期备份网络服务器中的数据
#版本:V1.0# 定义日期格式(如2025-08-06_Week03,Week01=周一)
Date=$(date +%F_Week0%w)
# 获取本机IP(需与网卡名匹配,此处为ens32)
Host_IP=$(ifconfig ens32 | awk '/broadcast/{print $2}')
# 本地备份目录
Backup_Dir="/backup/"
# 备份服务器IP
Backup_Server_IP=192.168.120.133# 若本地备份目录不存在则创建(按IP分目录)
[ ! -d $Backup_Dir/$Backup_Server_IP  ] && mkdir -p $Backup_Dir/$Host_IP# 输出备份开始提示
echo ${Date}${Host_IP} "开始备份......"# 打包需备份的文件(分步骤确保完整性)
cd / &&\    # 切换到根目录,避免路径错误
# 打包定时任务配置(/var/spool/cron)
tar cf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     var/spool/cron &&\
# 追加开机自启配置(/etc/rc.d/rc.local)
tar rf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     etc/rc.d/rc.local &&\
# 追加脚本目录(/server/scripts)
tar rf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     server/scripts/ &&\
# 单独打包网站目录(/www)并压缩
tar zcf $Backup_Dir$Host_IP/www_${Date}_tar.gz                  www/ &&\
# 单独打包Nginx日志(/var/log/nginx)并压缩
tar zcf $Backup_Dir$Host_IP/nginx_log_${Date}_tar.gz            var/log/nginx/ &&\# 生成MD5校验值(用于验证备份完整性)
find ${Backup_Dir:-/tmp}   -type   f   -name   "*${Date}_tar.gz*"  |    xargs    md5sum   >    $Backup_Dir/$Host_IP/${Date}.flag# 推送备份到backup服务器(使用rsync协议)
rsync -az $Backup_Dir    rsync@${Backup_Server_IP}::backup    --password-file=/etc/rsync.password# 清理本地7天前的备份(避免磁盘占满)
find ${Backup_Dir:-/tmp}   -type   f   -name   "*.tar.gz"    -a   -name  "*flag*"   -mtime +7 |   xargs  rm -fecho "本地备份成功,备份文件已推送到备份服务器"
②配置 rsync 客户端认证(用于连接备份服务器)

Web 服务器作为 rsync 客户端,需配置密码文件以连接服务端:

[root@web1 ~]# vim /etc/rsync.password
# 客户端建立认证的文件密码如下:
zds612612
# 密码认证文件必须为600
[root@web1 ~]# chmod 600 /etc/rsync.password 
③测试备份脚本
[root@web1 ~]# bash /server/scripts/backup.sh 
2025-08-07_Week04192.168.120.131 开始备份......
本地备份成功,备份文件已推送到备份服务器#backup端操作
[root@backup ~]# cd /backup/
[root@backup backup]# ls
192.168.120.131
[root@backup backup]# tree 192.168.120.131/
192.168.120.131/
├── 2025-08-07_Week04.flag
├── F_week.flag
├── nginx_log_2025-08-07_Week04_tar.gz
├── nginx_log_F_week_tar.gz
├── sys_file_bak_2025-08-07_Week04_tar.gz
├── sys_file_bak_F_week_tar.gz
├── www_2025-08-07_Week04_tar.gz
└── www_F_week_tar.gz0 directories, 8 files

(2)配置nfs1备份脚本

  • nfs1客户端主机需要打包备份的内容:/nfsfile/ ; /var/log/message文件;mount -l 挂载信息
①编写备份脚本
[root@nfs1 ~]# mkdir -p /server/scripts
[root@nfs1 ~]# vim /server/scripts/backup.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:定期备份nfs服务器中的数据
#版本:V1.0Date=$(date +%F_Week0%w)
Host_IP=$(ifconfig ens32 | awk '/broadcast/{print $2}')
Backup_Dir="/backup/"
Backup_Server_IP=192.168.120.133# 记录挂载信息(需备份)
mount -l > /var/log/mount.log[ ! -d $Backup_Dir/$Backup_Server_IP  ] && mkdir -p $Backup_Dir/$Host_IPecho ${Date}${Host_IP} "开始备份......"# 打包NFS相关文件
cd / &&\
tar cf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     var/spool/cron &&\
tar rf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     etc/rc.d/rc.local &&\
tar rf  ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz     server/scripts/ &&\
# 打包NFS共享目录
tar zcf $Backup_Dir$Host_IP/www_${Date}_tar.gz                  nfsfile/ &&\
# 打包挂载日志 
tar zcf $Backup_Dir$Host_IP/nginx_log_${Date}_tar.gz            var/log/mount.log &&\
# 生成MD5校验值 
find ${Backup_Dir:-/tmp}   -type   f   -name   "*${Date}_tar.gz*"  |    xargs    md5sum   >    $Backup_Dir/$Host_IP/${Date}.flag
# 推送备份到backup 
rsync -az $Backup_Dir    rsync@${Backup_Server_IP}::backup    --password-file=/etc/rsync.password
# 清理本地7天前数据
find ${Backup_Dir:-/tmp}   -type   f   -name   "*.tar.gz"    -a   -name  "*flag*"   -mtime +7 |   xargs  rm -fecho "本地备份成功,备份文件已推送到备份服务器"
②配置 rsync 客户端认证(用于连接备份服务器)
[root@nfs1 ~]# echo "zds612612" > /etc/rsync.password
[root@nfs1 ~]# chmod 600 /etc/rsync.password 
[root@nfs1 ~]# ll /etc/rsync.password 
-rw------- 1 root root 10 87 20:15 /etc/rsync.password
③测试备份脚本
[root@nfs1 ~]# bash /server/scripts/backup.sh 
2025-08-07_Week04192.168.120.132 开始备份......
本地备份成功,备份文件已推送到备份服务器#backup端操作
[root@backup backup]# ls
192.168.120.131  192.168.120.132
[root@backup backup]# tree 192.168.120.132
192.168.120.132
├── 2025-08-07_Week04.flag
├── nginx_log_2025-08-07_Week04_tar.gz
├── sys_file_bak_2025-08-07_Week04_tar.gz
└── www_2025-08-07_Week04_tar.gz

2.校验告警

(1)编写旧数据清理脚本(/server/scripts/del_bak_data.sh)

#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:清理旧备份:保留7天内所有数据+180天内每周一数据
#版本:V1.0Backup_Dir="/backup/"# 删除7天前的非周一数据(保留周一)
find ${Backup_Dir:-/tmp}  -type  f  -name  "*.tar.gz*"  !  -name   "*week01*"  -o   -name   "*flag*"  -mtime  +7  |  xargs  rm  -f# 删除180天前的所有数据(包括周一)
find ${Backup_Dir:-/tmp}  -type  f  -name  "*.tar.gz*"    -name   "*flag*"  -mtime  +180  |  xargs  rm  -f

(2)验证数据完整性(/server/scripts/send_mail.sh)

  • backup服务端针对客户端备份时的md5指纹数据,利用MD5命令进行验证,完成数据传输过程完整性验证。
[root@backup backup]# vim /server/scripts/send_mail.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:验证备份完整性
#版本:V1.0Date=$(date +%F_Week0%w)
Backup_Dir="/backup/"
Check_log="/tmp/bak.log_$(date +%F)"  # 验证日志
Admin_Mail=3436804884@qq.com     # 管理员邮箱# 用MD5校验当天备份文件 
find  $Backup_Dir  -type  f  -name  "${Date}.flag" | xargs   md5sum  -c  >>  $Check_log# 发送邮件(若日志为空则提示错误) 
if [ -n "cat $Check_log"  ]
thenmail -s "$Date 备份数据信息"  $Admin_Mail  <  $Check_log
elseecho "$Date  备份数据错误,请检查"  >  $Check_logmail -s  "$Date  备份数据信息"  $Admin_Mail  <  $Check_log
fi# 备份日志
cp $Check_log{,.ori}  &&  > $Check_log

(3)配置邮件服务(基于 QQ 邮箱 SMTP)

[root@backup ~]# yum  install  mailx  -y
[root@backup ~]# mkdir -p /root/.certs
[root@backup ~]# cd  /root/.certs
[root@backup .certs]# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt[root@backup .certs]# vim  /etc/mail.rc
# 最后一行后添加以下内容:
set from=3436804884@qq.com
set smtp=smtps://smtp.qq.com:465         
set smtp-auth-user=3436804884@qq.com
set smtp-auth-password=tf*********jge  
set smtp-auth=login
set nss-config-dir=/root/.certs/     
set ssl-verify=ignore  #测试邮件
[root@backup .certs]# echo  "testmail"  |  mail  -s  "testmail"  3436804884@qq.com

3.定时任务

(1)web服务器配置定时任务(每天 0 点自动备份)

[root@web1 ~]# crontab  -e
* * * * * /bin/sh  /server/scripts/backup.sh > /dev/null  2>&1
[root@web1 ~]# crontab  -l
* * * * * /bin/sh  /server/scripts/backup.sh > /dev/null  2>&1
[root@web1 ~]# systemctl enable --now crond

(2)web服务器配置定时任务(每天 0 点自动备份)

[root@nfs1 ~]# crontab -e
* * * * * /bin/sh  /server/scripts/backup.sh > /dev/null  2>&1
[root@nfs1 ~]# crontab -l
* * * * * /bin/sh  /server/scripts/backup.sh > /dev/null  2>&1
[root@nfs1 ~]# systemctl enable --now crond

(3)backup服务器配置定时任务(清理数据 + 发送邮件)

为了方便测试,我将每天八点发送邮件改为每分钟

[root@backup .certs]# crontab -e
# 每天0点执行清理脚本  
0 0 * * * /bin/sh /server/scripts/del_bak_data.sh >/dev/null 2>&1
# 每分钟执行验证与邮件脚本
* * * * * /bin/sh /server/scripts/send_mail.sh >/dev/null 2>&1

(4)进入QQ邮箱查看

在这里插入图片描述
在这里插入图片描述

五、总结

在独自完成项目时,遇到了不少具体问题。比如 rsync 认证失败,排查后发现是密码文件权限未设为 600,调整权限至 600 后,客户端与备份服务器的同步才恢复正常;编写 web 备份脚本时,不仅变量名输入有误,还误将-type f写成-type -f,导致 find 命令无法正确匹配文件,修正语法后才顺利生成校验值。
另外,打包文件时出现tar: server/scripts:无法 stat的错误,经查是混淆了目录路径,实际脚本目录为/server/scripts却漏写了根路径,补全后解决;防火墙配置也多次出问题,像 mountd 服务未开放端口导致 NFS 挂载失败,通过firewall-cmd添加相关端口规则后,才确保服务间通信正常。最终通过逐一排查和修正,实现了全流程自动化备份与监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95069.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95069.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95069.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring之【Import】

目录 Import注解 源码分析 使用示例 ImportSelector 源码分析 使用示例 DeferredImportSelector 源码分析 使用示例 ImportBeanDefinitionRegistrar 源码分析 使用示例 Import注解 源码分析 处理组件类上的Import注解 将Import引入类对应的BeanDefinition对象添加…

RN项目环境搭建和使用-Mac版本(模拟器启动不起来的排查)

ReactNative&#xff1a; https://github.com/facebook/react-native https://reactnative.cn/docs/getting-started &#xff08;可以先通读一下这个&#xff09; 环境搭建 &#xff08;mac版&#xff09;https://juejin.cn/post/7404860612758765605 搭建之前确认版本&#x…

悬赏任务系统网站兼职赚钱小程序搭建地推抖音视频任务拉新源码功能详解二开

功能详解&#xff08;一&#xff09;登录与注册1、登录&#xff1a;打开系统用户端&#xff0c;输入已注册的手机号&#xff0c;若为首次登录或忘记密码&#xff0c;可通过 “找回密码” 功能&#xff0c;按提示验证身份后重置密码登录。 2、注册&#xff1a;点击 “注册” 按钮…

scikit-learn/sklearn学习|线性回归解读

【1】引言 前序学习进程中&#xff0c;对SVM相关的数学原理进行了探索和推导&#xff0c;相关文章链接包括且不限于&#xff1a; python学智能算法&#xff08;二十六&#xff09;|SVM-拉格朗日函数构造-CSDN博客 python学智能算法&#xff08;二十八&#xff09;|SVM-拉格朗…

音视频学习(五十一):AAC编码器

什么是AAC编码器&#xff1f; 高级音频编码&#xff08;Advanced Audio Coding&#xff0c;简称AAC&#xff09; 是一种有损音频压缩技术&#xff0c;旨在作为MP3的下一代标准而开发。它的主要目标是在比MP3更低的比特率下提供更好的音质&#xff0c;同时具备更强的灵活性和功能…

10-netty基础-手写rpc-定义协议头-02

netty系列文章&#xff1a; 01-netty基础-socket02-netty基础-java四种IO模型03-netty基础-多路复用select、poll、epoll04-netty基础-Reactor三种模型05-netty基础-ByteBuf数据结构06-netty基础-编码解码07-netty基础-自定义编解码器08-netty基础-自定义序列化和反序列化09-n…

计算机毕设缺乏创新点?基于大数据的快手平台用户活跃度分析系统给你思路【程序开发+项目定制】

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二…

01.【面试题】在SpringBoot中如何实现多数据源配置

文章目录 1. 什么是多数据源 1.1 基本概念 1.2 传统单数据源 vs 多数据源 单数据源架构 多数据源架构 2. 为什么需要多数据源 2.1 业务场景需求 2.2 技术优势 3. 多数据源的实现方式 3.1 静态多数据源 3.2 动态多数据源 4. 环境准备 4.1 创建SpringBoot项目 pom.xml依赖配置 4.…

redis主从模型与对象模型

redis淘汰策略 首先我们要明确这里说的淘汰策略是淘汰散列表中的key-value&#xff0c;而不是value中的各个数据结构 过期key中 volatile-lru 从设置了过期时间的键中&#xff0c;移除最近最少使用的键&#xff08;LRU算法&#xff09;。适合需要优先保留高频访问数据的场景…

快速搭建开源网页编辑器(vue+TinyMCE)

文章目录 Tiny MCE 安装方法 1. 安装node.js 2. 创建vue3项目 3. 安装TinyMCE依赖并使用 (1)在component文件夹创建Editor.vue文件 (2)编辑App.vue文件 (3)运行项目 (4)获取并设置API key (5)设置中文菜单 Tiny MCE 安装方法 1. 安装node.js 下载地址:https://nod…

ADK【4】内置前端调用流程

文章目录说明ADK内置前端ADK内置前端开启流程说明 本文学自赋范社区公开课&#xff0c;仅供学习和交流使用&#xff0c;不用作任何商业用途&#xff01; ADK内置前端 ADK作为最新一代Agent开发框架&#xff0c;不仅功能特性非常领先&#xff0c;而且还内置了非常多的工具&am…

LLMs之GPT-5:OpenAI 发布更智能、更快速、更有用的 AI 模型—内置思考能力,赋能人人专家级智能—技术突破、性能评估与安全保障全面解读

LLMs之GPT-5&#xff1a;OpenAI 发布更智能、更快速、更有用的 AI 模型—内置思考能力&#xff0c;赋能人人专家级智能—技术突破、性能评估与安全保障全面解读 导读&#xff1a;2025年8月7日&#xff0c;OpenAI 发布了 GPT-5&#xff0c;这是他们目前最智能的 AI 系统。它在编…

Java 中操作 R 的全面指南

Java 中操作 R 的全面指南 引言 Java作为一种广泛使用的编程语言,具有跨平台、高性能、可扩展等特点。随着大数据和机器学习的兴起,Java在处理和分析复杂数据集方面发挥着越来越重要的作用。R语言,作为一种专门用于统计计算和图形展示的语言,同样在数据分析领域有着举足轻…

数据结构——优先级队列(PriorityQueue):一文解决 Top K 问题!

目录 1.优先级队列 2. 堆的概念 3. 堆的存储方式 4. 堆的创建 4.1 向下调整 4.2 堆的创建 4.3 堆的插入 4.4 堆的删除 5.用堆模拟实现优先级队列 6.常用接口的介绍 6.1 PriorityQueue 的特性 6.2 PriorityQueue 的方法 7. Top K问题 1.优先级队列 队列是一种先进先…

C语言自定义类型深度解析:联合体与枚举

在C语言中&#xff0c;自定义类型为数据组织提供了极大的灵活性。除了常用的结构体&#xff0c;联合体&#xff08;共用体&#xff09;和枚举也是非常重要的自定义类型。本文将结合实例&#xff0c;详细解析联合体和枚举的特性、用法及实际应用场景。 一、联合体&#xff08;Un…

Numpy科学计算与数据分析:Numpy数据分析基础之统计函数应用

Numpy统计函数实战&#xff1a;数据的聚合与分析 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy中用于统计分析的关键函数&#xff0c;如求和(sum)、平均值(mean)、标准差(std)等&#xff0c;能够熟练地在实际数据集中应用这些函数进行数据的聚合与分析。 相关知识…

从引导加载程序到sysfs:Linux设备树的完整解析与驱动绑定机制

摘要本报告旨在为嵌入式Linux开发者详细梳理设备树&#xff08;Device Tree, DT&#xff09;在系统启动中的完整解析流程。报告将从引导加载程序&#xff08;Bootloader&#xff09;如何准备和传递设备树二进制文件&#xff08;DTB&#xff09;开始&#xff0c;逐步深入到内核如…

基于深度学习的污水新冠RNA测序数据分析系统

基于深度学习的污水新冠RNA测序数据分析系统 摘要 本文介绍了一个完整的基于深度学习技术的污水新冠RNA测序数据分析系统&#xff0c;该系统能够从未经处理的污水样本中识别新冠病毒变种、监测病毒动态变化并构建传播网络。我们详细阐述了数据处理流程、深度学习模型架构、训练…

宝塔面板配置Nacos集群

一、环境准备 准备三台及以上的服务器&#xff0c;我这里准备了3台服务器&#xff0c;172.31.5.123&#xff5e;125&#xff1b;分别安装好宝塔面板&#xff0c;软件商店里安装nacos&#xff1b;二、Nacos集群配置 配置数据库连接&#xff1a;​ 进入每台服务器上 Nacos 解压后…

Spring Boot 3.x 全新特性解析

Spring Boot 是企业级 Java 开发中最常用的框架之一。自 Spring Boot 3.x 发布以来&#xff0c;其引入的一系列重大变更与优化&#xff0c;为开发者提供了更现代、更高效的开发体验。本文将重点解析 Spring Boot 3.x 的关键特性及其对项目架构的影响。 一、基于 Jakarta EE 10 …