提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
之前做一个项目,查询mysql性能较差,于是考虑将数据同步到es,改为查询es提高效率。
于是就有了从mysql到es同步数据的事,采用的思路是先查询出mysql数据表总数,然后分页同步到es。
同步完成后,发现有部分数据丢失,丢失的基本是比较近期的数据。
有一个情况是mysql表的数据是一直有一个定时任务在增加新数据,5分钟执行一次;表的主键不是整型,是字符串。这个问题造成了这个bug。
一、原因分析
定时任务5分钟执行一次,第一次全量同步的时候,采用分页查询同步,而数据量比较大,大约在30分钟到1个小时时间,5分钟没有执行完,下一次的定时任务又开始执行,数据库又同步了新数据,而分页还是按照之前的总数,造成数据缺失。
如果新数据是插入到数据库尾部,就不会影响到分页的情况,增量更新时就可以补充上。但是!
由于主键是字符串,字符串比较大小排序插入,字符串比较大小的规则是从第一个字符挨个比较,没有管长度,有可能主键的长度更长而第一个字符更小,所以插入有可能插入到了中间,造成尾部缺失。
二、解决方法
不以主键维度进行分页,最后选择一直会单向增长的字段,比如更新时间