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

适用版本: 7.4-7.15

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

snapshot lifecycle policy or policies [...] not found 表示你在读取 SLM policy 时,请求里指定了一个或多个 lifecycleIds,但 Elasticsearch 在当前集群元数据中没有找到对应 policy,因此返回 ResourceNotFoundException。源码显示,只有当请求指定了 ID 且最终匹配结果为空时,才会抛出这条错误;如果请求没带 ID,空列表会被当成正常结果返回。

这意味着问题不在执行 policy,而在“你请求的 policy 根本不存在”。

常见现象 #

  • 调用 GET /_slm/policy/{policy_id} 或批量读取多个 policy 时返回 404
  • 某个自动化任务引用了旧 policy 名称,但该 policy 已被删除或改名。
  • 集群迁移或环境切换后,业务侧仍请求不存在的 SLM policy ID。
  • 手工查看全部 policy 时能看到列表为空,或目标 policy 名称已变化。

典型报错与异常栈 #

ResourceNotFoundException: snapshot lifecycle policy or policies [daily-backup] not found

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

SLM policy 存在于集群元数据里,不是普通索引文档。读取时 Elasticsearch 会按请求中的 lifecycleIds 过滤已有 policy;如果一个都匹配不到,就会抛出这条异常。

常见原因通常包括:

  • policy 已被删除,但外部任务仍引用旧 ID。
  • policy 改名后,调用方没有同步更新配置。
  • 环境切换到了一个没有该 SLM policy 的新集群。
  • 自动化脚本假定 policy 一定存在,没有先做存在性检查。

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

建议按“先确认 policy 是否真的不存在,再判断是配置漂移还是环境切换造成”的顺序处理:

  1. 列出当前全部 SLM policy,确认目标 ID 是否存在。
  2. 对照调用方配置,检查是否引用了过期名称。
  3. 如果是多环境部署,确认当前请求是否打到了错误环境。
  4. 如果 policy 应该存在但实际不存在,继续追查是谁在何时删除或改名。

相关 Elasticsearch API #

  • GET /_slm/policy:列出全部 SLM policy。
  • GET /_slm/policy/{policy_id}:验证单个 policy 是否存在。
  • PUT /_slm/policy/{policy_id}:在确认配置正确后重建缺失 policy。

排查时需要注意的问题 #

  • 这不是执行失败,而是读取目标对象失败。
  • 如果请求没带 policy ID,空结果是合法的;只有“指定了目标但没找到”才是异常。
  • 不要把它和 snapshot lifecycle policy not found 的单 policy 文案混淆,本页覆盖的是一个或多个 policy ID 的批量读取场景。

4. 如何解决这个错误 #

常用修复思路 #

  • 修正调用方使用的 policy ID。
  • 若 policy 被误删,按原配置重新创建。
  • 在自动化脚本中增加存在性校验,避免把缺失 policy 当成执行失败。
  • 对跨环境脚本做显式环境标识,避免请求错集群。

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

  • INFINI Console 适合核对当前集群配置、SLM policy 列表与调用时间线。
  • INFINI Gateway 可帮助审计哪些上游系统在请求已经不存在的 policy ID。

5. 小结 #

snapshot lifecycle policy or policies not found 的本质很直接:请求目标不存在。处理重点是修正 policy ID、恢复缺失配置或纠正环境漂移,而不是把它当成 SLM 执行链路故障。

相关错误 #

附:日志上下文 #

if (lifecycles.size() == 0) {
	if (request.getLifecycleIds().length == 0) {
		listener.onResponse(new GetSnapshotLifecycleAction.Response(Collections.emptyList()));
	} else {
		listener.onFailure(new ResourceNotFoundException("snapshot lifecycle policy or policies {} not found",
			Arrays.toString(request.getLifecycleIds())));
	}
}