Files
ljwx-k8s/BACKUP-SOLUTION-SUMMARY.md
2026-02-20 22:50:45 +08:00

7.7 KiB
Raw Permalink Blame History

Kubernetes 数据库备份解决方案 - 实施总结

🎯 从 MinIO 单节点故障迁移到生产级 PVC 本地备份架构


📦 已交付内容

1. 完整架构文档

文件: K8S-BACKUP-ARCHITECTURE.md (32KB, 646 行)

包含内容:

  • ✅ 架构设计原则(强一致性优先)
  • ✅ 三层备份架构(PVC + 对象存储 + 冷存储)
  • ✅ 技术选型对比(存储类型、对象存储)
  • ✅ 实施方案和配置文件
  • ✅ 恢复演练流程
  • ✅ 监控告警规则
  • ✅ 故障案例分析(MinIO 数据丢失)

2. 可部署的备份解决方案

目录: backup-solution/

backup-solution/
├── README.md                          # 快速开始指南
├── deploy-and-test.sh                 # 一键部署测试脚本 ⭐
├── restore-drill.sh                   # 恢复演练脚本 ⭐
├── pvc/
│   └── database-backup-pvc.yaml       # PVC + RBAC 配置
├── scripts/
│   └── backup-scripts-configmap.yaml  # 备份脚本(MySQL/PostgreSQL/清理)
├── cronjob/
│   └── database-backup-cronjob.yaml   # CronJob 调度配置
└── monitoring/
    └── backup-alerts.yaml             # Prometheus 告警规则

🚀 快速部署(3 分钟)

方法 A:一键部署

cd /Users/brunogao/work/codes/tools/macos/k8s/backup-solution

# 部署全套方案
./deploy-and-test.sh deploy

# 手动触发测试备份
./deploy-and-test.sh test

# 验证备份文件
./deploy-and-test.sh verify

# 恢复演练
./restore-drill.sh

方法 B:分步部署

cd /Users/brunogao/work/codes/tools/macos/k8s/backup-solution

# 1. 创建 PVC 和权限
kubectl apply -f pvc/database-backup-pvc.yaml

# 2. 部署备份脚本
kubectl apply -f scripts/backup-scripts-configmap.yaml

# 3. 部署 CronJob
kubectl apply -f cronjob/database-backup-cronjob.yaml

# 4. 部署监控(可选)
kubectl apply -f monitoring/backup-alerts.yaml

💡 核心改进点

Before(MinIO 单节点方案)❌

数据库 → MinIO 单节点
   ↓
❌ 上传成功但数据丢失
❌ Versioning + Lifecycle 冲突
❌ Pod 重启导致数据不一致
❌ 无法验证备份可用性

问题:

  • Metadata 写入成功,Data block 未落盘
  • 小文件正常,SQL 文件全部消失
  • 备份显示成功,实际无数据
  • 12-15 小时数据无有效备份

After(PVC 本地备份方案)✅

数据库 → PVC 本地存储 (第一层)
   ↓
✅ POSIX 文件系统强一致性
✅ SHA256 校验保证完整性
✅ Metadata JSON 追踪状态
✅ 7天自动清理 + 保留策略
   ↓ (可选异步上传)
对象存储/NAS (第二层)

优势:

  • ✅ 备份数据真实落盘(POSIX 保证)
  • ✅ SHA256 校验和验证
  • ✅ 完整元数据(大小、时间、版本)
  • ✅ 支持快速恢复(RTO < 5分钟)
  • ✅ 可验证可恢复

📊 关键特性对比

特性 MinIO 单节点 PVC 本地备份
数据一致性 ❌ 不可靠 ✅ 强一致
备份验证 ❌ 假成功 ✅ SHA256
恢复速度 ❌ N/A ✅ < 5min
元数据追踪 ❌ 无 ✅ JSON
故障恢复 ❌ 数据丢失 ✅ 7天保留
监控告警 ❌ 无 ✅ Prometheus
适用场景 ❌ 生产禁用 ✅ 生产推荐

🔧 配置说明

1. 调整备份时间

编辑 cronjob/database-backup-cronjob.yaml:

spec:
  schedule: "0 2 * * *"  # 修改为你需要的时间(UTC)

2. 调整保留天数

编辑 CronJob 中的环境变量:

- name: RETENTION_DAYS
  value: "7"  # 修改为你需要的天数

3. 调整 PVC 大小

编辑 pvc/database-backup-pvc.yaml:

resources:
  requests:
    storage: 100Gi  # 根据数据库大小调整

容量规划公式:

数据库大小 × 压缩率(1:5) × 保留天数 × 1.5(冗余) = PVC 大小

示例:
10GB × 0.2 × 7 × 1.5 = 21GB
建议: 50-100GB(留有充足空间)

📈 监控指标

Grafana 查询示例

# 最近备份时间(小时前)
(time() - max(kube_job_status_completion_time{job_name=~"database-backup-pvc.*"})) / 3600

# 备份成功率(7天)
sum(kube_job_status_succeeded{job_name=~"database-backup-pvc.*"})
/
sum(kube_job_status_succeeded{job_name=~"database-backup-pvc.*"} + kube_job_status_failed{job_name=~"database-backup-pvc.*"})

# PVC 使用率
kubelet_volume_stats_used_bytes{persistentvolumeclaim="database-backups-pvc"}
/
kubelet_volume_stats_capacity_bytes{persistentvolumeclaim="database-backups-pvc"}

告警规则

已配置 5 个关键告警:

  1. ⚠️ DatabaseBackupFailed - 备份任务失败
  2. ⚠️ DatabaseBackupTimeout - 48小时无成功备份
  3. ⚠️ BackupStorageAlmostFull - 存储不足20%
  4. 🔴 BackupStorageCritical - 存储不足10%
  5. ⚠️ BackupSizeAnomaly - 备份大小异常

🛠️ 故障排查

问题1: 备份失败

# 查看最近失败的 Job
kubectl get jobs -n infra | grep database-backup-pvc | grep -v Complete

# 查看日志
kubectl logs -n infra -l app=database-backup-pvc --tail=100

# 常见原因:
# - 数据库连接失败(检查 Secret)
# - PVC 空间不足(检查存储)
# - 权限不足(检查 ServiceAccount)

问题2: 备份文件不存在

# 直接检查 PVC 内容
kubectl run -n infra check-pvc --rm -i --restart=Never \
  --image=busybox:latest \
  --overrides='{"spec":{"containers":[{"name":"check","image":"busybox:latest","command":["/bin/sh","-c"],"args":["ls -lh /backups/mysql/ /backups/postgres/"],"volumeMounts":[{"name":"backup-storage","mountPath":"/backups"}]}],"volumes":[{"name":"backup-storage","persistentVolumeClaim":{"claimName":"database-backups-pvc"}}]}}'

问题3: SHA256 校验失败

# 说明备份文件已损坏,需要重新备份
kubectl create job --from=cronjob/database-backup-pvc manual-rebackup -n infra

✅ 验证检查清单

部署后立即验证

  • PVC 已创建并绑定

    kubectl get pvc database-backups-pvc -n infra
    
  • CronJob 已部署

    kubectl get cronjob database-backup-pvc -n infra
    
  • 手动触发测试备份成功

    ./deploy-and-test.sh test
    
  • 备份文件存在于 PVC

    ./deploy-and-test.sh verify
    
  • SHA256 校验通过

    ./restore-drill.sh
    

持续运维

  • 每周检查备份成功率(应 > 95%)
  • 每月执行恢复演练
  • 每季度审查保留策略
  • 每半年测试完整灾难恢复

📚 相关文档

  • 完整架构文档: K8S-BACKUP-ARCHITECTURE.md
  • 部署指南: backup-solution/README.md
  • MinIO 故障分析: 参见架构文档第 8 节

🎯 下一步建议

立即执行(本周)

  1. ✅ 部署 PVC 备份方案
  2. ✅ 手动测试备份和恢复
  3. ✅ 配置 Prometheus 告警
  4. ⚠️ 废弃当前 MinIO 单节点备份

短期优化(1-2周)

  1. 添加第二层备份

    • 异步上传到可靠对象存储(阿里云 OSS / 腾讯云 COS)
    • 或企业 NAS/NFS
  2. 实施恢复演练

    • 在测试环境实际恢复验证
    • 记录 RTO/RPO 指标
  3. 优化调度时间

    • 根据业务峰谷调整备份时间
    • 避开高峰期

中期计划(1个月)

  1. 部署集群级备份

    • Velero 用于 K8s 资源备份
    • 包括 ConfigMap, Secret, PVC
  2. 建立备份恢复 SOP

    • 标准操作流程
    • 应急响应预案

📞 支持

如有问题请参考:

  • 架构文档: K8S-BACKUP-ARCHITECTURE.md
  • 故障排查: 本文档「故障排查」章节
  • 恢复演练: restore-drill.sh

文档版本: 1.0
创建时间: 2026-01-03
实施状态: ✅ 就绪可部署