灾备切换演练
问题
公司要求每季度进行一次灾备切换演练,如何设计和执行?
答案
灾备核心指标
| 指标 | 含义 | 典型目标 |
|---|---|---|
| RTO | 恢复时间目标(从故障到恢复) | < 30 分钟 |
| RPO | 恢复点目标(最多丢多少数据) | < 5 分钟 |
灾备架构层级
| 等级 | 方案 | RTO | RPO | 成本 |
|---|---|---|---|---|
| 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 | 外部依赖不通 | 提前配置好 |