我的群集有几个月前的每一天的索引, 每个索引5个分片(默认值), 我不能在整个集群上运行查询,因为有太多的分片(超过1000)。
自动生成文档ID。
如何将索引合并为一个索引,处理冲突的ID(如果甚至可能发生冲突),并更改类型?
我正在使用ES版本5.2.1
答案 0 :(得分:31)
仅在使用ELK堆栈几个月后才能看到的常见问题,filebeat
每天都会创建索引。有一些方法可以解决性能问题。
_forcemerge
首先,您可以使用_forcemerge
来限制Lucene索引中段的数量。操作不会限制或合并索引,但会提高Elasticsearch的性能。
curl -XPOST 'localhost:9200/logstash-2017.07*/_forcemerge?max_num_segments=1'
这将贯穿整月索引和强制合并段。每个月完成后,它应该会大大提高Elasticsearch的性能。在我的情况下,CPU使用率从100%下降到2.7%。
不幸的是,这不会解决分片问题。
_reindex
请在继续之前阅读
_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]}"
}
}
修复初始错误配置并不容易!祝你优化弹性搜索!
答案 1 :(得分:1)
您可以使用reindex api。
POST _reindex
{
"conflicts": "proceed",
"source": {
"index": ["twitter", "blog"],
"type": ["tweet", "post"]
},
"dest": {
"index": "all_together"
}
}