数据库主从读写分离通过中间件实现自动路由,核心是让应用无感地把写请求发到主库、读请求分发到从库,中间件充当“智能交通指挥员”,无需修改业务逻辑;主流方案包括shardingsphere-jdbc(java微服务)、proxysql(多语言混合)、mysql router(官方生态),应避免用mycat做简单读写分离;proxysql实操需正确配置主机组、路由规则顺序及归一化匹配,并启用规则与持久化;需应对从库延迟问题,通过强制走主库、延迟监控剔除、负载倾斜及事务粘性等策略保障一致性;上线前须验证规则命中、流量分发及故障切换能力。

数据库主从读写分离通过中间件实现自动路由,核心是让应用无感地把 写请求发到主库、读请求分发到从库,中间件充当“智能交通指挥员”。不需要改业务逻辑,也不用在代码里手动切数据源,关键在于选对中间件、配准规则、连通健康检查。
主流中间件怎么选
不同技术栈和规模适用不同方案:
- Java微服务为主:优先用 ShardingSphere-JDBC。它嵌在应用进程内,轻量、低延迟,支持 readwrite-splitting 配置 + Hint 强制走主库(比如刚插入就查),还能自动处理事务内“写后读”一致性问题。
-
多语言混合架构(如PHP+Python+Go):选 ProxySQL。它独立部署,兼容标准 MySQL 协议,SQL 解析精准,支持按正则匹配(
match_digest)、读写权重、从库延迟感知和故障自动摘除。 -
避免用 MyCat 做简单读写分离:配置复杂、全局锁风险高(如
SHOW PROCESSLIST卡在 metadata lock),容易因schema.xml嵌套出错导致所有流量打到同一节点。 - MySQL 官方生态用户:可考虑 MySQL Router,专为 InnoDB Cluster 和原生复制设计,配置简洁,故障转移稳定,但功能较单一,不支持复杂路由策略。
ProxySQL 自动路由实操要点
以 ProxySQL 为例,真正落地时容易翻车的不是装不上,而是规则没写对、没生效、没监控:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 先定义两个主机组:
hostgroup 10放从库,hostgroup 20放主库;确保后端节点状态为ONLINE。 - 路由规则必须按顺序精确配置:
SELECT类规则要放在UPDATE/INSERT等写操作规则之前,否则会被通配规则吞掉。 - 用
match_digest(非match_pattern)做 SQL 归一化匹配,更可靠。例如强制统计走主库:^SELECT.*COUNT\(\*\).+orders$→ 设置destination_hostgroup = 20且apply = 1。 - 规则启用后必须执行:
LOAD MYSQL QUERY RULES TO RUNTIME(立即生效)+SAVE MYSQL QUERY RULES TO DISK(防止重启丢失)。 - 开启
mysql_query_rules.active = 1,否则规则完全不触发。
如何应对从库延迟导致的一致性问题
单纯靠 SQL 类型判断路由不够——SELECT 被发到从库,但数据还没同步过来,用户就看不到刚提交的内容。这时需要叠加策略:
- 对强一致性场景(如订单支付后立刻查状态),加业务 Hint 或中间件规则,强制走主库。
- 接入从库延迟监控(如
Seconds_Behind_Master),当延迟超过阈值(如 > 500ms),动态将该从库从可用列表中剔除。 - 在 ProxySQL 中结合
mysql_servers表的weight字段做负载倾斜,或用mysql_replication_hostgroups自动识别主从关系。 - 事务内默认全走主库:ProxySQL 支持
sticky_conn = 1,保证一个连接生命周期内不跨节点跳变。
验证与上线前必做三件事
中间件上线不是配完就完事,得验证真实流量是否按预期分发:
- 用
PROXYSQL ADMIN连接,查stats_mysql_query_rules看各规则命中次数,确认hits在增长。 - 在应用侧发起典型读写请求,再登录 ProxySQL 查
stats_mysql_processlist,核对hostgroup字段是否符合预期(写→20,读→10)。 - 模拟主库宕机,观察 ProxySQL 是否在几秒内将写流量自动切到新主,并触发从库重新选举;同时检查读请求是否仍能正常响应。










