📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 7.4-8.9

1. 错误异常的基本描述 #

snapshot lifecycle policy not found 表示 Elasticsearch 在集群状态中的 SnapshotLifecycleMetadata 里找不到指定的 SLM 策略 ID。它通常出现在手动执行策略、查询策略状态、更新策略或删除策略后仍继续引用旧策略名的场景。

常见现象 #

  • 调用 /_slm/policy/{policy_id}、立即执行策略或查看策略相关状态时返回 404
  • 策略曾经存在,但在修改、删除或集群恢复后不再可见。
  • 自动化脚本、运维平台或 CI 任务仍在引用一个已经改名或删除的策略 ID。

典型报错与异常栈 #

org.elasticsearch.ResourceNotFoundException: snapshot lifecycle policy not found: nightly-policy

2. 为什么会发生这个错误 #

从源码看,Elasticsearch 会先从集群状态读取 SnapshotLifecycleMetadata,再检查目标策略 ID 是否存在。如果整个 SLM 元数据为空,或者目标 ID 不在策略配置表中,就会抛出这个异常。常见原因包括:

  • 策略从未创建成功,但上游任务已经开始调用它。
  • 策略已被删除或改名,调用方仍使用旧 ID。
  • 集群状态恢复后,SLM 元数据未包含预期策略。
  • 不同环境之间的脚本配置不一致,例如测试环境策略名被误用于生产环境。

3. 如何排查和解决这个异常和解决这个异常 #

优先确认“策略是否真的存在”,再判断是调用方配置错了,还是集群状态里策略已丢失。

  1. 查看当前所有 SLM 策略:
GET /_slm/policy
  1. 检查目标策略 ID 是否存在、是否与调用参数完全一致。
  2. 如果策略最近被调整过,核对自动化脚本、调度平台、运维平台中引用的策略名是否同步更新。
  3. 如果策略应该存在但查询不到,继续检查最近是否有删除策略、恢复集群状态或跨环境覆盖配置的操作。
  4. 查看主节点日志,确认是否还伴随其他 SLM 元数据加载异常。

排查时需要注意的问题 #

  • 这是元数据缺失问题,不是仓库读写失败问题。
  • 如果 GET /_slm/policy 为空,说明问题可能不只是单个策略名写错,而是整个 SLM 配置不存在。
  • 不要把策略 ID、快照名、仓库名混用,它们在自动化脚本里很容易被错误拼接。

4. 如何解决这个错误 #

常用修复思路 #

  • 如果只是策略 ID 填错,修正调用参数即可。
  • 如果策略已被删除,需要重新创建策略,或修改调度脚本引用新的策略 ID。
  • 如果是环境配置不一致,统一不同环境中的策略命名和发布流程。
  • 如果 SLM 元数据异常缺失,先确认集群状态和最近变更,再决定是否重新下发策略配置。

相关 Elasticsearch API #

  • GET /_slm/policy:列出全部 SLM 策略。
  • GET /_slm/policy/{policy_id}:查询指定策略。
  • PUT /_slm/policy/{policy_id}:创建或更新策略。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 可用来核对 SLM 调度状态、策略执行历史和集群异常日志。
  • INFINI Gateway 可帮助追踪是哪个调用方持续引用一个不存在的策略 ID。

5. 小结 #

snapshot lifecycle policy not found 的本质是“当前集群状态里没有这个 SLM 策略”。排查时先核对策略是否存在,再检查是否有策略删改、环境配置漂移或自动化脚本仍引用旧 ID。

附:日志上下文 #

SnapshotLifecycleMetadata snapMeta = currentState.metadata().custom(SnapshotLifecycleMetadata.TYPE);
if (snapMeta == null) {
	throw new ResourceNotFoundException("snapshot lifecycle policy not found: {}", request.getLifecycleId());
}