zoukankan      html  css  js  c++  java
  • elk默认分片只有1000导致索引没有创建

    maximun shards open

    by: 铁乐与猫

    现象

    • elk使用7.0版本

    • elk出现没有新数据的情况。

    • logstash日志中报出例如以下的报警:

      [WARN ] 2020-05-11 18:58:42.045 [[main]>worker26] elasticsearch - Could not index event ex=>"tielemao_web_log-2020.05.12", :_type=>"_doc", :routing=>nil}, #<LogStash::Event:0x6cb75e7>"_doc", "_id"=>nil, "status"=>400, "error"=>{"type"=>"validation_exception", "reason"=>is cluster currently has [1177]/[1000] maximum shards open;"}}}}
      

    原因

    7版本以上的elasticsearch吧,默认只允许1000个分片,问题是因为集群分片数不足引起的。

    1000 个shards的限制是怎么来的?

    根据官方解释,从Elasticsearch v7.0.0 开始,集群中的每个节点默认限制 1000 个shard,如果你的es集群有3个数据节点,那么最多 3000 shards。这里我是开发环境,只有一台es,所以只有1000。

    解决方案

    在elasticsearch.yml中定义

    > cluster.max_shards_per_node: 10000
    

    在kibana的tools中改变临时设置以便即时生效

    PUT /_cluster/settings
    {
      "transient": {
        "cluster": {
          "max_shards_per_node":10000
        }
      }
    }
    

    除此外,如果是开发环境,数据不那么重要的话,可以清空所有index

    DELETE /_all
    

    官方文档:删除索引

    然后,重新设置默认值,降低number_of_shards数量,同时提高max_shards_per_node的数量。

    vim elasticsearch.yml
    
    # Set the number of shards (splits) of an index (5 by default):
    #
    index.number_of_shards: 2
    # Set the number of replicas (additional copies) of an index (1 by default):
    #
    index.number_of_replicas: 1
    
    cluster.max_shards_per_node: 3000
    

    对于生产环境

    vim elasticsearch.yml
    
    # Set the number of shards (splits) of an index (5 by default):
    #
    index.number_of_shards: 5
    # Set the number of replicas (additional copies) of an index (1 by default):
    #
    index.number_of_replicas: 2
    
    cluster.max_shards_per_node: 3000
    

    Index 的配置参数在es配置文件里直接配置,会报错。不过可以用Kibana来设置。也就是最开始所说的使用kibana的开发工具put改变。

    最重要的是,要定期删除无用数据,可以每个月初删除一个月前的所有数据,即只保留最近1个月的Index数据。

    扩展阅读

    每个 Index 多少个 Shard 合适?

    配置 Elasticsearch 集群后,对于分片数,是比较难确定的。因为一个索引分片数一旦确定,以后就无法修改,所以我们在创建索引前,要充分的考虑到,以后我们创建的索引所存储的数据量,否则创建了不合适的分片数,会对我们的性能造成很大的影响。

    如果以后发现有必要更改分片的数量,则需要重新索引所有源文档。(尽管重新编制索引是一个漫长的过程,但可以在不停机的情况下完成)。

    主分片配置与硬盘分区非常相似,在硬盘分区中,原始磁盘空间的重新分区要求用户备份,配置新分区并将数据重写到新分区上。

    稍微过度分配是好的。但是如果你给每个 Index 分配 1000 个Shard 那就是不好的。

    请记住,您分配的每个分片都需要支付额外费用:

    • 由于分片本质上是Lucene索引,因此会消耗文件句柄,内存和CPU资源。
    • 每个搜索请求都将触摸索引中每个分片的副本,当分片分布在多个节点上时,这不是问题。当分片争夺相同的硬件资源时,就会出现争用并且性能会下降。

    我们的客户期望他们的业务增长,并且其数据集会相应地扩展。因此,始终需要应急计划。许多用户说服自己,他们将遇到爆炸性增长(尽管大多数用户从未真正看到无法控制的增长)。此外,我们所有人都希望最大程度地减少停机时间并避免重新分片。

    如果您担心数据的快速增长,那么我们建议您关注一个简单的约束:Elasticsearch最大JVM堆大小建议约为30-32GB。这是对绝对最大分片大小限制的可靠估计。例如,如果您确实认为可以达到200GB(但在不更改其他基础架构的情况下无法达到更大容量),那么我们建议分配7个分片,或最多8个分片

    绝对不要为从现在起三年后达到的太高的10 TB目标分配资源。

    如果现在你的场景是分片数不合适了,但是又不知道如何调整,那么有一个好的解决方法就是按照时间创建索引,然后进行通配查询。如果每天的数据量很大,则可以按天创建索引,如果是一个月积累起来导致数据量很大,则可以一个月创建一个索引。如果要对现有索引进行重新分片,则需要重建索引.

    修改默认的 Elasticsearch 分片数

    这是正确的改变配置文件中的index.number_of_shards默认值将涉及更改所有节点上的设置,然后理想地按照rolling restarts的指导方针重新启动实例。

    但是,如果这不是一个选项,如果在创建新索引时在设置中明确指定number_of_shards并不理想,那么解决方法将使用index templates

    可以创建index_defaults默认值,如下所示

    PUT /_template/index_defaults 
    {
      "template": "*", 
      "settings": {
        "number_of_shards": 4
      }
    }
    

    这会将index_defaults模板中指定的设置应用于所有新索引。

    重建索引

    参考:教你如何在 elasticsearch 中重建索引

    每个节点的 maximum shards open 设置为多大合适?

    对于分片数的大小,业界一致认为分片数的多少与内存挂钩,认为 1GB 堆内存对应 20-25 个分片。因此,具有30GB堆的节点最多应有600个分片,但是越低于此限制,您可以使其越好。而一个分片的大小不要超过50G,通常,这将有助于群集保持良好的运行状况。

    参考

    https://segmentfault.com/a/1190000021303027

  • 相关阅读:
    怎么判断一个bug到底是前端的bug还是后端的bug
    charles抓包原理
    java基础|Properties文件解析
    java基础|break、continue和return
    Java使用JSONPath解析JSON完整内容详解
    10/23/2019
    有什么好怕的
    [转]一个急刹车,过路老人吓得病发身亡 司机要担责吗?
    [转]7岁女孩练舞下腰致残,舞蹈培训机构被判赔115万
    Salesforce权限管理
  • 原文地址:https://www.cnblogs.com/tielemao/p/13523422.html
Copyright © 2011-2022 走看看