一. 索引生命周期简介
想要了解更多可以看 : 索引生命周期
1.1 索引生命周期五种阶段
(1)Hot:正在积极更新和查询索引。
(2)Warm:索引不再更新,但仍在查询中。
(3)Cold:索引不再更新,很少被查询。信息仍然需要可搜索,但如果查询速度较慢。
(4)Frozen: 索引不再更新并且是查询操作很少。信息还需要可搜索的,但查询速度较慢。
(5)Delete:不再需要索引,可以安全地删除。
1.2 阶段如何执行
官方解释:
-
当索引进入某个阶段时,ILM 会在索引元数据中缓存阶段定义。这避免策略更新的时候影响到索引变成永远无法退出该阶段的状态。如果可以安全地应用更改,ILM 会更新缓存的阶段定义。如果不能,阶段执行将继续使用缓存的定义。
-
ILM 定期运行,检查索引是否满足策略标准,并执行所需的任何步骤。为了避免竞争条件,ILM 可能需要运行多次才能执行完成操作所需的所有步骤。例如,如果 ILM 确定索引满足滚动条件,它将开始执行完成滚动操作所需的步骤。如果到达无法安全进入下一步的程度,执行就会停止。下次 ILM 运行时,ILM 将从中断处继续执行。这意味着,即使
indices.lifecycle.poll_interval
设置为 10 分钟并且索引满足展期标准,也可能需要 20 分钟才能完成展期。
我的理解:
- 索引中会缓存下当前阶段定义的策略,如果更新策略,并且索引恰好到达了该阶段,那么当前索引就不会使用最新的策略。
- ILM是定期运行的,默认10分钟执行一次的,我们可以通过
indices.lifecycle.poll_interval
去设置他的时间,如果在执行的过程中某个阶段受到阻碍,就会停止运行,下次执行时候才会从停止处继续执行。所以ILM
完整的执行一次可能需要20分钟或者更多。
二. 需求和问题
问题:
- 我们在使用es存储数据的时候,随着时间推移,数据量比较久远的数据就想删除掉,因此我们就想要定期的清除这些历史数据,所以我们可以通过es的策略去管理索引的生命周期。
需求:
- 当索引达到
100kb
时启动新索引 - 删除满足上面条件并且过了1小时后的旧索引
我做了以下设计:
三. 使用别名去管理索引
3.1 创建生命周期策略
根据我上面的需求创建以下策略
PUT _ilm/policy/test_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "100kb",
}
}
},
"delete": {
"min_age": "1h",
"actions": {
"delete": {}
}
}
}
}
}
查看创建的策略
GET _ilm/policy/test_policy
3.2 创建索引模板
我们需要在移动到新索引(rollover)时候自动将生命周期策略应用到新的索引 上,需要在创建新索引的索引模板中指定策略。
如下,我创建了一个test_template
模板,并应用到名称用 test-
开头的新索引。
为了启用自动翻转,模板配置了两个 ILM 设置:
index.lifecycle.name
:指定生命周期策略的名称。index.lifecycle.rollover_alias
:指定索引的别名。
PUT _index_template/test_template
{
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "test_policy", // 应用到每个新索引的生命周期策略的名称。
"index.lifecycle.rollover_alias": "test" // 用于引用这些索引的别名的名称。使用移动操作的策略是必需的。
}
},
"index_patterns": [
"test-*" // 如果新索引的名称以 test- 开头,则将模板应用到新索引。
]
}
查看创建的模板
GET /_index_template/test_template
3.3 创建一个带有数字结尾索引
如下,创建一个名为 的索引test-000001
,将 test-000001 索引指定为别名test的写入索引。
PUT test-000001
{
"aliases": {
"test": {
"is_write_index": true
}
}
}
当满足翻转条件后:
- 创建一个名为
test-000002
的新索引。这与test-*
模式匹配,因此设置test_template
将应用于test-000002
。 - 将
test-000002
新索引指定为写入索引并使test-000001
索引变为只读。
每次满足策略的条件时都会重复此过程。
四. 测试
4.1 当索引达到100kb时启动新索引
我们往里面添加文档
PUT /test/_bulk?refresh
{"index":{}}
{"name": "小狗", "leg": 4, "iswing": false}
{"index":{}}
{"name": "小鸡", "leg": 2, "iswing": true}
{"index":{}}
{"name": "小猫", "leg": 4, "iswing": false}
满足条件后,我们可以通过别名去查看对应的索引
GET _alias/test
通过查询的结果可以发现,他已经自己创建了新索引test-000002
4.2 删除过了1小时后的索引以执行数据保留标准
过了一小时后,索引test-000001就被删除了