由于分片数设置不合理,而es是以分片数平衡各节点的。当某个节点的分片都是比较大的时候,es无法自动进行平衡。目前公司es集群有个节点磁盘使用大于70%,而另外两台的磁盘使用率在50%。甚至随着时间的推移。当该节点磁盘达到一定的阈值后,新创建的索引无法被正确分配,导致集群出现有索引shard未分配的情况。

  • 解决方案:
  1. 将索引的分片数尽可能做到合理,如分片数等于节点数。

  2. es可以根据磁盘使用情况来决定是否继续分配shard。

    es根据磁盘使用情况来分配shard,默认设置是开启的,也可以通过api关闭:

    cluster.routing.allocation.disk.threshold_enabled: false

    在开启的情况下,有两个重要的设置:

    cluster.routing.allocation.disk.watermark.low:控制磁盘最小使用率。默认85%.说明es在磁盘使用率达到85%的时候将会停止分配新的shard。也可以设置为一个绝对数值,比如500M.

    cluster.routing.allocation.disk.watermark.high:控制磁盘的最大使用率。默认90%.说明在磁盘使用率达到90%的时候es将会relocate shard去其他的节点。同样也可以设置为一个绝对值。

  3. 可以手动将大的分片挪到磁盘空闲的节点上

  4. 把大的分片,从磁盘已满的节点挪到磁盘空间相对富余的节点;

  5. 同时需要从其他节点把小的分片挪到磁盘已满的节点上,保证个节点的分片数平衡,否则挪动的分片可能还会被balance回去。

分片挪动:

POST _cluster/reroute {
    "commands" : [ {
        "move" :
            {
              "index" : "test", "shard" : 0,
              "from_node" : "node1", "to_node" : "node2"
            }
        }
    ]
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐