MySQL读写分离

一、MySQL的读写分离

1.1 为什么要使用MySQL的读写分离?

​ 在高并发的场景下,当用户发起大量请求时,缓存肯定放不下所有数据,那么这些请求就会落到数据库上,当数据库的读写请求太高(2000次/s)时,数据库就会报警,磁盘IO开始变慢,CPU负载过高,内存使用率过高。当数据库读写请求达到4000/s,5000/s,8000/s时,数据库就会直接宕机,所以为了解决这种问题就诞生了MySQL的读写分离。

1.2 MySQL的读写分离怎么实现

​ 通过MySQL的主从复制

​ 就是基于主从复制架构,简单的来说,就是搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。

二、主从复制

2.1 MySQL主从复制原理是啥?

02_MySQL主从复制原理

​ 图片来自“石杉码农学院”

原理:用户发来一个写请求后,主库将变更数据,然后写binlog日志,然后从库连接到主库之后,从库有一个IO线程,将主库额binlog日志拷贝到自己本地,写入relay日志,接着从库中有一个SQL线程会从relay日志读取变更,然后执行变更的内容,也就是说在自己本地再次执行一遍SQL,这样就可以保证自己跟主库的数据是一样的。

2.2 主从复制带来的问题

​ 首先要明确一点,就是从库同步主库数据的过程是串行化的,就就是说主库上并行操作,在从库上会串行执行。

​ 所以这样就会引出一个问题:由于从库从主库拷贝日志以及串行串行执行SQL的特点,在搞并打场景下,从库的数据一定会比主库慢一些,是有延时的。所以经常会出现,刚写入主库的数据可能读不到,要过个几十毫秒,甚至几百毫秒才能读取到。即主从延迟

在实际生产中就有这种场景:

  • ​ 数据已全部同步到从库后,主库突然发生了宕机
    • ​ 解决:将从库变更为主库
  • ​ 数据还没有全部同步到从库中时,主库突然发生了宕机
    • ​ 解决:
      • ​ 提前开启MySQL所支持的半同步机制。所谓半同步机制就是指:当用户发送一个写请求后,如果主库还没有同步到从库时,那么系统会认为这个写操作是失败的,然后给客户反馈一个失败的信息,然后客户重新发送,在这期间系统就将从库变更为了主库。
      • 并行复制:MySQL5.7支持的新特性,从库开启多个线程,并行读取relay日志中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

2.3 当主从延迟比较严重时如何解决?

​ 先看一个场景:当你写业务代码时,先在数据库中插入一条数据,这时在立马将该数据查询出来,然后对其进行修改。

​ 分析上述场景:在数据库中插入数据是在主库中修改,然后由于主从延迟问题该数据还没有同步到从库,然后你又立马查询就会查不到结果,然后你的修改起始就也是无效的。

​ 解决:

  1. 分库,将一个主库拆分成为4个主库,每个主库的写并发就降低了,此时的主从延迟就可以忽略不计
  2. 打开MySQL支持的并行复制,多个库并行复制,如果说某个库的写入并发就是特别高,单库写并发达到了2000次/s,并行复制的意义其实不是很大
  3. 重写代码,插入数据之后直接修改,那么这两个操作就都是在主库中进行的了
  4. 如果业务上是存在这种必须先插入,立马查询,在修改的业务逻辑,那么就可以对这个操作设置直连主库。不推荐使用,因为这样导致读写分离的意义丧失了

三、在什么场景下使用MySQL的主从同步

​ 建议是一般在读远远多去写,而且读的时候一般对数据时效性要求没那么高的时候,使用

本文参考自:石杉码农学院的中华石杉老师的 “java工程师面试突击第一季”

Thanks
0%