面试官:Mysql 中主库跑太快,从库追不上怎么整?
作者 |莱乌
来源 | IT界农民工(ID:kejishuqian)
写这篇文章是因为之前有一次删库操作,需要进行批量删除数据,当时没有控制好删除速度,导致产生了主从延迟,出现了一点小事故。
今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。
坐好了,准备发车!
- 思维导图 -
主从常见架构
随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘。因此采用主库写数据,从库读数据这种将读写分离开的主从架构便随之衍生了出来。
在生产环境中,常见的主从架构有很多种,在这里给大家介绍几种比较常见的架构模式。
主从复制原理
了解了主从的基本架构及相关配置后,下面就要进入正题了。
对于主从来说,通常的操作是主库用来写入数据,从库用来读取数据。这样的好处是通过将读写压力分散开,避免了所有的请求都打在主库上。同时通过从库进行水平扩展使系统的伸缩性及负载能力也得到了很大的提升。
但是问题就来了,读从库时的数据要与主库保持一致,那就需要主库的数据在写入后同步到从库中。如何保持主库与从库的数据一致性,主库又是通过什么样的方式将数据实时同步到从库的?
Mysql 中主从复制时有两个很重要的日志文件:
在主从同步的过程中,主库会将所有的操作事件记录在 binlog 中,从库通过开启一个 I/O 线程保持与主库的通信,并在一定时间间隔内探测 binlog 日志文件是否发生改变。如果 binlog 日志发生了变化,主库生成一个 binlog dump 线程向从库 I/O 线程传送 binlog。从库上的 I/O 线程将 binlog 复制到自己的 relay log 中。最终由从库中的 SQL 线程读取 relay log 中的事件重放到从库上。
主从延迟原因
上面的流程我们已经知道了主从复制的相关过程了,但是主库有更新就会同步从库,那为什么会出现主从延迟的情况呢?
Mysql 主库中写 binlog 的操作是顺序写的,之前我们提到过,磁盘的顺序读写速度是很快的。同样的,从库中的 I/O 线程操作日志的速度效率也是很高的。但是别忘了,还有一个 SQL 线程来进行数据重放,而重放的过程是随机写盘的。到这里你应该就明白了吧,某一时刻 relay log 里的数据来不及重放进从库,就会产生主从延迟的情况。
主库并发高
知道了从库中 SQL 线程的重放情况,对于主库并发高导致主从延迟肯定就不难理解了。某一时刻,大量写请求打到主库上,意味着要不断对 binlog 进行写入,此时从库中的 SQL 线程就会应接不暇,自然会产生主从延迟。
对于 SQL 单线程来说,当遇到阻塞时就会一直等待,直到执行成功才会继续进行。如果某一时刻从库因为查询产生了锁等待的情况,此时只有当前的操作执行完成后才会进行下面的操作,同理也就产生了主从延迟的情况。
主从延迟处理
知道了主从延迟的原因,接下来我们看看如何来进行处理。
既然 SQL 单线程进行重放时速度有限,那么能不能采用多线程的方式来进行重放呢?MySQL 5.6 版本后,提供了一种并行复制的方式,通过将 SQL 线程转换为多个 work 线程来进行重放,这样就解决了主从延迟的问题。
降低主库并发
你可能会说了,我现在用的低版本的数据库,也没法升版本啊,那我怎么整。对于主库并发高的情况,这种方式你只能通过控制并发来解决延迟了,多用用 Redis。
这种情况你肯定不陌生,对于一些实时性要求比较高的数据,你总不能读从库去拿吧,万一延迟个大半天,你不得贡献自己的年终奖啊。
主从复制原理
主从延迟原因
主从延迟处理
-
JAVA 面试官 :你们公司用什么框架写 UTlingyuli • 5645浏览 • 0回复
-
Redis┃ 面试官 问我Redis事务和 MySQL 事务的区别,我。。。。。ImCrow • 2140浏览 • 0回复
-
MySQL |聊完了 MySQL 索引, 面试官 直接给我涨了2000!ImCrow • 1825浏览 • 0回复
-
MySQL ┃多个角度说明sql优化,让你吊打 面试官 !ImCrow • 3234浏览 • 0回复
-
mysql 主库 更新后, 从 库 都读到最新值了, 主库 还有可能读到旧值吗apei_02 • 1989浏览 • 0回复
-
《吊打 面试官 》系列-Redis基础mike_hit • 2115浏览 • 0回复
-
《吊打 面试官 》系列-Redis常见 面试 题mike_hit • 2823浏览 • 0回复
-
跟 面试官 侃半小时 MySQL 事务隔离性, 从 基本概念深入到实现gjsoftware • 3263浏览 • 0回复
-
面试官 :Redis 主从复制时网络开小差了 怎么 整 ?abinxy • 1999浏览 • 0回复
-
这样理解 Mysql 索引,阿里 面试官 也给你点赞LoveBank • 2219浏览 • 0回复
-
面试官 :数据 库 自增ID用完了会 怎么 样?wg204wg • 1118浏览 • 0回复
-
面试官 :缓存一致性问题 怎么 解决?| 文末送书wg204wg • 5628浏览 • 0回复
-
面试官 提问:什么是动态代理?fatherlaw • 1263浏览 • 0回复
-
面试官 问 HTTPS 是 怎么 从 HTTP 转过来的,我有点懵d_hero • 1373浏览 • 0回复
-
面试官 提问:如何通过sql方式将数据 库 表行转列?hxiaoyv • 1293浏览 • 0回复
-
新晋 面试官 对近期 面试 的感想与总结baojunzh • 1437浏览 • 0回复
-
站在 面试官 角度,看求职与内卷strikeeagle • 845浏览 • 0回复
-
别再问问JDK的Stream 怎么 用了好么? 面试官skyyoung • 461浏览 • 0回复
-
面试官 提问:什么是前缀索引?maxdl • 626浏览 • 0回复