讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql数据库如何实现读写分离_使用ProxySQL或中间件配置

星静君_7884

星静君_7884

发布时间:2026-05-04 16:25:46

|

839人浏览过

|

来源于php中文网

原创

ProxySQL 启动后连不上 MySQL 是因未正确配置 mysql_servers 和 mysql_replication_hostgroups 表:需手动插入 MySQL 实例并设 hostgroup_id=0(写)/1(读),且 mysql_replication_hostgroups 必须唯一配置 writer=0、reader=1;配置后须执行 LOAD TO RUNTIME 和 SAVE TO DISK。

mysql数据库如何实现读写分离_使用proxysql或中间件配置

ProxySQL 启动后连不上 MySQL?检查 mysql_servers 表和 mysql_replication_hostgroups

ProxySQL 不是开箱即用的“自动发现”中间件,它不会自己识别主从关系。你得手动把后端 MySQL 实例加进 mysql_servers 表,并明确标出哪个是写组(hostgroup_id = 0)、哪个是读组(hostgroup_id = 1),再通过 mysql_replication_hostgroups 表告诉 ProxySQL “0 是写,1 是读,靠 Read_only 状态自动切”。

常见错误现象:ERROR 9001 (HY000): ProxySQL Error: unable to find a server matching the hostgroup,基本就是 mysql_servers 没插、插错 hostgroup_id,或者 mysql_replication_hostgroups 没配或配反了。

  • 确保每个 MySQL 实例在 mysql_servers 中有且仅有一条记录,status='ONLINE',weight 非零
  • mysql_replication_hostgroups 必须且只能有一行:writer_hostgroup=0,reader_hostgroup=1,comment='read/write split'
  • 执行完 INSERT 后别忘了 LOAD MYSQL SERVERS TO RUNTIME 和 SAVE MYSQL SERVERS TO DISK

为什么 SELECT 不走读组?看 mysql_query_rules 的 destination_hostgroup 和 apply 顺序

ProxySQL 路由 SELECT 到读组,不是靠语法猜,而是靠规则匹配。默认规则不生效,必须显式插入一条匹配 SELECT 的规则,并指定 destination_hostgroup=1。而且规则按 rule_id 升序匹配,第一条命中就结束,apply=1 才终止后续匹配。

常见错误现象:所有流量都打到 hostgroup 0(写组),SHOW STATS STATS_mysql_connection_pool 显示 hg=1 的连接数始终为 0。

  • 插入规则示例:INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES(1,1,'^SELECT',1,1)
  • 如果已有 rule_id=0 匹配所有语句并指向 hg=0,新规则得设 rule_id > 0 且 apply=1,否则被拦截在前
  • 注意大小写:match_digest 默认区分大小写,'^select' 不会匹配 SELECT,建议用 '^SELECT' 或启用 case_sensitive=0

主从延迟大时,SELECT 还可能读到旧数据?ProxySQL 本身不校验延迟,得靠 mysql_server_read_only 和监控联动

ProxySQL 只看 MySQL 实例返回的 Read_only 系统变量来判断是否可读,它不查 Seconds_Behind_Master。也就是说,即使从库延迟 30 秒,只要 Read_only=ON,它就照常转发 SELECT 过去。

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载

这不是 bug,是设计使然——延迟判断逻辑复杂、开销高,不在 ProxySQL 职责范围内。真要规避延迟读,得靠外部手段干预。

  • 定期脚本查从库延迟,若 Seconds_Behind_Master > 30,就动态执行 UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostgroup_id=1 AND hostname='xxx'
  • ProxySQL 8.0+ 支持 mysql_server_connect_error 监控,但不包含复制延迟指标
  • 应用层更稳妥:对一致性要求高的 SELECT,显式加 /*+ MAX_EXECUTION_TIME(1000) */ 并捕获超时,触发重试或降级

配置改完没生效?别只 reload config,Runtime 和 Disk 两层状态必须同步

ProxySQL 有三层配置模型:MEMORY(当前运行态)、RUNTIME(生效但未落盘)、DISK(持久化)。你在 Admin 界面或 mysql -uadmin 里做的 INSERT/UPDATE,只是改了 MEMORY;必须 LOAD xxx TO RUNTIME 才真正生效;再 SAVE xxx TO DISK 才保证重启不丢。

最容易被忽略的一点:修改 mysql_query_rules 后只执行 LOAD MYSQL QUERY RULES TO RUNTIME,却漏了 SAVE,结果 ProxySQL 重启后规则全空,业务瞬间全打主库。

  • 典型操作链:INSERT INTO mysql_query_rules ... → LOAD MYSQL QUERY RULES TO RUNTIME → SAVE MYSQL QUERY RULES TO DISK
  • 检查是否生效:SELECT * FROM runtime_mysql_query_rules(看 RUNTIME 层),SELECT * FROM disk.mysql_query_rules(看 DISK 层)
  • 如果改的是用户或变量,对应的是 mysql_users 和 global_variables 表,同样要 LOAD + SAVE

ProxySQL 的读写分离不是开关一开就稳的,它的每条路由决策都依赖你填对的表、写准的规则、同步到位的状态。最常出问题的地方,往往不是语法写错,而是 MEMORY/RUNTIME/DISK 三者没对齐,或者以为它能自动感知延迟。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

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

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

2293

2023.06.20

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

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

1399

2023.06.21

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

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

815

2023.07.18

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

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

3172

2023.07.19

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

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

5388

2023.07.25

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

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

1199

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

5671

2023.08.11

mysql忘记密码
mysql忘记密码

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

4942

2023.08.14

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

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

共1课时 | 188人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn