elasticsearch – 如何删除ELK中的旧日志以为每个应用程序提供特定的磁盘配额

我想在以下场景中使用ELK(Elasticsearch Logstash Kibana)堆栈:

我有大约十个应用程序通过Logstash将其日志发送到单个Elasticsearch集群.

其中一些应用程序自然会产生比其他应用程序更多的日志,并且有时,其中一个可能因为一个错误而变得“疯狂”,因此,生成的日志条目比通常情况更多.因此,群集中可用的磁盘空间可能被单个应用程序的日志不公平地“占用”,从而没有足够的空间容纳其他应用程序.

我目前正通过Elasticsearch Curator管理可用磁盘空间.它定期运行,就像在crontab中一样,并根据磁盘使用配额删除旧索引.当所有索引使用的磁盘空间超过某个限制时,将逐个删除最旧的索引,直到它们使用的磁盘空间总和再次在指定的限制内.

这种方法的第一个问题是Elasticsearch Curator只能删除整个索引.因此,我必须配置Logstash以每小时创建一个不同的索引,并增加其粒度;因此,策展人一次删除较小的日志块.此外,很难决定策展人的运作频率.如果应用程序以更高的速率生成日志,则甚至一小时的索引也不够.其次,无法为每个不同的应用程序指定磁盘使用配额.

理想情况下,只要索引达到某个磁盘使用限制,Elasticsearch就应该能够自行删除旧的日志条目.这将消除定义策展人应该运行的频率的问题.但是,我在Elasticsearch手册中找不到任何类似的功能.

有人会建议采用不同的方法来解决这些问题吗?

参考文献:
http://www.elasticsearch.org
https://github.com/elasticsearch/curator

最佳答案 如果你有很多索引和分片,那么elasticsearch将难以让它们保持打开状态(你会遇到内存错误).有10个应用程序,你将有大量的分片.因此我更喜欢索引.

我认为你可能想要的是当你为给定的应用程序获得太多时删除“剩余”记录的方法.

想象一个小脚本,它将按类型和日期运行并计算文档数量,然后删除超出限制的文档.

以下是按类型和日期计算的方法:

curl -XPOST 'localhost:9200/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "by_type": {
      "terms": {
        "field": "_type"
      },
      "aggs": {
        "by_date": {
          "date_histogram": {
            "field": "@timestamp",
            "interval": "day",
            "order": {
              "_key": "desc"
            }
          }
        }
      }
    }
  }
}'

结果如下:

  "aggregations" : {
    "by_type" : {
      "buckets" : [ {
        "key" : "type1",
        "doc_count" : 900000,
        "by_date" : {
          "buckets" : [ {
            "key_as_string" : "2015-02-13T00:00:00.000Z",
            "key" : 1423785600000,
            "doc_count" : 300000
          }, {
            "key_as_string" : "2015-02-12T00:00:00.000Z",
            "key" : 1423699200000,
            "doc_count" : 200000
          }, {
            "key_as_string" : "2015-02-11T00:00:00.000Z",
            "key" : 1423612800000,
            "doc_count" : 400000
          }
        }
      }
    }
  }

现在,您可以遍历类型和每日期计数,找出您要删除的日期.在上面的示例中,如果您只想要500,000条“type1”条目,那么您就知道要删除2015年11月2日的条目.

您可以使用“delete by query”来删除这些文档.

希望有所帮助.

点赞