You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

关键参数解释

  1. pattern过滤器

    • 如果你的索引是更复杂的命名规则(比如app-logs-2024-05-*),可以把kind改成regexvalue设为对应的正则表达式,比如app-logs-\d{4}-\d{2}-.*
    • 确保exclude: False,这样才会选中所有匹配模式的索引。
  2. 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

火山引擎 最新活动