背景:
使用search_after采集千万级数据
解决办法
使用search_after采集需要指定一个或多个sort字段,我的初步方案是用一个精度是毫秒的时间戳字段,经过测试后发现会漏采集数据,原因是毫秒级的时间戳在千万级的数据之下会出现多个doc时间戳相同的情况,在采集这些相同的doc时就会出现漏采集数据的现象,因为sort值是根据时间戳来排序的,但是时间戳在这种情景下并不是一个唯一意义的字段,因此不能用这个字段。第二个解决办法是使用_id作为sort字段,经过测试后发现这种方式确实不会丢数据,但是tps很低,只有1600,不满足采集需求。第三个解决办法是在数据中加一个严格递增的字段,经过测试后,这种办法可以有效解决漏采集和低tps的问题,但是在真实生产环境中,很难维护一个严格递增的字段,因此这种方式也不适合,最后去官方文档找到了目前这种解决办法,使用date_nanos类型的时间戳,这个类型的时间戳是es的一个纳秒级的时间戳,能够满足需求,经过测试,使用这种方式,在并行度为一的情况下采集的tps为11000左右。采集一千万条数据需要15分钟左右。如果加并行度的话,这个时间会更短,能够较好的解决当前问题。
注意点:
采集的es数据mapping如下,纳秒值时间戳必须要有format,否则会报错: