直接上图:
index
Elasticsearch 的 index
类似于关系型数据库中的库,index
是存储数据的单元总称。但实际上,这个只是程序角度,在 es 的内部实现角度,每个index
相当于一个命名空间,这个空间指向一个或者多个shards
。
为什么用 index
,为了更好地表达,数据存储与搜索的意思。
inverted index
Elasticsearch 是基于 Lucene 的,而 Lucene 是基于 inverted index
的,inverted index
可以更好地服务于搜索。 inverted index
(倒排索引)可以获取数据中唯一的 terms
或 token
,然后记录哪些文档包含这些 terms
和 token
。
查看 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
是不可分的最小颗粒。当更新文档时,它实际上只会将旧文档标记为已删除,并为新文档创建新的索引,上述的合并过程还会消除段中这些标记删除的文档。
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。