连载中 13/22

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

2026-05-08 · 3828 阅读 · 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)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞