Elasticsearch版本:6.0


一、Elasticsearch计算分片位置的公式

shard = hash(routing) % number_of_primary_shards

解释:routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards主分片的数量)后得到 余数 。这个分布在 0number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

所以说主分片的数量不会改变,,因为如果改变了,文档就找不到了。

二、主分片和副本分片的交互

我们可以发送请求到集群中的任一节点。 每个节点都有能力处理任意请求。 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。

TIP: 当发送请求的时候,为了扩展负载,更好的做法是轮询集群中所有的节点。

新建、索引和删除 请求都是 操作, 必须在主分片上面完成之后才能被复制到相关的副本分片。

在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。

    局部更新文档update API 结合了先前说明的读取和写入模式 。

查询阶段

查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的 _优先队列_。

  1. 客户端发送一个 search 请求到 Node 3 , Node 3 会创建一个大小为 from + size 的空优先队列。
  2. Node 3 将查询请求转发到索引的每个主分片或副本分片中。每个分片在本地执行查询并添加结果到大小为 from + size 的本地有序优先队列中。
  3. 每个分片返回各自优先队列中所有文档的 ID 和排序值给协调节点,也就是 Node 3 ,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。

分片返回一个轻量级的结果列表到协调节点,它仅包含文档 ID 集合以及任何排序需要用到的值,例如 _score

取回阶段

取回阶段,查询阶段标识哪些文档满足 搜索请求,但是我们仍然需要取回这些文档。

  1. 协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。
  2. 每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。
  3. 一旦所有的文档都被取回了,协调节点返回结果给客户端。

最新文章

  1. Linq的分页与组合查询的配合使用
  2. [Cordova] 手机网页里的1px
  3. "Type Coercion failed" Error in FlashBuilder 4.7
  4. Android 下拉列表框、文本框、菜单
  5. [转]Asp.net MVC使用Filter解除Session, Cookie等依赖
  6. C#的一维数组和二维数组定义方式:
  7. HDU 2571 命运
  8. fis3安装
  9. SSO-Javascript模拟IE登录,不让IIS弹出登录窗口
  10. SCRUM,一个采用迭代,增量方法来优化可预见控制风险
  11. Chapter 8 工厂方法模式
  12. JSP的学习(3)——语法知识二之page指令
  13. Chapter 15_4 子模块和包
  14. struts2修改文件上传的大小
  15. Java多线程:Callable,Future,FutureTask
  16. 凡事预则立-于Beta冲刺前
  17. Matplotlib 使用 - 《Python 数据科学手册》学习笔记
  18. 服务器重新启动,ftp重新连接问题
  19. 检测到是移动端还是PC端进入页面,加载不同样式表现
  20. 记录C/C++中遇到的一些小问题

热门文章

  1. webSocket 简单介绍
  2. Poco 编译mysql
  3. deprecated conversion from string constant to ‘char*’
  4. 数据库中rs("ABC")与rs.Fields("ABC").value的差别(Rs是RecordSet对象)
  5. UniqueIdentifier 数据类型
  6. 第6章 图的学习总结(邻接矩阵&邻接表)
  7. CF360E Levko and Game【贪心+dijsktra】
  8. Awesome Blockchain 区块链技术导航
  9. Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
  10. java.exe is valid, but is for a machine type other than the current machine