AWS ElasticSearch使用Remote reindex API迁移索引报空指针异常
跨版本ES Remote Reindex空指针异常解决方案
根因说明
该空指针是Elasticsearch 7.x版本对接5.x版本执行远程重索引时的已知问题,核心由配置缺失、请求参数不全或版本兼容处理不到位导致。
修复步骤
- 配置目标集群远程重索引白名单
登录7.10版本的目标集群所有节点,修改config/elasticsearch.yml文件,添加以下配置:
修改完成后重启所有目标集群节点,配置生效。# 允许目标集群访问指定的源集群地址 reindex.remote.whitelist: - source.com:443 - 提前创建目标索引
先从源5.3集群导出ind1的索引配置与mapping,适配7.x版本规则(删除自定义type、调整过期字段等)后,提前在目标集群创建ind1索引,避免自动生成的mapping不符合预期。 - 补充请求参数重发reindex请求
5.x到7.x的远程重索引需要补充超时、鉴权字段(即使源集群无鉴权也需留空字段,避免空指针),同时显式指定新旧版本的type做兼容,修改后的请求如下:
如果源集群没有开启身份认证,username和password字段留空即可,不可省略curl -X POST "https://target.com/_reindex?pretty" \ -H 'content-type: application/json' \ -d '{ "source": { "remote": { "host": "https://source.com:443", "socket_timeout": "1m", "connect_timeout": "30s", "username": "", "password": "" }, "index": "ind1", "type": "doc" // 替换为源索引实际使用的type名 }, "dest": { "index": "ind1", "type": "_doc" } }' - 可选优化:如果索引数据量较大,建议添加
wait_for_completion=false参数异步执行任务,避免请求超时:# 异步发起重索引任务,返回task_id curl -X POST "https://target.com/_reindex?wait_for_completion=false" \ -H 'content-type: application/json' \ -d '{ // 同上请求体 }' # 用返回的task_id查询执行进度 curl -X GET "https://target.com/_tasks/<替换为返回的task_id>"
补充排查点
如果上述操作完成后仍报错,检查以下两项:
- 目标集群所有节点的网络都可以正常访问
source.com:443端口 - 源5.3集群的跨域配置放开了目标集群的访问权限,若之前未配置,可在源集群
elasticsearch.yml中添加:
http.cors.enabled: true http.cors.allow-origin: "*"
配置后重启源集群生效。
内容的提问来源于stack exchange,提问作者quickshekhar
相关产品推荐
相关产品推荐

