十张图说清Elasticsearch原理!

网友投稿 907 2023-03-07

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

十张图说清Elasticsearch原理!

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

Lucene 和 ES

Lucene

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

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

ES

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

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

写入过程

写入过程 1.0(不完善)

写入过程 1.0 如下:

不断将 Document 写入到 In-memory buffer(内存缓冲区)。当满足一定条件后内存缓冲区中的 Documents 刷新到磁盘。生成新的 segment 以及一个 Commit point 提交点。这个 segment 就可以像其他 segment 一样被读取了。

画图如下:

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

写入过程 2.0

写入过程 2.0 如下:

画图如下:

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

而 Document 从 buffer 到 cache 的过程叫做 ?refresh。一般是 1 秒刷新一次,不需要进行额外修改。

当然,如果有修改的需要,可以参考文末的相关资料。这也就是为什么说 Elasticsearch 是准实时的。

使文档立即可见:

PUT /test/_doc/1?refresh{"test": "test"}// 或者PUT /test/_doc/2?refresh=true{"test": "test"}

值得注意的是:

translog 每 5s 刷新一次磁盘,所以故障重启,可能会丢失 5s 的数据。translog 执行 flush 操作,默认 30 分钟一次,或者 translog 太大也会执行。

手动执行 flush:

POST /my-index-000001/_flush

POST /my-index-000001/_flush

删除和更新segment 不可改变,所以 docment 并不能从之前的 segment 中移除或更新。

而查询时,获取到的结果在返回前会经过 .del 过滤。更新时,也会标记旧的 docment 被删除,写入到 .del 文件,同时会写入一个新的文件。

此时查询会查询到两个版本的数据,但在返回前会被移除掉一个。

segment 合并

每 1s 执行一次 refresh 都会将内存中的数据创建一个 segment。

segment 数目太多会带来较大的麻烦。每一个 segment 都会消耗文件句柄、内存和 cpu 运行周期。

更重要的是,每个搜索请求都必须轮流检查每个 segment ;所以 segment 越多,搜索也就越慢。

在 ES 后台会有一个线程进行 segment 合并:

refresh 操作会创建新的 segment 并打开以供搜索使用。合并进程选择一小部分大小相似的 segment,并且在后台将它们合并到更大的 segment 中。这并不会中断索引和搜索。当合并结束,老的 segment 被删。

说明合并完成时的活动:

总结

主要介绍了内部写入和删除的过程,需要了解 refresh、fsync、flush、.del、segment merge 等名词的具体含义。

完整画图如下:

上一篇:机器学习 运维(机器人运维员)
下一篇:运维人员告警分析报告(运维人员告警分析报告范文)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~