从快照仓库中删除过期的数据,释放存储空间。
API 格式 #
POST /_snapshot/{repository}/_cleanup
API 作用 #
该 API 用于清理快照仓库中的孤立数据:
- 删除不再被仓库元数据引用的快照 blob 文件
- 清理过期的索引生成文件
- 删除孤儿索引的 blob 容器
- 移除不再需要的旧分片生成文件
API 参数 #
路径参数 #
| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
{repository} | String | 是 | - | 要清理的仓库名称 |
查询参数 #
| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
timeout | Time | 否 | 30s | 操作的超时时间 |
master_timeout | Time | 否 | 30s | 连接主节点的超时时间 |
请求示例 #
清理指定仓库 #
POST /_snapshot/my_backup_repo/_cleanup
设置超时时间 #
POST /_snapshot/my_backup_repo/_cleanup?timeout=5m
响应示例 #
成功响应 #
{
"results": {
"deleted_blobs": 42,
"deleted_bytes": 1048576
}
}
响应字段说明 #
| 字段 | 类型 | 描述 |
|---|---|---|
deleted_blobs | Long | 删除的 blob 文件数量 |
deleted_bytes | Long | 删除的数据总字节数 |
清理过程 #
1. 安全检查 #
- 验证同一仓库上没有其他清理操作正在运行
- 确保没有快照创建或删除操作正在进行
- 验证仓库支持清理操作(必须是
BlobStoreRepository)
2. 识别过期数据 #
清理过程会识别并删除:
- 过期快照 blob:仓库元数据中未引用的快照文件(
.dat) - 过期根 blob:已过时的索引生成文件
- 孤儿索引:元数据中不存在的索引的 blob 容器
- 旧分片生成:不再需要的分片生成文件
3. 执行流程 #
- 检查仓库状态并验证没有冲突操作
- 在集群状态中记录清理操作
- 列出仓库中的所有 blob
- 与当前仓库元数据比较以识别过期数据
- 写入新的索引生成文件以防止并发操作
- 删除所有已识别的过期 blob
- 更新集群状态标记清理完成
使用场景 #
- 存储优化:释放失败或中止操作留下的孤立数据占用的空间
- 定期维护:定期清理以保持仓库存储效率
- 故障恢复:清理因网络故障或节点失败产生的孤儿数据
注意事项 #
- 只读仓库:只读仓库不能执行清理操作,会抛出异常
- 主节点执行:操作仅在主节点上执行
- 支持类型:只有
BlobStoreRepository实现支持清理 - 幂等性:API 是幂等的,对同一仓库状态多次运行会产生相同结果
- 主节点故障转移:主节点故障转移时,任何进行中的清理操作会从集群状态中安全移除
相关操作 #
- PUT /_snapshot/{repository}:创建快照仓库
- GET /_snapshot/{repository}:查询快照仓库
- DELETE /_snapshot/{repository}:删除快照仓库
- POST /_snapshot/{repository}/{snapshot}:创建快照
实现细节 #
- REST 处理器:
RestCleanupRepositoryAction.java - Transport Action:
TransportCleanupRepositoryAction.java - 请求类:
CleanupRepositoryRequest.java - 响应类:
CleanupRepositoryResponse.java - 结果类:
RepositoryCleanupResult.java





