跳到主要内容

灾备切换演练

问题

公司要求每季度进行一次灾备切换演练,如何设计和执行?

答案

灾备核心指标

指标含义典型目标
RTO恢复时间目标(从故障到恢复)< 30 分钟
RPO恢复点目标(最多丢多少数据)< 5 分钟

灾备架构层级

等级方案RTORPO成本
L1数据备份(冷备)小时级小时~天级
L2数据库主从复制分钟级秒级
L3应用层双活秒级接近 0
L4全局负载均衡多活秒级0很高

演练方案设计

演练 Checklist

## 演练前(T-7 天)
- [ ] 确认灾备环境数据同步正常
- [ ] 通知业务方演练时间和影响范围
- [ ] 准备回滚方案
- [ ] 确认监控告警就绪

## 演练前(T-1 小时)
- [ ] 数据库主从延迟 < 1 秒
- [ ] 灾备站点应用健康检查通过
- [ ] DNS TTL 已调低(60 秒)
- [ ] 值班人员就位

## 执行切换
- [ ] 主站数据库设为只读
- [ ] 等待灾备库追平(Seconds_Behind_Master = 0)
- [ ] 灾备库提升为主库
- [ ] DNS / LB 切换到灾备站点
- [ ] 验证核心业务链路

## 验证项
- [ ] 用户登录正常
- [ ] 核心 API 响应正常
- [ ] 数据写入正常
- [ ] 定时任务正常
- [ ] 下游通知正常

## 回切
- [ ] 灾备库→主站库反向复制建立
- [ ] 主站库追平
- [ ] 切回主站
- [ ] 全链路验证

数据库切换脚本

#!/bin/bash
set -euo pipefail

MASTER_HOST="master-db.example.com"
SLAVE_HOST="dr-db.example.com"

echo "=== 灾备切换开始 ==="

# 1. 主库设为只读
echo "[1/5] 主库设为只读..."
mysql -h $MASTER_HOST -e "SET GLOBAL read_only = ON; SET GLOBAL super_read_only = ON;"

# 2. 等待从库追平
echo "[2/5] 等待从库追平..."
while true; do
LAG=$(mysql -h $SLAVE_HOST -N -e "SHOW SLAVE STATUS\G" | \
grep "Seconds_Behind_Master" | awk '{print $2}')
if [ "$LAG" = "0" ]; then
echo " 从库已追平"
break
fi
echo " 当前延迟: ${LAG}s,等待中..."
sleep 1
done

# 3. 从库断开复制并设为可写
echo "[3/5] 提升从库为主库..."
mysql -h $SLAVE_HOST -e "STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF;"

# 4. 切换 DNS
echo "[4/5] 切换 DNS..."
# 调用 DNS API 将 db.example.com 指向 $SLAVE_HOST
# aws route53 change-resource-record-sets ...

# 5. 验证
echo "[5/5] 验证..."
mysql -h $SLAVE_HOST -e "INSERT INTO health_check(ts) VALUES(NOW());"
echo "=== 灾备切换完成 ==="

常见面试问题

Q1: 灾备演练中最常发现的问题有哪些?

答案

问题影响预防措施
灾备环境配置与主站不一致切换后功能异常配置同步自动化
数据同步中断未被发现切换后数据丢失监控复制延迟并告警
DNS 切换后 TTL 缓存未过期部分用户仍访问旧站提前调低 TTL
灾备站点容量不足切换后性能下降灾备与主站同等配置
缺少自动化脚本手动操作耗时且易出错脚本化 + 定期验证
第三方服务白名单缺灾备 IP外部依赖不通提前配置好

相关链接