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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQLldr_乔羽简介

    SQLldr_乔羽简介1.SQLLDR导入 1.1 简介 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。 2.2 语法和参数语法:SQLLDRkeyword=value[,keyword=value,…];…

    2022年4月19日
    38
  • BufferedWriter写int型数据

    BufferedWriter写int型数据在做项目的过程中遇到用BufferedWriter.writer(…)写文件的,但是在写入int型数据时是乱码。在翻阅了API后发现,BufferedWriter.writer(intc)方法写的不是一个int型数据,而是一个character型数据:因此,在用BufferedWriter.writer写数据的时候,如果要写int型数据,可以先把它转成String型的数据,这样就

    2022年6月10日
    47
  • Django(20)ORM模型迁移命令

    Django(20)ORM模型迁移命令迁移命令makemigrations:将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中。这个命令有以下几个常用选项:app_label:后面可

    2022年7月30日
    5
  • java8 HashMap数据结构实现源码解析

    目录一、基础元素Node二、红黑树元素TreeNode1、类定义和类属性2、基础方法:3、红黑树插入元素实现4、红黑树的查找实现5、红黑树的形态转换实现6、红黑树的扩容切分实现一、基础元素NodestaticclassNode<K,V>implementsMap.Entry<K,V>{//key的ha…

    2022年4月8日
    45
  • 电赛 | 循迹小车(省电赛一等奖作品)

    电赛 | 循迹小车(省电赛一等奖作品)点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!往期资料==菜单栏下有更多资料资源分享|嵌入式相关资源分享|编程语言类资源分享|Linux相关资料资源…

    2022年6月5日
    49
  • java二维数组行列互换_java 二维数组行列互换[通俗易懂]

    java二维数组行列互换_java 二维数组行列互换[通俗易懂]代码需求:对等行等列的二维数组进行行列的互换分析过程主对角线是保持不变行列互换即角标互换:[0][1]=>[1][0]循环次数:外层循环行,内层循环每一行的列示意图代码实现publicclassArrayReverse{publicstaticvoidmain(String[]args){intarry[][]=newint[][]{{1,2,3},{4,5…

    2022年5月22日
    84

发表回复

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

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