由于分片数设置不合理,而es是以分片数平衡各节点的。当某个节点的分片都是比较大的时候,es无法自动进行平衡。目前公司es集群有个节点磁盘使用大于70%,而另外两台的磁盘使用率在50%。甚至随着时间的推移。当该节点磁盘达到一定的阈值后,新创建的索引无法被正确分配,导致集群出现有索引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去其他的节点。同样也可以设置为一个绝对值。
-
可以手动将大的分片挪到磁盘空闲的节点上
-
把大的分片,从磁盘已满的节点挪到磁盘空间相对富余的节点;
-
同时需要从其他节点把小的分片挪到磁盘已满的节点上,保证个节点的分片数平衡,否则挪动的分片可能还会被balance回去。
分片挪动:
POST _cluster/reroute {
"commands" : [ {
"move" :
{
"index" : "test", "shard" : 0,
"from_node" : "node1", "to_node" : "node2"
}
}
]
}