适用版本: 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. 如何排查和解决这个异常和解决这个异常 #
- 检查 ILM 执行状态:
GET /_ilm/explain/logs-000123
- 查看当前集群健康与主节点状态,确认是否存在选主抖动或元数据提交压力。
- 检查同时段是否存在大量快照、删除快照、仓库清理任务并发执行。
- 查看仓库配置与快照状态,确认仓库不是只读、损坏或不可访问。
- 若只是在高峰期偶发,优先观察是否是 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 提交链路入手排查,通常比单纯盯着快照后端更有效。
相关错误 #
- failed to delete snapshots:ILM cleanup 的底层通常仍然走仓库删除链路
- cannot delete snapshot from a readonly repository:如果策略请求落到只读仓库,清理步骤天然无法成功
- cannot run cleanup on readonly repository:如果是显式 cleanup 步骤,也会被只读策略直接拦截
- concurrent modification of the repository before cleanup started:仓库并发操作会让 cleanup 与 ack 链路更不稳定
- snapshot lifecycle policy not found:ILM/SLM 这类生命周期任务如果策略本身异常,也会影响清理执行
附:日志上下文 #
@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);
}





