Refresh & Flush

Refresh & Flush

官方文档描述

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/indices-refresh.html

The refresh API allows to explicitly refresh one or more index, making all operations performed since the last refresh available for search. The (near) real-time capabilities depend on the index engine used. For example, the internal one requires refresh to be called, but by default a refresh is scheduled periodically.

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/indices-flush.html

The flush API allows to flush one or more indices through an API. The flush process of an index basically frees memory from the index by flushing data to the index storage and clearing the internal transaction log. By default, Elasticsearch uses memory heuristics in order to automatically trigger flush operations as required in order to clear memory.

从上面的文档的描述中,可以发现 refresh 和 flush 作用似乎很像。都是在索引操作之后,使得文档可以立即被搜索到。为了理解这两个操作的原理,我们必须先对 Lucene 中的 Segments,Reopen,和 Commits 熟悉,这些是 elasticsearch 搜索引擎的底层原理。

Segments in Lucene

在 elasticsearch 中,数据存储的最小单元是分片。但是 Lucene 有些不同。每个 elasticsearch 分片都是一个 Lucene 的索引,每个 Lucene 索引都由一些 Lucene 分段组成。一个分段就是一个倒排索引,包含了词组和文档的映射关系。

分段的概念,以及它如何在 elasticsearch 的索引和分片中使用的,可以参照下面的示意图:

在这里插入图片描述

这种分段背后的写入机制是,不论何时创建新文档,它们都会被写入新的分段中,它们都属于新的段,而不会修改之前的分段。如果文档被删除,会在原本的分段上打上删除标记。这意味着,它永远不会在分段上做物理删除。

更新时也相同:之前版本的文档会在之前的分段中标记为已删除,更新后的文档,使用新的版本号,保留在当前的分段中。

Lucene Reopen

当调用 Lucene Reopen 时,可以使累积的数据用于搜索。 尽管可以搜索到最新数据,但这不能保证数据的持久性,可能数据并没有被写入磁盘。 我们可以调用 n 次 reopen 功能,并使最新数据可搜索,但不能确保磁盘上是否存在数据。

Commits in Lucene

Lucene Commits 使数据安全。 对于每次提交,来自不同分段的数据将合并并推送到磁盘,从而使数据持久化。 尽管提交是持久保存数据的理想方法,但问题是每个提交操作都占用大量资源。 每个提交操作都有其自己的内部 I/O 操作以及与其相关的读/写周期。 这就是为什么我们希望在基于 Lucene 的系统中一次又一次地使用 reopen 功能以使新数据可搜索的确切原因。

Tanslog

Elasticsearch 采用另一种方法来解决持久性问题。 它在每个分片中引入一个事务日志(transaction log)。 已建立索引的新文档将传递到此事务日志和内存缓冲区中。 下图显示了此过程:

在这里插入图片描述

Refresh

在 Elasticsearch 中,_refresh 操作默认会一秒钟执行一次。在执行此操作期间,内存缓冲区中的数据会被拷贝到内存中的一个新的分段中,如下图所示:

在这里插入图片描述

Translog and Persistence

Translog 是如何解决持久化问题的呢?每个分片中都存在一个 translog,这意味着它和物理磁盘相关。它是同步和安全的,因此即使是没有提交的文档,仍然具备持久性。如果发生问题,事务日志可以恢复。事务日志提交到磁盘,可以是每个时间间隔内,或者是成功的 index、Bulk、Delete、update 请求后。

Flush in Elasticsearch

Flush 实质上意味着将内存缓冲区中的所有文档都写入新的 Lucene Segment,如下面的图所示。 这些连同所有现有的内存段一起被提交到磁盘,该磁盘清除事务日志(参见图4)。 此提交本质上是 Lucene 提交(commit)。
https://qbox.io/img/blog/lucene4.png

Flush 会定期触发,也可以在 Translog 达到特定大小时触发。 这些设置可以防止 Lucene 提交带来的不必要的损耗。

结论

  • _refresh 用于使新文档可见以进行搜索。
  • 而 _flush 用于将内存中的段保留在硬盘上。 _flush 不会影响 Elasticsearch 中文档的可见性,因为搜索是在内存中的分段中进行的

参考文章

https://qbox.io/blog/refresh-flush-operations-elasticsearch-guide

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanicc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值