Yii2.0.54 本身不内置读写分离逻辑,但可通过配置多个数据库组件并自定义路由策略实现应用层读写分离;需区分主库(write)与从库(read)连接、识别SQL类型与事务上下文、处理从库延迟及健康检查,并辅以MySQL参数优化和Redis缓存。

Yii2.0.54 本身不内置读写分离逻辑,但可通过配置多个数据库组件 + 自定义路由策略,实现应用层读写分离,有效分摊主库压力。关键不在版本号,而在于如何组织连接、识别读写语句、处理事务一致性与从库延迟。
基础连接配置:主从分离声明
在 config/db.php 或应用配置中定义两个 DB 组件:
-
主库(write):仅用于 INSERT/UPDATE/DELETE 和显式事务,设为
'enableSchemaCache' => true并关闭从库同步检查 -
从库(read):可配置多个从库,用
'slaveConfig'统一管理连接参数;建议开启'attributes' => [PDO::ATTR_PERSISTENT => true]复用连接 - 主库需确保 MySQL 已开启 binlog、主从复制正常;从库建议启用
read_only=ON防误写
读写自动识别:靠 Query 类型 + 事务上下文
Yii2 默认通过 SQL 前缀判断读写(如 SELECT 走从库),但需注意边界情况:
- 含
SELECT的存储过程、SELECT ... FOR UPDATE必须走主库,需在执行前手动切换:Yii::$app->db->open(); Yii::$app->db->setActive(false); Yii::$app->db->setActive(true); - 事务中所有操作(含 SELECT)强制走主库,这是 Yii2 内置行为,无需额外干预;但需确认
transaction_persistent在 ProxySQL 层也设为 1(若使用) - 避免在从库执行
SHOW MASTER STATUS、SELECT @@server_id等管理类语句,这类请求应直连主库或跳过
高可用与延迟兜底:从库健康与滞后控制
单纯轮询从库可能放大延迟风险,建议加入简单判断:
- 在从库连接后执行
SELECT MASTER_POS_WAIT(...)或解析SHOW SLAVE STATUS中的Seconds_Behind_Master,超阈值(如 >3s)则临时剔除该节点 - Yii2 不原生支持动态剔除,可封装一个
ReadSlaveConnection类,在open()时校验延迟并缓存结果(TTL 30s) - 若使用 ProxySQL,直接配置
max_replication_lag=3,它会自动将延迟超限的从库标记为 OFFLINE
性能强化补充点
配合读写分离,这几个配置能进一步释放压力:
- 主库关闭查询缓存(
query_cache_type=0),因写频繁时缓存失效开销大 - 从库适当调高
innodb_buffer_pool_size(建议 70%~80% 可用内存),提升只读查询命中率 - Yii2 查询构造器中,避免
createCommand()->select(...)->from(...)->where(...)->all()连续链式调用产生隐式事务;明确用Yii::$app->db->createCommand(...)->execute()区分读写意图 - 对高频只读接口(如商品详情页),加 Redis 缓存层,减少数据库访问频次


















