ElasticSearch增删改查实现原理

1、write(写)/create(创建)操作实现原理

当您向协调节点发送请求以索引新文档时,将执行以下操作:

  • 所有在Elasticsearch集群中的节点都包含:有关哪个分片存在于哪个节点上的元数据。协调节点(coordinating node)使用文档ID(默认)将文档路由到对应的分片。Elasticsearch将文档ID以murmur3作为散列函数进行散列,并通过索引中的主分片数量进行取模运算,以确定文档应被索引到哪个分片。
    shard = hash(document_id) % (num_of_primary_shards)

  • 当节点接收到来自协调节点的请求时,请求被写入到translog(我们将在后续的post中间讲解translog),并将该文档添加到内存缓冲区。如果请求在主分片上成功,则请求将并行发送到副本分片。只有在所有主分片和副本分片上的translog被fsync’ed后,客户端才会收到该请求成功的确认。

  • 内存缓冲区以固定的间隔刷新(默认为1秒),并将内容写入文件系统缓存中的新段。此分段的内容更尚未被fsync’ed(未被写入文件系统),分段是打开的,内容可用于搜索。

  • translog被清空,并且文件系统缓存每隔30分钟进行一次fsync,或者当translog变得太大时进行一次fsync。这个过程在Elasticsearch中称为flush。在刷新过程中,内存缓冲区被清除,内容被写入新的文件分段(segment)。当文件分段被fsync’ed并刷新到磁盘,会创建一个新的提交点(其实就是会更新文件偏移量,文件系统会自动做这个操作)。旧的translog被删除,一个新的开始。

  • 下图显示了写入请求和数据流程:


    ElasticSearch增删改查实现原理_第1张图片
    写入流程

2、Update和Delete实现原理

删除和更新操作也是写操作。但是,Elasticsearch中的文档是不可变的(immutable),因此不能删除或修改。那么,如何删除/更新文档呢?
磁盘上的每个分段(segment)都有一个.del文件与它相关联。当发送删除请求时,该文档未被真正删除,而是在.del文件中标记为已删除。此文档可能仍然能被搜索到,但会从结果中过滤掉。当分段合并时(我们将在后续的帖子中包括段合并),在.del文件中标记为已删除的文档不会被包括在新的合并段中。
现在,我们来看看更新是如何工作的。创建新文档时,Elasticsearch将为该文档分配一个版本号。对文档的每次更改都会产生一个新的版本号。当执行更新时,旧版本在.del文件中被标记为已删除,并且新版本在新的分段中编入索引。旧版本可能仍然与搜索查询匹配,但是从结果中将其过滤掉。
indexed/updated文档后,我们希望执行搜索请求。我们来看看如何在Elasticsearch中执行搜索请求。

3、Read的实现原理

读操作由两个阶段组成:

  • 查询阶段(Query Phase)
  • 获取阶段(Fetch Phase)

3.1 查询阶段(Query Phase)

在此阶段,协调节点将搜索请求路由到索引(index)中的所有分片(shards)(包括:主要或副本)。分片独立执行搜索,并根据相关性分数创建一个优先级排序结果(稍后我们将介绍相关性分数)。所有分片将匹配的文档和相关分数的文档ID返回给协调节点。协调节点创建一个新的优先级队列,并对全局结果进行排序。可以有很多文档匹配结果,但默认情况下,每个分片将前10个结果发送到协调节点,协调创建优先级队列,从所有分片中分选结果并返回前10个匹配。

3.2 获取阶段(Fetch Phase)

在协调节点对所有结果进行排序,已生成全局排序的文档列表后,它将从所有分片请求原始文档。
所有的分片都会丰富文档并将其返回到协调节点。


ElasticSearch增删改查实现原理_第2张图片
读取流程

如上所述,搜索结果按相关性排序。我们来回顾一下相关性的定义。

3.3 搜索相关性(Search Relevance)

相关性由Elasticsearch给予搜索结果中返回的每个文档的分数确定。用于评分的默认算法为tf / idf(术语频率/逆文档频率)。该术语频率测量术语出现在文档中的次数(更高频率=更高的相关性),逆文档频率测量术语在整个索引中出现的频率占索引中文档总数的百分比(更高的频率==较少的相关性)。最终得分是tf-idf分数与其他因素(如词语邻近度(短语查询)),术语相似度(用于模糊查询)等的组合。

4、概念总结

4.1 refresh

es接收数据请求时先存入内存中,默认每隔一秒会从内存缓冲区中将数据写入文件系统缓存,这个过程叫做refresh;

4.2 fsync

translog会每隔5秒或者在一个变更请求完成之后执行一次fsync操作,将translog从缓存刷入磁盘,这个操作比较耗时,如果对数据一致性要求不是跟高时建议将索引改为异步,如果节点宕机时会有5秒数据丢失;

4.3 flush

es默认每隔30分钟会将文件系统缓存中的数据刷入磁盘同时清空translog日志文件,这个过程叫做flush。

4.4 merge

buffer每次refresh一次,就会产生一个segment文件,所以默认情况下是1秒钟一个segment file,segment file会越来越多,此时会定期执行merge;
每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。

转自:https://blog.csdn.net/tianyeshiye/article/details/80863343

你可能感兴趣的:(ElasticSearch增删改查实现原理)