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

发布于 2021-02-01 12:03:16

自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。

文档ID是自动生成的。

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

我正在使用ES版本5.2.1

关注者
0
被浏览
1399
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    仅在使用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

    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]}"
        }
    }
    

    最后的想法

    解决初始配置错误并不容易!通过优化您的elasticsearch祝您好运!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看