由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

Elasticsearch分布式底层原理

数据库 西门飞冰 156℃
[隐藏]

1.介绍

本文主要介绍ES分布式的一些原理,了解一个文档的写入、提取、搜索在ES里面做了哪些事情。

2.文档写入流程

我们首先了解在ES集群中,一个单独的文档是如何写入的。

image-20221019211600114

1、客户端发送任何一个请求到任意一个节点,这个节点就成为协调节点 (coordinate node)

2、协调节点对新增document(可以手动设置doc id,也可以由系统分配)的id号进行哈希取值,在根据分片的数量进行取模,得到的数量就是具体的节点,然后将请求转发给对应node。

文档编号 Hash值 对应主分片编号(HASH值%主分片数量)
800 8817201 0
900 8932174 1
933 8936891 2

主分片确定后:

3、node上的primary shard处理请求,然后将数据同步到replica node

4、协调节点如果发现primary shard所在的node和所有的replica shard所对应的 node都搞定之后,就会将请求返回给客户端

3.文档提取流程

image-20221019211816105

1、客户端发送任何一个请求到任意一个node,这个节点就成为协调节点

2、协调节点对文档id进行哈希路由,此时会使用round-robin随机轮询算法,在主分 片以及所有的副本分片中随机选择一个,让读请求负载均衡

3、数据提取完毕,返回document给协调节点

4、协调节点再将数据返回给客户端

4.文档搜索过程

文档搜索和提取的区别:

文档提取:一次性获取一个文档

文档搜索:一次性获取多个文档

image-20221019211933274

1、客户端发送一个请求给协调节点(coordinate node)

2、协调节点将搜索的请求转发给所有shard对应的primary shard或replica shard

3、query phase:每一个shard将自己搜索的结果(其实也就是一些唯一标识),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最后的结果

4、fetch phase :接着由协调节点,根据唯一标识去各个节点进行拉取数据,最后汇总返回给客户端

5.文档写入的底层原理

看一下文档是如何在内存和磁盘中进行协调的,为什么作为ES文档的提取速度这么快的原因。

image-20221019212118959

按照文档的存储组织来说,它主要分成了四块:

1、index buffer:内存的索引缓冲区

2、filesystem cache:系统文件的缓冲区

3、translog:数据的操作日志,为了防止数据丢失设计的

4、Disk:最终落盘存储的磁盘

在每一个过程中他都有一个处理的逻辑,下面我们分别来看一下:

1、当你写一条数据document的时候,一方面写入到内存buffer缓冲中,一方面同时 写入到translog日志文件中。

tips: translog日志作用:在数据最终保存到磁盘之前,所有的数据都是停留在buffer或OS cache之中,无论buffer或OS cache都是内存,一旦这台机器死了,内存的数据就会丢失,所以需要将数据对应的操作写入一个专门的日志之中,一旦机器出现宕机,再次重启的时候,es会主动的读取translog之中的日志文件的数据,恢复到内存buffer和OS cache之中。

2、buffer满了或者每隔1秒(可配),自动refresh将内存buffer中的数据生成index segment文件并写入os cache,此时index segment可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);然后清空内存buffer供后续使用。可见,refresh实现的是文档从内存移到文件系统缓存的过程。

tips: index segment本质就是倒排索引,ES的核心lucene引擎就是将大的倒排索引拆 分为许多小的index segment倒排索引存储。

image-20221019212455712

3、重复上两个步骤,新的segment不断添加到os cache,内存buffer不断被清空, 而translog的数据不断增加,随着时间的推移,translog文件会越来越大。当 translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定 时flush,其主要过程:

(1)执行refresh操作将mem buffer中的数据写入到新的segment并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。

(2)一个commit point被写入磁盘,这个commit point中标明所有的index segment。

(3)filesystem cache(os cache)中缓存的所有的index segment文件被fsync 强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被 打开,供查询使用。

(4)translog被清空和删除,创建一个新的translog。

6.为什么说es是准实时的?

NRT,全程near real-time,默认每隔1s refresh一次,所以es是准实时的,因为写入的数据1s之 后才能被看到。也可以通过restful ap或者java api,手动执行一次refresh操作。总之,只要数 据被输入到os cache中,数据就立马可以被搜索到

7.为什么ES可能会丢失5秒数据?

利用translog的数据也是先写入到内存buffer和os cache / segment filie 中,默认5s将数据 刷新到os disk中去,也就是说,可能有5s的数据仅仅停留在内存buffer或 os cache中,如果此 时机器挂了,会丢失5s的数据,但是这样性能比较好。如果对数据一致性要求较高,想要数据完全不丢,可以将每次的操作都必须直接fsync到磁盘,但是性能会比较差

8.ES中的更新与删除操作背后的原理是什么?

删除操作

当删除document的时候,会生成一个.del文件(如果没有的话) ,里面将被删除的document并标识为deleted状态。当搜索的时候,根据.del文件就知道document是否被删除了。

更新操作

ES其实没有更新操作,而是将原来的document标识为deleted状态,然后新写入一条被更新后的数据。

9.segment merge的执行流程

segment merge作用:将多个小的倒排索引合并成一个大的索引,方便我们进行磁盘的IO。

执行流程:

  • 选择一些相似大小的segment file, merge成一个大的segment file,同时,被标记为deleted的document也会被彻底物理删除
  • 将新的segment file flush到os disk
  • 写入一个新的commit point,包括了新的segment file,并排除了旧的那些 segment file
  • 将新的segment file打开供搜索
  • 将旧的segment file删除

转载请注明:西门飞冰的博客 » Elasticsearch分布式底层原理

喜欢 (2)or分享 (0)