Elasticsearch 如何清理旧索引(删除过期数据)?
清理 ES 旧索引的三种方式:手动 DELETE 索引、Curator 定时任务、以及现代的 ILM(索引生命周期管理)自动按保留期删除。本文给出三种方案与 ILM 完整配置。
现代方案是 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:误删能恢复吗? 索引删除不能撤销;需从可用快照恢复,或在保留原始数据时重建并重新摄取。重要数据先验证快照与恢复流程。