吐血整理!java面试中经常被问到的问题「建议收藏」
2023-06-13 09:12:14 时间
大家好,又见面了,我是你们的朋友全栈君。
主备同步的实现原理
我们先来了解一下主备同步的原理,下面以一个update语句来介绍主库与备库间是如何进行同步的。
上图是一个update语句在节点A执行,然后同步到节点B的完整流程图,具体步骤有:
- 主库接受到客户端发送的一条update语句,执行内部事务逻辑,同时写binlog。
- 备库通过 change master 命令,设置主库的IP、端口、用户名和密码,以及要从哪个位置开始请求 binlog。这个位置包含文件名和偏移量。
- 在备库上执行start slave命令,启动两个线程 io_thread 和 sql_thread,其中 io_thread 负责与主机进行连接。
- 主库校验完用户名和密码,按照接收到的位置去读取binlog,发给备库。
- 备库接收到binlog后,写到本地文件(relay log,中转文件)。
- 备库读取中转文件,解析出命令,然后执行。
主备同步的工作原理其实就是一个完全备份加上二进制日志备份的还原。不同的是这个二进制日志的还原操作基本上是实时的。
备库通过两个线程来实现同步:
- 一个是 I/O 线程,负责读取主库的二进制日志,并将其保存为中继日志。
- 一个是 SQL 线程,负责执行中继日志。
从上面的流程可以看出,主备同步的关键是binlog。
常见的两种主备切换流程
M-S结构
M-S结构,两个节点,一个当主库、一个当备库,不允许两个节点互换角色。
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。
当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。
双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,如果是自己的就丢掉。
解决后的流程:
- 业务逻辑在节点A执行更新,会生成带有节点A的server-id的binlog。
- 节点B接受到节点A发过来的binlog,并执行完成后,会生成带有节点A的server-id的binlog。
- 节点A接受到binlog后,发现是自己的,就丢掉。死循环就在这里断掉了。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156274.html原文链接:https://javaforall.cn
相关文章
- java数组和list转换_js将数组转换成字符串
- JAVA三元运算符_java中三元运算符详解
- java数组反转,Java数组反转
- java高级工程师面试情景题_Java高级工程师面试题III
- 8年经验面试官详解 Java 面试秘诀
- java单例模式_Java单例模式
- 反应java程序并行机制的特点_Java语言具有许多优点和特点,下列选项中能反映Java程序并行机制特点的是()。…[通俗易懂]
- java出现中文乱码_JAVA中文显示乱码问题「建议收藏」
- java开发常用四大框架_大牛经验!常用的5款Java框架汇总[通俗易懂]
- java中文乱码_Java中文乱码问题的解决方案[通俗易懂]
- java面试强基(2)
- 【说站】java中Class类的概念介绍
- 剑指java面试offer直通车_面试后一般多久给offer
- JAVA string转map_java怎么转业务
- Java测试工程师技术面试题库【持续补充更新】
- 面试java架构师问哪些问题_架构师面试题
- 全网首发“Java面试考点大全”,20+互联网公司,应有尽有
- Java财务在线咨询网站系统财务咨询网代理记账系统
- Java程序员面试中的多线程问题详解编程语言
- java中最常用jar包的用途详解编程语言
- Java问题-java进程占用内存过高,排查原因详解编程语言
- MySQL连接Java:一步一步实现连接(mysql连接java)
- Linux下部署Java项目实践(linux部署java项目)
- 连接高效完成Java面试:掌握Oracle连接知识(java面试oracle)
- 操作Redis Java操作实现过期时间调整(redisjava过期)
- Java和Redis的配合安装方法(java redis安装)
- Java应用在Linux上乱码的原因及解决方法(java linux乱码)