一次tddl-sequence问题的排查
背景
在测试环境,有个同事发现了一个ID插入的时候报了主键冲突。这是一件很奇怪的事情,在大家的理解中,使用了Sequence功能,每个节点的内存拿的ID段应该都是不同的,不可能会出现这个问题。不然这又要颠覆认知了~
思考
- 是否有人手动插入了一条数据,然后出入的时候手动设置了
ID呢? - 是否有人手动调整了
Sequence的value呢? - 为什么数据库还存在了
ID相同,但在不同表的数据呢?是不是多线程写的有毛病啊?
初步排查
- 确认没有人手动插入
ID,都是用程序获取的方式; - 那有时间与精力去手动设置
Sequence的value啊,确实谁去没事儿管这个; - 数据
ID相同数据在不同表,明显是2台不同的项目Node导致的。
总结:确定问题出现了2台机器获取的Sequence的value范围冲突了。
问题表现出来的确实如此,难道真的要颠覆我们的认知吗?因为问题算比较严重,所以非常的重视。一定要找到问题的原因所在!
具体排查
此时,我们发现代码有一处调整过,就是配置TDDL的Sequence的innerStep(内部步长),由原来的1000调整为5000。为什么调整大了,是因为在数据迁移的时候,数据量很大,减少由于ID扩容对数据库操作的时间(其实在这里,可以看出这位开发同学已经非常优秀了,其他地方也一定会非常的注意性能的设计)。
