Elasticsearch _reindex操作报no such index错误排查
问题根因
你的判断完全正确,该配置差异就是问题的根本原因。
Elasticsearch 配置生效优先级从高到低为:集群持久化动态配置(persistent) > 集群临时动态配置(transient) > elasticsearch.yml 中的静态配置,高优先级配置会直接覆盖低优先级的同项配置。
- 执行失败的实例仅加载了静态配置文件中的规则:
action.auto_create_index仅允许自动创建.watches、.triggered_watches、.watcher-history-*、.monitoring-*这几类系统内置索引,业务索引my_index_v2不在自动创建白名单内。而_reindex操作默认会在目标索引不存在时尝试自动创建,触发规则拦截后就会返回你看到的404索引不存在错误。 - 执行成功的实例虽然静态配置和故障实例完全一致,但集群持久化配置中额外设置了
action.auto_create_index: "true",该配置优先级更高,直接覆盖了静态文件中的白名单限制,允许自动创建任意名称的索引,因此_reindex流程可以正常执行。
解决方案
你可以根据自身运维规范二选一处理:
- 方案1:不修改全局配置,提前手动创建目标索引
_reindex检测到目标索引已存在时,不会触发自动创建逻辑,可直接执行数据迁移:
# 提前创建目标索引,可按需对齐源索引的mapping、settings配置 curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/my_index_v2' # 再执行原_reindex命令即可 curl -X POST -H 'Content-Type: application/json' 'localhost:9200/_reindex' -d '{"source": {"index": "my_index_v1"}, "dest": { "index": "my_index_v2" }}' | jq
- 方案2:调整自动创建索引规则,和正常实例配置对齐
如果不需要严格限制索引自动创建范围,可以直接更新集群持久化配置,放开自动创建权限:
curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/_cluster/settings' -d ' { "persistent": { "action.auto_create_index": "true" } }'
如果要保留系统索引的白名单限制,同时允许业务索引自动创建,只需要把业务索引的命名规则追加到白名单即可,例如配置值改为 .watches,.triggered_watches,.watcher-history-*,.monitoring-*,my_index_*,就可以允许所有my_index_开头的业务索引自动创建。
内容的提问来源于stack exchange,提问作者Vojtěch
相关产品推荐
相关产品推荐

