Elasticsearch从2.x升级至5.6后,升级6.x前重索引相关问题咨询
嘿,我来帮你把这些问题捋明白!
什么是Elasticsearch重索引?
重索引本质上就是把现有旧索引里的数据,按照适配Elasticsearch 6.x的新索引结构(比如映射规则、字段类型、索引设置等),重新写入到新的索引中。
为啥要做这个?因为ES从5.x到6.x有不少破坏性的变更:比如单索引只能有一个_type(6.x开始逐步废弃多类型)、某些字段类型(比如string拆分text和keyword)的兼容性调整、映射参数的变更等。旧索引的结构大概率不符合6.x的要求,直接升级实例会导致数据无法正常读取或写入,所以必须通过重索引完成数据结构的适配迁移。
要不要用自己的数据生成脚本?
如果你的脚本能生成完全符合6.x索引规范的全量数据,那直接删除旧索引、用脚本重新导入,确实和重索引的最终效果类似。但这里有两个关键点要权衡:
- 若你的业务有实时写入,直接删旧索引会有数据丢失风险;而重索引可以在不中断服务的情况下逐步同步(比如先后台同步旧数据,再同步增量,最后切换流量到新索引)。
- 脚本重新导入可能耗时更长——尤其是数据量很大时,你需要重新生成所有数据再导入;而重索引是ES内部直接复制数据,省去了外部生成的环节,效率更高。
要不要为所有索引执行_reindex?
没错,所有要迁移到6.x的旧索引都需要执行重索引操作,因为每个旧索引的结构都可能存在6.x不兼容的点(比如多_type、过时的字段类型)。不过不用一个个单独执行,你可以用批量重索引的方式一次性处理多个:
比如这个POST请求,就能批量把多个旧索引迁移到对应前缀的新索引(注意要提前创建好符合6.x规范的新索引映射哦):
POST _reindex { "source": { "index": ["old_index_1", "old_index_2", "old_index_3"] }, "dest": { "index": "new_{index}" } }
有没有更快的工具完成重索引?
如果数据量很大,原生的_reindex API速度可能不够,推荐这几个工具:
- Logstash:用Logstash的
elasticsearch输入插件读取旧索引,elasticsearch输出插件写入新索引,通过调整批量大小、线程数等参数,可以大幅提升迁移速度,适合大规模数据迁移。 - elasticsearch-dump:轻量的开源命令行工具,操作简单,适合中小规模数据。示例命令如下:
elasticdump --input=http://old-es-host:9200/old_index --output=http://new-es-host:9200/new_index --type=data - ES官方Reindex Helper:官方提供的辅助工具,能帮你批量管理重索引任务,还能实时监控迁移进度,适合生产环境的规范化操作。
最后提醒下:不管用哪种方式,一定要先在测试环境验证数据完整性和兼容性,没问题再在生产环境执行哦!
内容的提问来源于stack exchange,提问作者hukachaka
相关产品推荐
相关产品推荐

