elasticsearch源码解析---AllocationDecider

来源:互联网 发布:linux textinfo安装 编辑:程序博客网 时间:2024/05/18 09:13

AllocationModule分为两个模块:ShardAllocatorModule和AllocationDecidersModule。这里主要关注后一个模块。

AllocationDecidersModule有一系列AllocationDecider组成,每一个Decider就是一个分配策略。在AllocationDecidersModule中:

            add(SameShardAllocationDecider.class).            add(FilterAllocationDecider.class).            add(ReplicaAfterPrimaryActiveAllocationDecider.class).            add(ThrottlingAllocationDecider.class).            add(RebalanceOnlyWhenActiveAllocationDecider.class).            add(ClusterRebalanceAllocationDecider.class).            add(ConcurrentRebalanceAllocationDecider.class).            add(EnableAllocationDecider.class). // new enable allocation logic should proceed old disable allocation logic            add(DisableAllocationDecider.class).            add(AwarenessAllocationDecider.class).            add(ShardsLimitAllocationDecider.class).            add(NodeVersionAllocationDecider.class).            add(DiskThresholdDecider.class).            add(SnapshotInProgressAllocationDecider.class).build();
我们分析一下几个主要的策略:

1:AwarenessAllocationDecider

根据配置中的awareness属性来决定分配策略。主要涉及以下几个设置:

cluster.routing.allocation.awareness.attributes   cluster.routing.allocation.awareness.force.*:

有以下规则:

(1)如果没有设置cluster.routing.allocation.awareness.attributes ,则允许分配,say YES

(2)如果启用cluster.routing.allocation.awareness.attributes ,但是不在这个设置包含的属性值中的节点,则say NO

正确的设置状态下,force中设置的对应值应该包含在awareness属性的的值域中,但是也有异常情况,比如有些机器还没有启动完成,这时候获取到force的值可能不包含在force的值域(因为包含该值的机器还没有启动)。当然配置错误是另外一种特例了。

该策略会按照awareness属性中属性值和index对应的shard数目来计算一个平均值出来,代表没一个属性值应该分配多少个shard,作为一个衡量标准。如果所有属性当前状态下目标节点存在的shard数目小于这个平均值则say YES。当然代码逻辑会考虑的会很严密。

如果有配置出现错误的情况(这块是否需要验证?当前模块中未发现相关代码),会导致say NO。

2:ClusterRebalanceAllocationDecider

通过集群中活跃的shard状态来决定是否可以执行rebalance操作。主要涉及到以下配置项目:

cluster.routing.allocation.allow_rebalance。

这个配置是在集群启动之前需要设置好的,不能实时的更改。

支持三种类型:ALWAYS,INDICES_PRIMARIES_ACTIVE(所有主shard活跃),INDICES_ALL_ACTIVE(所有shard活跃)。

3:ConcurrentRebalanceAllocationDecider

通过并行的rebalance操作的数量来作出决策,如果超出标准则say NO。

设置项为cluster.routing.allocation.cluster_concurrent_rebalance

4:DisableAllocationDecider

这个策略在后来的版本中可能会去掉。

5:DiskThresholdDecider

根据硬盘剩余空间来决定是否继续分配。主要涉及的配置项:

cluster.routing.allocation.disk.threshold_enabled + cluster.routing.allocation.disk.watermark.low + cluster.routing.allocation.disk.watermark.high

low默认为85% high默认为90%,这个设置也可以是具体的数值,比如100G等。

如果enabled没有启用,那当然是say YES。

如果只有一个node,则say YES

如果暂时获取不到集群的资源使用情况,也是say YES(这种考量是为何呢?)

校验目标node的磁盘使用情况,使用率和使用资源量都要校验。

此处校验使用的是剩余资源的衡量标准,因此衡量标准变成了freelow15%,freehigh成了10%

如果free小于freelow,情况又分几种了:if 将要分配的shard是个副本或者是之前已经被分配过的主分片,则say NO;else if free>freehigh,则说明还是有些剩余空间的,并且是之前未被分配过的主分片,所以say YES;否则,say NO,说明即便是未被分配过的主分片,也会超过阈值,不与分配。

可见在对待shard的时候还是有区分主分片和副本的,主分片会优先。

如果free大于freelow,说明有空间,但是分配了目标shard之后,是否会超标呢?需要进一步配合freehigh进行验证。

如果超标,say NO,否则 say YES。

6:EnableAllocationDecider

控制是否允许分配。可以在cluster级别设置,也可以在index级别设置,index级别的设置会覆盖cluster级别的设置:

cluster.routing.allocation.enable + index.routing.allocation.enable。支持四种类型:ALL(默认),NONE,NEW_PRIMARIES,PRIMARIES

7:FilterAllocationDecider

显式的设定shard可以分配到那些node上。设置项目有:

index.routing.allocation.require.*

index.routing.allocation.include.*

index.routing.allocation.exclude.*

cluster.routing.allocation.require.*

cluster.routing.allocation.include.*

cluster.routing.allocation.exclude.*

这些设置都可以在系统运行期间动态修改。

分配规则是:

如果不在require设置的值域,say NO

如果不在include设置的值域,say NO

如果在exclude设置的值域,say NO

首先是判断cluster的设置是否符合上述分配规则,然后判断index的设置。

8:NodeVersionAllocationDecider

根本node上部署的版本来确定是否分配。

新版本可以兼容旧版本,say YES,否则say NO。

这也就说明了另外一个问题:es集群中的各个节点可以使用不同的es版本(当然最好是使用相同的),比如在逐个node进行升级的时候,又不想停止服务,就出现了多个版本的情况。

9:RandomAllocationDecider

随机,不介绍了

10:RebalanceOnlyWhenActiveAllocationDecider

控制在所有shard都处在active状态下,才可以执行rebalance操作

11:ReplicaAfterPrimaryActiveAllocationDecider

控制只有在主分片active状态下,副本才可以分配

12:SameShardAllocationDecider

这个决策只有在同一台机器上部署有多个node实例的时候才会有用,用来确保不会将主分片和副本放在同一台机器上。

13:ShardsLimitAllocationDecider

限制一个节点上允许的shard数目。设置项为index.routing.allocation.total_shards_per_node。

14:SnapshotInProgressAllocationDecider

控制snapshot期间是否允许分配。配置项为cluster.routing.allocation.snapshot.relocation_enabled

15:ThrottlingAllocationDecider

这个策略主要是对recovery过程的控制。设置项有:

cluster.routing.allocation.node_initial_primaries_recoveries

cluster.routing.allocation.node_concurrent_recoveries

cluster.routing.allocation.concurrent_recoveries

含义就不用解释了。


以上所有的decider组合成为一个deciders。最终由deciders来决定分配策略。










0 0
原创粉丝点击