MySQL 主从架构中怎么实现读写分离负载均衡

舞夢輝影

舞夢輝影

2026-07-18

164人浏览

原创

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

mysql 主从架构中怎么实现读写分离负载均衡

MySQL 主从架构中实现读写分离与负载均衡,本质是两步协同:**先按操作类型路由(读走从库、写走主库),再在多个从库间合理分发读请求**。不依赖应用改代码也能做到,关键在于选对技术路径和配置细节。

主从复制是前提,必须稳定可靠

没有数据同步,读写分离就失去意义。主库开启 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(Linux)
MySQL(Linux)

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 默认行为已支持)
  • 关键路径(如登录态校验、库存扣减后查余额)默认走主库,避免幻读

这样既享受中间件带来的透明性,又保有应对突发问题的控制力。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1117

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

753

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

452

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

1353

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

1855

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

616

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

2221

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

1943

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

2354

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 122人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 221人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习