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

应用场景

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

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

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

模型种类

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

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

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

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

比如下面这种情况

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

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

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

相关推荐
洛阳泰山11 分钟前
Llamaindex 使用过程中的常见问题 (FAQ)
java·服务器·数据库·python·llm·rag·llamaindex
没有名字的小羊17 分钟前
Linux基础命令——账户简单管理
linux·运维·服务器·网络·数据库
单字叶29 分钟前
MySQL数据库管理
数据库·mysql
Deryck_德瑞克31 分钟前
mysql笔记—sql性能分析
笔记·sql·mysql
ID_云泽32 分钟前
MVCC机制解析:提升数据库并发性能的关键
数据库·mvcc
小灰灰是码农...32 分钟前
MySQL的数据库课程设计的基本步骤和考虑因素
数据库
行走的山峰1 小时前
etcd三节点,其中一个坏掉了的恢复办法
数据库·etcd
ImomoTo4 小时前
HarmonyOS学习(十三)——数据管理(二) 关系型数据库
数据库·学习·harmonyos·arkts·鸿蒙
机器视觉知识推荐、就业指导7 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
jnrjian7 小时前
export rman 备份会占用buff/cache 导致内存压力
数据库·oracle