适用版本: 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. 如何排查和解决这个异常和解决这个异常 #
优先确认“策略是否真的存在”,再判断是调用方配置错了,还是集群状态里策略已丢失。
- 查看当前所有 SLM 策略:
GET /_slm/policy
- 检查目标策略 ID 是否存在、是否与调用参数完全一致。
- 如果策略最近被调整过,核对自动化脚本、调度平台、运维平台中引用的策略名是否同步更新。
- 如果策略应该存在但查询不到,继续检查最近是否有删除策略、恢复集群状态或跨环境覆盖配置的操作。
- 查看主节点日志,确认是否还伴随其他 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());
}





