写点什么

Elasticsearch Document 查询内部原理

用户头像
escray
关注
发布于: 2021 年 02 月 03 日
Elasticsearch Document 查询内部原理

前面两篇分别记录了 Elasticsearch 增删改的过程和如何在增删改的时候保持一致性,那么现在问题来了,查询的时候 Elasticsearch 如何处理?文字内容来自 B 站中华石杉 Elasticsearch 高手进阶课程


Elasticsearch 对于读请求,不一定需要将请求转发到 Primary Shard,转发到 Replica Shard 也可以,Replica Shard 可以服务所有读请求。


当客户端(Java 程序)选择 Elasticsearch 集群中任意一个节点,发送读请求,比如 get document,这个节点同样作为 Coordinating Node,对 Document 进行路由,找到其 Primary Shard 的节点。


Coordinating Node 会采用 Round-Robin 随机轮询算法,转发读请求。


三个节点的 Elastisearch 集群,3 个 Primary Shard,3 个 Replica Shard,假设接收到对于同一个 Document 的 4  次查询,Coordinating Node 经过路由得出 Primary Shard 在 P1 上,使用 Round-Robin 算法,将其中 2 次查询转发给 P1,将其余 2 次查询转发给 R1,让 Primary 和 Replica 负载均衡。


从 Document 所在的 Shard 上获取数据,返回给协调节点,然后由协调节点返回给查询数据的客户端。


有一种特殊情况:document 如果还在建立索引的过程中,可能只在 primary shard 有,任何一个 replica shard 都没有,此时可能会导致无法读取到 document,但是当 document 完成索引建立之后,primary shard 和 replica shard 就都有了。


这种情况要如何处理?我猜应该可以设定 retry 参数。


小结一下:


  1. 客户端发送请求到任意一个 node,成为 coordinate node

  2. coordinate node 对 document 进行路由,将请求转发到对应的 node,此时会使用 round-robin 随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡

  3. 接收请求的 node 返回 document 给 coordinate node

  4. coordinate node 返回 document 给客户端

  5. Document 如果还在建立索引过程中,可能只有 primary shard 有,任何一个 replica shard 都没有,此时可能会导致无法读取到 document,但是 document 完成索引建立之后,primary shard 和 replica shard 就都有了


补充材料


什么时候使用 coordinating 节点?when to use coordinating vs data node


If I should include coordinating-only nodes in my network and if I should route queries exclusively to those coordinating-only nodes? It sounds like the answer is yes.

If I should route write requests exclusively to data nodes? Again, it sounds like the answer is yes.


如果集群里面有 coordinating-only nodes,那么就可以把查询请求直接发送给这些节点,把写请求发送给 data node。


coordinating only node coordinating only node


If you take away the ability to be able to handle master duties, to hold data, and pre-process documents, then you are left with a coordinating node that can only route requests, handle the search reduce phase, and distribute bulk indexing. Essentially, coordinating only nodes behave as smart load balancers.


Adding too many coordinating only nodes to a cluster can increase the burden on the entire cluster because the elected master node must await acknowledgement of cluster state updates from every node!


其实 Elasticsearch 集群中每个节点都默认同时是数据节点、候选主节点和协调节点。


Every node is by default a data node, master eligible and coordinating node (also ingest node) at the same time


如果想要指定一个节点为 coordinating only,只需要通过如下配置:

node.roles: [ ]
复制代码


发布于: 2021 年 02 月 03 日阅读数: 32
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Elasticsearch Document 查询内部原理