ElasticSearch 增删改查 原理流程
前置基础必知: # ElasticSearch 准实时索引的底层实现原理
1、ElasticSearch 文档写入 原理流程
-
选择任意一个DataNode发送请求,例如:node2 ;此时,node2就成为一个coordinating node(协调节点)
-
hash计算得到文档要写入的分片
shard = hash(routing) % number_of_primary_shards- routing 是一个可变值,默认是文档的 _id
-
coordinating node会进行路由,将请求转发给对应的primary shard(主分片)所在的DataNode(假设primary shard主分片在node1、replicaShard副本分片在node2)
-
node1节点上的Primary Shard主分片处理请求,写入数据到索引库中,并将数据同步到Replica shard副本分片
-
Primary Shard和Replica Shard都保存好了文档,返回client
2、ElasticSearch 检索查询 原理流程
- client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点(Coordinating Node)
- 协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求
- 每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点
- 协调节点将所有的结果进行汇总,并进行全局排序
- 协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端
3、ElasticSearch 文档更新与删除 原理流程
对于文档的删除:
每个commit point都会维护一个.del文件,文件内记录了在某个segment内某个文档已经被删除。
在segment中,被删除的文档依旧是能够被搜索到的,不过在返回搜索结果前,会根据.del把那些已经删除的文档从搜索结果中过滤掉。
- Segment合并:Segment太多时,ES定期会将多个segment合并成为大的segment,减少索引查询时IO开销,此阶段ES会真正的物理删除(之前执行过的delete的数据)
对于文档的更新
对于文档的更新,采用和删除文档类似的实现方式。
当一个文档发生更新时,首先会在.del中声明这个文档已经被删除,同时新的文档会被存放到一个新的segment中。
这样在搜索时,虽然新的文档和老的文档都会被匹配到,但是.del会把老的文档过滤掉,返回的结果中只包含更新后的文档。