读写分离的手段——主从复制,解决读流量大大高于写流量的问题

应用场景

假设说有这么一种业务场景,读流量显著高于写流量,你要怎么优化呢。因为写是要加锁的,可能就会阻塞你读请求。而且其实读多写少的场景还很多见,比如电商平台,用户浏览n多个商品才会买一个。

大部分人的思路可能是建个缓存来帮助 MySQL 抗住大部分的查询请求。但是这不行,因为应用缓存的原则之一是保证缓存命中率足够高,不然很多请求会穿透缓存,最终打到数据库上。不同用户的请求基本上都不一样。

所以你要考虑优化数据库来抗住高查询请求,首先要做的就是区分读写流量区,这样才方便针对读流量做单独扩展,这个过程就是流量的"读写分离 "。这是提升MySQL并发性的首选方案,因为当单台 MySQL 无法满足要求时,就只能用多个具有相同数据的 MySQL 实例组成的集群来承担大量的读写请求。

模型种类

那如何实现主从复制呢?答案如下图所示

在完成主从复制之后,你就可以在写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行。但是不是说越多从库越好,因为一个从库io线程就需要一个主库log dump线程。所以在实际使用中,一个主库一般跟 2~3 个从库(1 套数据库,1 主 2 从 1 备主),这就是一主多从的 MySQL 集群结构。

同时,主从复制有三种模式:

主从复制的延迟问题怎么解决呢?

比如下面这种情况

最推荐的是使用数据冗余 :可以在异步调用审核模块时,不仅仅发送商品 ID,而是发送审核模块需要的所有评论信息,借此避免在从库中重新查询数据(这个方案简单易实现,推荐你选择)。但你要注意每次调用的参数大小,过大的消息会占用网络带宽和通信时间。

或者加一层缓存 ,读先读缓存,然后不行再去从库。但这存在一致性问题。

或者直接查询主库,但是要提前明确查询的数据量不大,不然会出现主库写请求锁行,影响读请求的执行,最终对主库造成比较大的压力。

相关推荐
愛~杦辷个訾35 分钟前
芋道项目,商城模块数据表结构
java·sql·芋道·yudao-cloud·芋道商城
Smile丶凉轩3 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
昔柯的修炼日记3 小时前
使用 Navicat 将 Excel 导入数据库
数据库
进击的雷神6 小时前
数据库知识全面考查:从基础概念到实战应用
jvm·数据库·oracle
Le_ee6 小时前
sqli-labs靶场第七关——文件导出注入
数据库·sql·网络安全·php·sql注入·sqli—labs
不知几秋6 小时前
Maven
java·数据库·maven
政沅同学7 小时前
数据库实验报告 SQL SERVER 2008的基本操作 1
数据库
lyw2056197 小时前
MySQL八股(自用)
数据库·mysql
MMMMMMMMMMemory8 小时前
pgsql14自动创建表分区
数据库·pgsql
文牧之8 小时前
PostgreSQL 配置设置函数
运维·数据库·postgresql