Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Laravel读写分离?数据库读写怎样分离?_创想鸟

Laravel读写分离?数据库读写怎样分离?

Laravel读写分离通过将读请求分发到从库、写请求发送到主库,结合sticky机制与事务处理,有效提升数据库性能和系统可扩展性,适用于高并发读多写少场景。

laravel读写分离?数据库读写怎样分离?

Laravel的读写分离,简单来说,就是将数据库的读取操作和写入操作分别指向不同的数据库实例。通常,写入操作会去到主库(Master),而读取操作则会分发到从库(Slave)。这样做最直接的目的,是为了提升数据库的整体性能和系统的可伸缩性,尤其是在读多写少的应用场景下,效果尤为显著。它能有效分散数据库的压力,让系统在高并发下依然能保持较好的响应速度。

解决方案

在Laravel中实现数据库读写分离,主要通过配置

config/database.php

文件来完成。核心思路是为同一个数据库连接定义多个主机,指定其中一个作为写入主机,其余作为读取主机。Laravel的数据库连接器会自动处理后续的读写请求路由

具体来说,你需要修改你的数据库连接配置,例如,对于MySQL连接,你可以这样设置:

'mysql' => [    'driver' => 'mysql',    'host' => env('DB_HOST', '127.0.0.1'), // 默认的写入主机    'read' => [        'host' => [            '192.168.1.10', // 从库1            '192.168.1.11', // 从库2        ],    ],    'write' => [        'host' => [            '192.168.1.5', // 主库        ],    ],    'port' => env('DB_PORT', '3306'),    'database' => env('DB_DATABASE', 'forge'),    'username' => env('DB_USERNAME', 'forge'),    'password' => env('DB_PASSWORD', ''),    'unix_socket' => env('DB_SOCKET', ''),    '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'),    ]) : [],    'sticky' => true, // 开启粘滞连接],

在这个配置中,

write

键下的

host

数组定义了主库的地址,所有写操作(如INSERT, UPDATE, DELETE)都会发送到这里。

read

键下的

host

数组则定义了从库的地址列表,所有读操作(如SELECT)会从中随机选择一个从库进行连接。

sticky

选项是一个非常重要的配置。当它设置为

true

时,如果在一个请求生命周期内发生了写操作,那么后续的读操作也会被强制发送到主库。这主要是为了解决主从复制延迟(Replication Lag)可能导致的数据不一致问题。例如,用户刚注册成功(写操作),紧接着就要显示用户个人信息(读操作),如果此时读操作被路由到尚未同步最新数据的老从库,用户就会看到“注册失败”的假象。

sticky

机制能在一定程度上缓解这种问题,确保用户在写操作后立即读取到最新数据。我个人觉得,在大多数面向用户的应用中,开启

sticky

是更稳妥的选择,虽然它会稍微增加主库的压力,但用户体验的优先级往往更高。

为什么数据库读写分离是现代应用架构的必然选择?

在我看来,数据库读写分离已经不再是“可选项”,而是许多现代高并发、大数据量应用架构的“必选项”。想想看,一个单体数据库实例,它既要处理用户注册、订单创建、数据更新等写入请求,又要响应数以万计甚至百万计的用户查询、报表生成等读取请求。这就像一个餐厅只有一个厨师,既要炒菜又要洗碗,很快就会忙不过来。

主从复制(Master-Slave Replication)是实现读写分离的基础。主库负责所有写入操作,并将这些操作同步到从库。从库则专注于提供读取服务。这样一来,主库的压力大大减轻,可以更高效地处理事务性操作;而从库集群则能分担大量的查询负载,显著提升系统的并发处理能力和响应速度。它不仅能提升性能,更重要的是,它提供了水平扩展的可能性。当读取压力增大时,我们只需要增加更多的从库,而不需要去升级昂贵的主库硬件,这在成本控制和弹性伸缩方面都有巨大优势。当然,这也不是没有代价的,比如数据一致性问题,但权衡下来,它的收益通常远大于引入的复杂性。

Laravel中配置读写分离的具体步骤和注意事项

配置Laravel的读写分离,除了上面提到的

database.php

文件修改,还有一些细节和注意事项需要考虑。

小绿鲸英文文献阅读器 小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器 199 查看详情 小绿鲸英文文献阅读器

首先,确保你的数据库环境已经搭建好了主从复制。这通常意味着你有一个MySQL主库和至少一个从库,并且它们之间的数据同步是正常运行的。这是读写分离的基础,如果复制本身有问题,那么读写分离也无从谈起。

database.php

中,

read

数组下的

host

列表,Laravel会默认采用随机轮询的方式选择一个从库。这意味着每次读请求都可能访问不同的从库。这对于负载均衡是好事,但也可能在某些极端情况下,如果你有特定的从库连接需求,会觉得不够灵活。不过,对于大多数场景,这种随机性已经足够。

另一个需要关注的是事务。在Laravel中,如果你开启了事务,那么在事务期间,所有的数据库操作(包括读和写)都会被强制发送到主库。这是为了保证事务的原子性和一致性。例如:

DB::transaction(function () {    // 这里的写操作会去主库    User::create(['name' => 'Test User']);    // 这里的读操作也会去主库,即使它是一个简单的查询    $user = User::where('name', 'Test User')->first();});

这种设计是符合预期的,因为它确保了在事务边界内的数据强一致性。但在某些场景下,如果你有非常大的、只读的事务,且不希望它们也占用主库资源,你可能需要重新考虑你的事务设计,或者在事务外部显式地使用

DB::connection('read')

来执行非关键的读取。

读写分离在实际项目中会遇到哪些挑战和应对策略?

尽管读写分离好处多多,但在实际项目中,它也带来了一些不容忽视的挑战。我个人在处理这类架构时,最头疼的就是“复制延迟”和“连接管理”。

1. 复制延迟 (Replication Lag):这是读写分离最常见的“坑”。主库写入数据后,从库需要一定时间才能同步。这个时间差就是复制延迟。如果用户刚完成一个写操作(比如发布了一篇文章),然后立即刷新页面尝试读取(读操作被路由到从库),他可能会发现文章还没显示出来。这会严重影响用户体验。

应对策略:

sticky

连接: 正如前面所说,在Laravel中开启

sticky

选项,可以在当前请求中,一旦发生写操作,后续的读操作也强制走主库。这是一种简单有效的缓解方案。业务逻辑容忍: 有些业务场景可以容忍轻微延迟,例如统计数据、非实时性内容展示等。异步处理/缓存: 对于一些非实时性要求高的读操作,可以将数据写入缓存(如Redis),或者通过消息队列异步更新从库,并告知前端数据正在同步中。强制主库读: 对于某些对实时性要求极高的读操作,可以显式地指定走主库。在Laravel中,你可以通过

DB::connection('write')->select(...)

来实现。但我建议尽量避免过度使用,否则就失去了读写分离的意义。监控与优化: 持续监控主从复制的状态,优化数据库性能,减少复制延迟。

2. 连接管理和资源消耗:当你有多个从库时,Laravel会为每个请求选择一个从库。这可能导致连接数激增,尤其是在高并发场景下。每个数据库连接都会消耗服务器资源。

应对策略:连接池 (Connection Pooling): 虽然PHP的FPM模式下,每个请求都是独立的,传统的连接池效果有限。但对于一些常驻进程(如Swoole、RoadRunner),可以利用连接池来复用数据库连接,减少连接建立和销毁的开销。优化数据库配置: 调整MySQL的

max_connections

wait_timeout

等参数,确保数据库能处理足够的并发连接。合理分配资源: 根据实际负载情况,为主库和从库分配合适的服务器资源,确保它们不会因为资源瓶颈而影响性能。

3. 故障转移和高可用性:如果主库宕机,整个写入功能就瘫痪了。如果某个从库宕机,虽然不会影响写入,但会减少读取能力。

应对策略:高可用方案: 部署主从复制时,通常会结合Keepalived、ProxySQL等工具实现自动故障转移,确保主库宕机后能快速选举新的主库。监控告警: 建立完善的数据库监控系统,及时发现并处理数据库异常,减少停机时间。多从库冗余: 部署多个从库,即使一两个从库出现问题,其他从库也能继续提供服务。

读写分离无疑增加了系统的复杂性,但它带来的性能和扩展性提升是巨大的。关键在于理解其工作原理,并针对潜在问题做好充分的准备和应对措施。

以上就是Laravel读写分离?数据库读写怎样分离?的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/271532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何查看linux服务器的内存使用情况
上一篇 2025年11月4日 12:35:15
如何解决复杂查询时的代码冗余问题?使用tucker-eric/eloquentfilter可以!
下一篇 2025年11月4日 12:35:22

相关推荐

  • Laravel Nova 4 动作响应持久化:告别短暂Toast,拥抱长效通知

    本文探讨了Laravel Nova动作响应消息(Toast)持续时间过短的问题,特别是在处理耗时操作时。针对这一局限性,我们提供了利用Laravel Nova 4内置通知(NovaNotification)功能的解决方案,以实现更持久、可交互且用户友好的消息提示,确保用户即使在离开页面后也能及时获取…

    2026年9月23日
    000
  • mysql如何输入特殊字符 mysql写sql语句的转义方法

    mysql如何输入特殊字符 mysql写sql语句的转义方法mysql如何输入特殊字符 mysql写sql语句的转义方法mysql如何输入特殊字符 mysql写sql语句的转义方法mysql如何输入特殊字符 mysql写sql语句的转义方法

    在mysql中处理特殊字符的核心方法是使用预处理语句,1.手动转义可通过反斜杠实现,如单引号转为’、双引号转为”等,但易出错且不安全;2.更推荐使用预处理语句(prepared statements)或参数绑定,它能自动处理特殊字符并防止sql注入;3.预处理语句的优势包括安全性高,彻底杜绝sql注…

    2026年9月23日 用户投稿
    300
  • Java中ConnectException连接异常的解决方法

    答案:Java中ConnectException通常因服务未启动、网络不通或配置错误导致,需检查服务状态、IP端口配置及防火墙设置,并合理设置连接超时与重试机制。 Java中出现ConnectException通常表示应用程序尝试连接到远程服务器时失败,最常见的原因是目标主机拒绝连接或网络不通。这个…

    2026年9月23日
    100
  • AO3镜像站替代访问链接_AO3镜像站官方镜像站点

    AO3镜像站替代访问链接为https://nightalk.xyz,用户可通过主站或镜像站点登录账户,支持中文界面切换与多端同步阅读。 AO3镜像站替代访问链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站官方镜像站点,感兴趣的网友一起随小编来瞧瞧吧! https://arc…

    2026年9月23日
    000
  • VSCode高效配置Elixir:Phoenix框架、中文提示、模式匹配

    要高效配置vscode支持elixir开发,必须安装elixirls扩展并确保elixir和erlang环境正确;elixirls提供代码补全、跳转、格式化和调试功能,配合手动设置.heex、.leex文件关联为html可优化phoenix框架开发体验;通过安装中文语言包、设置files.encod…

    2026年9月23日
    100
  • PHP高效读取大型GZ文件:揭示Gzip的顺序访问限制与实践方法

    本教程深入探讨了php中处理大型gz压缩文件的核心挑战:其固有的顺序访问特性。我们将解释为何无法对gz文件进行随机跳转读取,以及这意味着您必须从头开始按序解压数据。文章将提供一种实用的分块读取策略,并附带php示例代码,帮助开发者高效、安全地处理超大gz文件,同时讨论潜在的跨块数据处理问题及内存管理…

    2026年9月23日
    200
  • 如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    RayTune通过分布式超参数优化解决大模型训练中的资源调度、搜索效率、实验管理与容错难题,其核心是利用并行化和智能调度(如ASHA、PBT)加速最优配置探索。首先,将训练逻辑封装为可调用函数,并在其中集成分布式训练(如PyTorch DDP);其次,定义超参数搜索空间与资源需求(如每试验2 GPU…

    2026年9月23日 用户投稿
    100
  • mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql子查询常见类型包括标量子查询、行子查询和表子查询,分别返回一行一列、一行多列和多行多列数据;应用场景涵盖where作为过滤条件、from作为派生表、select作为标量列以及dml操作的数据提供。此外,根据与外部查询的关联性分为非关联子查询和关联子查询,前者独立执行一次,后者依赖外部查询每…

    2026年9月23日 用户投稿
    100
  • 硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    谷歌最新视频生成模型 veo 3.1 来了!今日上手可用。 北京时间 10 月 16 日,谷歌在 Gemini API 中发布了 Veo 3.1 和 Veo 3.1 Fast 付费预览版。模型一上线,就受到了行业的高度关注。毕竟,和前不久发布的 Sora 2 一样,这次 Veo 3.1 也新增了音频…

    2026年9月23日 用户投稿
    200
  • 深入理解 PHP PDO:正确获取最后插入ID的连接管理策略

    本文旨在解决 PHP PDO 中 lastInsertId() 方法返回 0 的常见问题。核心原因在于每次数据库操作时重复创建新的 PDO 连接,导致 lastInsertId() 无法在正确的会话中获取到自动递增ID。解决方案是优化数据库连接类,通过实现连接的单例模式,确保在整个请求生命周期内复用…

    2026年9月23日
    200
  • Java Optional与集合结合使用方法

    Optional与集合结合可避免空指针异常。1. 用Optional.ofNullable包装可能为null的集合元素;2. Stream中filter后接findFirst返回Optional,安全查找;3. 对象属性为Optional时,通过flatMap展开提取值;4. 方法返回Optiona…

    2026年9月23日
    200
  • vivo X300 Pro首发定制2亿灭霸长焦 韩伯啸:长焦新王

    9月2日,vivo产品经理韩伯啸再次为即将发布的vivo x300系列预热,此次聚焦于旗舰机型vivo x300 pro的影像能力。 韩伯啸指出,X300 Pro搭载了独家深度定制的2亿HPB“灭霸”长焦镜头,标志着vivo在长焦技术上的又一次飞跃。这颗镜头是蓝厂真正意义上的第四代两亿像素长焦系统,…

    2026年9月23日
    000
  • VSCode 怎样用插件实现代码的二维码分享功能 VSCode 代码二维码分享插件的创意使用​

    是的,vscode可通过安装插件实现代码二维码分享功能,具体操作为:1. 打开扩展视图(ctrl+shift+x);2. 搜索“qr code”或“share code”等关键词;3. 选择下载量高、评价好的插件如“code to qr code”并安装;4. 选中代码后右键点击“generate …

    2026年9月23日
    200
  • 抖音小店可以无货源吗?无货源开店

    随着电商行业的不断发展,其在人们日常生活中的地位日益重要。作为当下热门的短视频社交平台,抖音凭借庞大的用户群体和强大的流量支持,吸引了大量商家入驻。很多人开始关注:抖音小店是否可以采用无货源模式运营?本文将带您了解这一新兴电商模式的发展趋势。 一、什么是抖音小店无货源模式? 抖音小店无货源模式是指商…

    2026年9月23日
    000
  • win11任务栏图标合并了怎么取消_win11任务栏图标合并设置方法

    首先通过系统设置将“合并任务栏按钮”设为从不,若无效则用注册表编辑器新建TaskbarGlomLevel并赋值2,或使用StartAllBack等工具自定义,同时排查第三方软件干扰。 如果您发现Win11任务栏上的程序图标被自动合并,导致无法清晰查看每个应用的独立窗口,可以通过系统设置或高级方法进行…

    2026年9月22日
    100
  • Java ListIterator如何实现双向遍历

    Java中的ListIterator接口支持双向遍历,即可以从前往后,也可以从后往前遍历列表。这与普通的Iterator只能单向向后遍历不同。ListIterator提供了更灵活的操作方式,特别适用于需要反向访问或在遍历过程中修改列表的场景。 1. ListIterator的基本特性 ListIte…

    2026年9月22日
    100
  • Linus Torvalds 批评 Rust 代码格式化工具:称其“完全疯狂”

    近日,linux创始人linus torvalds在linux内核邮件列表中对rust语言的代码格式化工具rustfmt提出了尖锐批评,称其行为“完全疯狂”。 他提到,在Rust代码中,类似use crate::xyz;这样的导入语句,在经过自动格式化后经常被合并为一行,导致原本清晰的结构变得混乱,…

    用户投稿 2026年9月22日
    200
  • mysql如何分析索引使用 mysql创建索引后的执行计划解读

    mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读

    要分析mysql索引使用和执行计划,核心是通过explain命令查看查询路径,并结合handler_read%状态变量评估索引效率。1. 使用explain命令分析执行计划,关注type、key、extra等列,判断是否高效利用索引;2. 通过show global status like &#82…

    2026年9月22日 用户投稿
    100
  • PHP命令怎么获取执行结果_PHP命令执行结果捕获与返回值处理技巧

    使用exec()可捕获命令输出和返回状态,shell_exec()仅获取输出,proc_open()支持精细控制;需用escapeshellarg()等函数确保安全,并优先使用内置函数替代系统命令。 在PHP中执行系统命令并获取其输出结果和返回状态,是很多运维脚本、自动化工具或与外部程序交互场景下的…

    2026年9月22日
    300
  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信