绊脚石乃是进身之阶。

"cluster.routing.allocation.disk.watermark.low"参数为什么不能禁止向节点分片分片?

Elasticsearch | 作者 sterne vencel | 发布于2018年07月24日 | 阅读数:6236

"cluster.routing.allocation.disk.watermark.low"这个参数是当某个节点的磁盘使用量达到设置值后,集群将不再向此节点分配副本分片,注意,不再分配副本分片。所以这个配置项对于主分片是透明的。
所以如果集群中有的数据节点快被写满了,这个值是没有什么作用的。、
我的问题是:ES为什么只能限制副本分片的分配?如果节点被写满,节点会出现故障,集群也会出现故障,为什么不能设置"cluster.routing.allocation.disk.watermark.low"这个参数禁止所有新分配的分片?
 
我的想法是:ES重平衡是按照节点分片数来重平衡的,如果"cluster.routing.allocation.disk.watermark.low"这个值可以禁止所有分片的分配,将势必造成集群节点间分片数的不平等,从而造成持续的“重平衡”,而有些节点又禁止分配分片,这样的话,集群将处于不断启动重平衡的死循环?
已邀请:

kennywu76 - Wood

赞同来自: rochy sterne vencel luxx cccthought

low watermark不是对主分片透明,如果你仔细阅读一下文档,这个参数是对“未分配过的"主分片无效,即新创建的索引的场景。 也就是说一个结点的磁盘空间消耗达到low watermark以后,新创建的索引不受限制,依然可以分配到上面。 不能够分配上去的场景主要是以下两个:
  1. 集群有结点挂掉或者用户更改了集群的复制片数量, 需要挑选某个结点复制分片的时候
  2. 集群触发了rebalance的时候

 
这么设计也是有道理的,low watermark表达的含义是磁盘空间较低,为了保护已有数据的进一步空间消耗(数据的持续写入, merge的临时空间消耗),禁止有数据的shard向上面分配。 而新创建的索引,一开始是空的,分配上去也无所谓。
 
low watermark是不管磁盘数据结点是否快写满了的,有另外一个参数"cluster.routing.allocation.disk.watermark.high"来处理这种情况。这个阈值触发以后,ES会将该结点上的数据开始往其他结点迁移,该参数对所有shard有效。
 
两个watermark合理配置,可以减少数据迁移的频率,同时保障结点磁盘空间不会过低。
 
最后还有一道防线"cluster.routing.allocation.disk.watermark.flood_stage" ,万一应用写数据太猛,超过预期,磁盘空间降太快,来不及往外迁移,这个阈值触可能被触发。 触发时,ES会将结点上的索引设置为只读, 避免磁盘空间爆掉,影响结点的可用性。
 
 

要回复问题请先登录注册