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来决定分配策略。
- elasticsearch源码解析---AllocationDecider
- ElasticSearch Bulk 源码解析
- mongodb-river-elasticsearch源码解析
- mongodb-elasticsearch-rive源码解析
- Elasticsearch分词器源码解析
- mongodb-river-elasticsearch源码解析
- ElasticSearch源码解析(三):索引创建
- ElasticSearch源码
- ES-MongoDB学习2_mongodb-river-elasticsearch源码解析
- Elasticsearch源码分析九--查询解析器QueryParser注册过程
- ElasticSearch源码解析(二):ES的CharFilter、Tokenizer、TokenizerFilter
- ElasticSearch源码解析(四):检索(Search)
- ElasticSearch源码解析(五):排序(评分公式)
- elasticsearch源码分析之Rest/RPC 接口解析(八)
- elasticsearch源码分析---TransportClient
- elasticsearch-ThreadPool源码
- elasticsearch 源码阅读
- Elasticsearch源码编译运行
- source insight UTF-8 乱码解决
- Redis主从复制问题和扩容问题的解决思路
- dddddddd
- 一直说要改变却从未开始
- /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
- elasticsearch源码解析---AllocationDecider
- DataGridView控件---绑定数据方法
- test
- Project Euler 9
- android WebView 加载重定向页面无法后退解决方案
- Cocos2dx技术(三)——cocos2dx基本概念(二)
- 一个Activity给另一个Activity传递数据
- iOS获取文件夹下某个后缀的所有文件
- java synchronized详解