直接上图:

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 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。