Elasticsearch 如何清理旧索引(删除过期数据)?

清理 ES 旧索引的三种方式:手动 DELETE 索引、Curator 定时任务、以及现代的 ILM(索引生命周期管理)自动按保留期删除。本文给出三种方案与 ILM 完整配置。

最佳实践
Elasticsearch 如何清理旧索引(删除过期数据)?封面

现代方案是 ILM(Index Lifecycle Management):正确配置策略、滚动别名与索引模板后自动执行,仍需监控生命周期状态和失败;老集群用 Curator 定时任务;一次性清理由 DELETE API 手动执行。

方案一:手动删除

# 列出所有索引按时间排序
curl -s 'es:9200/_cat/indices?v&s=creation.date'

# 核对该索引的创建时间、写入状态、备份及删除范围后执行
curl -XDELETE 'es:9200/logs-2024.01.01'

方案二:ILM 自动生命周期(推荐)

以下为支持 ILM 的 Elasticsearch 部署示例;Serverless 使用其支持的数据生命周期功能,不套用此配置。

PUT _ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": { "actions": { "rollover": { "max_age": "1d", "max_size": "30gb" } } },
      "delete": { "min_age": "30d", "actions": { "delete": {} } }
    }
  }
}

还需配置滚动别名并引导首个写入索引(以下在 Dev Tools 中执行):

PUT _index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "logs_policy",
      "index.lifecycle.rollover_alias": "logs"
    }
  }
}

PUT logs-000001
{
  "aliases": {
    "logs": { "is_write_index": true }
  }
}

应用写入目标应为别名 logs。发生 rollover 后,delete 阶段的 min_age: 30d 以 rollover 时间计算,不是每条文档的年龄,也不保证满 30 天瞬间删除。warm/cold 阶段还需要相应的数据层与资源。Logstash 等写入端若自行管理 ILM,应先确认模板和别名由谁负责,避免相互覆盖。

方案三:Curator 定时任务

# curator action 文件
actions:
  1:
    action: delete_indices
    filters:
      - filtertype: pattern
        kind: regex
        value: '^logs-'
      - filtertype: age
        source: creation_date
        direction: older
        unit: days
        unit_count: 30

先用 curator --dry-run action.yml 核对匹配列表及集群连接配置,再按计划执行;确认 Curator 与 Elasticsearch 版本兼容。

常见问题(FAQ)

Q:删除索引空间立刻释放吗? 删除整个索引不依赖段合并,也不应通过 force merge 加速;磁盘统计更新可能滞后。按文档删除留下的段内删除标记是另一种情况。

Q:误删能恢复吗? 索引删除不能撤销;需从可用快照恢复,或在保留原始数据时重建并重新摄取。重要数据先验证快照与恢复流程。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台