ES读写流程

简述ES的写流程,GET读取数据流程和Search搜索数据流程。

ES的读写流程主要是协调节点,主分片节点、副分片节点间的相互协调。

ES的读取分为GET和Search两种操作。GET根据文档id从正排索引中获取内容;Search不指定id,根据关键字从倒排索引中获取内容。

写单个文档的流程

  1. 客户端向集群中的某个节点发送写请求,该节点就作为本次请求的协调节点;
  2. 协调节点使用文档ID来确定文档属于某个分片,再通过集群状态中的内容路由表信息获知该分片的主分片位置,将请求转发到主分片所在节点;
  3. 主分片节点上的主分片执行写操作。如果写入成功,则它将请求并行转发到副分片所在的节点,等待副分片写入成功。所有副分片写入成功后,主分片节点向协调节点报告成功,协调节点向客户端报告成功。

读取单个文档的流程

  1. 客户端向集群中的某个节点发送读取请求,该节点就作为本次请求的协调节点;

  2. 协调节点使用文档ID来确定文档属于某个分片,再通过集群状态中的内容路由表信息获知该分片的副本信息,此时它可以把请求转发到有副分片的任意节点读取数据。

    协调节点会将客户端请求轮询发送到集群的所有副本来实现负载均衡。

  3. 收到读请求的节点将文档返回给协调节点,协调节点将文档返回给客户端

Search流程

ES的Search操作分为两个阶段:query then fetch。需要两阶段完成搜索的原因是:在查询时不知道文档位于哪个分片,因此索引的所有分片都要参与搜索,然后协调节点将结果合并,在根据文档ID获取文档内容。

Query查询阶段

  1. 客户端向集群中的某个节点发送Search请求,该节点就作为本次请求的协调节点;
  2. 协调节点将查询请求转发到索引的每个主分片或者副分片中;
  3. 每个分片在本地执行查询,并使用本地的Term/Document Frequency信息进行打分,添加结果到大小为from+size的本地有序优先队列中;
  4. 每个分片返回各自优先队列中所有文档的ID和排序值给协调节点,协调节点合并这些值到自己的优先队列中,产生一个全局排序后的列表。

Fetch拉取阶段

query节点知道了要获取哪些信息,但是没有具体的数据,fetch阶段要去拉取具体的数据。相当于执行多次上面的GET流程

  1. 协调节点向相关的节点发送GET请求;
  2. 分片所在节点向协调节点返回数据;
  3. 协调阶段等待所有的文档被取得,然后返回给客户端。

参考自《ES源码解析与优化实践》

posted @ 2020-08-11 23:42  upupfeng  阅读(1606)  评论(0编辑  收藏  举报