【elasticsearch】elasticsearch ES磁盘分配不均问题及解决方法
一、前言:
最近发现公司es集群磁盘分布的很不均匀,有个节点磁盘使用在36%,而另外两台的磁盘使用率在70%。
这样带来的后果,随着时间的推移,如果另外两台的磁盘达到一定的阈值后,新创建的索引无法在这两台机器上被正确分配,导致集群出现有索引shard未分配的情况。
并且集群状态为yellow。
二、问题原因:
查询es文档才发现,es自动均衡是按照分片数来分配的,并不是按照磁盘空间使用率来分配的。
造成这种问题的原因:
-
个别索引太大,并且设置的shard个数不合理。
如上图一个单副本70G的索引,只有1个shard,es集群为了保证分片数的均衡,可能都分配在了另外两台机器上,导致出现了这个问题。 -
本身磁盘就相对别的机器磁盘就少。
三、解决方案:
至于如何解决这种问题?
对于第一种情况,可以将索引的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%"
}
}
}
}'