跳到主要内容

故障转移

问题​

数据库主从架构中,主库宕机后如何自动切换到从库?如何防止脑裂?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:多数派协议天然防脑裂

相关链接​