8.2 灾难恢复流程

一、适用范围与目标

  • 适用于 Kubernetes 集群、数据库、存储系统等的灾难恢复场景。
  • 目标:建立标准化的灾难恢复流程,保障业务连续性,降低灾难影响。

二、管理目标

  1. 备份策略完善,备份数据可恢复、可验证
  2. 恢复流程标准化,恢复时间可预期
  3. 容灾架构完善,支持跨区域容灾
  4. 定期演练,验证恢复流程有效性

三、详细规范

etcd 数据恢复

  • 备份策略:定期快照备份(每日/每周),备份文件异地存储
  • 备份工具:etcdctl、Velero、自定义脚本
  • 恢复流程:停止服务 → 恢复快照 → 启动服务 → 健康检查
  • 验证机制:恢复后验证集群状态、数据完整性

跨区域容灾

  • 架构设计:多活/热备架构,关键数据实时同步
  • 数据同步:数据库主从复制、存储快照同步、配置同步
  • 流量切换:DNS 切换、负载均衡切换、应用层切换
  • 容灾演练:定期演练容灾切换流程,记录演练结果

应急演练

  • 演练频率:每季度至少一次完整演练
  • 演练内容:备份恢复、容灾切换、数据验证
  • 演练记录:记录演练过程、发现问题、改进措施
  • 自动化脚本:关键恢复步骤自动化,减少人工错误

四、操作流程

etcd 备份流程

  1. 配置备份任务 → 设置备份频率和存储位置
  2. 执行备份 → 使用 etcdctl 或自动化脚本执行备份
  3. 验证备份 → 验证备份文件完整性和可恢复性
  4. 异地存储 → 备份文件传输到异地存储
  5. 定期检查 → 定期检查备份文件可用性

etcd 恢复流程

  1. 评估影响 → 评估恢复操作的影响范围
  2. 停止服务 → 停止 etcd 服务(如需要)
  3. 恢复快照 → 使用备份快照恢复数据
  4. 启动服务 → 启动 etcd 服务
  5. 健康检查 → 检查集群状态、数据完整性
  6. 验证业务 → 验证业务功能正常
  7. 记录归档 → 记录恢复过程和结果

容灾切换流程

  1. 触发条件 → 检测到主区域故障
  2. 评估影响 → 评估故障影响和切换必要性
  3. 启动切换 → 执行容灾切换流程
  4. 数据同步 → 确保数据同步完成
  5. 流量切换 → 切换流量到容灾区域
  6. 验证业务 → 验证业务功能正常
  7. 记录归档 → 记录切换过程和结果

五、实际案例

案例1:etcd 数据恢复

  • 场景:生产环境 etcd 数据损坏,需要从备份恢复
  • 步骤
    1. 停止 etcd 服务
    2. 使用最新备份快照恢复数据
    3. 启动 etcd 服务
    4. 检查集群健康状态
    5. 验证业务功能正常
  • 结果:30分钟内完成恢复,业务无影响
  • 亮点:备份策略完善,恢复流程标准化

案例2:跨区域容灾切换

  • 场景:主区域发生故障,需要切换到容灾区域
  • 步骤
    1. 检测到主区域故障
    2. 评估影响范围
    3. 启动容灾切换流程
    4. 数据同步完成
    5. 切换流量到容灾区域
    6. 验证业务功能正常
  • 结果:1小时内完成切换,业务恢复正常
  • 亮点:容灾架构完善,切换流程自动化

案例3:定期容灾演练

  • 场景:每季度进行容灾演练
  • 步骤
    1. 制定演练计划
    2. 模拟故障场景
    3. 执行恢复流程
    4. 记录演练过程
    5. 发现问题并改进
  • 结果:发现并修复3个潜在问题
  • 亮点:定期演练,持续改进

六、操作模板

etcd 快照备份脚本

#!/bin/bash
# etcd 快照备份脚本

ETCD_ENDPOINTS="https://etcd-1:2379,https://etcd-2:2379,https://etcd-3:2379"
BACKUP_DIR="/backup/etcd"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/etcd-snapshot-${DATE}.db"

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行备份
ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_FILE} \
  --endpoints=${ETCD_ENDPOINTS} \
  --cacert=/etc/etcd/ssl/ca.pem \
  --cert=/etc/etcd/ssl/etcd.pem \
  --key=/etc/etcd/ssl/etcd-key.pem

# 验证备份
if [ $? -eq 0 ]; then
  echo "备份成功: ${BACKUP_FILE}"
  # 传输到异地存储
  # rsync -avz ${BACKUP_FILE} backup-server:/backup/etcd/
else
  echo "备份失败"
  exit 1
fi

etcd 恢复脚本

#!/bin/bash
# etcd 恢复脚本

BACKUP_FILE=$1
RESTORE_DIR="/var/lib/etcd-restore"

if [ -z "${BACKUP_FILE}" ]; then
  echo "用法: $0 <备份文件路径>"
  exit 1
fi

# 停止 etcd 服务
systemctl stop etcd

# 恢复快照
ETCDCTL_API=3 etcdctl snapshot restore ${BACKUP_FILE} \
  --data-dir=${RESTORE_DIR}

# 更新 etcd 配置
# 修改 etcd.service 配置指向新的数据目录

# 启动 etcd 服务
systemctl start etcd

# 等待服务就绪
sleep 10

# 检查集群健康
ETCDCTL_API=3 etcdctl endpoint health \
  --endpoints=https://etcd-1:2379,https://etcd-2:2379,https://etcd-3:2379

echo "恢复完成"

容灾演练检查清单

# 容灾演练检查清单

## 演练前准备
- [ ] 制定演练计划
- [ ] 通知相关人员
- [ ] 准备演练环境
- [ ] 备份当前数据

## 演练执行
- [ ] 模拟故障场景
- [ ] 执行恢复流程
- [ ] 验证数据完整性
- [ ] 验证业务功能

## 演练后
- [ ] 记录演练过程
- [ ] 发现问题并记录
- [ ] 制定改进措施
- [ ] 更新恢复流程

七、注意事项

  • 备份文件安全:备份文件需异地存储,定期校验可用性
  • 恢复操作审批:恢复操作需有详细记录与审批,避免误操作
  • 容灾演练覆盖:容灾演练需全链路覆盖,包括数据、网络、应用
  • 恢复时间目标:明确 RTO(恢复时间目标)和 RPO(恢复点目标)
  • 定期验证:定期验证备份文件可恢复性,防止备份失效

八、参考资料

  • 《Kubernetes 灾备最佳实践》
  • 《企业级容灾与备份白皮书》
  • 《etcd 运维指南》
  • 团队内部灾备制度