MySQL slave状态之Seconds_Behind_Master

MySQL slave状态之Seconds_Behind_Master

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

        在MySQL的主从环境中,我们能够通过在slave上运行show slave status来查看slave的一些状态信息,当中有一个比較重要的參数Seconds_Behind_Master。那么你是否明确它的真正含义以及它是怎么计算的呢?

        在之前我一直误以为Seconds_Behind_Master是表示slave比master落后多少,假设这个值为0的表示主从已经处于一致了(在非同步模式下,如今官方最多也仅仅在5.5中添加�了半同步复制)。可是近期我最终认识到之前的错误理解。首先我们须要明确的一点:Seconds_Behind_Master表示slave上SQL thread与IO thread之间的延迟,我们都知道在MySQL的复制环境中,slave先从master上将binlog拉取到本地(通过IO thread),然后通过SQL thread将binlog重放,而Seconds_Behind_Master表示本地relaylog中未被运行完的那部分的差值。手冊上的定义:

In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread.

所以假设slave拉取到本地的relaylog(实际上就是binlog,仅仅是在slave上习惯称呼relaylog而已)都运行完,此时通过show slave status看到的会是0,那么Seconds_Behind_Master的值为0是否表示主从已经处于一致了呢?答案差点儿是否定的!为什么差点儿是否定的?由于绝大部分的情况下复制都是异步的,异步就意味着master上的binlog不是实时的发送到slave上,所以即使Seconds_Behind_Master的值为0依旧不能肯定主从处于一致,这也是我之前强调非同步复制的原因(如今已经有公司在做同步复制了,比方网易自己实现了VSR,VirtualSynchronized Replication,由于同步复制性能较差,所以网易再实现同步复制的同一时候还打了group commit的补丁)。所以假设我们要以这个參数来预计主从延迟多久的话至少得在一个比較好的网络环境中,这样才干保证差点儿master上的binlog都已经发送到slave上。

        上面解释了Seconds_Behind_Master这个值的真正含义,那么它的值究竟是怎么计算出来的呢?实际上在binlog中每一个binlog events都会附上运行时的timestamp,所以在在确定Seconds_Behind_Master的值时MySQL是通过比較当前系统的时间戳与当前SQL thread正在运行的binlog event的上的时间戳做比較,这个差值就是Seconds_Behind_Master的值。或许你会有疑问那要是两台server之间的时钟不一致怎么办?确实会存在这样的情况,那么此时这个值的可靠性就不大了,手冊上对此也进行了说明:

This time difference computation works even if the master and slave do not have identical clock times, provided that the difference,
computed when the slave I/O thread starts, remains constant from then on. Any changes—including NTP updates—can lead to clock
skews that can make calculation of Seconds_Behind_Master less reliable

        Seconds_Behind_Master的值除了是非负数之外还可能是NULL,它是由例如以下几种情况导致的:SQL thread没执行/IO thread没执行/slave没有连接到master。

        接下来再简介一下异步复制/半同步复制之间的差别。

        异步复制,master上的操作记录binlog的同一时候不关心binlog是否已经被slave接收。

        半同步复制,master上的操作记录binlog的同一时候会关心binlog是否被slave接受。可是因为它的处理逻辑问题可能丢一个事务,例如以下图所看到的:

MySQL slave状态之Seconds_Behind_Master

这种处理流程存在一个问题,当存储引擎提交(storage commit)后,此时假设master挂了那么会存在主从不一致,对于这个问题orczhou好像自己对源代码进行了改动更改storage commit的顺序来达到一个增强的半同步复制。

        对Seconds_Behind_Master就解释到这里,希望对你也能有点帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118944.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cubieboard + busybox 打造mini系统「建议收藏」

    cubieboard + busybox 打造mini系统「建议收藏」本文打造一个迷你的LINUX系统,讲述了arm嵌入式设备的常用方法和过程。适合新手入门,当然最好还是知道什么是交叉编译,和懂得linux的基本命令。先说说大致的思路,要在cubieboard板子上跑起来一个linux需要四大件:uboot,script-bin,linux内核(uImage),rootfs(这个我们自己做)前面3个已经很多人写过相关的文章了,我们不厌其烦的也多做一遍

    2022年7月22日
    12
  • setfacl命令基本用法[通俗易懂]

    setfacl命令基本用法[通俗易懂]setfacl命令可以用来细分linux下的文件权限。chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。换句话说,setfacl可以更精确的控制权限的分配。比如:让某一个用户对某一个文件具有某种权限。这种独立于传统的u,g,o的rwx权限之外的具体权限设置叫ACL(AccessControlList)ACL可以针

    2022年6月16日
    46
  • burp suite使用教程(抓包,截包,改包)

    burp suite使用教程(抓包,截包,改包)1.浏览器代理设置(以Chrome为例)设置局域网(LAN)设置,地址写127.0.0.1端口:随便(不冲突且在端口范围即可)。2.burpsuite监听设置。proxy–options–add(添加代理与上边浏览器设置的一致即可。最后记得勾上代理设置即可)3.抓包如下图:拦截了一个请求,可以通过按钮Forward(放行请求),Drop(弃掉拦截)。R…

    2022年6月11日
    437
  • Java 中初始化 List 集合的 6 种方式!「建议收藏」

    Java 中初始化 List 集合的 6 种方式!「建议收藏」Java 中初始化 List 集合的 6 种方式!

    2022年4月21日
    48
  • 关于UNPIVOT 操作符

    关于UNPIVOT 操作符

    2021年11月25日
    40
  • python控制灯_树莓派python编程 做一个LED呼吸灯「建议收藏」

    呼吸灯概述上一篇我们通过控制GPIO口输出高低电平来控制一只LED的亮灭。这次我们来控制LED的亮度,灯由暗渐渐变亮,再由亮渐渐边暗,反复循环,也就是呼吸灯的效果。按Ctrl+C结束程序。通过本节课,你能学习到:脉冲宽度调制技术所需硬件树莓派x1面包板x1杜邦线x2LED灯x1名称解释我们知道,通过LED的电流越大,LED越亮,电流越小,LED越暗。如果可以控制输出电流大小就可…

    2022年4月16日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号