数据备份与灾难恢复规范 💾
版本:1.0
适用范围:所有生产服务器(RHEL 9.x+、Rocky Linux 9、AlmaLinux 9、Debian Stable、Ubuntu LTS)
1. 核心原则与指标
RPO / RTO 目标:
| 业务等级 | RPO(恢复点目标) | RTO(恢复时间目标) |
|---|---|---|
| 关键业务 | ≤ 4 小时 | ≤ 4 小时 |
| 非关键业务 | ≤ 24 小时 | ≤ 24 小时 |
3-2-1 备份法则(强制遵守):
- 3 份数据拷贝(1 份生产 + 2 份备份)
- 2 种不同存储介质(本地磁盘 + 远程服务器或对象存储)
- 1 份异地存储(不同机房或云存储)
恢复演练要求
备份的价值在于能够成功恢复。所有生产环境备份策略必须至少每季度执行一次恢复测试,并记录结果。未经恢复验证的备份不具备保障意义。
2. 备份分类与工具推荐
| 数据类型 | 推荐工具组合 | 备份频率 | 保留周期 |
|---|---|---|---|
系统配置(/etc) |
etckeeper / restic / rsync | 每日 | 90 天 |
应用数据(/opt/data、/data) |
restic / BorgBackup / rsync | 每日全量 + 每小时增量 | 30 天 + 月度归档 12 个月 |
| 数据库(MySQL / PostgreSQL) | xtrabackup / pg_basebackup + WAL 归档 | 每日全量 + 连续 WAL | 30 天全量 + WAL 保留至空间允许 |
| 容器镜像与持久卷 | Podman save / Velero / restic | 每日 / 变更后 | 30 天 |
| 日志文件 | rsync 到集中日志服务器 | 实时 / 每小时 | 90–365 天(视合规要求) |
3. 备份路径规范
结合 naming.md 命名规范,统一使用以下目录与文件命名:
本地暂存目录:/opt/backup/local/
远程备份目标:/opt/backup/remote/ 或对象存储挂载点
文件命名示例:
system-config-20260215.tar.zst
mysql-full-20260215.xbstream.gz
app-data-daily-20260215.restic-snapshot
4. 文件备份实现:restic
restic 是支持加密、去重、多后端存储的现代备份工具,适合通用文件备份场景。
4.1 初始化仓库(仅首次执行)
export RESTIC_REPOSITORY="s3:s3.example.com/bucket/$(hostname)"
export RESTIC_PASSWORD_FILE="/opt/conf/restic-repo-password"
restic init
4.2 每日备份脚本(/opt/scripts/backup-system-daily.sh)
#!/bin/bash
set -euo pipefail
export RESTIC_REPOSITORY="s3:s3.example.com/bucket/$(hostname)"
export RESTIC_PASSWORD_FILE="/opt/conf/restic-repo-password"
LOG="/opt/logs/backup/backup-$(date +%F).log"
mkdir -p /opt/logs/backup
echo "$(date '+%F %T') 开始备份" >> "${LOG}"
restic backup \
--tag daily \
--exclude-caches \
--exclude={/dev,/proc,/sys,/tmp,/run,/mnt,/media,/lost+found,/opt/backup} \
/etc /opt /home /var/log /data \
>> "${LOG}" 2>&1
# 自动清理旧快照(保留策略)
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--prune \
>> "${LOG}" 2>&1
# 验证仓库完整性
restic check >> "${LOG}" 2>&1
echo "$(date '+%F %T') 备份完成" >> "${LOG}"
4.3 配置 systemd timer(替代 cron)
# /etc/systemd/system/restic-backup.service
[Unit]
Description=Restic System Backup
After=network.target
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup-system-daily.sh
StandardOutput=journal
StandardError=journal
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily Restic Backup Timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=600
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
5. 数据库备份:MySQL + xtrabackup
5.1 每日全量备份
xtrabackup \
--backup \
--target-dir=/opt/backup/local/mysql/full-$(date +%F) \
--user=backup \
--password-file=/opt/conf/mysql-backup-passwd \
--parallel=8
5.2 binlog 归档(增量恢复基础)
在 /etc/my.cnf.d/mariadb-server.cnf 中配置:
[mysqld]
log_bin = /var/log/mysql/mysql-bin
binlog_expire_logs_seconds = 604800 # 保留 7 天
6. 数据库备份:PostgreSQL + pg_basebackup
# 全量基础备份
pg_basebackup \
-h localhost \
-U replication \
-D /opt/backup/local/pgsql/base-$(date +%F) \
-Ft -z -Xs -P
# WAL 归档(在 postgresql.conf 中配置)
# archive_mode = on
# archive_command = 'rsync -a %p /opt/backup/local/pgsql/wal/%f'
7. 恢复流程
7.1 验证备份完整性
export RESTIC_REPOSITORY="s3:s3.example.com/bucket/$(hostname)"
export RESTIC_PASSWORD_FILE="/opt/conf/restic-repo-password"
restic check
restic snapshots
7.2 恢复特定文件或目录
# 恢复最新快照中的特定目录
restic restore latest \
--target /mnt/recovery \
--include /etc/nginx
# 恢复到指定快照
restic restore <snapshot-id> \
--target /mnt/recovery
7.3 MySQL 全量恢复
# 第一步:准备(applying redo log)
xtrabackup --prepare \
--target-dir=/opt/backup/local/mysql/full-20260215
# 第二步:停止数据库
systemctl stop mariadb
# 第三步:恢复数据文件
rsync -av --delete \
/opt/backup/local/mysql/full-20260215/ \
/var/lib/mysql/
# 第四步:修正权限并启动
chown -R mysql:mysql /var/lib/mysql
systemctl start mariadb
7.4 PostgreSQL 恢复
systemctl stop postgresql
rsync -av --delete \
/opt/backup/local/pgsql/base-20260215/ \
/var/lib/pgsql/data/
chown -R postgres:postgres /var/lib/pgsql/data
systemctl start postgresql
8. 恢复演练与记录要求
每季度至少执行一次完整恢复测试(生产环境建议在 staging 环境模拟),使用以下模板记录:
测试日期:
恢复对象:(数据类型、文件路径或数据库名)
备份来源:(快照 ID 或备份文件路径)
RTO 实际耗时:
完整性验证结果:(PASS / FAIL + 说明)
发现问题:
改进措施:
操作人员:
9. 检查清单(上线 / 变更必验)
- 备份脚本已部署并测试执行成功(
systemctl status restic-backup) - 备份文件存在且大小合理(
ls -lh /opt/backup/local/) - restic 仓库完整性验证通过(
restic check) - 远程备份目标可达且有写入权限
- 数据库备份策略已配置(全量 + WAL / binlog)
- 本季度恢复演练已完成并记录
- 磁盘空间监控已关联备份目录(
/opt/backup/)