理解 Elasticsearch 数据持久化模型

in Notes with 3 comments

1537859101498-28fc2d39-32fa-45c4-9e2c-2f8f213cf324-image-resized.png

index

Elasticsearch 的 index 类似于关系型数据库中的库,index 是存储数据的单元总称。但实际上,这个只是程序角度,在 es 的内部实现角度,每个index相当于一个命名空间,这个空间指向一个或者多个shards

为什么用 index,为了更好地表达,数据存储与搜索的意思。

inverted index

Elasticsearch 是基于 Lucene 的,而 Lucene 是基于 inverted index 的,inverted index可以更好地服务于搜索。 inverted index(倒排索引)可以获取数据中唯一的 termstoken,然后记录哪些文档包含这些 termstoken

查看 http://en.wikipedia.org/wiki/Inverted_index 获取更多了解。

shard

一个 shard (分片) 是 Lucene 的一个实例,它本身具备一个功能齐全的搜索引擎。 一个 index 可以由一个 shard 组成,但大部分情况下都是由多个 shard 组成,这样就可以允许 index 继续增长和分割到不同的机器上。

primary shard (主分片)是主要文档的入口,replica shard (副本分片)是主分片的复制集,并提供主分片所在的节点故障时的故障转移,同时也会增加读写吞吐量。

segment

每个 shard 包含多个 segment(段),每个段就是一个 inverted index(倒排索引),在分片中,每次搜索将会依次搜索每个段,然后将其结果合并到该分片的最终结果中,然后返回。

每次写入新文档时, Elasticsearch 会搜集这些新文档存储于内存中(为了安全,放在事务日志中),然后每隔 1s ,将一个新的小段写入磁盘,并 refreshes ,使其可以被搜索到。

这使得新段中的数据对搜索可见,但该段尚未与磁盘进行同步,因为数据依然可能会丢失。

然后,再每隔一段时间,Elasticsearch 将会执行flush,这意味着会执行段与磁盘同步的操作(commit),接着是清除事务日志,事物日志已经被写入到磁盘了,不再需要了。

分段越多,每次搜索所需要的时间越长。因此 Elasticsearch 会在后台执行合并操作,将大量相似的尺寸的小段合并到一个更大的段中。写入到大段后,旧段会被删掉。当有大量的小段时,这个过程会反复执行。

segment 是不可分的最小颗粒。当更新文档时,它实际上只会将旧文档标记为已删除,并为新文档创建新的索引,上述的合并过程还会消除段中这些标记删除的文档。

结束

结合上图去看就更容易理解。

Responses
  1. wwaf

    宅男福利 https://6wll.com

    Reply
  2. goods!
    http://www.datangyun.cn
    评论内容请不少于一个中文汉字

    Reply
  3. gfghh

    网址 https://www.linpx.com/

    Reply