JAVA面试:MySQL读写分离及主从同步延时解决方案


1面试问题

你做过MySQL读写分离吗?

如何实现MySQL读写分离

主从复制原理

如何解决MySQL主从同步的延迟问题

准备好面对这次轰炸采访了吗?

2测试中心分析

在高并发阶段,绝对需要进行读写分离。

事实上,大多数互联网公司的网站应用程序读写量都比较少

对于现状,写一个主库,挂多个从库,然后从多个从库中读取,它能支持更高的读取压力吗?

3 MySQL读写分离实现

基于主从复制体系结构

加入一个主库,挂起多个从库,然后只写主库,主库就会自动同步数据到从库

4 MySQL主从复制原理

为什么MySQL读写分离?

0×251C

主库将更改写入binlog日志,然后从库连接到主库,从库具有IO线程,将主库的binlog日志复制到本地,写入中继日志。

然后库中有一个SQL线程从中继日志中读取binlog,然后执行binlog日志的内容。

也就是说,在本地再次执行SQL,确保数据与主库相同

MySQL主从复制原理

0×251d

从库同步主库数据的过程是序列化的,也就是说,在从库上串行执行主库上的并行操作。

由于从主库中复制日志和SQL的串行执行的特性,高并发方案存在延迟。来自库的数据必须比主库慢,所以通常看起来刚刚写入主库的数据可能无法读取它,读取它需要几十甚至几百毫秒

这里还有另一个问题。如果主库突然崩溃,只是数据没有同步到从库,那么一些数据可能不在库中,可能会丢失。

所以MySQL实际上有两种机制

半同步复制(半同步)

解决主库中数据丢失的问题

将主库写入binlog日志后,此时将强制数据同步到从库。

将日志从库中写入其本地中继日志后,将ack返回到主库

在从库中收到至少一个ack之前,主库不会考虑完成写操作

并行复制

解决主从同步延迟问题

从库中打开多个线程,并行读取中继日志中不同库的日志,然后并行重放不同库的日志,这在库级并行

5 MySQL主从同步延迟问题(核心)

由生产环境问题引起的MySQL主从延迟

i1.go2yd.comimage.php?url=0Md9qQcVOo

您可以看到从库复制到主库的数据背后有多少ms

事实上,经常遇到这种事情,例如,在使用MySQL主从架构之后,你可能会发现刚写入库中的数据没有找到,结果就完成了

所以实际上,您必须考虑应该使用哪种方案来与此MySQL主控器同步

建议通常不仅仅是阅读,在阅读时,通常在数据的及时性不高时使用

所以我们可以考虑的是你可以使用MySQL进行并行复制,但问题是它是库级并行,所以有时它不能很好地工作

在这一点上,一般来说,我们将使用强制读取主库的方法为我们可以保证在写完后找到的场景。

确保您可以读取数据。其实用的数据库中间件没有问题。

通常,如果主从延迟更严重

子库:将主库拆分为4个主库,每个库写入500秒,主从延迟可忽略不计

规则是一些订单表,写于2000年代,其他数十个表10s

重写代码:编写代码的学生应该小心,重写代码,插入数据,直接更新,不要查询

如果它确实存在,则必须先插入,然后立即请求它,然后立即执行一些操作,设置与主库的直接连接(不推荐,因此读写分离的含义丢失)

http://www.whgcjx.com/bdsKPna/H8RTV2