关于mysql:面试官咱们来聊一聊mysql主从延迟

1次阅读

共计 1208 个字符,预计需要花费 4 分钟才能阅读完成。

背景

前段时间遇到一个线上问题,起初排查良久发现是因为主从同步提早导致的,所以明天写一篇文章总结一下这个问题心愿对你有用。如果感觉还不错, 记得加个关注点个赞哦

思维导图

常见的主从架构

随着日益增长的访问量,单台数据库的能力曾经顾此失彼。因而采纳主库写数据,从库读数据这种将读写分来到的主从架构便随之衍生了进去。

一主一从

一主多从

一主一从和一主多从是最常见的主从架构,施行起来简略并且无效,不仅能够实现高可用,还能读写拆散,进而晋升集群的并发能力。

多主一从

双主复制

级联复制

主从同步原理

想要理解主从同步原理,首先得记住两个很重要的日志文件

  • binlog(二进制日志文件)
  • relay log(中继日志文件)

主从同步过程

  • 从库生成两个线程,一个 I / O 线程,一个 SQL 线程;
  • i/ o 线程去申请主库 的 binlog,并将失去的 binlog 日志写到 relay log(中继日志)文件中;
  • 主库会生成一个 log dump 线程,用来给从库 i/ o 线程传 binlog
  • SQL 线程,会读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作统一,而最终数据统一;

    如何判断主从是否延时

    通过监控 show slave status 命令输入的 Seconds_Behind_Master 参数的值来判断:

  • NULL,示意 io_thread 或是 sql_thread 有任何一个产生故障;
  • 0,该值为零,示意主从复制良好;
  • 正值,示意主从曾经呈现延时,数字越大示意从库提早越重大。

主从提早起因

随机重放

MySQL 的主从复制都是单线程的操作,主库对所有 DDL 和 DML 产生的日志写进 binlog,因为 binlog 是程序写,所以效率很高。Slave 的 SQL Thread 线程将主库的 DDL 和 DML 操作事件在 slave 中重放。DML 和 DDL 的 IO 操作是随机的,不是程序的,老本高很多。所以 SQL Thread 线程的速度赶不上主库学 binlog 的速度,就会产生主从提早

锁期待

另一方面,因为 SQL Thread 也是单线程的,当主库的并发较高时,产生的 DML 数量超过 slave 的 SQL Thread 所能解决的速度,或者当 slave 中有大型 query 语句产生了锁期待那么延时就产生了。

主从提早解决办法

并行复制

既然 SQL 单线程进行重放时速度无限,那么能不能采纳多线程的形式来进行重放呢?MySQL 5.6 版本后,提供了一种并行复制的形式,通过将 SQL 线程转换为多个 work 线程来进行重放,这样就解决了主从提早的问题

升高并发

如果你了解了随机重放这个导致主从提早的起因,那么就比拟好了解了,管制主库写入的速度,主从提早产生的概率天然就小了。

读主库

如果你做的是相似领取这种对实时性要求十分高的业务,那么最间接的办法就是间接读主库。

几句唠叨

大家好,我是小饭,一枚后端工程师。如果感觉文章对你有一点点帮忙,欢送分享给你的敌人,也给小饭点个赞,上面是我的公众号,感兴趣能够关注,这是小饭坚持下去的能源,谢谢大家,咱们下次见!

正文完
 0