IBM Cloud Docs
配置 Databases for Elasticsearch 的“索引生命周期管理”功能

配置 Databases for Elasticsearch 的“索引生命周期管理”功能

索引生命周期管理 (ILM) 是 Elasticsearch的一大功能。 它允许您主动管理索引,以便在存储和搜索功能方面高效利用资源。 例如,如果应用程序需要存储 30 天的事件,那么可以使用 ILM 来创建名为 "events" 的索引,该索引可以轻松地写入和查询,但实际上由背景中的 30 个单独的索引组成。 可将较旧的索引设为“只读”,并可选择进行优化,当它们达到 30 天的年龄时,将其删除。

可以定义生命周期规则,包括:

  • 创建新索引时: 按年龄,数据量或文档计数。
  • 是否使较旧的索引“只读”。
  • 是否更改旧索引的分片计数。
  • 设置每个索引的优先级,这将定义在节点重新引导时恢复索引的顺序。
  • 删除旧数据的时间和时间。

ILM 非常灵活,功能丰富。 有关其功能的完整描述,请参阅 ILM 概述

在本教程中,您将通过创建一组简单规则,然后查看如何实施这些规则来熟悉 ILM。 虽然设置比较简单,但你需要让规则在几天的时间里走他们的路线,才能看到全面的效果。

Databases for Elasticsearch 是付费服务,因此遵循本教程将产生费用。

开始之前

在开始之前,请确保您具备以下条件:

获取 API 密钥以将基础架构部署到您的帐户

执行 这些步骤 以创建 IBM Cloud API 密钥,该密钥使 Terraform 能够在您的帐户中供应基础结构。 您最多可以创建 20 个 API 密钥。

出于安全原因,API 密钥仅在创建时才可复制或下载。 如果 API 密钥丢失,必须创建新的 API 密钥。

克隆项目

要克隆项目,请运行以下命令:

git clone https://github.com/IBM/elasticsearch-index-lifecycle-management.git

安装 Elasticsearch 集群

  1. 浏览到克隆项目的 Terraform 文件夹。

    cd elasticsearch-index-lifecycle-management/terraform
    
  2. 使用以下字段创建名为 terraform.tfvars 的文档:

    ibmcloud_api_key = "<your_api_key_from_step_1>"
    region = "<your_region>"
    elastic_password = "<make-up-a-password>"
    

    terraform.tfvars 文档包含您可能要保密的变量,因此将其从公共 Github 存储库中排除。

  3. 使用以下命令安装基础架构

    terraform init
    terraform apply --auto-approve
    
  4. 最后,将数据库访问 URL 导出到终端环境 (后续步骤将需要此 URL)。

    terraform output --json
    export ES="<the url value obtained from the output>"
    

创建 ILM 进程

假设您有来自应用程序的日志进入 Elasticsearch 实例。 日志在第一天非常重要,因为您正在检查异常。 在第二天之后,日志变得不太有用,但您仍需要它们来执行一些操作,例如尝试发现趋势。 三天后,这些日志将过时,您将不再使用这些日志。 因此,请为索引创建为期三天的生命周期:

  • 第 1 天: 您的数据位于“热层”中,这意味着可以随时进行搜索。 这是您最近搜索最多的数据。
  • 第 2 天: 您的数据位于暖层中。 在 1 天后,您的数据将滚动到“热”状态。 在此层中,将对其进行优化以进行搜索而不是建立索引。 在此层中,您将强制合并以减少索引片段中的段数,从而提高搜索效率。
  • 第 3 天: 删除。 在 3 天后,不再需要您的数据,因此会将其删除。

创建索引生命周期策略

首先,创建用于定义上述相应阶段和操作的 ILM 策略。

curl -kX PUT -H 'Content-Type: application/json' -d'{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"1d"},"set_priority":{"priority":100},"forcemerge":{"max_num_segments":1},"shrink":{"number_of_shards":1},"readonly":{}},"min_age":"0ms"},"warm":{"min_age":"1d","actions":{"set_priority":{"priority":50}}},"delete":{"min_age":"3d","actions":{"delete":{}}}}}}' $ES/_ilm/policy/ilm-test-1

创建索引模板

索引模板定义将如何创建索引。 因为上面的生命周期策略每天都会将数据从热移动到热,所以每天都会创建一个新索引。 此模板告诉 Elasticsearch 要用于创建这些新索引的模式: 在这种情况下,所有相关索引都将被称为 "logs-",后跟递增数字。 该模板还具有其他设置,例如要用于索引的生命周期策略。 让我们使用我们在上一步中创建的那个。

通过两个步骤创建索引模板。 首先,创建一个或多个“组件”模板。 这些是可复用的块,可稍后组合以创建多个模板。 在此非常简单的示例中,仅创建一个组件模板。

curl -kX PUT -H 'Content-Type: application/json' -d'{"template":{"mappings":{"properties":{"@timestamp":{"type":"date"}}}}}' $ES/_component_template/component_template1

(此组件模板基本上为空,除非映射到时间戳记字段 (所有日志都具有时间戳记),但实际用例可能包含复杂映射和其他指令)。

第二,使用组件模板创建索引模板本身。 此示例告诉 Elasticsearch 有关索引模式和其他数据的信息,例如,每个新索引都必须具有两个分片和两个副本。

curl -kX PUT -H 'Content-Type: application/json' -d'{"index_patterns":["logs-*"],"template":{"settings":{"number_of_shards":2,"number_of_replicas":2,"index.lifecycle.name":"ilm-test-1","index.lifecycle.rollover_alias":"logs"}},"priority":500,"composed_of":["component_template1"],"version":3,"_meta":{"description":"my custom template"}}' $ES/_index_template/my_index_template

创建索引

最后一步是创建 Elasticsearch 索引,该索引将使用您的模板 (从而使用您的生命周期策略)。 通过调用 “logs-000001” 并将其与模板中定义的别名进行别名判别,可确保使用正确的模板并以数字递增。

curl -kX PUT -H 'Content-Type: application/json' -d'{"aliases": {"logs": { "is_write_index": true } } }' $ES/logs-000001

向索引添加文档

可以在不知道当前 logs 索引的名称的情况下添加文档,只需写入 logs 即可。

curl -kX PUT -d’{document goes here}’ $ES/logs/_doc/mydocid

查询索引

虽然 Elasticsearch 将数据存储在多个索引中,但仍可以像查询数据一样进行查询。

curl -X POST -d’{query goes here}’ $ES/logs/_search

观看索引管理本身

现在你得等一下。 在第一天,您将能够看到名为 logs-000001 的索引。

curl -kX GET $ES/_cat/indices | grep logs-

但是在第二天,如果再次运行上述命令,那么您将看到另一个名为 logs-000002 的索引出现。 在第 3 天,logs-000001 应该会消失 (因为它已被删除),但您应该会看到出现 logs-000003。 您始终可以使用别名 logs 随时搜索日志的全部内容。 您的索引正在自行管理!

拆除基础架构

Databases for Elasticsearch 会产生费用。 完成本教程后,可以通过转至项目的 terraform 目录并使用以下命令来除去所有基础结构:

terraform destroy

后续步骤

ILM 功能非常丰富,在本教程中,您只探讨了它的基础知识。 ILM 可以帮助您以高效的方式管理数据。 有关更多信息,请参阅 ILM: 管理索引生命周期