0、allocator&decider
allocation与rebalance都由allocator与decider来实现。
(1)allocator:尝试寻找最优的节点来分配分片
- 对于新建的索引。allocator按照分片数量升序排序节点列表,注意,是按照分片数量,而不是分片的大小 。然后decider依次遍历节点列表,根据分配规则判断是否要把分片分配到该节点。
-
对于已有的索引。当节点重启时,触发对于已有分片的分配。对于主分片,allocator只允许把主分片分配到拥有分片完整数据的节点上,即只有完整数据的副分片才能升为主节点;对于副分片,allocator优先分配到拥有分片数据(即使数据不是最新的)的节点上。
allocator.png
(2)decider:负责判断并决定是否要进行要分配
allocation与rebalance的决策权由下列有控制的decider决定,只有全返回true,才可allocation/rebalance(如果没控制,默认返回true。例如SameShardAllocationDecider不控制rebalance,则返回true)
decider.png
1、allocation
(1)important parameter
parameter | 含义 | other |
---|---|---|
cluster.routing.allocation.enable | 是否开启allocation | all(default);primaries:只允许主分片;new_primaries:只允许新生成的主分片;none:不允许 |
(2)allocation的细节
- shard allocation发生在:
(1)创建/删除一个Index
(2)加入/离开一个Node
(3)手动执行reroute命令
(4)修改replication数量
(5)集群重启 - 当把allocation关闭的时候,新建的index的shard不会被创建!
- 手动reroute不受allocation关闭影响。
- 节点重启时恢复上面的primary shard不受allocation的配置是否开启的影响,但是replica shared不会被重新allocation上来。
- allocation关闭以后,可以使用reroute指令手动显示进行allocation,不受影响。
2、rebalance
(1)important parameter
参数 | 含义 | 其他 |
---|---|---|
cluster.routing.rebalance.enable | 是否可以rebalance | all(default),primaries,replicas,none。es2.x+才有的配置,所以1.x如果要禁止rebalance需要把allocation关闭。 |
cluster.routing.allocation.allow_rebalance | 什么情况下才可以触发rebalance | always:总是可以;indices_primaries_active:所有主分片都已被分配好;indices_all_active:所有的分片都已被分配好(default) |
cluster.routing.allocation.cluster_concurrent_rebalance | 多少shard可以同时进行rebalance | 默认2 |
(2)detail
- 通过阈值判定,将在不同的node上的shard转移来平衡集群中每台node的shard数。发生在节点增减、修改replica的配置的时候。
-
关闭allocation以后,rebalance过程也会被禁止。
源码.png
3、关系
allocation与rebalance的关系,在于rebalance需要依赖allocation,所以allocation被关闭以后rebalance也就被禁止了。
4、other
(1)balance
新shard的生成以及rebalance都需要依照这3个参数进行计算,以达到cluster balance
parameter | 参数 | 其他 |
---|---|---|
cluster.routing.allocation.balance.shard | allocate每个node上shard总数时计算的权重,提高这个值以后会使node上的shard总数基本趋于一致 | 默认0.45f。调低 |
cluster.routing.allocation.balance.index | allocate每个index在一个node上shard数时计算的权重,提高这个值会使单个index的shard在集群节点中均衡分布 | 默认0.55f。调高 |
cluster.routing.allocation.balance.threshold | 根据上面2个参数计算得出集群内部的分布情况,大于这个阈值就会触发迁移 | 默认1.0f,调高这个参数会使rebalance不那么频繁 |
(2)disk-based shard allocation
parameter | 参数 | 其他 |
---|---|---|
cluster.routing.allocation.disk.threshold_enabled | 是否开启磁盘allocation探测 | 默认true |
cluster.routing.allocation.disk.watermark.low | 低水位线阈值 | 默认85%。在低版本的时候会禁止所有shard被allocation到这台节点上;在5.x的版本上会禁止新shard被allocation到这台;在6.x+的版本会禁止除新primary shard以后的shard被allocation到这台 |
cluster.routing.allocation.disk.watermark.high | 高水位线阈值 | 默认值90%。大于这个阈值以后,上面的shard就会被迁移到其他node上。 |
cluster.routing.allocation.disk.watermark.flood_stage | 设置index为只读的阈值 | 默认值95%。磁盘空间大于这个阈值以后,index就会被设置read-only。esv6.x+ |
网友评论