一、为什么需要滚动索引
当索引时间序列数据(如日志或指标)时,您不能无限期地写入单个索引。为了满足索引和搜索性能要求并管理资源使用,您可以写入一个索引,直到达到某个阈值,然后创建一个新的索引并开始写入该索引。
滚动索引的作用:
在高性能热节点上优化高摄取率的活动指标。
优化暖节点的搜索性能
将较旧、较少访问的数据转移到较便宜的冷节点
通过删除整个索引来根据保留策略删除数据。
二、如何使用滚动索引
ILM 使您能够根据索引大小、文档数量或年龄自动转移到新的索引。触发滚动时,创建一个新索引,更新写别名以指向新索引,并将所有后续更新写入新索引。
通常建议使用数据流来管理时间序列数据,数据流自动跟踪写索引,同时将配置保持在最低限度。
每个数据流都需要一个索引模板,其中包含:
数据流的名称或通配符(*)模式。
数据流的时间戳字段
映射mappings和设置settings
ILM 允许您根据索引大小、文档数量或年龄自动转移到新的索引。触发滚动时,创建一个新索引,更新写别名以指向新索引,并将所有后续更新写入新索引。
滚动的触发条件:
“max_primary_shard_size”: “50GB” 依据主分片大小
“max_age”: “30d” 依据索引数据年龄
“max_docs”:3 索引记录数
“max_size”: “5gb” 索引大小
TIP:
滚动到基于索引大小、文档数量或年龄的新索引比基于时间的滚动更可取。在任意时间滚动通常会导致许多小的索引,这可能会对性能和资源使用产生负面影响。
为了创建一个滚动索引,你需要:
创建生命周期策略
创建一个索引模板
验证索引生命周期阶段的转变
官网说明文档: Rollover
三、实战
1、创建生命周期策略
方式一:通过Kibana定义
通过 Kibana 或使用 create 或 update policy API 创建策略。要从 Kibana 创建策略,打开菜单,进入堆栈管理 > 索引生命周期策略。点击创建策略。
方式二:通过API定义
说明:定义一个包含两个阶段的索引生命周期管理策略 timeseries_policy。
1、在hot阶段,定义了翻转动作,该阶段指定当索引的主分片的最大存储容量到达50g 或者最大年龄到达30天进行滚动。
2、delete阶段,定义滚动后90天删除索引。
PUT _ilm/policy/timeseries_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_primary_shard_size": "50GB", "max_age": "30d" } } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }
参数介绍:
1、rollover 设置索引滚动的触发条件
2、max_primary_shard_size 最大主分片数
3、max_age 索引最多保留多少时间
4、min_age多长时间后,进入下一个阶段
5、actions滚动到该阶段后需要执行的动作
注意⚠️:
1、滚动动作只有在hot阶段才能配置。
2、min_age时间是从执行滚动后开始算起,而不是创建索引开始算起。
例如,下列策略在索引滚动一天后删除该索引。它不会在创建索引后一天删除索引。
PUT /_ilm/policy/rollover_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50G" } } }, "delete": { "min_age": "1d", "actions": { "delete": {} } } } } }
2、创建索引模板
要设置数据流,首先创建一个索引模板来指定生命周期策略。因为模板是用于数据流的,所以它还必须包含数据流定义。
例如,您可以创建一个 timeseries _ template,用于将来名为 timeseries 的数据流。
为了使 ILM 能够管理数据流,模板配置了一个 ILM 设置:
指定要应用于数据流的生命周期策略的名称
方式一:通过Kibana创建索引模板
您可以使用 Kibana Create 模板向导添加模板。从 Kibana 打开菜单,进入 Stack Management > Index Management。在 Index Templates 选项卡中,单击 Create template。
方式二:通过API创建索引模板
PUT _index_template/timeseries_template { "index_patterns": ["timeseries"], "data_stream": { }, "template": { "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.lifecycle.name": "timeseries_policy" } } }
说明:
创建名称为timeseries_template的索引模板。
index_patterns 用于设置索引名称的匹配模式,当索引名称与 timeseries 目标匹配时应用该模板
index.lifecycle.name 用于管理数据流的 ILM 策略的名称。
通过data_stream声明是一个数据流模板。
3、创建数据流
如果索引名称与索引模板的 index _ patterns 中定义的名称或通配符模式匹配,只要现有的数据流、索引或索引别名尚未使用该名称,索引请求就会自动创建带有单个后备索引的对应数据流。Elasticsearch 自动将请求的文档索引到这个支持索引中,该索引也充当流的写索引。
例如,下面的请求将创建 timeseries 数据流和名为. ds-timeseries-2099.03.08-00001的第一代支持索引。
POST timeseries/_doc { "message": "logged the request", "@timestamp": "1591890611" }
当满足生命周期策略中的滚动条件时,滚动操作:
创建名为 .ds-timeseries-2099.03.08-000002 的第二代后备索引。 因为它是 timeseries 数据流的后备索引,所以来自 timeseries_template 索引模板的配置将应用于新索引。
由于是timeseries数据流的最新一代索引,新创建的backing index .ds-timeseries-2099.03.08-000002成为数据流的写索引。
每次满足滚动条件时,这个过程都会重复。你可以搜索所有数据流的支持索引,这些索引由 timeseries_ policy 管理,并带有时间串数据流名称。写操作被路由到当前的写索引。读操作将由所有支持索引处理。
注意⚠️:
1、数据流是缩放和管理时间序列数据的一种方便方式,但是它们仅用于附加。很多场景下数据需要更新或删除的用例,而数据流不支持直接删除和更新请求,因此索引 api 将需要直接用于数据流的支持索引。
2、如果索引数据需要支持直接删除、更新那么就不能采用数据流了,这时可以使用索引别名来管理包含时间序列数据的索引,并定期转移到新的索引。
4、检索生命周期的进度
要获取托管索引的状态信息,可以使用 ILM 解释 API:
索引处于什么阶段以及何时进入这个阶段
当前操作和正在执行的步骤
如果发生任何错误或进度被阻塞
例如,下面的请求获取有关 timeseries 数据流的支持索引的信息:
GET .ds-timeseries-*/_ilm/explain
总结
1、滚动索引使用场景
2、如何使用滚动索引,配置策略(policy)、创建索引模版(template)、创建索引(index)