Elasticsearch 冻结索引

2025年3月17日 | 阅读 7 分钟

在 Elasticsearch 6.6 中,引入了两个强大的功能,即ILM冻结索引。ILM 指的是索引生命周期管理,我们在上一章中已详细讨论过。 点击此处了解索引生命周期管理。所以,我们将在本章讨论冻结索引。

在本章中,我们将讨论以下主题 -

什么是冻结索引?

冻结索引基本上是那些很少被访问的索引。因此,用户会冻结这些索引。基本上,我们冻结那些不使用的索引以释放内存。此类索引称为冻结索引Elasticsearch提供了_freeze API,可帮助用户冻结索引。

以下是冻结索引的一些重要注意事项 -

  • 冻结索引是只读的,其资源不再保持活动状态。这意味着冻结索引的资源在需要时会被销毁并重新分配给它们。
  • Elasticsearch 6.6 引入了一个名为 freeze API 的新 API,允许我们冻结未使用的索引。
  • 冻结索引始终为搜索打开,这意味着我们可以随时搜索冻结索引中的数据。

请注意,冻结索引的搜索速度较慢,但不会占用堆内存。

  • Elasticsearch 提供了一个专用的ignore_throttled参数,用于将冻结索引包含在搜索中。因此,我们无需重新打开它们即可使其可用于搜索。
  • 冻结索引是可搜索的,但要再次写入,我们需要解冻它们。

为什么冻结索引?

Elasticsearch 允许用户冻结索引。因此,了解为什么冻结索引很重要。让我们通过一个例子来理解 -

一些索引被用户频繁搜索,每次搜索时都需要花费时间重新构建。因此,这些频繁搜索的索引会保留在内存中,以节省重新构建和高效搜索它们的时间。这样,每当用户搜索这些索引时,都可以更高效、更快速地完成搜索。

另一方面,也可能存在一些很少被访问的索引,它们不会保留在内存中。因为为不经常使用的索引占用内存是不明智的。因此,用户倾向于为相应的索引释放内存,并通过冻结它们来腾出空间。此类索引称为冻结索引。

Elasticsearch Frozen Indices

还有一个可能的解决方案是关闭索引,这不需要内存。索引在关闭后会释放堆内存,但我们需要重新打开该关闭的索引才能进行搜索。然而,重新打开索引会降低运营成本,但它需要之前关闭时使用的堆内存。

注意:每当需要冻结索引时,都可以重新构建它们,并为其分配资源。

冻结如何工作?

Elasticsearch 提供了一个专用的searched_throttled线程池,用于搜索冻结索引。默认情况下,它使用单个线程来确保冻结索引一次加载一个到内存中。

  • 由于冻结索引不会保留在缓存内存中,因此搜索需要一些时间。可能需要几秒钟或几分钟才能完成。
  • 可能存在一种情况,当索引未被冻结时,搜索可能只需要几毫秒。
  • 通常,冻结索引并非旨在处理高搜索负载。

Elasticsearch 索引在内存中包含一些数据结构。这些数据结构使用户能够高效地搜索索引和索引到其中。如果索引过多,我们可以为这些数据结构添加足够的内存。因此,对于频繁搜索的索引,最好将这些数据结构保留在内存中,因为它们需要时间来重新构建。

Elasticsearch 会在每次搜索冻结索引的每个分片时构建临时数据结构,并在搜索完成后立即丢弃这些数据结构。这些临时数据结构不会由 Elasticsearch 在内存中维护。当索引被冻结时,它们占用的堆内存比普通索引少。现在,我们将继续介绍如何冻结索引。

如何冻结索引?

我们可以使用_freeze API 冻结索引。这些索引是可搜索的,但要再次写入,我们需要解冻它们。我们可以使用_unfreeze API 解冻(冻结)索引。这些 API 关键字用于在创建查询请求时使用。

语法

以下是冻结索引的语法 -

这里_freeze是 Elasticsearch API,POST是请求方法。在index_name中,您需要传入要执行冻结操作的索引名称。

示例

在下面的示例中,我们将冻结student索引。

响应

如果您的输出与以下响应相同,则表示student索引已成功冻结。

截图

Elasticsearch Frozen Indices

如何解冻索引?

冻结索引是可搜索的,但我们无法向其中写入数据,因为它们是只读的。如果您尝试在冻结索引中写入内容,将会产生错误。要向冻结索引中写入内容,我们需要解冻它们。Elasticsearch 提供了_unfreeze API 来解冻索引,以便我们可以向其中写入数据。

语法

以下是解冻索引的语法 -

这里_unfreeze是 API,POST是请求方法。在index_name中,您需要传入要执行操作的索引名称。

示例

在下面的示例中,我们将冻结student索引。

响应

如果您的输出与以下响应相同,则表示student索引已成功解冻。

截图

Elasticsearch Frozen Indices

我们可以在需要时随时搜索冻结的索引。对于冻结索引,常规搜索将不起作用。因此,为了将冻结索引包含在我们的搜索中,我们在创建查询时必须使用参数ignore_throttled = false

这些索引将重新构建,并且还会为其分配资源。它们可以根据节点数并发加载,并受线程池中线程数的限制。默认值为 1。

注意:要控制并发搜索的数量,我们可以使用 search_throttled 线程池。

创建一个搜索请求来搜索冻结的索引。此搜索查询包含请求方法、搜索 API、索引名称。此外,它必须包含一个查询参数ignore_throttled = false,该参数用于将冻结索引包含在搜索中。

语法

以下语法用于搜索冻结的索引 -

这里GET是请求方法,_search是 API。在index_name, 中,传入要搜索的索引名称。

示例

通过以下示例,您将看到常规搜索在冻结索引上的工作方式有何不同。请看下面的示例 -

不带 ignore_throttled 的查询

在下面的示例中,我们将在student索引(一个冻结的索引)中查找包含name: Alen Paul的文档。

响应

您的查询中未包含ignore_throttled=false。因此,它不会将student冻结索引包含在搜索中,也不会返回任何文档。

截图

Elasticsearch Frozen Indices

带有 ignore_throttled 参数的查询

现在,我们将在查询中包含ignore_throttled=false,并查看同一索引的差异。

响应

在这里,您可以看到区别,通过包含ignore_throttled=false,返回了一个包含name: Alen Paul的文档。因为它将Student冻结索引包含在其搜索中。

截图

Elasticsearch Frozen Indices

监控冻结索引

冻结索引是普通索引。这些索引使用内存高效的分片实现和搜索节流。Elasticsearch 允许使用命令检查索引的状态。

语法

执行以下代码以检查索引的状态 -

这里,_cat indices 命令用于提供每个索引的横截面,其中 v 和 h 是参数,GET是请求方法。在index_name, 中,传入要搜索的索引名称。

响应

响应将与以下输出相同

health	status	Index	pri	rep	docs.count	store.size
yellow	open	Frozenexample	4	1	2	16.3

在冻结索引中添加文档时出错

如果您尝试向冻结的索引添加数据,将会生成错误。在下面的截图中,您可以看到我们在student索引中添加了一个文档,但它返回了错误。请看下面的示例 -

示例

截图

在冻结索引上执行上述查询将生成不可用分片异常错误。请看下面的截图

Elasticsearch Frozen Indices