跳到主要内容

故障转移

问题

数据库主从架构中,主库宕机后如何自动切换到从库?如何防止脑裂?MHA 和 Orchestrator 怎么选?

答案

故障转移流程

MHA(Master High Availability)

MHA 是最经典的 MySQL 高可用方案:

切换过程

  1. MHA Manager 检测到 Master 不可用
  2. 登录 Master 尝试保存 binlog(如果还能访问)
  3. 选择 relay log 最新的 Slave 为新 Master
  4. 将差异 binlog 应用到新 Master
  5. 其他 Slave 切换到新 Master
  6. 通知应用/VIP 漂移

MHA 的局限

  • Manager 是单点(需要额外做 HA)
  • 一次性工具,切换后 Manager 进程退出
  • 不支持多机房

Orchestrator

GitHub 开源的 MySQL 高可用工具,比 MHA 功能更强大:

特性MHAOrchestrator
拓扑管理Web UI 可视化
故障检测心跳检测多路径检测
切换模式自动自动 + 手动
持续运行切换后退出持续运行
GTID 支持有限完善

脑裂问题

脑裂(Split Brain):网络分区导致两个节点同时认为自己是主库,都接受写入。

防脑裂措施

措施说明
VIP 漂移只有持有 VIP 的节点才接受写入
Fencing(隔离旧主)切换前先关闭旧主(STONITH: Shoot The Other Node In The Head)
设置 read_only旧主降级为只读
网络隔离iptables 禁止旧主接收写流量
超半数选举MGR/Raft 等协议天然防脑裂

故障转移策略

策略说明RPORTO
自动切换MHA/Orchestrator 自动执行接近 010-30s
手动切换DBA 人工决策执行0分钟级
DNS 切换修改 DNS 指向新主接近 0取决于 TTL
VIP 漂移Keepalived VIP 飘移接近 0秒级
RPO 和 RTO
  • RPO(Recovery Point Objective):可容忍的数据丢失量
  • RTO(Recovery Time Objective):故障恢复时间

常见面试问题

Q1: MySQL 主库宕机后怎么处理?

答案

  1. 检测故障:MHA/Orchestrator 通过心跳检测主库不可用
  2. 选择新主:选择数据最新的从库(relay log 最完整或 GTID 最大)
  3. 数据补全:将其他从库缺少的事务同步过来
  4. 提升新主STOP SLAVE; RESET SLAVE ALL;
  5. 切换从库:其他从库 CHANGE MASTER TO 指向新主
  6. 切流量:VIP/DNS 指向新主
  7. 修复旧主:恢复后作为从库加入集群

Q2: 如何判断应该提升哪个从库?

答案

选主优先级:

  1. GTID 最新:数据最完整的从库
  2. 候选配置:人为指定的候选主库(硬件配置好)
  3. 同机房:优先选同机房的从库(减少延迟)
  4. 排除黑名单:排除延迟大、配置低的从库

Q3: 如何防止脑裂?

答案

  1. Fencing:切换前强制关闭旧主(IPMI 远程关机、iptables 禁写)
  2. VIP 互斥:确保同一时刻只有一个节点持有 VIP
  3. 半同步复制:只有确认从库收到数据后才提交
  4. MGR/Raft:多数派协议天然防脑裂

相关链接