通过阅读源码分析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源码分析之集群管理(一)

一、背景 Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。本文主要介绍实现分布式搜索和分析的基础–存储,好的存储设计在根本上决定了查询的性能。...

CentOS下ELK开机自启动的配置

前言   上篇文章描写了 CentOS下ELK的搭建流程[ CentOS下ELK的搭建 ],做好相应配置后,我们往往会考虑服务自启动的问题。笔者在网上找了很多相关资料,都没有比较全面讲解,真是一步...

CentOS 7 目录结构

初学来做个笔记

elasticsearch节点脱离集群 分片控制

Rebalancing操作,延迟分配

elasticsearch源码分析之分片分配(十)

分片是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。这个把shard分发到node的过程就是分片的分配。分配的原则是主要还是基于提高读写性能,实现负载均衡,备份恢复快...

elasticsearch介绍集群,模拟横向扩展节点、节点宕机、改变分片

elasticsearch介绍集群,模拟横向扩展节点、节点宕机、改变分片      出处:[http://www.cnblogs.com/dennisit/p/4133131.html] ...

ubuntu12.04+Elasticsearch2.3.3伪分布式配置,集群状态分片调整

目录目录 1什么是Elashticsearch 1 Elashticsearch介绍 2 Elashticsearch的基础概念  2运行Elasticsearch需要哪些环境 1 Java运行环境安...
  • 狮子
  • 狮子
  • 2016年08月03日 16:28
  • 702

实例展示elasticsearch集群生态,分片以及水平扩展.

elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵...

elasticsearch集群生态,分片以及水平扩展.

elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵...

elasticsearch集群生态介绍,分片及其水平扩展

出自: [http://www.cnblogs.com/dennisit/p/4133131.html],自己保留一份。 elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过阅读源码分析elasticsearch中分片如何分配到集群中节点
举报原因:
原因补充:

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