连载中 13/22

读写分离与高可用选型:路由方案、MHA 与 MGR

2026-05-08 · 3822 阅读 · 0 评论 · 0 赞

从库有了,流量怎么分

一主两从搭完,读写分离是必然动作,但「写主读从」四个字后面藏着两套完全不同的落地路线;而主库单点问题(第 8 篇哨兵篇的老朋友,数据库这边也有同款考题)要用高可用方案来答。这篇把两道题一起答完。

路由方案:应用层 vs 代理层

方案代表优点缺点
应用层路由ShardingSphere-JDBC、Spring 多数据源 + AbstractRoutingDataSource无中间件、少一跳延迟;代码里可精细控制每个应用都要配;语言绑定,跨团队难统一
代理层ProxySQL、ShardingSphere-Proxy、MaxScale对应用透明,集中管控;平滑扩从库多一跳延迟;代理自身要高可用;SQL 兼容面要验证

选型经验:中小规模、Java 技术栈统一,应用层够用且省心;多语言并存、要集中治理连接和查询时上代理。老王选的应用层——他的场景一个 Spring Boot 项目说了算,别给自己加一跳。

强制走主库的三个场景

  • 写后立读:同一请求内改完立刻读(改昵称刷新资料页)——第 12 篇的延迟问题,路由层按「用户 + 短时间窗」粘主库;
  • 强一致读:余额、库存、支付状态这类决策性读,永远主库;
  • 事务内:事务里的读必须和写同源,路由组件要感知事务上下文。

别的都往从库放——读写分离的正确姿势不是「能读从就读从」,而是「不能读从的绝不读从」,白名单思路反着来才不会翻车。

高可用选型:MHA、Orchestrator 与 MGR

主库挂了,要有人完成三件事:识别故障、选出新主、把流量切过去——这就是 Failover。三个主流候选:

方案原理特点
MHA外置管理节点监控主库,故障时补齐从库差量再选新主老牌经典;最大程度减少数据丢失;管理节点自身单点,社区活跃度下降
Orchestrator拓扑感知的自动化 Failover 与可视化拓扑发现、人工/自动切换都好用;需与 ProxSQL 等配合做流量切换
MGR组复制,基于 Paxos 多数派表决提交,自带选主数据库原生方案,RPO≈0 不丢事务;要求较高(每行要有主键、写入吞吐受限),运维心智新

再给一张决断表:

场景建议
读多写少的业务库,容忍秒级切换主从 + Orchestrator / MHA,务实性价比
交易核心库,绝不丢事务MGR(或半同步 + Orchestrator 兜底)
云上部署直接用云数据库的高可用版(RDS 主备),别重复造轮子

和 Redis 哨兵篇的结论遥相呼应:单点不能拍板,但人数也不能太多——MGR 的多数派要求奇数节点,故障切换的「投票委员会」逻辑在两个体系里一模一样。

到这,主从三部曲收官:搭建(11)、延迟(12)、路由与切换(13)。下一篇转向性能调优的服务器视角:Buffer Pool 为什么是 MySQL 的命根子、核心参数怎么给。

咖啡凉了,记得趁热喝。

503

10 年全栈工程师 · 503咖啡馆主理人

#MySQL#读写分离#高可用#MHA#MGR

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 3 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞