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

Joe*_*rog 10 elasticsearch

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

文档ID是自动生成的.

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

我使用的是ES 5.2.1版

Mr.*_*fee 45

只有在使用ELK堆栈几个月后才能看到的常见问题,并且filebeat每天都会创建索引.这里有几个选项可以解决性能问题.

_forcemerge

首先,您可以使用_forcemerge限制Lucene索引中的段的数量.操作不会限制或合并索引,但会提高Elasticsearch的性能.

curl -XPOST 'localhost:9200/logstash-2017.07*/_forcemerge?max_num_segments=1'
Run Code Online (Sandbox Code Playgroud)

这将贯穿整月索引和强制合并段.每个月完成后,它应该会大大提高Elasticsearch的性能.在我的情况下,CPU使用率从100%下降到2.7%.

不幸的是,这不会解决分片问题.

_reindex

请继续阅读_reindex文档并备份数据库.

正如托马斯所说.如果要限制分片数或索引数,除了用于_reindex将少数索引合并为一个之外没有其他选项.这可能需要一段时间,具体取决于您拥有的索引的数量和大小.

目的地索引

您可以预先创建目标索引,并指定它应包含的分片数.这将确保您的最终索引将具有您需要的分片数.

curl -XPUT 'localhost:9200/new-logstash-2017.07.01?pretty' -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 1 
        }
    }
}
'
Run Code Online (Sandbox Code Playgroud)

限制分片数量

如果要限制每个索引的分片数,可以_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"
    }
}
'
Run Code Online (Sandbox Code Playgroud)

执行此操作后,您可以删除旧索引并使用新索引.不幸的是,如果你想使用旧名称,你需要再次_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"
    }
}
'
Run Code Online (Sandbox Code Playgroud)

完成后,你应该有所有的条目logstash-2017.07.01logstash-2017.07.31合并成logstash-2017.07.请注意,必须手动删除旧索引.

某些条目可以被覆盖或合并,具体取决于您选择的选项conflictsop_type选项.

进一步的步骤

使用一个分片创建新索引

您可以设置每次创建新索引时将使用的索引模板logstash.

curl -XPUT 'localhost:9200/_template/template_logstash?pretty' -H 'Content-Type: application/json' -d'
{
    "template" : "logstash-*",
    "settings" : {
        "number_of_shards" : 1
    }
}
'
Run Code Online (Sandbox Code Playgroud)

这将确保创建的每个新索引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]}"
    }
}
Run Code Online (Sandbox Code Playgroud)

最后的想法

修复初始错误配置并不容易!祝你优化弹性搜索!

  • 这确实是很好的信息。正式文档可能很难理解应用于特定ELK实例时。与许多其他对象一样,在更好地了解分片的真正含义之后,我需要知道如何组合索引。 (2认同)
  • 合并多个索引后,您只需为新索引指定一个别名即可。无需再次重新索引即可使用旧名称。 (2认同)