0

0

Laravel如何实现数据库主从读写分离_Laravel配置多个数据库连接读写点【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-05 11:38:02

|

500人浏览过

|

来源于php中文网

原创

Laravel主从读写分离需在database.php中将read/write配置为同一连接名的子键,读操作自动走从库仅限纯SELECT且未显式指定连接、非事务内;写操作、事务、显式连接等一律走主库。

laravel如何实现数据库主从读写分离_laravel配置多个数据库连接读写点【详解】

Laravel 原生支持主从读写分离,但不是“开箱即用”的自动路由,必须显式配置连接、指定读写意图,且需注意查询构造器与 Eloquent 的行为差异——否则所有查询仍走主库。

如何配置 database.php 中的主从连接组

Laravel 不是靠“添加两个独立连接”实现读写分离,而是把多个从库(read)和一个主库(write)归入同一个逻辑连接名下。关键在 'connections' 数组中使用 'read''write' 子键:

 'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
        PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
    ]) : [],
    'read' => [
        'host' => [
            env('DB_READ_HOST_1', '192.168.1.10'),
            env('DB_READ_HOST_2', '192.168.1.11'),
        ],
    ],
    'write' => [
        'host' => env('DB_WRITE_HOST', '192.168.1.5'),
    ],
],
  • read.host 是数组,Laravel 会轮询选择其中一个从库(非负载均衡,无健康检查)
  • write.host 必须是单个字符串,不能是数组;写操作只发往此处
  • 所有其他连接参数(如 usernamepassworddatabase)若未在 read/write 内单独覆盖,则继承外层配置
  • 如果从库需要不同账号,必须在 read 下显式写出 'username''password'

哪些查询会自动走从库?哪些不会?

只有「纯读操作」且未显式指定连接时,Laravel 才可能路由到从库。但以下情况一律走主库:

  • 任何含 insert()update()delete()increment() 等写方法的查询构造器调用
  • Eloquent 模型调用 save()create()delete()update()
  • 事务内所有查询(即使只是 select),因为事务必须在单一连接上执行
  • 使用 DB::connection('mysql') 显式获取连接后,再调用 table()->get() —— 此时 Laravel 无法推断意图,强制走主库
  • DB::select()DB::statement() 等原生方法不参与读写分离,始终走默认连接(即主库)

真正能触发从库路由的是:DB::table('users')->where('id', 1)->first()User::find(1) 这类未包裹在事务、未显式绑定连接、且语法明确为只读的操作。

如何强制走主库或从库?

当自动路由不符合预期(比如刚写入就要立刻读取,避免从库延迟),必须手动指定连接:

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载
  • 强制走主库:DB::connection('mysql')->table('users')->first() —— 注意:这里传的是连接名 'mysql',不是 'mysql_write';Laravel 在该连接配置下会主动选 write 分支
  • 强制走从库:DB::connection('mysql')->usingConnection('read')->table('users')->first()(Laravel 9+);旧版本需用 DB::connection('mysql.read'),但该写法已被弃用且不稳定
  • Eloquent 中强制主库:User::on('mysql')->find(1);强制从库:User::on('mysql')->withWrite(false)->find(1)withWrite(false) 是 Laravel 8.34+ 引入的明确标记)

注意:on('mysql.read') 是错误写法,'mysql.read' 并不是一个真实连接名,只是配置里的嵌套结构。

常见踩坑点和验证方式

主从分离配置后没生效,大概率卡在这几个地方:

  • 环境变量未生效:检查 .envDB_READ_HOST_1 是否拼写正确,是否被 php artisan config:clear 清除缓存后重载
  • 从库权限不足:MySQL 账号需有 SELECT 权限,且 bind-address 允许远程连接;用 mysql -h 192.168.1.10 -u read_user -p 手动测试连通性
  • 忘记关闭 strict 模式导致从库报错:某些从库因复制延迟,执行 SELECT ... FOR UPDATE 会失败,而 Laravel 在某些场景下会隐式加锁
  • 没有验证实际走哪个库:在 DB::listen() 回调里打印 $event->connectionName$event->sql,或在数据库侧开启 general_log 查看请求来源 IP

最易被忽略的是:Eloquent 的 withCount()withSum() 等聚合关系方法,在关联模型未指定连接时,会回退到主库执行子查询——这意味着一次列表页可能混合走了主从,却不自知。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

340

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

294

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

773

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

141

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

80

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

578

2026.03.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号