ElasticSearch - 如何将索引合并到一个索引中?

时间:2017-09-11 10:38:54

标签: elasticsearch

我的群集有几个月前的每一天的索引, 每个索引5个分片(默认值), 我不能在整个集群上运行查询,因为有太多的分片(超过1000)。

自动生成文档ID。

如何将索引合并为一个索引,处理冲突的ID(如果甚至可能发生冲突),并更改类型?

我正在使用ES版本5.2.1

2 个答案:

答案 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.01logstash-2017.07.31的所有条目合并到logstash-2017.07。请注意,必须手动删除旧索引。

根据您选择的conflictsop_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"
 }
}