我想在以下场景中使用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”来删除这些文档.
希望有所帮助.