Elasticsearch 6+使用elasticdump指定offset迁移数据报错如何解决
elasticdump 高版本ES断点续传解决方案
报错原因
Elasticsearch 6.0+ 不再允许在scroll查询上下文里使用from参数,而elasticdump默认启用scroll模式拉取数据,你传入的--offset参数会被自动转为ES的from参数,因此触发报错。
解决方案
方案1:使用searchBody按字段过滤(推荐,适合动态业务索引)
这是最适合持续写入的业务系统的方案,不会出现数据重复/遗漏问题:
- 确保索引存在可排序的唯一递增字段,通常用
@timestamp(文档创建时间)、文档_id或者ES内置的_doc排序字段 - 记录上一次导出的最后一条文档的对应字段值,比如上次导出的最新一条文档的创建时间为
2021-11-22T15:00:00.000Z - 执行带过滤条件的导出命令:
elasticdump --headers='{"Content-Type": "application/json"}' \ --input=http://localhost:9200/sessions2-020228 \ --output=/usr/share/elasticsearch/dump/sessions2-020228.json \ --type=data \ --searchBody '{"query":{"range":{"@timestamp":{"gt":"2021-11-22T15:00:00.000Z"}}}}'
命令里的gt表示仅导出大于该时间戳的文档,也就是上次导出之后新增和未导出的所有数据。
方案2:关闭scroll模式使用offset(仅适合静态小索引)
如果你的索引没有合适的递增字段,且导出期间不会有新数据写入,可以关闭scroll模式让offset参数生效:
elasticdump --headers='{"Content-Type": "application/json"}' \ --offset=2 \ --input=http://localhost:9200/sessions2-020228 \ --output=/usr/share/elasticsearch/dump/sessions2-020228.json \ --type=data \ --scrollTime=null
部分版本的elasticdump也支持用--noScroll参数替代--scrollTime=null,效果一致。
注意:该方案仅适用于静态索引,业务持续写入的动态索引用offset会出现位置偏移,导致数据重复或者遗漏,不推荐使用。
长期增量导出建议
每次导出完成后,记录本次导出的最大排序字段值(比如最新的@timestamp),下次导出直接用该值作为过滤条件即可实现稳定的断点续传,不受业务新增数据影响。
内容的提问来源于stack exchange,提问作者Eric-Hoffmann
相关产品推荐
相关产品推荐

