研发4面真题解析(Java岗):java中文乱码解决方法

主备同步的实现原理

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

研发4面真题解析(Java岗):java中文乱码解决方法

上图是一个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结构,两个节点,一个当主库、一个当备库,不允许两个节点互换角色。

研发4面真题解析(Java岗):java中文乱码解决方法

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

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

双M结构

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

研发4面真题解析(Java岗):java中文乱码解决方法

对比前面的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后,发现是自己的,就丢掉。死循环就在这里断掉了。

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

提供【免费】的Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

Java全套进阶资料点这里免费领取

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
研发4面真题解析(Java岗):java中文乱码解决方法

上一篇:docker 安装mysql 并挂载数据 配置文件,并且设置主从复制


下一篇:MySQL Binlog解析工具MaxWell详解