"cluster.routing.allocation.disk.watermark.low"参数为什么不能禁止向节点分片分片?
Elasticsearch | 作者 sterne vencel | 发布于2018年07月24日 | 阅读数:6816
"cluster.routing.allocation.disk.watermark.low"这个参数是当某个节点的磁盘使用量达到设置值后,集群将不再向此节点分配副本分片,注意,不再分配副本分片。所以这个配置项对于主分片是透明的。
所以如果集群中有的数据节点快被写满了,这个值是没有什么作用的。、
我的问题是:ES为什么只能限制副本分片的分配?如果节点被写满,节点会出现故障,集群也会出现故障,为什么不能设置"cluster.routing.allocation.disk.watermark.low"这个参数禁止所有新分配的分片?
我的想法是:ES重平衡是按照节点分片数来重平衡的,如果"cluster.routing.allocation.disk.watermark.low"这个值可以禁止所有分片的分配,将势必造成集群节点间分片数的不平等,从而造成持续的“重平衡”,而有些节点又禁止分配分片,这样的话,集群将处于不断启动重平衡的死循环?
所以如果集群中有的数据节点快被写满了,这个值是没有什么作用的。、
我的问题是:ES为什么只能限制副本分片的分配?如果节点被写满,节点会出现故障,集群也会出现故障,为什么不能设置"cluster.routing.allocation.disk.watermark.low"这个参数禁止所有新分配的分片?
我的想法是:ES重平衡是按照节点分片数来重平衡的,如果"cluster.routing.allocation.disk.watermark.low"这个值可以禁止所有分片的分配,将势必造成集群节点间分片数的不平等,从而造成持续的“重平衡”,而有些节点又禁止分配分片,这样的话,集群将处于不断启动重平衡的死循环?
1 个回复
kennywu76 - Wood
赞同来自: rochy 、sterne vencel 、luxx 、cccthought
这么设计也是有道理的,low watermark表达的含义是磁盘空间较低,为了保护已有数据的进一步空间消耗(数据的持续写入, merge的临时空间消耗),禁止有数据的shard向上面分配。 而新创建的索引,一开始是空的,分配上去也无所谓。
low watermark是不管磁盘数据结点是否快写满了的,有另外一个参数"cluster.routing.allocation.disk.watermark.high"来处理这种情况。这个阈值触发以后,ES会将该结点上的数据开始往其他结点迁移,该参数对所有shard有效。
两个watermark合理配置,可以减少数据迁移的频率,同时保障结点磁盘空间不会过低。
最后还有一道防线"cluster.routing.allocation.disk.watermark.flood_stage" ,万一应用写数据太猛,超过预期,磁盘空间降太快,来不及往外迁移,这个阈值触可能被触发。 触发时,ES会将结点上的索引设置为只读, 避免磁盘空间爆掉,影响结点的可用性。