概念描述

当MySQL搭建双主模式的复制架构,节点 A 上更新了一条语句,然后再把生成的 binlog 发给节点 B,节点 B 执行完这条更新语句后也会生成 binlog。

  • 在B节点生成binlog的同时会不会将数据同步回给A节点,A节点如何判定数据是否已经被应用。
  • 如何解决两个节点循环复制的问题

解决方案:

当主节点A发现从节点B同步过来的binlog日志信息时会判断server_id的值,如果当server_id与自己的相同时则不会进行日志的应用将日志丢弃,如果发现与自己的serve_id不同时则会应用此部分信息。这样就解决循环复制产生的问题。

测试验证

实验环境:

mysql两台实例版本8.0,双主架构A,B节点互为主从
A节点ip:172.16.243.129
B节点ip:172.16.243.130

MySQL双主模式循环复制 - 知识贴_知识贴

MySQL双主模式循环复制 - 知识贴_知识贴_02


测试流程:

1.对A节点进行数据的插入修改,A节点binlog进行写入

MySQL双主模式循环复制 - 知识贴_知识贴_03

这里binlog中记录了A节点的server_id为 243129.我们在登陆B节点查看B节点生成的binlog日志

MySQL双主模式循环复制 - 知识贴_双主_04

这里B节点也生成了相同的数据,但是B节点的binlog中日志对应的server_id为A节点的server_id

3.同样我们在B节点进行插入数据

MySQL双主模式循环复制 - 知识贴_知识贴_05

这里在B节点插入数据后生成的server_id则为B节点的server_id为243130

4.在次查看A节点的binlog

MySQL双主模式循环复制 - 知识贴_知识贴_06

这里发现B节点插入的数据已经同步到了A节点,但是server_id为B节点的server_id

知识总结

通过上述实验分析得出结论:
1.在搭建主从关系时,两个节点的server_id必须不同(基本设置)。

2.如果A节点在进行数据修改生成binlog的同时同步到B节点,B节点的binlog内生成的信息中也是A节点的server_id信息。

3.所以当双主模式下,当主节点A发现从节点B同步过来的binlog日志信息时会判断server_id的值,如果当server_id与自己的相同时则不会进行日志的应用将日志丢弃,如果发现与自己的serve_id不同时则会应用此部分信息。这样就解决循环复制产生的问题。