跳转到主内容
极星编程网:以代码为星,赴技术山海!

ThinkPHP如何进行数据库主从同步配置_实现负载均衡的架构设计

ThinkPHP主从读写分离配置仅在database.php中生效,框架自动路由SELECT至从库、DML至主库;需正确设置default/read标识、type为mysql、多从库用数组,避免手动切库或错误类型导致失效。 主从配置写在 database. php 里,不是靠中间件或命令行 ThinkPHP 的主从读写分离是框架层做的路由决策,不是数据库自身同步——同步得靠 MySQL 的 binlog + relay log 实现,TP 只负责把
SELECT
发给从库、
INSERT/UPDATE/DELETE
发给主库。所以配置入口只有
config/database.php
,其他地方改了没用。 常见错误是试图在控制器里手动切库,或者以为加个
Db::connect('slave')
就算主从——这只能临时指定连接,不改变读写自动分发逻辑。
'type' => 'mysql'
必须保持,不能写成
'type' => 'pdo'
,否则从库配置会被忽略 主库必须定义为
'default' => true
,从库用
'read' => true
标识,框架才识别 从库可以配多个,用数组形式:
'slave' => [['hostname' => '192.168.1.10', ...], ['hostname' => '192.168.1.11', ...]]
如果从库连不上,TP 默认会静默降级到主库查(取决于
'break_reconnection'
配置),但不会报错提醒你从库挂了 readwrite 分离失效的三个典型原因 写了主从配置却还是全走主库?大概率卡在这几个点上: 模型用了
->master()
方法,强制走主库,连带后续所有查询都绑定主连接(包括关联查询) 事务中执行了
SELECT
,TP 认为“可能要写”,一律路由到主库——哪怕你只是
SELECT COUNT(*)
开启了
'deploy' => 1
(分布式部署模式),但没配
'prefix' => 'think_'
等必要项,导致读写策略未激活 验证是否生效:开调试模式,在日志里搜
[ SQL ] SELECT
,看 host 是不是从库地址;或者在从库
SHOW PROCESSLIST
观察是否有连接进来。 立即学习 “ PHP免费学习笔记(深入) ”; PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 从库延迟导致数据不一致,TP 不管,得你自己兜底 MySQL 主从延迟是常态,TP 的读写分离机制完全不感知延迟。比如刚插入一条记录,紧接着查列表,很可能查不到——这不是 TP 的 bug,是架构必然代价。 强一致性场景(如支付结果页),必须显式调用
Db::master()->table(...)->select()
避免用
lastInsertId()
后立刻查同条记录,ID 能拿到,但数据可能还没同步到从库 不要依赖从库做唯一性校验(如注册时查用户名是否存在),否则可能重复插入 监控建议:在从库执行
SHOW SLAVE STATUS\G
,重点关注
Seconds_Behind_Master
,超过 5 秒就得告警 连接池和超时参数不配好,从库反而拖慢整体响应 从库通常比主库硬件弱,如果连接参数沿用主库默认值,容易雪崩:
'time_out' => 30
对从库太激进,网络抖动时直接卡住整个请求;建议设为
5
或
10
没设
'break_reconnection' => true
,某个从库宕机后,TP 会逐个重试所有从库,耗尽超时时间
'params' => [\PDO::ATTR_PERSISTENT => true]
在 FPM 下慎用,持久连接容易复用到已断开的从库连接 从库连接数上限(
max_connections
)要单独调高,否则并发稍大就
Too many connections
真实线上环境里,主从配置最麻烦的从来不是怎么写,而是怎么让从库「稳得住、退得快、不扯后腿」——这些细节不压测根本暴露不出来。

相关文章