通过阅读源码分析elasticsearch中分片如何分配到集群中节点

原创 2016年06月05日 18:05:28

下面以三个节点,主分片为3,副本为1的情况进行说明:

 核心逻辑是通过计算权重来分配分片到节点,权重计算逻辑:首先计算分片的权重(节点的分片数量-每个节点的平均分片),然后是索引的权重(节点上索引的分片数量减去每个节点对应索引的平均分片数);最终的权重值就是:0.45(分片平衡因子的默认值)*分片的权重+0.55(索引平衡因子的默认值)*索引的权重,得到的结果即为权重值;另外在计算权重值的时候es首先假设将此分片分配到这个节点上,然后进行计算,计算完之后会remove掉。

第一个主分片循环  

1.循环第一个节点的时候->计算权重值为-1(分片的权重为-1,索引的权重为-1,最终计算就是-1),因为-1小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。

2.循环第二个节点->计算权重值为-1(分片的权重为-1,索引的权重为-1,最终计算就是-1),因为-1等于minWeight并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合继续下一个节点,符合条件就像前面那样赋值)。
3.第三个节点->计算权重值为-1,因为-1等于minWeight并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合跳出节点循环(此时就是跳出循环不赋值),符合条件就像前面那样赋值。跳出循环之后,如果minNode不为空,则将此分片分配到这个节点上,并进行初始化等操作。
                     节点名称                         主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0                  


第二个主分片开始循环 

1.循环第一个节点的时候->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。

2.循环第二个节点->计算权重值为-1(分片的权重为-1,索引的权重为-1,最终计算就是-1),因为-1小于minWeight(此时minWeight已是0)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。
3.第三个节点->计算权重值为-1,因为-1等于minWeight并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合跳出节点循环(此时就是跳出循环不赋值),符合条件就像前面那样赋值。
                    节点名称                          主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0                  
   N57J9WrZQPCEL6GvbXEonQ             1
   

第三个主分片开始循环 

1.循环第一个节点的时候->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。

2.循环第二个节点->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0等于minWeight(此时minWeight已是0)并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合跳出节点循环(此时就是跳出循环不赋值),符合条件就像前面那样赋值。
3.第三个节点->计算权重值为-1,因为-1小于minWeight(此时minWeight已是0)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。
                   节点名称                           主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0                  
   N57J9WrZQPCEL6GvbXEonQ             1
   Ckva8gbbSpuFvlecvw5p5Q                 2
   
此时主分片已经分配完,开始副本分配;在分配副本分片的时候,会调用decision判断主分片是否已经激活,如果没有得需要等到副本分片对应的主分片分配完之后才能分配副本分片。
   

第一个副本分片开始循环 

1.循环第一个节点的时候->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision是NO(因为相同分片不能分配到相同节点),所以此处没有赋值,继续循环。

2.循环第二个节点->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。
3.第三个节点->计算权重值为0,因为0等于minWeight(此时minWeight已是0)并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合跳出节点循环(此时就是跳出循环不赋值),符合条件就像前面那样赋值。
                   节点名称                           主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0                  
   N57J9WrZQPCEL6GvbXEonQ             1 0
   Ckva8gbbSpuFvlecvw5p5Q                 2
   

第二个副本分片开始循环 

1.循环第一个节点的时候->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。

2.循环第二个节点->计算权重值为1(分片的权重为1,索引的权重为1,最终计算就是1),因为1大于minWeight(minWeight此时为0)直接跳出继续循环下一个节点。
3.第三个节点->计算权重值为0,因为0等于minWeight(此时minWeight已是0)并且decision都是YES,然后进行下列复杂的判断(此处见最后的说明),不符合跳出节点循环,符合条件就像前面那样赋值(此时符合条件)。
                    节点名称                          主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0                  
   N57J9WrZQPCEL6GvbXEonQ             1 0
   Ckva8gbbSpuFvlecvw5p5Q                 2                     1
   

第三个副本分片开始循环 

1.循环第一个节点的时候->计算权重值为0(分片的权重为0,索引的权重为0,最终计算就是0),因为0小于minWeight(minWeight为1.0f / 0.0f)并且decision都是YES,所以把当前节点赋给minNode,把当前权重赋给minWeight,把当前的decision结果赋给decision。

2.循环第二个节点->计算权重值为1(分片的权重为1,索引的权重为1,最终计算就是1),因为1大于minWeight(minWeight此时为0)直接跳出继续循环下一个节点。
3.第三个节点->计算权重值为1(分片的权重为1,索引的权重为1,最终计算就是1),因为1大于minWeight(minWeight此时为0)直接跳出继续循环下一个节点。
                     节点名称                         主分片          副本分片
   lrUOpMcLT4eEAVAm2zGcpA               0 2
   N57J9WrZQPCEL6GvbXEonQ             1 0
   Ckva8gbbSpuFvlecvw5p5Q                 2 1
   
复杂判断代码如下:


这段代码的主要作用就是:诸如上面的情形,当主分片0,1,2分别分配到了节点a,b,c上的时候,会避免出现如下情形,副本1,0分别分配到了a,b节点上,由于相同分片不能分配到相同节点上,并且每个节点要保持分片数相同,那么这样就会导致副本分片2无处分片,这段代码的作用正在于此。

控制Elasticsearch分片和副本的分配

ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运...
  • xtjsxtj
  • xtjsxtj
  • 2016年01月12日 09:25
  • 11673

通过阅读源码分析elasticsearch中分片如何分配到集群中节点

下面以三个节点,主分片为3,副本为1的情况进行说明:  核心逻辑是通过计算权重来分配分片到节点,权重计算逻辑:首先计算分片的权重(节点的分片数量-每个节点的平均分片),然后是索引的权重(节点上索引的分...
  • jianjun200607
  • jianjun200607
  • 2016年06月05日 18:05
  • 599

在一台服务器部署多个elasticsearche节点

之前已在一台服务器上部署了elasticsearch,今天想着尝试elasticsearch的分布式,但受限于硬件资源(手头上只有一台服务器),所以就想着在一台服务器上部署多个结点(下文以2个结点作为...
  • xujingzhong0077
  • xujingzhong0077
  • 2016年10月21日 17:27
  • 3278

elasticsearch节点脱离集群 分片控制

Rebalancing操作,延迟分配
  • zhengxgs
  • zhengxgs
  • 2016年12月30日 14:47
  • 759

ElasticSearch:一个物理节点上应该有多少个分片?

一个物理节点上应该有多少个分片? ES官方给予的回答是: 每个分片都是一个Lucene实例,它会消耗相应的CPU,IO,内存,文件描述符等等。 所以我们应该让每台机器上的分片数尽量的少,...
  • kexinmei
  • kexinmei
  • 2015年06月04日 09:08
  • 2502

elasticsearch高级配置之分片分布规则设置

Java代码   cluster.routing.allocation.allow_rebalance   设置根据集群中机器的状态来重新分配分片,可以设置为always, i...
  • xtjsxtj
  • xtjsxtj
  • 2016年01月13日 14:31
  • 4303

ES集群节点宕机导致shard unassigned解决方案

ES集群概况: 1台master节点,4台data节点,9个shards 问题: 一台data节点宕机,导致5个分片处于unassigned状态,集群状态变为red,无法自动rerouting ...
  • u012386386
  • u012386386
  • 2017年12月15日 12:35
  • 182

Elasticsearch学习笔记(三)Elasticsearch集群分片的读写操作流程

Elasticsearch学习笔记(三)Elasticsearch集群分片的读写操作流程 在上篇文章中详细介绍了Elasticsearch基于Lucene的单节点的准实时索引的实现,那么Elasti...
  • u010994304
  • u010994304
  • 2015年12月31日 14:24
  • 7092

Elasticsearch中setting,mapping,分片查询方式

原文地址:http://blog.csdn.net/ty4315/article/details/52477559?utm_source=itdadao&utm_medium=referral s...
  • tanga842428
  • tanga842428
  • 2017年03月09日 08:51
  • 735

elasticsearch 集群任意节点都可以请求

If you have multiple nodes in your Elasticsearch cluster, the easiest way to distribute Kibana reque...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年01月02日 21:03
  • 812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过阅读源码分析elasticsearch中分片如何分配到集群中节点
举报原因:
原因补充:

(最多只允许输入30个字)