laravel 配置MySQL读写分离

271 阅读2分钟

前言:说到应对大流量、高并发的解决方案的时候,总会有这样的回答,如:读写分离,主从复制...等,数据库层今天先不讨论,那么今天我们就来看看怎么在应用层实现读写分离。

框架:laravel5.7

说明:

Laravel默认将 select 的语句让 read 指定的数据库执行,insert/update/delete 则交给 write 指定的数据库,达到读写分离的作用。
这些设置对原始查询 raw queries,查询生成器 query builder,以及对象映射 Eloquent 都生效。  

一、单读库配置(一主一从)

打开database.php文件,找到mysql配置处,完成效果如下图

v2-7971369fa62a4e3b9da4eb0aadb473d7_720w.jpgv2-3709a917bfe694eb5548e57f78f2bc6b_720w.jpg

二、多读库配置(一主多从)

v2-9555e03851b55ab28c0edf3ad1997472_720w.jpg

.env文件

v2-eeed60991c1c72f9f9f53b6980e84dd9_720w.jpg

三、多写多读配置(多主多从)

v2-2fe58170003ab6796e8186c196fe53ee_720w.jpg

.env文件

v2-21cd1e1bcd43c97b8320793cb4859fbc_720w.jpg

四、sticky 项

说明:

sticky 项是一个可选的配置值,可用于在当前请求生命周期内允许立即读取写入数据库的记录。如果 sticky 选项被启用并且一个"写"操作在当前生命周期内发生,则后续所有"读"操作都会使用这个"写"连接(前提是同一个请求生命周期内),这样就可以确保同一个请求生命周期内写入的数据都可以立即被读取到,从而避免主从延迟导致的数据不一致,是否启用这一功能取决于你。

解释:

当然,这只是一个针对分布式数据库系统中主从数据同步延迟的一个非常初级的解决方案,访问量不高的中小网站可以这么做,大流量高并发网站肯定不能这么干,主从读写分离本来就是为了解决单点性能问题,这样其实是把问题又引回去了,造成所有读写都集中到写数据库,对于高并发频繁写的场景下,后果可能是不堪设想的,但是话说回来,对于并发量不那么高,写操作不那么频繁的中小型站点来说,sticky 这种方式不失为一个初级的解决方案。

示意图(红框中)

v2-941466840cb9c942da31ed495060ad97_720w.jpg

attachments-2020-08-JXG23yy85f365454cb767.jpg