🔄 第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=天级,成本最低
业务级别RTORPO策略成本
核心交易0-15分钟0Active-Active多区域5x
关键服务1-4小时< 1分钟热备+实时复制3x
重要服务4-24小时< 1小时温备+定期备份2x
一般服务1-7天< 24小时冷备+日备份1.5x

命令实操

1. K8s集群备份(Velero) ✅

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演练脚本 ✅

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设计决策

系统RTORPO策略月成本
订单系统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、社区动态,保持知识新鲜度。