ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

查缺补漏!北京Java培训班

2021-07-12 07:53:25  阅读:191  来源: 互联网

标签:主库 binlog 补漏 同步 Java 主备 查缺 备库 节点


## 主备同步的实现原理 我们先来了解一下主备同步的原理,下面以一个update语句来介绍主库与备库间是如何进行同步的。 ![主备同步流程图](http://www.icode9.com/i/li/?n=2&i=images/20210712/1626046749435134.jpg) 上图是一个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结构](http://www.icode9.com/i/li/?n=2&i=images/20210712/1626046749601914.jpg) 在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。 当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。 ### 双M结构 双M结构,两个节点,一个当主库,一个当备库,允许两个节点互换角色。 ![双M结构](http://www.icode9.com/i/li/?n=2&i=images/20210712/1626046749117378.jpg) 对比前面的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程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考,**需要的可以[戳这里免费领取](https://gitee.com/vip204888/java-p7)**,以下是部分内容截图 ![架构面试专题及架构学习笔记导图.png](http://www.icode9.com/i/li/?n=2&i=images/20210712/1626046749360663.jpg)

标签:主库,binlog,补漏,同步,Java,主备,查缺,备库,节点
来源: https://blog.51cto.com/u_15293085/3037171

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有