【elasticsearch】elasticsearch ES磁盘分配不均问题及解决方法

一、前言:

最近发现公司es集群磁盘分布的很不均匀,有个节点磁盘使用在36%,而另外两台的磁盘使用率在70%。

这样带来的后果,随着时间的推移,如果另外两台的磁盘达到一定的阈值后,新创建的索引无法在这两台机器上被正确分配,导致集群出现有索引shard未分配的情况。

并且集群状态为yellow。

在这里插入图片描述

二、问题原因:

查询es文档才发现,es自动均衡是按照分片数来分配的,并不是按照磁盘空间使用率来分配的。

造成这种问题的原因:

  1. 个别索引太大,并且设置的shard个数不合理。
    在这里插入图片描述
    如上图一个单副本70G的索引,只有1个shard,es集群为了保证分片数的均衡,可能都分配在了另外两台机器上,导致出现了这个问题。

  2. 本身磁盘就相对别的机器磁盘就少。

三、解决方案:

至于如何解决这种问题?

对于第一种情况,可以将索引的shard个数尽可能做到合理,如shard个数等于节点数。

对于第二种情况,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去其他的节点。同样也可以设置为一个绝对值。

注意: watermark setting可以通过update-api动态修改,默认es每隔30s会收集各个节点磁盘的使用情况,可以cluster.info.update.interval来设置时间间隔。

调整磁盘水位线:

API

put _cluster/settings
{
   "transient":{
       "cluster":{
          "routing":{
               "allocation.disk.watermark.high":"95%",
               "allocation.disk.watermark.low":"90%",
             }
           }
       } 
}

实际使用的命令:

curl -s -u admin:admin -XPUT 10.11.36.1:29200/_cluster/settings -d '
{
"persistent": {
  "cluster": {
     "routing": {
        "allocation.disk.watermark.high": "90%",
        "allocation.disk.watermark.low": "85%"
      }
    }
  }
}'
posted @ 2022-11-10 19:25  彬在俊  阅读(421)  评论(0编辑  收藏  举报