跳转至

数据备份与灾难恢复规范 💾

版本: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/