只有在使用 ELK 堆栈和 filebeat 每天创建索引几个月后才能看到的常见问题。这里有几个选项可以解决性能问题。
首先您可以使用_forcemerge 来限制Lucene 索引中的段数。操作不会限制或合并索引,但会提高 Elasticsearch 的性能。
curl -XPOST 'localhost:9200/logstash-2017.07*/_forcemerge?max_num_segments=1'
这将贯穿整个月的索引并强制合并段。如果每个月都完成,它应该会大大提高 Elasticsearch 的性能。在我的情况下,CPU 使用率从 100% 下降到 2.7%。
很遗憾,这并不能解决分片问题。
请阅读_reindex 文档并在继续之前备份您的数据库。
正如tomas 提到的。如果您想限制分片或索引的数量,除了使用_reindex 将几个索引合并为一个之外别无选择。这可能需要一段时间,具体取决于您拥有的索引的数量和大小。
目的地索引
您可以预先创建目标索引并指定它应该包含的分片数量。这将确保您的最终索引具有您需要的分片数量。
curl -XPUT 'localhost:9200/new-logstash-2017.07.01?pretty' -H 'Content-Type: application/json' -d'
{
"settings" : {
"index" : {
"number_of_shards" : 1
}
}
}
'
限制分片数量
如果您想限制每个索引的分片数量,您可以一对一运行_reindex。在这种情况下,不应删除任何条目,因为它将是精确副本,但分片数量较少。
curl -XPOST 'localhost:9200/_reindex?pretty' -H 'Content-Type: application/json' -d'
{
"conflicts": "proceed",
"source": {
"index": "logstash-2017.07.01"
},
"dest": {
"index": "logstash-v2-2017.07.01",
"op_type": "create"
}
}
'
此操作后,您可以删除旧索引并使用新索引。不幸的是,如果您想使用旧名称,您需要再次使用新名称_reindex。如果你决定这样做
不要忘记为新索引指定分片数!默认情况下,它将回退到 5。
合并多个索引并限制分片数量
curl -XPOST 'localhost:9200/_reindex?pretty' -H 'Content-Type: application/json' -d'
{
"conflicts": "proceed",
"source": {
"index": "logstash-2017.07*"
},
"dest": {
"index": "logstash-2017.07",
"op_type": "create"
}
}
'
完成后,您应该将所有从logstash-2017.07.01 到logstash-2017.07.31 的条目合并到logstash-2017.07。请注意,旧索引必须手动删除。
根据您选择的conflicts 和op_type 选项,可以覆盖或合并某些条目。
进一步的步骤
用一个分片创建新索引
您可以设置每次创建新的logstash 索引时都会使用的index template。
curl -XPUT 'localhost:9200/_template/template_logstash?pretty' -H 'Content-Type: application/json' -d'
{
"template" : "logstash-*",
"settings" : {
"number_of_shards" : 1
}
}
'
这将确保创建的与名称中的logstash- 匹配的每个新索引都只有一个分片。
按月分组日志
如果您不流式传输太多日志,您可以将您的 logstash 设置为按月对日志进行分组。
// file: /etc/logstash/conf.d/30-output.conf
output {
elasticsearch {
hosts => ["localhost"]
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM}"
document_type => "%{[@metadata][type]}"
}
}
最后的想法
修复初始错误配置并不容易!祝您优化 Elastic 搜索顺利!