一个有趣的BUG(精度问题)

在ES数据迁移过程中,使用elasticdump工具时遇到一个长度较大的ID精度丢失问题。经过排查,发现原因是JS遵循IEEE754规范,超过一定数值范围后会出现精度丢失。解决方案是在elasticdump导出命令中添加--support-big-int参数。此外,文章还提到了千年虫问题和2038年问题这两个与精度相关的经典BUG。
摘要由CSDN通过智能技术生成

最近在协助团队完成 ES 数据的切换(业务数据迁移),过程中遇到一个比较好玩的 BUG ,和大家分享并作为经验记录。

01 问题发现过程

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值