温馨提示×

Java在CentOS上的备份与恢复策略

小樊
44
2025-11-19 20:15:03
栏目: 编程语言

备份范围与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:00rsync 增量同步到远端备份目录;
    • 每日 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"

# 1) 应用目录 tar 归档
tar czf "$BACKUP_BASE/app_$DATE.tar.gz" -C "$APP_SRC" . >>"$LOG" 2>&1

# 2) 远端 rsync 增量同步(示例远端为 backup@192.0.2.10:/data/backup/java)
rsync -avz --delete -e ssh "$BACKUP_BASE/" backup@192.0.2.10:/data/backup/java/ >>"$LOG" 2>&1

# 3) 清理本地 7 天前归档
find "$BACKUP_BASE" -maxdepth 1 -name "app_*.tar.gz" -mtime +7 -delete >>"$LOG" 2>&1
  • 示例脚本(MySQL 每日备份)
#!/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"

# 保留 30 天
find "$BACKUP_BASE" -name "db_*.sql.gz" -mtime +30 -delete
  • 定时任务(crontab)
# 应用与日志(每日 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。

恢复流程与演练

  • 标准恢复步骤
    1. 准备与校验:确认目标环境磁盘、网络、依赖版本;校验备份完整性与可用性(如校验和/快照列表)。
    2. 数据库恢复:先停写或切换到维护模式,按时间点选择备份恢复;MySQL 示例:
      gunzip < /backup/mysql/db_2025-11-18.sql.gz | mysql -u"$DB_USER" -p"$DB_PASS"
    3. 应用与配置恢复:停止应用,清理工作目录后解压归档;
      tar xzf /backup/java/app_20251118.tar.gz -C /opt/app
    4. 启动与自检:启动应用,检查端口、日志与健康检查端点;必要时回滚至上一个可用版本。
    5. 验证:执行业务冒烟测试,核对关键数据一致性与最近交易/消息是否恢复。
  • 服务恢复与故障排查要点
    • 使用 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 镜像 作为回滚基线。

0