教程:使用ILM自动化滚动创建index
当你持续将带有时间戳的文档index到Elasticsearch当中时,通常会使用数据流(data streams)以便可以定义滚到到新索引。这是你能够实施一个hot-warm-cold架构来满足你的性能要强,控制随时间推移的成本,实施保留策略,并仍然充分利用数据。
TIP:数据流最适合仅追加的使用场景,如果你需要频繁更新或删除跨多个索引的现有文档,我们建议改用索引别名和索引模版;你仍然可以使用ILM来管理和滚动别名的索引,跳到管理没有数据流的时间序列数据Tutorial: Automate rollover with ILM | Elasticsearch Guide [7.12] | Elastic
使用ILM自动滚动创建index 并管理数据流,你需要做如下工作:
- 创建一个生存周期策略 定义适当的阶段和要执行的动作;
- 创建一个 index template 来创建数据流和应用ILM策略以及支持(backing)索引的设置(setting)和映射(mapping);
- 确认index正在移动到的生存周期阶段 符合预期;
更多介绍关于rolling indices ,访问Rollover
IMPORTANT:当你启用beats或者Logstash Elasticsearch输出插件的生存周期管理,生存周期策略会自动启用,你不需要采取其他操作。你可以通过kibana 管理界面或者ILM API修改默认策略;
创建一个生存周期策略(Create a lifecycle policy)
生命周期策略指定索引生命周期的阶段以及每个阶段要执行的操作。生命周期最多可以有五个阶段:hot、warm、cold、frozen和delete。
例如,您可以定义一个具有两个阶段的 timeseries_policy
- Hot阶段,定义滚动操作以指定索引在达到 50 GB 的 max_size 或 30 天的 max_age 时rollover(滚动创建新索引)。
- Delete阶段,设置 min_age 以在滚动后 90 天删除索引。请注意,该值与滚动时间相关,而不是与索引创建时间相关。
您可以通过 Kibana 或使用创建或更新策略 API 创建策略。要从 Kibana 创建策略,请打开菜单并转到Stack management > index lifecycle Policies。单击create policy。
API 样例
PUT _ilm/policy/timeseries_policy { "policy": { "phases": { # min_age 默认值是0ms,所以新建索引会立即进入hot阶段; "hot": { "actions": { # 触发rollover 动作,当任何一个条件被满足的情况下; "rollover": { "max_size": "50GB", "max_age": "30d" } } }, "delete": { # rollover 90天后进入delete阶段 "min_age": "90d", "actions": { # 触发删除动作,当index进入删除阶段; "delete": {} } } } } }
创建一个index template来创建data stream并应用生存周期策略(Create an index template to create the data stream and apply the lifecycle policy)
为了建立数据流,首先要创建一个指定生存周期策略的index template,因为这个template是为了data stream,所以它必须也包括一个data_stream 的定义。
例如,您可以创建一个 timeseries_template 以用于未来名为 timeseries 的数据流
为了使 ILM 能够管理数据流,模板配置了一项 ILM 设置:
index.lifecycle.name 指定要应用于数据流的生命周期策略的名称。
您可以通过 Kibana 或使用创建或更新策略 API 创建策略。要从 Kibana 创建策略,请打开菜单并转到Stack Management > Index Management > Index Templates 。单击Create template
此向导(wizard)调用(invokes)创建或更新索引模板 API 以使用您指定的选项创建索引模板。
API 样例
PUT _index_template/timeseries_template { # 当documents写入到timeseries index是应用这个template "index_patterns": ["timeseries"], "data_stream": { }, "template": { "settings": { "number_of_shards": 1, "number_of_replicas": 1, # 用于管理 data stream的ILM策略; "index.lifecycle.name": "timeseries_policy" } } }
创建数据流(Create the data stream)
首先,将文档索引到索引模板的 index_patterns 中定义的名称或通配符(wildcard)模式(pattern)中。只要现有数据流、索引或索引别名尚未使用该名称,索引请求就会自动创建具有单个后备(backing)索引的相应数据流,Elasticsearch 自动将请求的文档索引到此后备(backing)索引中,该索引也充当流的写入索引
例如,以下请求创建timeseries 数据流和名为 .ds-timeseries-2099.03.08-000001 的第一代支持索引。
POST timeseries/_doc { "message": "logged the request", "@timestamp": "1591890611" }
当满足生命周期策略中的滚动条件时,滚动操作
- 创建第二代支持索引,名为 .ds-timeseries-2099.03.08-000002。由于它是 timeseries 数据流的后备索引,因此 timeseries_template 索引模板中的配置将应用于新索引。
- 由于它是时间序列数据流的最新一代索引,因此新创建的后备索引 .ds-timeseries-2099.03.08-000002 将成为数据流的写入索引。
每次满足rollover条件时都会重复此过程。您可以使用时间序列数据流名称搜索由 timeseries_policy 管理的所有数据流的支持索引。写操作将路由到当前写索引。读取操作将由所有支持索引处理
检查生命周期进度(Check lifecycle progress)
获取托管索引的状态信息,您可以使用 ILM explain API。这可以让你发现诸如:
- index 处于哪个阶段以及何时进入该阶段
- 当前的操作以及正在执行的步骤
- 如果发生任何错误或进度受阻
例如,以下请求获取有关timeseries data stream的支持(backing)索引的信息:
GET .ds-timeseries-*/_ilm/explain
以下响应显示数据流的第一代支持索引正在等待hot阶段的翻转操作(rollover action)
它保持在此状态,并且 ILM 继续调用check-rollover-ready,直到满足翻转条件
{ "indices": { ".ds-timeseries-2099.03.07-000001": { "index": ".ds-timeseries-2099.03.07-000001", "managed": true, # 用来管理index 的ILM policy; "policy": "timeseries_policy", "lifecycle_date_millis": 1538475653281, # index 的存活期限 "age": "30s", "phase": "hot", "phase_time_millis": 1538475653317, "action": "rollover", "action_time_millis": 1538475653317, # ILM对索引执行的步骤 "step": "check-rollover-ready", "step_time_millis": 1538475653317, "phase_execution": { "policy": "timeseries_policy", # 当前阶段(Hot阶段)的定义 "phase_definition": { "min_age": "0ms", "actions": { "rollover": { "max_size": "50gb", "max_age": "30d" } } }, "version": 1, "modified_date_in_millis": 1539609701576 } } } }
无需数据流即可管理时间序列数据(Manage time series data without data streams)
尽管Data streams是扩展和管理时间序列数据的便捷方法,但它们被设计为仅附加(append-only)我们认识到可能存在数据需要就地更新或删除的用例,并且数据流不直接支持删除和更新请求,因此索引 API 需要直接在数据流的支持索引上使用。
在这些情况下,您可以使用索引别名(index alias)来管理包含时间序列数据(time series data)的索引并定期(periodically)滚动到新索引(roll over to a new index).
要使用索引别名通过 ILM 自动翻转和管理时间序列索引,你需要做:
- 创建一个生存周期策略 定义适当的阶段和要执行的动作;
- 创建索引模板以将策略应用到每个新索引
- 引导(bootstrap)索引作为初始写入索引。
- 验证索引是否按预期经历生命周期阶段。
创建一个index template 并应用lifecycle policy(Create an index template to apply the lifecycle policy)
要在rollover时自动将生命周期策略应用于新的写入索引,请在用于创建新索引的索引模板中指定策略,指定索引模板中用于创建新索引的策略
例如,您可以创建一个 timeseries_template ,该模板应用于名称与 timeseries-* 索引模式匹配的新索引。
为了启用automatic rollover,模板配置了两个 ILM 设置:
- index.lifecycle.name: 指定要应用于与索引模式匹配的新索引的生命周期策略的名称。
- index.lifecycle.rollover_alias: 指定触发索引rollover操作时要rollover的索引别名。
您可以使用 Kibana 创建模板向导来添加模板。要访问该向导,请打开菜单并转至Stack Management > Index Management。 在 Index Templates 选项卡中,单击Create template
API 样例
PUT _index_template/timeseries_template { # index 前缀 "index_patterns": ["timeseries-*"], "template": { "settings": { "number_of_shards": 1, "number_of_replicas": 1, # ILM 策略名 "index.lifecycle.name": "timeseries_policy", # rollover使用的alias "index.lifecycle.rollover_alias": "timeseries" } } }
使用写入索引别名引导初始时间序列索引(Bootstrap the initial time series index with a write index alias)
首先,您需要引导一个初始索引并将其指定为索引模板中指定的翻转别名的写入索引,将其指定为索引模板中指定的翻转别名的写入索引。该索引的名称必须与模板的索引模式匹配并以数字结尾。翻转时,该值会增加以生成新索引的名称。
例如,以下请求创建一个名为timeseries-000001的索引,并使其成为timeseries别名的写入索引
PUT timeseries-000001 { "aliases": { "timeseries": { "is_write_index": true } } }
当满足rollover条件时,rollover 动作:
- 创建一个名为timeseries-000002的新索引,这与 timeseries-* 模式匹配,因此 timeseries_template 中的设置将应用于新索引。
- 将新索引指定为写入索引并使引导索引为只读
每次满足rollover条件时都会重复此过程。您可以使用 timeseries 别名搜索 timeseries_policy 管理的所有索引。写操作被路由到当前写索引
检查生命周期进度
检索托管索引的状态信息与数据流情况非常相似,有关详细信息,请参阅数据流检查进度部分
唯一的区别是索引命名空间,因此,检索进度需要执行以下 api 调用:
GET timeseries-*/_ilm/explain