laravel主从读写分离通过配置read/write连接、启用sticky选项、设置从库权重、验证路由及处理延迟来实现;需修改database.php,保持driver为mysql,添加weight和sticky,用on()或$connection强制主库读。

如果您在 Laravel 应用中面临高并发读请求压力,数据库单点读负载过重,则可通过配置主从读写分离将写操作固定到主库、读操作分散至从库。以下是实现此架构优化的具体步骤:
一、配置多个数据库连接
需在 config/database.php 中定义主库(write)与从库(read)连接,并通过键名区分。Laravel 支持为同一数据库类型配置多个连接,且可指定读写权重。
1、打开 config/database.php 文件,定位到 'mysql' 连接配置块。
2、将原 'host' 字段替换为 'read' 和 'write' 子数组,其中 'read' 包含一个或多个从库地址,'write' 仅包含主库地址。
3、确保每个子数组内均包含 'host'、'port'、'database'、'username'、'password' 等必要字段。
二、启用读写分离驱动
Laravel 默认使用 mysql 驱动,但主从分离需依赖其内置的 mysql 驱动对 'read' / 'write' 结构的自动识别能力,无需更换驱动类型,但必须确保配置结构符合框架约定。
1、确认 config/database.php 中对应连接的 'driver' 值仍为 'mysql'。
2、删除该连接配置下独立的 'host'、'database' 等顶层字段(若存在),避免与 'read'/'write' 冲突。
3、在连接配置末尾添加 'sticky' => true,确保事务期间后续读操作仍路由至主库,防止主从延迟导致数据不一致。
三、配置从库读取权重
当存在多个从库时,Laravel 支持按权重分配读请求,以实现负载均衡。权重值为整数,数值越大被选中的概率越高。
1、在 'read' 数组中,为每个从库连接添加 'weight' 键,例如:'weight' => 3。
2、确保所有从库的 'weight' 值均为正整数,且至少有一个从库权重大于 0。
3、Laravel 在运行时根据权重总和随机选取从库,无需额外代码干预。
四、验证主从路由行为
可通过日志或数据库连接监控确认读写是否正确分发。Laravel 提供查询日志与连接调试机制,便于观察实际执行位置。
1、在 AppServiceProvider 的 boot() 方法中调用 DB::enableQueryLog() 启用日志记录。
2、执行一条 User::first() 查询,随后调用 dd(DB::getQueryLog()) 查看最后一条 SQL 所属连接的 host 地址。
3、执行一条 User::create([...]) 写入操作,再次检查日志中该 SQL 对应的 host 是否为主库地址。
五、处理主从延迟敏感场景
部分业务逻辑(如写入后立即读取)可能因从库同步延迟而获取旧数据。此时需强制走主库读取,Laravel 提供了显式指定连接的方法。
1、在查询构造器中调用 on('mysql') 强制使用主连接,例如:User::on('mysql')->find($id)。
2、在模型中定义 $connection = 'mysql' 属性,使该模型所有操作默认绑定主库。
3、对关键读操作,使用 DB::connection('mysql')->table(...)->get() 显式选择主连接。











