Elasticsearch 冻结索引2025年3月17日 | 阅读 7 分钟 在 Elasticsearch 6.6 中,引入了两个强大的功能,即ILM和冻结索引。ILM 指的是索引生命周期管理,我们在上一章中已详细讨论过。 点击此处了解索引生命周期管理。所以,我们将在本章讨论冻结索引。 在本章中,我们将讨论以下主题 - 什么是冻结索引?冻结索引基本上是那些很少被访问的索引。因此,用户会冻结这些索引。基本上,我们冻结那些不使用的索引以释放内存。此类索引称为冻结索引。 Elasticsearch提供了_freeze API,可帮助用户冻结索引。 以下是冻结索引的一些重要注意事项 -
请注意,冻结索引的搜索速度较慢,但不会占用堆内存。
为什么冻结索引?Elasticsearch 允许用户冻结索引。因此,了解为什么冻结索引很重要。让我们通过一个例子来理解 - 一些索引被用户频繁搜索,每次搜索时都需要花费时间重新构建。因此,这些频繁搜索的索引会保留在内存中,以节省重新构建和高效搜索它们的时间。这样,每当用户搜索这些索引时,都可以更高效、更快速地完成搜索。 另一方面,也可能存在一些很少被访问的索引,它们不会保留在内存中。因为为不经常使用的索引占用内存是不明智的。因此,用户倾向于为相应的索引释放内存,并通过冻结它们来腾出空间。此类索引称为冻结索引。 ![]() 还有一个可能的解决方案是关闭索引,这不需要内存。索引在关闭后会释放堆内存,但我们需要重新打开该关闭的索引才能进行搜索。然而,重新打开索引会降低运营成本,但它需要之前关闭时使用的堆内存。 注意:每当需要冻结索引时,都可以重新构建它们,并为其分配资源。冻结如何工作?Elasticsearch 提供了一个专用的searched_throttled线程池,用于搜索冻结索引。默认情况下,它使用单个线程来确保冻结索引一次加载一个到内存中。
Elasticsearch 索引在内存中包含一些数据结构。这些数据结构使用户能够高效地搜索索引和索引到其中。如果索引过多,我们可以为这些数据结构添加足够的内存。因此,对于频繁搜索的索引,最好将这些数据结构保留在内存中,因为它们需要时间来重新构建。 Elasticsearch 会在每次搜索冻结索引的每个分片时构建临时数据结构,并在搜索完成后立即丢弃这些数据结构。这些临时数据结构不会由 Elasticsearch 在内存中维护。当索引被冻结时,它们占用的堆内存比普通索引少。现在,我们将继续介绍如何冻结索引。 如何冻结索引?我们可以使用_freeze API 冻结索引。这些索引是可搜索的,但要再次写入,我们需要解冻它们。我们可以使用_unfreeze API 解冻(冻结)索引。这些 API 关键字用于在创建查询请求时使用。 语法以下是冻结索引的语法 - 这里_freeze是 Elasticsearch API,POST是请求方法。在index_name中,您需要传入要执行冻结操作的索引名称。 示例 在下面的示例中,我们将冻结student索引。 响应 如果您的输出与以下响应相同,则表示student索引已成功冻结。 截图 ![]() 如何解冻索引?冻结索引是可搜索的,但我们无法向其中写入数据,因为它们是只读的。如果您尝试在冻结索引中写入内容,将会产生错误。要向冻结索引中写入内容,我们需要解冻它们。Elasticsearch 提供了_unfreeze API 来解冻索引,以便我们可以向其中写入数据。 语法以下是解冻索引的语法 - 这里_unfreeze是 API,POST是请求方法。在index_name中,您需要传入要执行操作的索引名称。 示例 在下面的示例中,我们将冻结student索引。 响应 如果您的输出与以下响应相同,则表示student索引已成功解冻。 截图 ![]() 搜索冻结索引我们可以在需要时随时搜索冻结的索引。对于冻结索引,常规搜索将不起作用。因此,为了将冻结索引包含在我们的搜索中,我们在创建查询时必须使用参数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冻结索引包含在搜索中,也不会返回任何文档。 截图 ![]() 带有 ignore_throttled 参数的查询 现在,我们将在查询中包含ignore_throttled=false,并查看同一索引的差异。 响应 在这里,您可以看到区别,通过包含ignore_throttled=false,返回了一个包含name: Alen Paul的文档。因为它将Student冻结索引包含在其搜索中。 截图 ![]() 监控冻结索引冻结索引是普通索引。这些索引使用内存高效的分片实现和搜索节流。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 分页 |
我们请求您订阅我们的新闻通讯以获取最新更新。