高可用与故障切换
MySQL 高可用不是部署两个实例就完成了,而是要明确故障检测、主库选举、数据一致性、连接切换、旧主隔离和业务恢复的全过程。
# 1. 学习定位
| 维度 | 内容 |
|---|---|
| 难度层级 | 架构高级 |
| 核心目标 | 先会用,再理解机制,最后能做工程取舍和故障分析 |
| 学习方法 | 带着业务场景看命令、SQL、数据结构、日志和运行时指标 |
# 2. 核心地图
高可用与故障切换
├─ 主从复制
├─ MHA
├─ Orchestrator
├─ InnoDB Cluster
├─ Group Replication
├─ Proxy
├─ VIP
└─ 故障演练
# 3. 小章节深度讲解
下面把核心地图中的每个点拆开讲。每个小节都同时面向开发和运维:开发侧关注怎么设计、怎么写代码、怎么避免错误;运维侧关注怎么监控、怎么定位、怎么恢复。
# 3.1. 主从复制
# 是什么
主从复制 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.2. MHA
# 是什么
MHA 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.3. Orchestrator
# 是什么
Orchestrator 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.4. InnoDB Cluster
# 是什么
InnoDB Cluster 属于 InnoDB 运行时结构。它决定数据页如何缓存、修改如何延迟刷盘、后台线程如何合并和清理,以及内存与磁盘如何协作。
# 开发人员怎么用
开发人员要通过顺序主键、合理索引、避免大字段和控制批量写入来减少页分裂与写放大。不要把报表扫描直接打到核心 OLTP 实例。
# 运维人员怎么看
运维人员要关注 Buffer Pool、脏页比例、checkpoint、IO 延迟、后台线程状态和 InnoDB status。很多抖动不是 SQL 写错,而是后台刷盘或缓存污染。
# 常见风险
常见风险是只调大 Buffer Pool,却不治理大查询和随机写入,最终内存更大但延迟仍然不稳定。
# 3.5. Group Replication
# 是什么
Group Replication 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.6. Proxy
# 是什么
Proxy 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.7. VIP
# 是什么
VIP 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.8. 故障演练
# 是什么
故障演练 属于 MySQL 高可用与复制拓扑。它决定写入如何传播到副本、故障时谁提升为新主、应用如何重新找到写入口。
# 开发人员怎么用
开发人员要区分强一致读和可延迟读。写后立即读、支付结果、权限变更等场景通常不能随意读从库。
# 运维人员怎么看
运维人员要监控复制延迟、GTID 集合、线程状态、旧主隔离、切换耗时和客户端重连。高可用必须通过演练验证 RTO/RPO。
# 常见风险
常见风险是自动切换后旧主没有隔离,网络恢复后出现双写,造成数据分叉。
# 3.9. 本篇学习实验
建议准备一个至少百万行级别的测试表,分别观察正常查询、缺失索引、错误索引、长事务、锁等待和慢查询日志。每次实验都记录 SQL、执行计划、耗时、扫描行数和 MySQL 状态变量变化。
开发侧实验重点是理解 SQL 与事务边界,运维侧实验重点是理解指标如何变化。真正掌握本篇内容,应该能从现象反推 SQL、索引、锁、日志或存储引擎问题。
# 4. 核心机制
- 高可用系统需要检测主库不可用,选择最合适从库提升为新主,并让应用流量切换过去。
- 旧主隔离是关键步骤,否则网络恢复后可能出现双写。
- Group Replication 和 InnoDB Cluster 提供更集成的组复制和路由能力,但仍要理解一致性和仲裁边界。
- 代理层可以屏蔽部分拓扑变化,但代理自身也要高可用。
# 5. 工程实践
- 定期做故障演练,验证 RTO、RPO 和应用重连表现。
- 切换流程必须包含旧主只读或隔离、GTID 校验、复制关系重建和业务验证。
- 核心库不要把备份、报表和在线读全压在同一组从库上。
- 在架构图中标明写入口、强一致读入口、弱一致读入口和管理入口。
# 6. 常见坑
- 只做自动切换,不做数据一致性校验。
- 旧主恢复后继续接受写入,造成数据分叉。
- 应用连接池不刷新 DNS 或连接,仍然打到旧地址。
- 没有演练,第一次切换发生在真实故障现场。
# 7. 专家视角
- 高可用是流程系统,不只是数据库功能。
- 专家会把 RTO 和 RPO 写成可测试指标,并通过演练持续修正。
- 越自动化的切换,越要有防误判和人工兜底。
# 8. Tips 快问快答
Q:高可用能保证零丢数据吗?
A:不一定。要看复制模式、提交确认、故障位置和切换策略。
Q:自动切换越快越好吗?
A:不一定。误切换和脑裂比短暂停机更危险。
Q:为什么要隔离旧主?
A:防止旧主恢复后继续写入,造成双主分叉。
# 9. 阶段小结
高可用与故障切换 的学习重点不是记住零散概念,而是把它放回真实系统:数据如何进入、如何存储、如何被查询、如何在并发下保持正确、如何在故障后恢复。掌握这些连接关系,才能从“会用”走向“能设计、能优化、能排障”。