运行环境
- DB1 <-> DB2,双向同步(非双 A,已关闭数据一致性)
- DB1 有数据写入,DB2 无数据写入
- MySQL 5.7
问题描述
我们使用 otter
进行双向同步时,发现有数据版本回退的情况;同时,在 DB2 -> DB1
这条 pipeline
上, I
/ U
/ D
不为 0,呈持续增长的态势。
解析两侧的 binlog
后,整理出一条数据的生命周期,大致如下:
ID | SQL Type | DB1 | DB2 |
---|---|---|---|
1 | INSERT | col=1, update_time='2020-05-12 10:00:01' | |
2 | UPDATE | col=2, update_time='2020-05-12 10:00:02' | |
3 | INSERT INTO ... ON DUPLICATE KEY UPDATE | col=1, update_time='2020-05-12 10:00:01' | |
4 | UPDATE | col=2, update_time='2020-05-12 10:00:02' | |
5 | INSERT INTO ... ON DUPLICATE KEY UPDATE | col=1, update_time='2020-05-12 10:00:01' |
其中,3、4、5 均有 retl_mark
相关的事务标记。
个人思考
DB2
侧没有数据写入,那么DB2 -> DB1
这条pipeline
的I
/U
/D
应该始终为 0。- 双向同步中,
otter
为了避免回环,会在事务前后嵌入额外的标识,用于判断是否需要进行同步。由此可知,只要本侧的binlog
中出现了这样的event
,说明该事务是由对端同步过来的。
根据这 2 点,结合我们的看到现象,原因似乎是双向回环的判断机制不完善,导致部分数据重复同步。
请问,具体原因是什么?我们该如何解决?谢谢!
1条答案
按热度按时间watbbzwu1#
那个版本的otter啊?