ElasticSearch 增删改查 原理流程

671 阅读2分钟

ElasticSearch 增删改查 原理流程

前置基础必知: # ElasticSearch 准实时索引的底层实现原理

1、ElasticSearch 文档写入 原理流程

image.png

  1. 选择任意一个DataNode发送请求,例如:node2 ;此时,node2就成为一个coordinating node(协调节点)

  2. hash计算得到文档要写入的分片

    shard = hash(routing) % number_of_primary_shards

    • routing 是一个可变值,默认是文档的 _id
  3. coordinating node会进行路由,将请求转发给对应的primary shard(主分片)所在的DataNode(假设primary shard主分片在node1、replicaShard副本分片在node2)

  4. node1节点上的Primary Shard主分片处理请求,写入数据到索引库中,并将数据同步到Replica shard副本分片

  5. Primary Shard和Replica Shard都保存好了文档,返回client

2、ElasticSearch 检索查询 原理流程

image.png

  1. client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点(Coordinating Node)
  2. 协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求
  3. 每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点
  4. 协调节点将所有的结果进行汇总,并进行全局排序
  5. 协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端

3、ElasticSearch 文档更新与删除 原理流程

对于文档的删除:

每个commit point都会维护一个.del文件,文件内记录了在某个segment内某个文档已经被删除。

在segment中,被删除的文档依旧是能够被搜索到的,不过在返回搜索结果前,会根据.del把那些已经删除的文档从搜索结果中过滤掉。

  • Segment合并:Segment太多时,ES定期会将多个segment合并成为大的segment,减少索引查询时IO开销,此阶段ES会真正的物理删除(之前执行过的delete的数据)

对于文档的更新

对于文档的更新,采用和删除文档类似的实现方式。

当一个文档发生更新时,首先会在.del中声明这个文档已经被删除,同时新的文档会被存放到一个新的segment中。

这样在搜索时,虽然新的文档和老的文档都会被匹配到,但是.del会把老的文档过滤掉,返回的结果中只包含更新后的文档。