写点什么

【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!

发布于: 2020 年 08 月 29 日
【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!

前言



说到 Elasticsearch ,其中最明显的一个特点就是 near real-time 准实时 —— 当文档存储在Elasticsearch中时,将在1秒内以几乎实时的方式对其进行索引和完全搜索。那为什么说 ES 是准实时的呢?



公众号:liuzhihangs,记录工作学习中的技术、开发及源码笔记;时不时分享一些生活中的见闻感悟。欢迎大佬来指导!



Lucene 和 ES



Lucene



Lucene 是 Elasticsearch所基于的 Java 库,它引入了按段搜索的概念。



Segment: 也叫段,类似于倒排索引,相当于一个数据集。



Commit point:提交点,记录着所有已知的段。



Lucene index: “a collection of segments plus a commit point”。由一堆 Segment 的集合加上一个提交点组成。



对于一个 Lucene index 的组成,如下图所示。





Elasticsearch



一个 Elasticsearch Index 由一个或者多个 shard (分片) 组成。





而 Lucene 中的 Lucene index 相当于 ES 的一个 shard。





写入过程



写入过程 1.0 (不完善)



  1. 不断将 Document 写入到 In-memory buffer (内存缓冲区)。

  2. 当满足一定条件后内存缓冲区中的 Documents 刷新到磁盘。

  3. 生成新的 segment 以及一个 Commit point 提交点。

  4. 这个 segment 就可以像其他 segment 一样被读取了。



画图如下:





将文件刷新到磁盘是非常耗费资源的,而且在内存缓冲区和磁盘中间存在一个高速缓存(cache),一旦文件进入到 cache 就可以像磁盘上的 segment 一样被读取了。



写入过程 2.0



  1. 不断将 Document 写入到 In-memory buffer (内存缓冲区)。

  2. 当满足一定条件后内存缓冲区中的 Documents 刷新到 高速缓存(cache)。

  3. 生成新的 segment ,这个 segment 还在 cache 中。

  4. 这时候还没有 commit ,但是已经可以被读取了。



画图如下:





数据从 buffer 到 cache 的过程是定期每秒刷新一次。所以新写入的 Document 最慢 1 秒就可以在 cache 中被搜索到。



而 Document 从 buffer 到 cache 的过程叫做 ?refresh 。一般是 1 秒刷新一次,不需要进行额外修改。当然,如果有修改的需要,可以参考文末的相关资料。这也就是为什么说 Elasticsearch 是准实时的。



使文档立即可见: