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

从快照仓库中删除过期的数据,释放存储空间。

API 格式 #

POST /_snapshot/{repository}/_cleanup

API 作用 #

该 API 用于清理快照仓库中的孤立数据:

  • 删除不再被仓库元数据引用的快照 blob 文件
  • 清理过期的索引生成文件
  • 删除孤儿索引的 blob 容器
  • 移除不再需要的旧分片生成文件

API 参数 #

路径参数 #

参数类型是否必填默认值描述
{repository}String-要清理的仓库名称

查询参数 #

参数类型是否必填默认值描述
timeoutTime30s操作的超时时间
master_timeoutTime30s连接主节点的超时时间

请求示例 #

清理指定仓库 #

POST /_snapshot/my_backup_repo/_cleanup

设置超时时间 #

POST /_snapshot/my_backup_repo/_cleanup?timeout=5m

响应示例 #

成功响应 #

{
  "results": {
    "deleted_blobs": 42,
    "deleted_bytes": 1048576
  }
}

响应字段说明 #

字段类型描述
deleted_blobsLong删除的 blob 文件数量
deleted_bytesLong删除的数据总字节数

清理过程 #

1. 安全检查 #

  • 验证同一仓库上没有其他清理操作正在运行
  • 确保没有快照创建或删除操作正在进行
  • 验证仓库支持清理操作(必须是 BlobStoreRepository

2. 识别过期数据 #

清理过程会识别并删除:

  • 过期快照 blob:仓库元数据中未引用的快照文件(.dat
  • 过期根 blob:已过时的索引生成文件
  • 孤儿索引:元数据中不存在的索引的 blob 容器
  • 旧分片生成:不再需要的分片生成文件

3. 执行流程 #

  1. 检查仓库状态并验证没有冲突操作
  2. 在集群状态中记录清理操作
  3. 列出仓库中的所有 blob
  4. 与当前仓库元数据比较以识别过期数据
  5. 写入新的索引生成文件以防止并发操作
  6. 删除所有已识别的过期 blob
  7. 更新集群状态标记清理完成

使用场景 #

  1. 存储优化:释放失败或中止操作留下的孤立数据占用的空间
  2. 定期维护:定期清理以保持仓库存储效率
  3. 故障恢复:清理因网络故障或节点失败产生的孤儿数据

注意事项 #

  1. 只读仓库:只读仓库不能执行清理操作,会抛出异常
  2. 主节点执行:操作仅在主节点上执行
  3. 支持类型:只有 BlobStoreRepository 实现支持清理
  4. 幂等性:API 是幂等的,对同一仓库状态多次运行会产生相同结果
  5. 主节点故障转移:主节点故障转移时,任何进行中的清理操作会从集群状态中安全移除

相关操作 #

  • PUT /_snapshot/{repository}:创建快照仓库
  • GET /_snapshot/{repository}:查询快照仓库
  • DELETE /_snapshot/{repository}:删除快照仓库
  • POST /_snapshot/{repository}/{snapshot}:创建快照

实现细节 #

  • REST 处理器RestCleanupRepositoryAction.java
  • Transport ActionTransportCleanupRepositoryAction.java
  • 请求类CleanupRepositoryRequest.java
  • 响应类CleanupRepositoryResponse.java
  • 结果类RepositoryCleanupResult.java