🔄 第33课:灾难恢复
核心概念
灾难恢复:当最坏的情况发生
灾难恢复在重大故障或灾难后恢复业务运行。关键是定义RTO和RPO,并验证恢复方案可行。
DR核心概念
RTO(Recovery Time Objective) — 恢复时间目标
"系统必须在X小时内恢复"
RPO(Recovery Point Objective) — 恢复点目标
"最多丢失X小时的数据"
DR策略:
├── Active-Active:双活,RTO≈0,成本最高
├── Active-Passive:热备,RTO=分钟级,成本中等
├── Warm Standby:温备,RTO=小时级,成本较低
└── Cold Backup:冷备,RTO=天级,成本最低
| 业务级别 | RTO | RPO | 策略 | 成本 |
| 核心交易 | 0-15分钟 | 0 | Active-Active多区域 | 5x |
| 关键服务 | 1-4小时 | < 1分钟 | 热备+实时复制 | 3x |
| 重要服务 | 4-24小时 | < 1小时 | 温备+定期备份 | 2x |
| 一般服务 | 1-7天 | < 24小时 | 冷备+日备份 | 1.5x |
命令实操
1. K8s集群备份(Velero) ✅
velero install --provider aws --bucket my-velero-backup \
--backup-location-config region=ap-southeast-1 \
--snapshot-location-config region=ap-southeast-1 --use-node-agent
# 定时备份(每天2点)
velero schedule create daily-backup --schedule "0 2 * * *" \
--include-namespaces production --ttl 720h
# 手动备份
velero backup create manual-backup --include-namespaces production
# 查看备份状态
velero backup get
# 恢复备份
velero restore create --from-backup daily-backup
velero restore get
2. 数据库备份与恢复 ✅
#!/bin/bash
# pg-backup.sh
PG_HOST="${PG_HOST:-localhost}"
S3_BUCKET="s3://my-db-backups"
DATE=$(date +%Y%m%d_%H%M%S)
# 全量逻辑备份
pg_dumpall -h $PG_HOST -U postgres | gzip > /tmp/pg_all_$DATE.sql.gz
aws s3 cp /tmp/pg_all_$DATE.sql.gz $S3_BUCKET/postgresql/
rm -f /tmp/pg_all_$DATE.sql.gz
# 清理30天前备份
aws s3 ls $S3_BUCKET/postgresql/ | while read -r _ _ _ f; do
file_date=$(echo "$f" | grep -oP '\d{8}')
diff=$(( ($(date +%s) - $(date -d "$file_date" +%s)) / 86400 ))
[[ $diff -gt 30 ]] && aws s3 rm $S3_BUCKET/postgresql/$f
done
# 恢复
gunzip -c pg_all_20260519_020000.sql.gz | psql -h $PG_HOST -U postgres
3. DR演练脚本 ✅
#!/bin/bash
# dr-drill.sh
START_TIME=$(date +%s)
LOG="/var/log/dr-drill-$(date +%Y%m%d).log"
log() { echo "[$(date '+%H:%M:%S')] $*" | tee -a "$LOG"; }
log "🚨 DR演练开始"
# 验证备份
velero backup get | grep "Completed" || { log "❌ 无可用备份"; exit 1; }
# 恢复到DR环境
velero restore create dr-drill-restore --from-backup daily-backup
for i in $(seq 1 60); do
STATUS=$(velero restore get dr-drill-restore -o jsonpath='{.status.phase}')
[[ "$STATUS" == "Completed" ]] && break
log "等待恢复... ($i/60) status=$STATUS"
sleep 10
done
RESTORE_TIME=$(( $(date +%s) - START_TIME ))
log "恢复耗时: ${RESTORE_TIME}秒 (RTO目标: < 4小时)"
# 验证服务
for svc in api-server web-app order-service; do
if curl -sf "http://$svc.dr-env.svc/health" > /dev/null 2>&1; then
log "✅ $svc 健康"
else
log "❌ $svc 不可用"
fi
done
log "DR演练完成"
架构图
灾难恢复:当最坏的情况发生架构
┌──────────────────────────────────────┐
│ Region A (Primary) │
│ App(Active) │ DB(R/W) │ Cache │
└──────┬───────────┬────────────────────┘
│ │ 实时复制
┌──────┼───────────▼────────────────────┐
│ │ Region B (DR) │
│ App(Standby) │ DB(R/O) │ Cache │
└──────────────────────────────────────┘
RTO: 4小时 RPO: 0(零丢失)
故障排查
❌ Velero备份失败
velero backup describe --details
kubectl logs -n velero deployment/velero
# 常见:S3权限不足/PV快照不支持/资源过大超时
velero backup create retry --from-schedule daily-backup
💡 DR黄金法则:定期演练(至少每季度)、备份必须加密、RTO/RPO必须验证、文档化恢复流程。
🏆 成就解锁:灾难恢复专家!
掌握Velero备份、数据库备份、DR演练——当灾难发生时你能从容应对
📝 RTO/RPO设计决策
| 系统 | RTO | RPO | 策略 | 月成本 |
| 订单系统 | 15分钟 | 0 | 多活+实时同步 | $$ |
| 用户服务 | 1小时 | <1分钟 | 热备+流复制 | $ |
| 日志平台 | 24小时 | 1小时 | 温备+日备份 | ¢ |
| 内部工具 | 3天 | 24小时 | 冷备+周备份 | ¢ |
💡 DR规划要点:RPO决定备份频率、RTO决定恢复架构、每季度演练验证、备份加密异地存储。
🔧 跨云灾备架构
# Velero跨集群备份恢复
# 集群A(主)
velero backup create daily-backup --include-namespaces production
# 集群B(DR)
velero restore create --from-backup daily-backup
# 数据库跨区域复制
# PostgreSQL流复制
cat > postgres-recovery.conf << 'EOF'
standby_mode = on
primary_conninfo = 'host=primary.db.internal port=5432 user=replicator password=xxx'
restore_command = 'aws s3 cp s3://my-db-backups/wal/%f %p'
EOF
# Redis哨兵模式(自动故障转移)
cat > sentinel.conf << 'EOF'
sentinel monitor mymaster primary.redis.internal 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
EOF
📝 DR演练检查清单
| 检查项 | 验证内容 | 目标 | 实际 |
| 备份可用性 | Velero备份存在且完整 | 100% | ☐ |
| 恢复时间 | 从备份到服务可用 | <RTO | ☐ |
| 数据完整性 | 最新数据可恢复 | <RPO | ☐ |
| 服务健康 | 所有组件正常运行 | 100% | ☐ |
| DNS切换 | 流量路由到DR环境 | <5分钟 | ☐ |
| 监控恢复 | 监控和告警正常 | 100% | ☐ |
💡 DR演练原则:至少每季度一次、记录RTO实际值、每次演练后改进流程、确保关键人员知道如何触发恢复。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。
📝 本课知识图谱
| 知识域 | 核心技能 | 验证方式 |
| 核心概念 | 理解原理和架构 | 能用自己的话解释 |
| 命令实操 | 熟练使用相关工具 | 能独立完成操作 |
| 故障排查 | 定位和解决问题 | 能在模拟故障中恢复 |
| 最佳实践 | 遵循生产级标准 | 能设计可靠方案 |
💡 持续学习:技术领域更新快,关注官方博客、GitHub Release、社区动态,保持知识新鲜度。