1、回环问题的产生
数据回环的产生如上图所示,数据从A实例通过数据组件到B实例之后,又会从B实例回到A实例,从而形成了数据同步环的问题。
2、解决方案
要解决数据回环的问题,主要的思路就是能给同步组件产生的binlog打标,用来标记binlog是同步组件写入的。binlog的打标通常有两种方案,具体的方案如下:
a、同步数据写到对端时, 同一个事务带上一个特定操作,对向链路识别这个操作,决定整个事务是否同步
同步组件在写入目标端库的时候会带上一个特殊的操作逻辑,用来识别是否同步,如果识别到了这种标记就中断同步
优点:通用,什么版本的mysql都支持
缺点:会有一点mysql的binlog冗余
实践:otther(阿里的开源双向同步组件),解决双向同步回环问题用的就是这种模式。
b、依赖数据库自身提供的防回环机制(比如 MySQL GTID),同步工具做相应动作
GTID:集群内事务唯一ID,GTID=server_uuid:transaction_id
自动GTID生成:
手动设置GTID:
凡是由同步组件更新的数据都会将GTID设置成源端的GTID,这样再反向链路中就可以通过gtid中的server_id数据判断出是否需要同步了
优点:没有额外的binlog数据产生
确定:mysql数据库版本必须要支持gtid
实践:cloud-canal (商业版本的同步组件),解决双向同步回环问题用的就是这种模式。