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

适用版本: 7.8-7.15

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

这个异常通常出现在 ILM 或与生命周期相关的快照清理流程中。代码已经表明:请求发送后收到了 AcknowledgedResponse,但 isAcknowledged()false,因此 Elasticsearch 认为这次清理快照步骤没有被集群成功确认。

常见现象 #

  • ILM 策略推进到快照清理步骤时失败。
  • 错误信息中会同时出现仓库名、快照名、策略名和索引名。
  • 请求不是直接报权限错误,而是“未被确认”,说明问题多发生在集群状态提交或协调层。

典型报错与异常栈 #

cleanup snapshot step request for repository [prod-backup] and snapshot [snap-2024.12.01] policy [logs-policy] and index [logs-000123] failed to be acknowledged

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

这类异常一般意味着清理请求已经发出,但集群没有在预期时间内完成确认。常见原因包括:

  • 主节点负载过高或集群状态更新拥堵,导致 ack 未能及时完成。
  • ILM 触发时仓库相关操作正忙,例如快照、删除、清理并发进行。
  • 节点间网络抖动,导致管理请求提交但未完成全局确认。
  • 仓库状态异常,导致清理步骤无法顺利推进。

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

  1. 检查 ILM 执行状态:
GET /_ilm/explain/logs-000123
  1. 查看当前集群健康与主节点状态,确认是否存在选主抖动或元数据提交压力。
  2. 检查同时段是否存在大量快照、删除快照、仓库清理任务并发执行。
  3. 查看仓库配置与快照状态,确认仓库不是只读、损坏或不可访问。
  4. 若只是在高峰期偶发,优先观察是否是 ack 超时类问题,而不是立即重建仓库。

排查时需要注意的问题 #

  • acknowledged=false 不等于请求一定完全没执行,处理前先读取实际状态确认。
  • ILM 失败往往是结果,不一定是根因,真正原因可能在集群协调或仓库层。
  • 如果同一策略涉及大量索引,单次失败可能会扩散成多个生命周期步骤卡住。

4. 如何解决这个错误 #

常用修复思路 #

  • 先恢复主节点和集群协调稳定性,再重试 ILM 步骤。
  • 避免在快照高峰期叠加仓库清理、策略切换和大批量索引生命周期操作。
  • 如果仓库异常,先修复仓库可用性,再让 ILM 继续推进。
  • 对关键策略设置更明确的执行窗口,减少与备份任务冲突。

相关 Elasticsearch API #

  • GET /_ilm/explain/{index}:查看索引生命周期当前卡在哪一步。
  • GET /_snapshot/{repository}/_all:查看仓库和快照状态。
  • GET /_cluster/health:确认集群整体健康度。

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

  • INFINI Console 适合把 ILM 失败、主节点状态和仓库异常放在同一视图分析。
  • INFINI Gateway 可帮助统计清理类管理请求的时间分布,识别高峰冲突。

5. 小结 #

cleanup snapshot step request ... failed to be acknowledged 表示生命周期中的快照清理请求没有得到集群确认。优先从 ILM 执行状态、主节点稳定性、并发仓库任务和 ack 提交链路入手排查,通常比单纯盯着快照后端更有效。

相关错误 #

附:日志上下文 #

@Override
public void onResponse(AcknowledgedResponse acknowledgedResponse) {
	if (acknowledgedResponse.isAcknowledged() == false) {
		String policyName = indexMetadata.getSettings().get(LifecycleSettings.LIFECYCLE_NAME);
		throw new ElasticsearchException("cleanup snapshot step request for repository [" + repositoryName + "] and snapshot " +
			"[" + snapshotName + "] policy [" + policyName + "] and index [" + indexName + "] failed to be acknowledged");
	}
	listener.onResponse(null);
}