ES Frozen Indices

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

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

  • 什么是冻结索引
  • 为什么要冻结索引
  • 冻结的工作原理
  • 如何冻结索引
  • 如何解冻索引
  • 搜索索引
  • 监控索引
  • 在冻结索引中添加文档时出错

什么是冻结索引?

冻结索引基本上是那些很少访问的索引。因此,用户冻结这些索引。基本上,我们冻结那些未使用的索引以释放内存。此类索引称为冻结索引。 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 关键字在创建查询请求时用于查询。 

语法

以下是冻结索引的语法:

POST /index_name/
_freeze

这里_freeze是Elasticsearch API,POST是请求方法。在index_name中,您必须传递索引的名称才能对其执行冻结操作。

示例:

在下面这个例子中,我们将冻结student索引。

POST /student/
_freeze
{ }

Response

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

{
    "acknowledged": true,
    "shards_acknowledged": true
}

屏幕截图

Elasticsearch Frozen Indices

如何解冻索引?

冻结的索引是可搜索的,但我们不能写入它们,因为它们是只读的。如果您尝试在冻结索引中写入内容,则会出错。要在冻结的索引中写一些东西,我们必须解冻它们。 Elasticsearch 提供了 _unfreeze API 来解冻索引,以便我们可以在其中写入。

语法

以下是解冻索引的语法:

POST /index_name/
_unfreeze

这里_unfreeze是一个API,POST是请求方法。在index_name中,您必须传递要对其执行操作的索引的名称。

示例

在下面这个例子中,我们将冻结student索引。

POST /student/
_unfreeze
{ }

Response

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

{
    "acknowledged": true,
    "shards_acknowledged": true
}

屏幕截图

Elasticsearch Frozen Indices

搜索冻结索引

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

这些索引重新-再次构建,资源也分配给他们。它们可以每个节点并发加载,受线程池中线程数的限制。它的默认值为 1、

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

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

语法

以下语法用于搜索冻结索引:

GET /index_name/
_search?q=parameter:parameter_value&ignore_throttled=false

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

示例

有帮助在下面的示例中,您将看到普通搜索在冻结索引上的工作方式有何不同。看下面的例子:

Query without ignore_throttled

在下面这个例子中,我们将找到包含名字的文档: Alen Paul 在 student 索引中,这是一个冻结索引。

GET /student/
_search?q=name:Alen Paul
{ }

Response

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

{
    "took": 0,
"timed_out": true,
    "_shards": {
         "total": 0,
         "successful": 0,
         "skipped": 0,
         "failed": 0
    },
    "hits": {
         "total": {
             "value": 0,
             "relation": "eq"
           }
         "max_score": 0,
         "hits": [ ]
    }
}

截图

Elasticsearch Frozen Indices

使用ignore_throttled 参数查询

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

GET /student/
_search?q=name:Alen Paul&ignore_throttled=false
{ }

Response

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

{
    "took": 17,
"timed_out": true,
    "_shards": {
         "total": 1,
         "successful": 1,
         "skipped": 0,
         "failed": 0
    },
    "hits": {
         "total": {
             "value": 1,
             "relation": "eq"
           }
         "max_score": 0.5753642,
         "hits": [ ]
    {
"_index": "student"
"_type": "_doc",
"_id": "01",
"_score": 0.5753642
    "_source": {
         "name": "Alen Paul",
         "gender": "Male",
         "phone": "9876543210",
         "street": "Malen Park",
         "city": "California",
         "country": "United States",
         "zip": "94025",
}

屏幕截图

Elasticsearch Frozen Indices

监控冻结指数

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

语法

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

GET _cat/indices/index_name?v&h=health,status,index,pri,rep,docs.count,store.size

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

Response

响应将与以下输出相同:

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

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

如果您尝试在冻结索引中添加一些数据,则会产生错误。在下面的屏幕截图中,您可以看到我们在 student 索引中添加了一个文档,但它返回了一个错误。请参阅以下示例:

示例:

POST http://localhost:9200/student/_doc/02/
{
  "name": "Kelvin K",
  "dob": "17 Dec 1989",
  "course": "CFP",
  "duration": "6 months to 2 years",
  "phone": "+91141893548",
  "address": "Malen Beach 9A, NewCity, USA",
  "pin code": "56018"
}

截图

对冻结索引执行上述查询,会产生不可用分片异常错误。看下面的截图:

Elasticsearch Frozen Indices

下一章:ES 汇总数据

Elasticsearch 提供汇总功能,有助于汇总索引中的数据并将其汇总到新索引中。这些存储的数据可以在未来需要时用于分析,但成本仅为原始数据存储成本的一小部分。在分析中保留历史数据非常有用。然而,有时会因为归档大量数据的 ...