如何用Elasticsearch Curator删除匹配模式的旧索引,保留最新的?
用Elasticsearch Curator保留最新N个匹配模式的索引,删除其余
我之前刚好处理过一模一样的需求——当时想用age过滤器但发现它只能按时间阈值清理,没法满足「不管时间,只留最新X个匹配索引」的要求,后来用pattern+count过滤器的组合完美解决了问题,给你详细说下:
核心思路
先通过pattern过滤器匹配你指定的索引模式,再用count过滤器筛选出最新的N个索引并保留,剩下的全部删除。
完整配置示例
假设你想保留logstash-*模式下最新的3个索引,删除其他,Curator的配置文件(比如cleanup_indices.yml)可以这么写:
actions: 1: action: delete_indices description: "清理logstash索引:保留最新3个,删除其余" options: ignore_empty_list: True # 没有匹配索引时不报错 disable_action: False # 启用该动作(测试时可设为True) filters: # 第一步:匹配指定模式的索引 - filtertype: pattern kind: prefix # 匹配前缀,可选regex(正则)、wildcard(通配符) value: logstash- # 你的索引前缀/模式 exclude: False # 不排除匹配到的索引 # 第二步:只保留最新的3个,删除更老的 - filtertype: count direction: older # 标记出比最新N个更老的索引(要删除的) value: 3 # 要保留的最新索引数量 source: name # 按索引名称排序(适合按时间命名的索引,比如logstash-2024.05.20) # 如果索引名称不按时间排序,改用按创建时间排序: # source: creation_date
关键参数解释
pattern过滤器:
- 如果你的索引是更复杂的命名规则(比如
app-logs-2024-05-*),可以把kind改成regex,value设为对应的正则表达式,比如app-logs-\d{4}-\d{2}-.*。 - 确保
exclude: False,这样才会选中所有匹配模式的索引。
- 如果你的索引是更复杂的命名规则(比如
count过滤器:
direction: older是核心:它会把索引按指定的source排序后,标记出「超出保留数量」的旧索引,供后续删除。source的选择很重要:如果你的索引名称是按时间递增命名的(比如yyyy.MM.dd),用name排序最准确;如果索引命名和时间无关,就用creation_date按实际创建时间排序。
测试与执行
在正式执行前,一定要用--dry-run参数做测试,避免误删:
curator --config /path/to/your/curator_config.yml /path/to/cleanup_indices.yml --dry-run
这个命令会输出将要删除的索引列表,确认无误后去掉--dry-run执行即可。
为什么age过滤器不适用?
age过滤器是按时间阈值(比如删除7天前的索引)来清理,适合固定周期的清理场景;但如果你的需求是「不管索引生成时间,只保留最新的N个」(比如某天突然生成了5个索引,或者连续几天没生成新索引),count过滤器才是正确的选择。
内容的提问来源于stack exchange,提问作者RFI




