吐血整理!java面试中经常被问到的问题「建议收藏」

吐血整理!java面试中经常被问到的问题「建议收藏」主备同步的实现原理我们先来了解一下主备同步的原理,下面以一个update语句来介绍主库与备库间是如何进行同步的。上图是一个update语句在节点A执行,然后同步到节点B的完整流程图,具体步骤有:主库接受到客户端发送的一条update语句,执行内部事务逻辑,同时写binlog。备库通过changemaster命令,设置主库的IP、端口、用户名和密码,以及要从哪个位置开始请求binlog。这个位置包含文件名和偏移量。在备库上执行startslave命令,启动两个线程io_thread

大家好,又见面了,我是你们的朋友全栈君。

主备同步的实现原理

我们先来了解一下主备同步的原理,下面以一个update语句来介绍主库与备库间是如何进行同步的。

主备同步流程图

上图是一个update语句在节点A执行,然后同步到节点B的完整流程图,具体步骤有:

  1. 主库接受到客户端发送的一条update语句,执行内部事务逻辑,同时写binlog。
  2. 备库通过 change master 命令,设置主库的IP、端口、用户名和密码,以及要从哪个位置开始请求 binlog。这个位置包含文件名和偏移量。
  3. 在备库上执行start slave命令,启动两个线程 io_thread 和 sql_thread,其中 io_thread 负责与主机进行连接。
  4. 主库校验完用户名和密码,按照接收到的位置去读取binlog,发给备库。
  5. 备库接收到binlog后,写到本地文件(relay log,中转文件)。
  6. 备库读取中转文件,解析出命令,然后执行。

主备同步的工作原理其实就是一个完全备份加上二进制日志备份的还原。不同的是这个二进制日志的还原操作基本上是实时的。

备库通过两个线程来实现同步:

  • 一个是 I/O 线程,负责读取主库的二进制日志,并将其保存为中继日志。
  • 一个是 SQL 线程,负责执行中继日志。

从上面的流程可以看出,主备同步的关键是binlog。

常见的两种主备切换流程

M-S结构

M-S结构,两个节点,一个当主库、一个当备库,不允许两个节点互换角色。

M-S结构

在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。

当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。

双M结构

双M结构,两个节点,一个当主库,一个当备库,允许两个节点互换角色。

双M结构

对比前面的M-S结构图,可以发现,双M结构和M-S结构,其实区别只是多了一条线,即节点A和B之间总是互为主备关系。这样在切换的时候就不用再修改主备关系。

双M结构的循环复制问题

在实际生产使用中,多数情况是使用双M结构的。但是,双M结构还有一个问题需要解决。

业务逻辑在节点A执行更新,会生成binlog并同步到节点B。节点B同步完成后,也会生成binlog。(log_slave_updates设置为on,表示备库也会生成binlog)。

当节点A同时也是节点B的备库时,节点B的binlog也会发送给节点A,造成循环复制。

解决办法:

  • 设置节点的server-id,必须不同,不然不允许设置为主备结构
  • 备库在接到binlog后重放时,会记录原记录相同的server-id,即谁产生即为谁的。
  • 每个节点在接受binlog时,会判断server-id,如果是自己的就丢掉。

解决后的流程:

  1. 业务逻辑在节点A执行更新,会生成带有节点A的server-id的binlog。
  2. 节点B接受到节点A发过来的binlog,并执行完成后,会生成带有节点A的server-id的binlog。
  3. 节点A接受到binlog后,发现是自己的,就丢掉。死循环就在这里断掉了。

读者福利

读到这的朋友还可以免费领取一份收集的Java进阶知识笔记和视频资料。

资料免费领取方式:关注后,点击这里即可免费领取

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

中…(img-WatDK5fS-1625425731834)]

[外链图片转存中…(img-0MpJwTTO-1625425731835)]

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

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

(0)
上一篇 2022年7月9日 上午7:46
下一篇 2022年7月9日 上午8:00


相关推荐

  • 局域网vlan配置步骤_局域网vlan划分案例

    局域网vlan配置步骤_局域网vlan划分案例计算机网络技术的发展犹如戏剧舞台,你方唱罢我登台。从传统的以太网(10Mb/s)发展到快速以太网(100Mb/s)和千兆以太网(1000Mb/s)也不过几年的时间,其迅猛的势头实在令人吃惊。而现在中大型规模网络建设中,以千兆三层交换机为核心的所谓“千兆主干跑、百兆到桌面”的主流网络模型已不胜枚举。现在,网络业界对“三层交换”和VLAN这两词已经不感到陌生了。一、什么是三…

    2026年1月21日
    2
  • 传统图像降噪算法之BM3D原理详解

    传统图像降噪算法之BM3D原理详解       图像降噪是一个十分具有实用价值的研究方向,因为噪声总是无处不在的。当处于比较昏暗的环境时,噪声将极大地影响着我们所拍摄的图像。如今,随着深度学习算法以及相关硬件的不断发展,深度卷积网络同样在图像降噪领域占据了主流,并且代表了该领域最优异的成绩。但是,深度神经网络同样有着其缺点,例如模型过于庞大而计算复杂度过高,以及缺乏一些理论上的解释性,当然这些缺点正不断地得到弥补。为了更好地理解图像降噪的基本原理,我们有必要回过头来仔细研

    2022年6月7日
    47
  • 数据结构之循环链表建议收藏

    一循环链表基础在单链表中,有了头结点,我们可以在O(1)时间访问到第一个节点,但如果要访问最后一个节点却需要O(n)的时间,因为我们需要对整个链表进行一次遍历。在循环链表中,我们可以借助尾节点来实

    2021年12月19日
    42
  • linux安装svn服务器的两种方式

    linux安装svn服务器的两种方式操作环境:CentOS7.264位==============第一种:采用压缩包安装:比如你们公司服务器上安装软件有自己的规定,一般会采用压缩包安装。==============第一步:SVN服务器端压缩包下载下载地址:http://mirrors.cnnic.cn/apache/subversion/ 我下载的是subversion-1.8.19版本,下载好的压缩包置于目录/usr/loc…

    2022年7月19日
    19
  • opencv中scalar_opencv ffmpeg

    opencv中scalar_opencv ffmpegMat类中的Scalar()成员有什么用呢?先不急着看资料,看下有什么结果出现吧:先将里边的值设为0[html]viewplaincopy#include<opencv2/core/core.hpp>#include<opencv2/imgproc/imgproc.hpp&a

    2026年4月13日
    5
  • pycharm返回上一次编辑或者光标的地方

    pycharm返回上一次编辑或者光标的地方返回上次编辑的地方 ctrl shift backspace 删除返回上次光标

    2025年9月25日
    6

发表回复

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

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