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)
上一篇 2021年11月28日 下午10:00
下一篇 2021年11月28日 下午11:00


相关推荐

  • 学生注册idea_学生证怎么绑定身份证

    学生注册idea_学生证怎么绑定身份证一、安装进入官网下载适合自己系统的版本,下载地址:https://www.jetbrains.com/idea/download/#section=windows安装中选择适合本机的64位(32位)版本,其他一直next即可二、激活成功教程先下载jar包JetbrainsCrack.jar,把它放到你认为合适的文件夹内,我直接放在了安装目录C:\ProgramFiles\JetBrai…

    2026年2月24日
    8
  • 小白保姆教程!GPT-4o制作H5头图详细步骤拆解!

    小白保姆教程!GPT-4o制作H5头图详细步骤拆解!

    2026年3月16日
    2
  • 字节开源Dolphin文档解析模型-部署指南+实战测试

    字节开源Dolphin文档解析模型-部署指南+实战测试

    2026年3月12日
    2
  • read函数的返回值问题

    read函数的返回值问题Read函数读取字符串返回值的问题1.前言在学习socket编程的途中,通过客户端给服务端发送字符串,然后服务端通过read或者recv来读取数据,然后返回读取的字节数.我在想read返回的读取字节数有没有包含’\0’或者’\n’呢,于是通过一些简单的小例子,来看看实际情况到底如何.2.read函数我们来看一下read函数的原型:ssize_tread(intfd,void…

    2022年6月22日
    98
  • vmware虚拟机重装系统_ubuntu下安装虚拟机

    vmware虚拟机重装系统_ubuntu下安装虚拟机VMware下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html下载之后按步骤安装即可。安装完成后需要密钥,这里给出VMwareWorkstationPro16的密钥:YF390-0HF8P-M81RQ-2DXQE-M2UT6ZF71R-DMX85-08DQY-8YMNC-PPHV8密钥输入完成就可永久使用。ubuntu:首先下载Ubuntu的镜像,我下载的是ubuntu

    2025年11月18日
    6
  • java.lang.NullPointerException出现的几种原因以及解决

    java.lang.NullPointerException出现的几种原因以及解决java.lang.NullPointerException出现的几种原因:1、字符串变量未初始化2、接口类型的对象没有用具体的类初始化,比如:Mapmap//会报错Mapmap=newMap();//则不会报错了3、当一个对象的值为空时,你没有判断为空的情况。4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常Stringstr…

    2022年5月20日
    48

发表回复

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

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