Hyperf如何在高可用环境下配置MySQL双主架构_在连接池中配置VIP

雨强吖_8812

雨强吖_8812

2026-05-20

529人浏览

原创

hyperf连接池填vip不可行,因其不感知主库状态、不自动重连或重试,vip漂移后旧连接仍指向宕机节点,易引发复制延迟放大、主键冲突、连接卡死;须配合mysql层健康检测、调优连接池参数(如max_idle_time≤30s)并实现写后读一致性兜底。

hyperf如何在高可用环境下配置mysql双主架构_在连接池中配置vip

Hyperf 应用连接 MySQL 双主 + Keepalived VIP,不能只靠改 pool.host 为 VIP 就完事——连接池本身不感知主库状态,也不做故障重试或读写分离,盲目配 VIP 反而会放大复制延迟、主键冲突、连接卡死等风险。

Hyperf 连接池里填 192.168.1.100(VIP)为什么不行

Hyperf 的 MySQL 连接池(基于 Swoole 协程)在初始化时只做一次 DNS 解析和 TCP 连接建立,之后复用连接。一旦 Keepalived 把 VIP 漂到另一台机器,已建立的连接仍维持在旧节点(可能已宕机),新请求虽能连上 VIP,但:

  • 旧连接不会自动断开或重连,SELECT @@server_id 可能返回已下线节点的 ID
  • 应用层无感知复制延迟,Seconds_Behind_Master 是几百时照样写入
  • 双主自增步长(auto_increment_increment)若未对齐,INSERT 同一主键直接报 ERROR 1062 (23000): Duplicate entry
  • 连接池中空闲连接超时(pool.max_idle_time)默认 60 秒,故障切换后这 60 秒内请求大概率失败

必须配合 MySQL 层的双主健康检测脚本

Keepalived 的 vrrp_script 必须调用真实检测逻辑,不能只用 nc -z 127.0.0.1 3306。Hyperf 不参与 VIP 切换决策,但它依赖的这个 VIP 背后是否真正可写,得由 MySQL 自身状态决定:

Hyperframes Creative
Hyperframes Creative

HyperFrames视频非动画创意指导,包括设计规范(frame.md/design.md)处理、配色、字体设计、旁白及节奏规划等。

下载
  • 检测脚本需执行:mysql -uhealth -p... -e "SELECT 1" | grep -q "1",且附加 --connect-timeout=3 --execution-timeout=3
  • 必须校验复制状态:SHOW SLAVE STATUS\G 中 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 同时成立,且 Seconds_Behind_Master
  • 脚本返回非 0 时,Keepalived 才触发降级;否则即使 MySQL 进程活着,但复制已断,VIP 也不能漂过去

Hyperf 连接池配置要适配双主语义

Hyperf 默认把 MySQL 当单点用,但双主本质是“两个可写端点”,连接池参数需抑制副作用:

  • pool.connect_timeout 建议设为 3.0:避免因 VIP 漂移中短暂不可达导致协程阻塞过久
  • pool.wait_timeout 提高到 5.0:防止连接池在切换窗口期因等待连接超时而抛异常
  • pool.max_idle_time 严格设为 30.0 或更低:强制在 30 秒内回收空闲连接,让新连接有机会命中新 VIP 节点
  • 禁用 options.ATTR_PERSISTENT(持久连接):Swoole 协程下持久连接与双主场景互斥,容易复用到已失效连接
  • 不要依赖 pool.min_connections 预热:预热连接可能全落在旧节点,反而加剧故障期错误

应用层必须做写后读一致性兜底

即便 VIP 切换正确、复制延迟控制在秒级,Hyperf 请求仍可能因路由错位读到旧数据。这不是连接池问题,而是最终一致性模型下的固有约束:

  • 关键写操作(如创建订单)后,若紧接着查该记录,应显式指定 server_id 或走强一致性读(如加 SELECT ... FOR UPDATE)
  • 避免在事务中跨连接读写:Hyperf 连接池不保证同个协程内多次 db::select() 复用同一连接,可能读到不同节点
  • 业务日志中建议打上 @@server_id 和 @@hostname,出问题时能快速定位是哪台节点响应了请求

双主架构里最易被忽略的,不是 Keepalived 怎么配,也不是 Hyperf 连接池怎么调,而是「写入后立即读」这个动作本身,在 MySQL 复制机制下天然不保序——哪怕 VIP 漂得再快,也救不了没加读一致性策略的代码。

相关文章

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

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

下载

相关标签:

mysql hyperf

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

相关专题

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

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

2023.06.20

2293

6

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

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

2023.06.21

1399

5

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

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

2023.07.18

815

5

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

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

2023.07.19

3172

5

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

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

2023.07.25

5388

4

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

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

2023.08.08

1199

3

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

5651

4

mysql忘记密码
mysql忘记密码

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

2023.08.14

4942

7

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

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

2023.08.16

6574

11

热门下载

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

精品课程

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

共1课时 | 188人学习