最近在协助团队完成 ES 数据的切换(业务数据迁移),过程中遇到一个比较好玩的 BUG ,和大家分享并作为经验记录。
01 问题发现过程
通过前期的方案设计和比较,我们决定通过 elasticdump 工具来做 ES 的数据迁移,这个也是比较普遍的迁移方案,于是就动手实施了,过程中也没遇到什么问题。在最后的数据验证环节,发现有一个 ID 对应不上了,如下图所示,通过对比工具,发现一个长度较大的 ID 发生了偏移,其他的数据都没有问题。这是为什么呢?一头雾水。
根据二分法的排错思路,我们需要先确认是导出数据的问题,还是导入数据的问题。查看导出过程的中间文件,发现在导出的时候就出现了错误。于是怀疑是 elasticdump 导出功能的问题。因为这个出错的字段,主要的特征就是长度比较长(18 位),于是怀疑是精度的问题。就去查了下 elasticdump 的源码,一番查找后,果然发现有人遇到过同样的问题,并已经修复了这个 BUG,并给出了解决方案和一些猜测的原因。于是这个问题就得到了解决。在 elasticdump 的导出命令中,加上--support-big-int 参数,就可以了。
好像也很简单嘛,不是么。其实排错的过程也走过很多弯路,只是现在回顾起来看着比较