otter 疑似双向回环控制失效

qyswt5oh  于 2022-10-25  发布在  其他
关注(0)|答案(1)|浏览(139)

运行环境

  • DB1 <-> DB2,双向同步(非双 A,已关闭数据一致性)
  • DB1 有数据写入,DB2 无数据写入
  • MySQL 5.7

问题描述

我们使用 otter 进行双向同步时,发现有数据版本回退的情况;同时,在 DB2 -> DB1 这条 pipeline 上, I / U / D 不为 0,呈持续增长的态势。
解析两侧的 binlog 后,整理出一条数据的生命周期,大致如下:

IDSQL TypeDB1DB2
1INSERTcol=1, update_time='2020-05-12 10:00:01'
2UPDATEcol=2, update_time='2020-05-12 10:00:02'
3INSERT INTO ... ON DUPLICATE KEY UPDATEcol=1, update_time='2020-05-12 10:00:01'
4UPDATEcol=2, update_time='2020-05-12 10:00:02'
5INSERT INTO ... ON DUPLICATE KEY UPDATEcol=1, update_time='2020-05-12 10:00:01'

其中,3、4、5 均有 retl_mark 相关的事务标记。

个人思考

  1. DB2 侧没有数据写入,那么 DB2 -> DB1 这条 pipelineI / U / D 应该始终为 0。
  2. 双向同步中, otter 为了避免回环,会在事务前后嵌入额外的标识,用于判断是否需要进行同步。由此可知,只要本侧的 binlog 中出现了这样的 event ,说明该事务是由对端同步过来的。

根据这 2 点,结合我们的看到现象,原因似乎是双向回环的判断机制不完善,导致部分数据重复同步。

请问,具体原因是什么?我们该如何解决?谢谢!

相关问题