MySQL如何进行读写分离?

面试题

你们有没有做MySQL读写分离?如何实现MySQL的读写分离?MySQL的主从复制原理是啥?如何解决MySQL主从同步的延时问题?

面试官心理分析

高并发这个阶段,肯定是要需要做读写分离的,因为大部分互联网的业务都是以浏览为主的,这样的情况,很适合做读写分离。把一个主库挂载多个从库,读取的时候在从库进行,这样就做到了高并发。

面试题剖析

如何实现MySQL的读写分离?

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

MySQL主从复制的原理是什么?

主库将数据变更信息写入到binlog,然后从库连接到主库之后,从库有一个IO线程,将主库的binlog拷贝到自己本地,写入一个relay中继日志中。接着从库中有一个SQL线程会从中继日志中读取binlog,然后执行binlog日志中的内容,也就是在本地再执行一边SQL,这样就保证了自己的数据和主库的数据保持一致。

这里有非常重要的一点就是,从库同步主库的数据是串行化的。也就是说主库上并行的操作,再从库上会串行执行。由于从库需要拷贝主库的日志以及同步数据串行化的特点,导致在高并发场景瞎,从库的数据一定会比主库慢一些,是有延迟的。所以经常出现的问题是,刚写入主库的数据时候,要过几十毫秒,甚至是几百毫秒,从库才可以读到日志。

而且这里还有一个隐患,如果主库突然宕机,此时数据没有同步到从库上,就会出现数据丢失的情况。

MySQL在解决这两个问题的时候,会有两个机制半同步复制,用来解决主库数据丢失问题;一个是并行复制,用来解决主从同步延时问题。

  • 半同步复制:也叫做semi-sync复制,指的是主库写入到binlog之后,就会将强制此时立即将数据返回给从库,从库将日志写入到自己的relay log之后,会返回一个ack给主库,主库至少收到一个ack之后,才会认为写操作完成了。
  • 并行复制:指的是从库开启多个线程,并行读取ralay log中不同的日志,然后并行重放不同库的日志。这个就是库级别的并行。
MySQL主从同步延时问题(精华)

之前线上生产环境遇到过因为主从同步延迟导致的问题。

有一个业务是,先插入库之后,再将数据查询出来,日常是没有问题的,但是在高峰情况下,由于做了读写分离,再加上从库的复制有延迟,就会导致这个业务逻辑的失败。

我们可以在MySQL中输入命令:

show status

来查看参数Seconds_Behind_Master,看一下从库落后了主库多少毫秒。

一般来说,如果从库的延迟比较高,有以下几种解决方案:

  • 分库,以分库来减少并发量,达到可容忍的延迟水平。
  • 打开MySQL支持的并行复制,多个库并行复制。但是如果某个库的写入量特别高,那么并行复制也是没有意义的。
  • 重构代码,避免出现刚写入就查询的情况。
  • 这个时候的查询走主库,不推荐,这样就丧失了读写分离的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值