第 13/30 天(重访·第二季)
引言
在第一季的第 13 天,我们学会了 rsync、tar、duplicity、borg 四个工具的基本用法,知道了「3-2-1 备份原则」这句口号。但真实的生产环境远比「跑一条 rsync 命令」复杂得多——你知道每天的备份到底有没有成功吗?数据库备份和文件备份的时间点一致吗?备份介质真的能读出来吗?机房失火或者勒索病毒把备份盘一起加密时,你还有退路吗?
本篇文章是第二季的重访,我们将从「会跑备份命令」跃升到「构建企业级备份体系」:把 3-2-1 原则落地成可执行的方案(含 3-2-1-1-0 进阶变体)、用 borg/restic 做加密去重备份并打通自动验证、解决数据库一致性备份这个头号难题、最后通过灾难恢复演练证明「备份真的能恢复」。如果你已经会用 rsync 和 tar,本文会告诉你如何让备份体系「看得见、验得了、恢复了」。
一、从口号到落地:3-2-1 原则的企业级实现
「3 份副本、2 种介质、1 份异地」只是起点。企业级备份体系在它之上还要回答三个问题:副本之间隔多久同步?备份数据有没有被加密?备份能不能扛住勒索软件? 由此衍生出两个进阶变体:
- 3-2-1-1-0:在 3-2-1 基础上再加「1 份不可变(immutable)副本」和「0 错误(恢复演练验证过)」——不可变副本是抵御勒索软件的关键,攻击者即使拿到备份机权限也无法删除或篡改存量备份。
- RPO / RTO 指标:RPO(恢复点目标)回答「最多丢多少数据」,RTO(恢复时间目标)回答「多久恢复业务」。备份频率必须由 RPO 倒推,而不是「每天半夜备份一次」。
落地示例——先盘清楚自己的数据资产:
# 盘点服务器上的关键数据目录
du -sh /var/www /var/lib/mysql /home/user /etc /opt/*/data 2>/dev/null | sort -rh
# 输出示例
# 152G /var/lib/mysql
# 38G /var/www
# 9.2G /home/user
# 1.2G /opt/application/data
# 86M /etc
根据 RPO 分级:数据库(RPO=15 分钟)需要高频增量 + 定期全量;Web 静态文件(RPO=24 小时)每日快照即可;/etc 配置(RPO=即时)每次变更后随手备份。没有 RPO/RTO 的备份计划,等于没有计划。
二、borg / restic:去重加密备份实战
第一季介绍了 borg 的基本用法,这里对比 borg 与 restic 两个现代去重工具,重点解决远程备份和多客户端集中管理两大生产场景。
| 特性 | borgbackup | restic |
|---|---|---|
| 去重粒度 | 块级(chunk) | 块级(blob) |
| 加密 | 默认内置(AES-256 + HMAC) | 默认内置(AES-256 + Poly1305) |
| 远程免装服务端 | ❌ 需 borg serve | ✅ 直接写 SSH 路径 |
| 多客户端单仓库 | 弱(单仓库并发写入易锁) | ✅ 强(每客户端独立 snapshot) |
| 云存储后端 | 少(需 rclone 中转) | ✅ S3、B2、Azure、Swift 原生 |
| 单仓库跨平台 | Linux 为主 | ✅ Windows/macOS/Linux |
2.1 restic:一条命令搞定加密远程备份
# 安装
sudo apt update && sudo apt install -y restic
# 初始化仓库(会要求设置密码,务必放入密码管理器)
restic init --repo sftp:backup@192.168.1.100:/srv/backup/restic
# 备份 /var/www(第一次为全量,之后自动增量去重)
restic -r sftp:backup@192.168.1.100:/srv/backup/restic backup /var/www
--exclude '*.log' --exclude 'cache/' --tag web
# 输出示例
# repository 7555a7d5 opened (repository version 2) successfully, password is correct
# created new cache in /root/.cache/restic
# Files: 8412 new, 0 changed, 0 unmodified
# Dirs: 523 new, 0 changed, 0 unmodified
# Added to the repo: 8.471 GiB
# processed 8412 files, 8.471 GiB in 1:21
# snapshot 8f3c2a1e saved
查看与恢复:
# 列出所有快照
restic -r sftp:backup@192.168.1.100:/srv/backup/restic snapshots --latest 5
# 恢复到指定目录(不覆盖现有文件,先试跑 --dry-run)
restic -r sftp:backup@192.168.1.100:/srv/backup/restic restore 8f3c2a1e
--target /tmp/restore-test --include /var/www/index.html --dry-run
# 挂载浏览(FUSE)
mkdir -p /mnt/restic && restic -r sftp:backup@192.168.1.100:/srv/backup/restic mount /mnt/restic
restic 杀招:多个客户端写同一个仓库互不干扰,天然适合「10 台服务器每晚各自备份到一台备份机」的拓扑;
forget --prune命令按保留策略清理旧快照并回收空间。
2.2 borg:本地全量 + 保留策略
borgg 在单机/单仓库场景依然高效,关键是 borg prune 的保留策略要写成「可读的声明」:
export BORG_PASSPHRASE='<your-passphrase>'
# 创建备份(压缩 + 去重)
borg create --stats --compression zstd,8
/backup/borg-repo::server-{hostname}-{now:%Y-%m-%d_%H:%M}
/var/www /etc /home/user
--exclude '/home/user/cache' --exclude '*.tmp'
# 保留策略:保留每日 7 个、每周 4 个、每月 6 个
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6
--prefix='server-{hostname}-' /backup/borg-repo
# 输出示例
# Keeping archive: server-web-2026-08-30_02:00 (1.24 GB)
# Keeping archive: server-web-2026-08-31_02:00 (1.24 GB)
# Keeping archive: server-web-2026-09-01_02:00 (1.24 GB)
# Pruned 4 archives, freed 32.4 GB
关键实践:--compression zstd,8 在速度与压缩率之间取得平衡;prune 的 --prefix 必须与 create 的 archive 命名一致,否则会把别的备份集一起删掉——这是 borg 生产事故高发点。
三、数据库一致性备份:备份体系的头号难题
文件级备份最大的坑:MySQL 在写入中,直接从数据目录复制出来的文件可能是损坏的。数据库备份必须保证一致性,三种做法按可靠性排序:
3.1 方案 A:mysqldump 逻辑备份(最通用)
# 全量逻辑备份:--single-transaction 保证 InnoDB 一致性快照(不锁表)
mysqldump --single-transaction --routines --triggers --events
-u backup_user -p --all-databases
| gzip > /backup/db/full-$(date +%F).sql.gz
# 恢复演练:先建库再导入
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS test_restore"
gunzip -c /backup/db/full-2026-09-01.sql.gz | mysql -u root -p test_restore
配合 binlog 可实现时间点恢复(PITR):
# 先在 my.cnf 开启 binlog(row 格式)
# [mysqld]
# log_bin = /var/log/mysql/mysql-bin
# binlog_format = ROW
# 恢复:全量 + 增量 binlog 到灾难发生前一刻
mysqlbinlog --stop-datetime="2026-09-01 14:30:00" /var/log/mysql/mysql-bin.000012
| mysql -u root -p
3.2 方案 B:LVM 快照一致性备份(本机零锁)
如果 MySQL 数据目录在 LVM 逻辑卷上,快照是无损备份最爱:
# 1. 创建 LVM 快照(秒级完成,业务无感)
lvcreate -L 20G -s -n mysql-snap /dev/vg00/mysql-data
# 2. 挂载快照并复制数据(复制期间业务正常写入,互不影响)
mkdir -p /mnt/snap && mount /dev/vg00/mysql-snap /mnt/snap
rsync -a /mnt/snap/ /backup/mysql-full-$(date +%F)/
# 3. 卸载并删除快照
umount /mnt/snap && lvremove -f /dev/vg00/mysql-snap
3.3 方案 C:restic 备份前的 fsync 保障
数据库自带的热备工具(mariadb-backup、pg_basebackup)会在备份结束时执行 fsync,把备份文件与事务日志对齐。用 restic 备份这些工具的输出,就同时获得了「一致性 + 去重 + 加密」:
# PostgreSQL 基础备份(流复制协议,零锁)
pg_basebackup -h localhost -U backup -D /var/backup/pg-base
-Ft -z -P --wal-method=stream
# 再用 restic 加密去重上传
restic -r sftp:backup@192.168.1.100:/srv/backup/restic backup /var/backup/pg-base --tag pg
铁律:永远不要直接备份数据库裸数据目录(不配合快照/热备工具的话)——你备份的可能是「正在写入中的一半文件」。
四、备份自动化验证:让备份「看得见」
「备份成功」≠「备份可用」。企业级体系必须加上三层验证,并接入监控告警:
4.1 脚本层:备份后立即校验
#!/bin/bash
# /usr/local/bin/verify-backup.sh
set -e
REPO="sftp:backup@192.168.1.100:/srv/backup/restic"
# 1. restic check:校验仓库完整性与加密
restic -r "$REPO" check --read-data-subset=5%
# 2. 试恢复关键文件到临时目录(不污染生产)
restic -r "$REPO" restore latest --target /tmp/verify
--include /var/www/index.html --include /etc/nginx/nginx.conf
# 3. 内容比对:检查关键文件是否与生产一致
diff /etc/nginx/nginx.conf /tmp/verify/etc/nginx/nginx.conf
&& echo "VERIFY_OK $(date)" >> /var/log/backup-verify.log
|| echo "VERIFY_FAILED $(date)" >> /var/log/backup-verify.log
4.2 监控层:失败即告警
把验证结果接入现有监控(Prometheus + Alertmanager 或简单的钉钉/邮件通知):
# cron 每日 03:30 执行备份验证,失败时写入告警文件
30 3 * * * /usr/local/bin/verify-backup.sh 2>&1 | tail -1
# 结合 node_exporter textfile collector 暴露指标
/usr/local/bin/verify-backup.sh --prometheus
> /var/lib/node_exporter/textfile/backup.prom 2>&1
textfile 指标示例:
# HELP backup_last_verify_ok 最近一次备份验证是否通过 (1=ok)
# TYPE backup_last_verify_ok gauge
backup_last_verify_ok 1
backup_last_verify_age_seconds 86340
Grafana 面板加一条「备份验证失败」告警规则:backup_last_verify_ok == 0 持续 5 分钟,就触发告警。备份失败尤其要「及时」发现——等两周后恢复时才发现备份坏了,代价是灾难性的。
五、灾难恢复演练:证明「备份真的能恢复」
备份体系的最后一块拼图是 DR 演练。参考业界最佳实践,每月至少做一次:
- 演练目标:从零环境恢复 Web 服务 + 数据库,RTO 目标 2 小时
- 演练环境:一台全新 Ubuntu 服务器(或容器),不接触生产数据
- 演练脚本:
# 恢复步骤 1:安装基础软件并恢复配置
sudo apt install -y nginx mysql-server
restic -r sftp:backup@192.168.1.100:/srv/backup/restic restore latest
--target / --include /etc/nginx/ --include /etc/mysql/ 2>/dev/null || true
# 恢复步骤 2:恢复数据库
gunzip -c /backup/db/full-$(date +%F).sql.gz | mysql -u root -p
# 恢复步骤 3:恢复 Web 文件
restic -r sftp:backup@192.168.1.100:/srv/backup/restic restore latest
--target / --include /var/www/
# 恢复步骤 4:业务自检
curl -sf http://127.0.0.1/healthz && echo "DR_DRILL_PASS $(date)" >> /var/log/dr-drill.log
- 演练复盘:记录实际 RTO/RPO,与目标对比;找出「恢复手册没写/写错」的步骤,更新文档。演练中发现的问题,比灾难发生时发现的问题便宜一万倍。
总结与下期预告
企业级备份体系不是「更复杂的命令」,而是把备份变成可量化、可验证、可演练的工程:盘清数据资产并定义 RPO/RTO(3-2-1-1-0)、用 borg/restic 做加密去重备份、用 LVM 快照和热备工具解决数据库一致性、用自动校验 + 监控告警让备份失败「立刻可见」、用月度 DR 演练证明恢复能力。记住三个立即可用的要点:数据库永远不要裸复制数据目录、restic check + 试恢复要进 cron、每月至少演练一次完整恢复。
下期预告:第 14 天(重访·第二季)将带来《系统更新与升级管理——生产环境升级策略》,深入 apt 安全补丁策略、do-release-upgrade 的完整升级流程、内核 Livepatch 与升级回滚方案。敬请期待!
系列目录
| 天数 | 主题 | 状态 |
|---|---|---|
| 第 1 天 | Ubuntu 简介与版本选择 | ✅ |
| 第 2 天 | 手把手安装 Ubuntu | ✅ |
| 第 3 天 | Ubuntu 桌面环境初探 | ✅ |
| 第 4 天 | Ubuntu 终端基础 | ✅ |
| 第 5 天 | 用户与权限管理 | ✅ |
| 第 6 天 | 软件包管理 | ✅ |
| 第 7 天 | 文件与文本操作 | ✅ |
| 第 8 天 | 系统服务管理 | ✅ |
| 第 9 天 | 磁盘与文件系统管理 | ✅ |
| 第 10 天 | 网络配置与管理 | ✅ |
| 第 11 天 | 进程管理与监控 | ✅ |
| 第 12 天 | 计划任务与自动化 | ✅ |
| 第 13 天 | 备份与恢复策略 | ✅ |
| 第 14 天 | 系统更新与升级管理 | ✅ |
| 第 15 天 | SSH 远程管理与安全加固 | ✅ |
| 第 16 天 | Web 服务器搭建 | ✅ |
| 第 17 天 | 数据库服务器部署 | ✅ |
| 第 18 天 | Docker 容器化管理 | ✅ |
| 第 19 天 | 文件共享服务 | ✅ |
| 第 20 天 | 监控与告警系统 | ✅ |
| 第 21 天 | 邮件服务器基础 | ✅ |
| 第 22 天 | 系统安全加固 | ✅ |
| 第 23 天 | 性能调优与内核参数 | ✅ |
| 第 24 天 | 虚拟化技术 | ✅ |
| 第 25 天 | 容器编排入门 | ✅ |
| 第 26 天 | 高可用与负载均衡 | ✅ |
| 第 27 天 | Ubuntu 自动部署 | ✅ |
| 第 28 天 | 故障排查实战 | ✅ |
| 第 29 天 | Ubuntu 社区与文档 | ✅ |
| 第 30 天 | 30 天回顾总结 | ✅ |
| 第 23 天(重访) | 性能调优与内核参数——生产环境基准测试与踩坑实战 | ✅ |
| 第 24 天(重访) | KVM 虚拟化高级实战——生产级配置与性能调优 | ✅ |
| 第 25 天(重访) | 容器编排进阶——Docker Compose 生产实践与 Kubernetes 单节点集群实战 | ✅ |
| 第 26 天(重访) | 高可用与负载均衡生产实战——Keepalived + HAProxy 深度调优与故障排查 | ✅ |
| 第 27 天(重访) | 自动部署生产实践——PXE + Preseed + Cloud-init 深度进阶与企业级流水线 | ✅ |
| 第 28 天(重访) | 故障排查实战——深度内核调试、文件系统救援与生产级排障 | ✅ |
| 第 29 天(重访) | Ubuntu 社区与文档——从使用者到贡献者深度实践 | ✅ |
| 第 30 天(重访) | 30 天系列完结篇——学习路线图与成长行动指南 | ✅ |
| 第 1 天(重访·第二季) | Ubuntu 新篇章——2026 年生态全景与版本选择 | ✅ |
| 第 2 天(重访·第二季) | 手把手安装 Ubuntu——2026 年全新安装体验与自动化部署 | ✅ |
| 第 3 天(重访·第二季) | Ubuntu 桌面环境深度探索——GNOME 46 新特性与个性化定制 | ✅ |
| 第 4 天(重访·第二季) | Ubuntu 终端与 Shell 高级技巧——现代 CLI 工具链 | ✅ |
| 第 5 天(重访·第二季) | 用户与权限管理——从 ACL 到 PAM 企业级权限体系 | ✅ |
| 第 6 天(重访·第二季) | 软件包管理——apt、dpkg、snap、flatpak 深入对比 | ✅ |
| 第 7 天(重访·第二季) | 文件与文本操作——现代化 CLI 工具链 | ✅ |
| 第 8 天(重访·第二季) | 系统服务管理——systemd 深度剖析与企业级服务治理 | ✅ |
| 第 9 天(重访·第二季) | 磁盘与文件系统管理——LVM 与存储进阶 | ✅ |
| 第 10 天(重访·第二季) | 网络配置与管理——netplan 高级网络、策略路由与生产级防火墙 | ✅ |
| 第 11 天(重访·第二季) | 进程管理与监控——性能分析与调优 | ✅ |
| 第 12 天(重访·第二季) | 计划任务与自动化——进阶自动化 | ✅ |
| 第 13 天(重访·第二季) | 备份与恢复策略——企业级备份方案 | 🟢 今日 |
| 第 14 天(重访·第二季) | 系统更新与升级管理——生产环境升级策略 | ⏳ |
| 第 15 天(重访·第二季) | SSH 远程管理——安全加固进阶 | ⏳ |
| 第 16 天(重访·第二季) | Web 服务器搭建——高性能 Nginx 调优 | ⏳ |
| 第 17 天(重访·第二季) | 数据库服务器部署——生产级数据库运维 | ⏳ |
| 第 18 天(重访·第二季) | Docker 容器化——生产级容器管理 | ⏳ |
| 第 19 天(重访·第二季) | 文件共享服务——高性能存储方案 | ⏳ |
| 第 20 天(重访·第二季) | 监控与告警系统——可观测性平台 | ⏳ |
| 第 21 天(重访·第二季) | 邮件服务器基础——企业邮件方案 | ⏳ |
| 第 22 天(重访·第二季) | 系统安全加固——深度安全策略 | ⏳ |
| 第 23 天(重访·第二季) | 性能调优与内核参数——生产环境优化 | ⏳ |
| 第 24 天(重访·第二季) | 虚拟化技术——KVM 高级虚拟化 | ⏳ |
| 第 25 天(重访·第二季) | 容器编排入门——Docker Compose 与 K8s | ⏳ |
| 第 26 天(重访·第二季) | 高可用与负载均衡——集群方案 | ⏳ |
| 第 27 天(重访·第二季) | Ubuntu 自动部署——自动化运维 | ⏳ |
| 第 28 天(重访·第二季) | 故障排查实战——深度排障 | ⏳ |
| 第 29 天(重访·第二季) | Ubuntu 社区与文档——开源贡献 | ⏳ |
| 第 30 天(重访·第二季) | 30 天回顾总结——第二季完结篇 | ⏳ |















暂无评论内容