mysql读写分离与负载均衡需先按操作类型路由再均衡分发读请求,依赖稳定主从复制、proxysql语义路由及动态权重调整,并辅以应用层兜底机制。

主从复制是前提,必须稳定可靠
没有数据同步,读写分离就失去意义。主库开启 binlog,从库配置 server-id、relay-log,并启用 read_only(防误写)。推荐使用 ROW 格式 binlog 和半同步复制(rpl_semi_sync_master_enabled=ON),兼顾一致性与可用性。执行 `show replica status\G` 时,Replica_IO_Running 和 Replica_SQL_Running 都为 Yes 才算真正同步就绪。常见问题:从库延迟高,导致读到旧数据。可通过监控 Seconds_Behind_Master 或 GTID_EXECUTED 对比来识别;对强一致性要求的查询(如订单支付后立即查状态),应直连主库或加 hint 强制走主库。
读写分离靠中间件自动识别 SQL 类型
ProxySQL 是当前生产环境最主流的选择。它监听客户端连接,解析 SQL 开头关键字做路由判断:- 以 SELECT 开头(不含 FOR UPDATE)→ 路由到从库所在 hostgroup(如 20)
- INSERT/UPDATE/DELETE/SELECT ... FOR UPDATE → 路由到主库 hostgroup(如 10)
- 支持正则匹配,可细化规则,比如把带特定注释 /*+ USE_MASTER */ 的 select 也强制走主库
配置示例(ProxySQL):
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FOR UPDATE', 10, 1), (2, 1, '^SELECT', 20, 1);
从库间的读负载均衡要动态适配实际压力
单纯轮询(round-robin)容易忽略节点差异。ProxySQL 支持基于权重、连接数、响应时间甚至自定义监控指标(如 CPU、延迟)动态调整流量分配:- 给性能强的从库设更高 weight(如 100),弱节点设低 weight(如 50)
- 启用 mysql_server_stats 表实时统计各节点健康状态
- 配合 scheduler 定期运行脚本,自动下线异常节点或恢复服务
若用 HAProxy 做四层负载均衡,只能做连接级分发,无法识别 SQL 类型,适合只做从库读均衡的简化场景;而 ProxySQL、MaxScale 等属于七层代理,能真正实现“语义路由 + 智能分发”。
应用层兜底机制不能少
中间件再稳也有单点风险。建议在业务代码中保留手动指定数据源的能力:- DAO 层提供 readFromMaster() / readFromSlave() 显式调用接口
- 事务内所有读操作自动绑定主库(Spring @Transactional 默认行为已支持)
- 关键路径(如登录态校验、库存扣减后查余额)默认走主库,避免幻读
这样既享受中间件带来的透明性,又保有应对突发问题的控制力。










