ES中的索引生命周期管理
ILM
ILM
:索引生命周期管理,即 Manage the index lifecycle
。
使用
ILM
应确保集群中的所有节点运行的是同一个版本,不然无法保证他们会按预期工作。
索引生命周期
索引的生命周期有四个阶段:
-
Hot
:索引更新和查询很活跃。 -
Warm
:索引不再更新,但仍然有查询 -
Cold
:索引不再更新,只有很少的查询,而且查询速度也很慢 -
Delete
:索引不需要了,可以安全的删除
索引的生命周期策略指定了适用于哪些阶段、在每个阶段中执行哪些操作以及何时在各个阶段之间进行转换。
rollover
当索引满足一定条件之后,将不再写入数据,而是自动创建一个索引,所有的数据将写入新的索引。
使用滚动索引能够:
- 优化活跃索引,在高性能
hot
节点上提升高接收速率。 - 优化
warm
节点搜索性能。 - 将旧的、访问频率低的数据转移到成本低的
cold
节点上。 - 通过删除整个索引,根据索引保留策略删除数据。
官方推荐使用 data stream
数据流来管理时间序列数据。每个数据流都需要一个 索引模板
,其中包括:
- 数据流的名称或通配符(*)模式。
- 数据流时间戳字段。该字段必须映射为
date
或date_nanos
数据类型。并且包含在索引到该数据流的每个文档中。 - 当创建每一个索引时将应用索引模板的映射和设置。
数据流专为追加数据而设计,其中数据流名称可用作操作(读取、写入、翻转、收缩等)目标。如果需要更新数据,可以使用 索引别名
来管理时间序列数据。
自动 rollover
ILM
会根据你的配置: 索引大小
、 文档数量
、 所在阶段
,当满足这些条件时,自动实现 rollover
。
索引生命周期策略的更新
- 生命周期策略被应用到索引上时,索引会获取当前策略的最新版本号。如果更新了当前策略,版本号会发生冲突,
ILM
就能检测出当前索引正在使用上一个版本的策略,需要将索引策略更新到最新版本。 - 如果将不同的策略应用到已经被管理的索引上时,索引还是使用先前管理策略中的缓存定义来完成当前阶段。直到进入下一个阶段,索引才会应用新的管理策略。
索引生命周期操作
-
allocate
:将分片移动到具有不同性能特征的节点上,并减少副本的数量。 -
delete
:永久移除索引。 -
force merge
:减少索引段的数量并清除已删除的文档。使索引为只读
。 -
freeze
:冻结索引以最大程度减少其内存的占用量。 -
read only
:阻止对索引的写操作。 -
rollover
:删除索引作为过渡别名的写索引,然后开始索引到新索引。 -
set priority
:降低索引在生命周期中的优先级,以确保首先恢复热索引。 -
shrink
:通过将索引缩小为新索引来减少主分片的数量。 -
unfollow
:将关注者索引转换为常规索引。在进行滚动或收缩操作之前自动执行。 -
wait for snapshot
:删除索引之前,确保快照存在。
配置生命周期策略
要让 ILM
管理索引,必须要在 index.lifecycle.name
索引设置中指定有效的策略。
要为滚动索引创建生命周期策略,你要创建该策略并把它加入到 索引模板
中。
创建生命周期策略
可以通过 Kibana
管理页面设置,也可以通过API设置。
1 | PUT _ilm/policy/my_policy |
将生命周期策略应用到索引模板中
可以通过 Kibana
管理页面设置,也可以通过API设置。
1 | PUT _index_template/my_template |
创建一个初始被管理的索引
如果要给滚动索引设置策略,需要手动创建第一个被该策略管理的索引,并指定为可写索引。
索引的名称必须跟索引模板里定义的模式相匹配,并且以数字结尾。
1 | PUT test-000001 |
手动应用生命周期策略
你可以在创建索引的时候指定一个策略,也可以直接将策略应用到一个已经存在的索引上通过 Kibana
管理或者更新设置的API。一旦你应用了策略, ILM
立即会开始管理该索引。
1 | PUT test-index |
将策略应用于多个索引
1 | PUT mylogs-pre-ilm*/_settings |
解决生命周期策略运行报错
查看错误:
1 | GET /my-index-000001/_ilm/explain |
重新运行报错的一步:
1 | POST /my-index-000001/_ilm/retry |
开启和终止索引生命周期管理
查看 ILM
状态:
1 | GET _ilm/status |
终止 ILM
:
1 | POST _ilm/stop |
开启 ILM
:
1 | POST _ilm/start |
跳过rollover
设置 index.lifecycle.indexing_complete
为 true
。
举个例子,如果你要改变一系列新索引的名称,并保留之前根据你配置的策略产生的索引数据,你可以:
- 为新的索引模式创建一个模板,并使用之前相同的策略。
- 根据新的模板创建一个初始索引。
- 使用索引别名API将别名的
write
索引更改为bootstrapped
索引。 - 设置旧索引的
index.lifecycle.indexing_complete
的值为true
。
相关连接: https://www.elastic.co/guide/en/elasticsearch/reference/7.9/index-lifecycle-management.html