备份范围与RPO/RTO设定
- 备份范围应覆盖:应用配置与发布包(如 /opt/app、/etc/ 下相关配置)、业务数据(如上传目录、缓存持久化)、外部化配置(如数据库、消息队列、配置中心)、日志与诊断数据(GC日志、heap dump、业务日志)、以及运行环境基线(JDK/系统参数、用户与权限、定时任务、systemd 服务单元)。
- 设定目标:根据业务重要性定义 RPO(最大可容忍数据丢失) 与 RTO(最大可容忍停机时间)。例如:数据库采用每日增量+每周全量,RPO≈24小时;应用包与配置按日发布,RPO≈24小时;日志与诊断数据按小时轮转与归档,便于问题回溯。
- 备份目标与介质:结合成本与可用性,采用本地盘 + 远端存储(NAS/对象存储)的 3-2-1 策略(3份副本、2种介质、1份异地/离线)。
备份策略与工具选型
- 文件系统与发布包:使用 tar 做按日全量归档,配合 rsync 做增量同步到远端;适合快速回滚与迁移。
- 日志管理:优先使用 logrotate 按日轮转、压缩、保留策略(如保留 7–30 天),避免日志无限增长影响备份与恢复。
- 数据库:关系型数据库(如 MySQL)使用 mysqldump 或企业备份工具做定时备份;按日增量、每周全量,保留周期与恢复点目标对齐。
- 加密与去重:如需加密与高效存储,可采用 Restic(支持 AES-256 加密与校验),适合多环境统一备份与云端/异地存储。
- 系统级克隆/镜像:对需要整机快速重建的场景,可用 Mondo Rescue 制作可启动的 ISO 镜像,用于灾难恢复演练与快速重建。
- 自动化与调度:将上述流程脚本化,配合 crontab 定时执行,统一日志与告警。
示例备份方案与脚本
- 方案概览:
- 每日 02:00 对应用目录做 tar.gz 全量归档;
- 每日 03:00 用 rsync 增量同步到远端备份目录;
- 每日 02:30 对数据库做 mysqldump 全量备份;
- 日志由 logrotate 按日轮转并压缩;
- 每周日 01:00 执行 Restic 仓库全量备份;
- 保留策略:本地 7 天、远端 30 天、Restic 快照按周保留 4 周。
- 示例脚本(按日应用归档 + 远端 rsync)
#!/usr/bin/env bash
set -Eeuo pipefail
export LANG=en_US.UTF-8
APP_SRC="/opt/app"
BACKUP_BASE="/backup/java"
DATE=$(date +%Y%m%d)
LOG="$BACKUP_BASE/backup_$DATE.log"
mkdir -p "$BACKUP_BASE"
tar czf "$BACKUP_BASE/app_$DATE.tar.gz" -C "$APP_SRC" . >>"$LOG" 2>&1
rsync -avz --delete -e ssh "$BACKUP_BASE/" backup@192.0.2.10:/data/backup/java/ >>"$LOG" 2>&1
find "$BACKUP_BASE" -maxdepth 1 -name "app_*.tar.gz" -mtime +7 -delete >>"$LOG" 2>&1
#!/usr/bin/env bash
set -Eeuo pipefail
DB_USER="backup"
DB_PASS="YourStrongPass!"
BACKUP_BASE="/backup/mysql"
DATE=$(date +%F)
mkdir -p "$BACKUP_BASE"
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers --databases your_db \
| gzip > "$BACKUP_BASE/db_$DATE.sql.gz"
find "$BACKUP_BASE" -name "db_*.sql.gz" -mtime +30 -delete
# 应用与日志(每日 02:00/03:00)
0 2 * * * /opt/scripts/backup_app.sh
0 3 * * * /opt/scripts/backup_rsync.sh
# MySQL(每日 02:30)
30 2 * * * /opt/scripts/backup_mysql.sh
# 可选:Restic 每周全量(周日 01:00)
0 1 * * 0 /opt/scripts/backup_restic.sh
- 说明:脚本需以具备相应权限的用户运行,远端备份建议使用 SSH 密钥 免密;数据库备份账号应最小权限并限制来源 IP。
恢复流程与演练
- 标准恢复步骤
- 准备与校验:确认目标环境磁盘、网络、依赖版本;校验备份完整性与可用性(如校验和/快照列表)。
- 数据库恢复:先停写或切换到维护模式,按时间点选择备份恢复;MySQL 示例:
gunzip < /backup/mysql/db_2025-11-18.sql.gz | mysql -u"$DB_USER" -p"$DB_PASS"
- 应用与配置恢复:停止应用,清理工作目录后解压归档;
tar xzf /backup/java/app_20251118.tar.gz -C /opt/app
- 启动与自检:启动应用,检查端口、日志与健康检查端点;必要时回滚至上一个可用版本。
- 验证:执行业务冒烟测试,核对关键数据一致性与最近交易/消息是否恢复。
- 服务恢复与故障排查要点
- 使用 systemctl 管理服务:systemctl status/start/stop your-app;查看状态与日志定位启动失败原因。
- 检查 JAVA_HOME / PATH 与版本:echo $JAVA_HOME;java -version;必要时用 alternatives 设置默认 Java。
- 端口冲突排查:ss -tulpen | grep 8080;释放端口或调整配置。
- 诊断工具:top/htop、jstat、jstack、jmap;OutOfMemoryError 时启用 HeapDumpOnOutOfMemoryError 并分析。
- 演练与指标
- 建议每季度进行一次恢复演练,覆盖数据库时间点恢复、应用回滚、日志追溯;
- 记录每次演练的 RTO/RPO 达成情况,持续优化备份频率与保留策略。
安全与运维注意事项
- 权限与凭据:备份脚本与数据库备份账号遵循最小权限;SSH 密钥妥善保管;凭据避免硬编码,使用 Vault/环境变量。
- 加密与合规:传输与静态加密(如 Restic 的 AES-256);敏感配置与备份文件访问控制;合规留痕。
- 存储与保留:监控备份存储容量,执行定期清理与异地/离线副本校验;避免单点。
- 监控与告警:对备份任务执行结果、磁盘空间、远端连通性、最近快照/备份年龄进行监控与告警。
- 版本与环境:记录 JDK/应用/依赖 版本;跨大版本恢复时评估兼容性;必要时保留构建产物与 Docker 镜像 作为回滚基线。