如何在不同Elasticsearch环境之间迁移索引数据
Elasticsearch跨环境索引数据迁移方案
完全可以通过ES原生API实现迁移,同时也支持导出后再导入的实现方式,两种常用方案如下:
方案1:原生Reindex API直接迁移(无需中间文件,操作简单)
这是ES官方提供的原生API迁移方案,适合两个环境网络互通的场景,操作步骤如下:
- 提前在验收环境的
elasticsearch.yml配置文件中添加本地集群IP到远程重索引白名单,配置完成后重启验收环境ES生效:reindex.remote.whitelist: ["本地ES节点IP:端口"] - 提前在本地集群查询待迁移索引的Mapping结构,在验收环境提前创建相同结构的目标索引,避免自动生成的Mapping不符合业务预期,查询Mapping的命令为:
GET /本地待迁移索引名/_mapping - 在本地集群执行重索引请求,直接把数据同步到验收环境,数据量大的话可以添加
slices: auto参数开启并行迁移提升速度:POST _reindex?slices=auto { "source": { "index": "本地待迁移索引名" }, "dest": { "index": "验收环境目标索引名", "remote": { "host": "http://验收环境ES节点IP:端口", "username": "验收环境ES有账号认证时填写", "password": "对应认证密码" } } } - 迁移完成后分别在两个环境执行
GET /对应索引名/_count查询文档总数,确认数据一致性即可。
方案2:导出后再导入(适合两个环境网络不通的场景)
小数据量场景(GB级):使用elasticdump工具
- 先安装Node.js环境,再通过npm全局安装elasticdump工具:
npm install elasticdump -g - 从本地环境导出索引的Mapping和数据文件:
# 导出Mapping结构 elasticdump --input=http://本地ES地址:端口/本地索引名 --output=./es_index_mapping.json --type=mapping # 导出全量数据 elasticdump --input=http://本地ES地址:端口/本地索引名 --output=./es_index_data.json --type=data - 把导出的两个json文件拷贝到可访问验收环境的设备上,执行导入命令:
# 导入Mapping结构 elasticdump --input=./es_index_mapping.json --output=http://验收环境ES地址:端口/目标索引名 --type=mapping # 导入全量数据 elasticdump --input=./es_index_data.json --output=http://验收环境ES地址:端口/目标索引名 --type=data
大数据量场景(TB级):使用Snapshot快照API
- 在本地集群创建快照仓库,将待迁移索引的全量快照备份到共享存储/本地目录
- 把快照文件整体拷贝到验收环境可访问的存储位置,在验收环境注册相同的快照仓库
- 直接从快照中恢复对应索引到验收环境即可,迁移效率远高于普通文件导出导入。
注意事项
- 迁移前确认两个环境的ES大版本兼容性,跨大版本迁移建议先做小批量测试验证
- 若ES集群开启了身份认证,所有请求和命令都需要补充对应的认证参数
- 迁移完成后除了校验文档总数,建议抽查部分文档内容确认一致性
内容的提问来源于stack exchange,提问作者spartan712
相关产品推荐
相关产品推荐

