hyperf 实现读写分离需先完成多数据库连接基础配置,包括定义独立的写库(如 db_write)与读库(如 db_read_1)连接池、严格隔离连接池命名与驱动、适配从库只读及同步延迟特性。

Hyperf 实现读写分离,前提是先完成多数据库连接的基础配置。这不是简单改几个参数就能生效的事,而是要从连接池定义、命名规范、驱动隔离三个层面打牢基础。
定义独立的写库与读库连接池
在 config/autoload/database.php 中,必须显式声明至少两个**完全独立**的连接池,不能复用 default 或靠继承简化配置:
- 写库连接名建议用 db_write(全小写、无点号、无大写字母),完整填写 host/port/database/username/password,尤其不能省略 driver 和 pool 子项
- 读库连接名如 db_read_1,同样需单独配置全部参数;若有多从库,可再加 db_read_2、db_read_3
- default 连接池建议保留为空或注释掉,防止未显式指定时意外走 default,导致从库被写入或主库被读压爆
连接池命名与驱动必须严格隔离
Hyperf 不允许同一连接池混用不同版本或引擎的数据库实例。哪怕都是 MySQL,MySQL 5.7 和 8.0 也必须分设连接池:
- 连接名要有语义,例如 mysql_v80_rds、mysql_v57_local,避免 db1/db2 这类模糊命名
- 每个连接池都必须显式声明 driver(如 'mysql' 或 'pgsql'),不可依赖环境变量 fallback
- pool 配置需按实际数据库承载力单独调优:MySQL 5.7 的 max_connections 若为 200,对应连接池 max_connections 建议 ≤150;MySQL 8.0 可适当提高
连接参数需适配从库运行特性
从库通常启用 --read-only,且主从同步存在延迟,配置时要提前规避潜在报错:
- 读库连接中建议设置 strict_type => false 和 fetch_mode => PDO::FETCH_ASSOC,减少类型转换开销
- 若从库使用 MySQL 8.0,需在 options 中明确指定认证插件:
'options' => [PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_NONE, PDO::ATTR_EMULATE_PREPARES => false] - 不推荐在读库连接中开启 sticky(即“刚写完立刻读”),该机制在 Hyperf 3.1+ 中需额外配合事务上下文,否则易引发一致性误判











