elasticsearch生命周期管理
一、参考
二、概览
2.1 目标
(1) 当索引达到约定大小、索引文档数量达到约定数量,自动创建新的索引
(2) 安装指定周期(1 天,1 周,1 个月)创建索引,将之前的索引存档
(3) 强制删除过期的索引,以达到保留一定日期范围的数据
2.2 生命周期策略
一个生命周期策略定义了:
(1) 适用于哪些阶段
(2) 每个适用阶段中有哪些行为
(3) 什么时候,由当前阶段进入下一个阶段
三、生命周期的四个阶段
3.1 热数据阶段
定义: 索引正在频繁写入和查询
行为: Set Priority, Unfollow, Force Merge, Rollover
3.2 温数据阶段
定义: 索引只能查询,无法写入
行为: Set Priority, Unfollow, Read-Only, Allocate, Shrink, Force Merge
3.3 冷数据阶段
定义: 索引相对较少查询,无法写入
行为: Set Priority, Unfollow, Allocate, Freeze, Searchable Snapshot
3.4 删除阶段
定义: 索引可以被彻底删除
行为: Wait For Snapshot, Delete
3.5 阶段何时转移
由阶段 A 进入阶段 B,需要:
(1) 阶段 A 中所有行为完成
(2) 索引的 age 必须大于阶段 B 中定义的最小时间
示例:
四、生命周期策略
4.1 创建策略
# 创建策略
PUT _ilm/policy/yztest_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "10s",
"max_docs": 3
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
# 创建索引模版,应用上面的策略
PUT _template/yztest_template
{
"index_patterns": [
"yztest-*"
],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.lifecycle.name": "yztest_policy",
"index.lifecycle.rollover_alias": "yztest"
}
}
# 创建索引
PUT yztest-000001
{
"aliases": {
"yztest": {
"is_write_index": true
}
}
}
4.1 策略的缓存
当一个索引进入一个新的阶段,将会首先缓存新的阶段的定义到索引 metadata 中
4.2 策略的更新
五、actions 列表
5.1 rollover 滚动
5.2 shrink 分片缩小
5.3 force merge 分片中分段合并
5.4 freeze 冻结分片,只读
5.5 delete 删除分片
六、ilm api 列表
6.1 更新策略检查间隔
# 将时间间隔更新为10s,默认是10m
PUT _cluster/settings
{
"persistent": {
"indices.lifecycle.poll_interval": "10s"
}
}
七、注意和问题
7.1 如何保证生命周期策略适用于所有索引(包含以后会生成的索引)?
一般做法是, 先创建一个生命周期策略、一个索引模版,将生命周期策略应用于索引模版上,所有符合模版的索引都会使用相同的生命周期策略
如果只是对于当前索引(按照时间滚动),指定一个生命周期策略,则滚动后创建的新索引不会使用之前的生命周期策略
7.2 集群状态为 yellow 时候,生命周期策略会有影响吗?
即使集群状态是 yellow, 具体索引仍然会按照生命周期策略中定义,正常进行阶段转移,
但是,因为集群非 green 状态,会有一些清理任务无法完成,所以可能会产生负作用