什么是ILM(索引生命周期管理)?¶
典型回答¶
ILM(Index Lifecycle Management,索引生命周期管理) 是 Elasticsearch 从 7.0 版本开始内置的一项核心功能,用于自动化管理索引在其生命周期中的各个阶段,包括创建、滚动更新、迁移、优化、冻结和删除等操作。
ILM的核心思想:将索引的生命周期划分为多个阶段,每个阶段定义一组自动化动作,系统根据时间或大小条件自动触发状态流转。主要的阶段包含以下几个:
| 阶段 | 用途 | 可执行的动作 | 动作目的 |
|---|---|---|---|
| Hot | 索引活跃写入和高频查询 | rollover |
当索引达到一定大小、文档数或时长时,自动创建一个新索引,并将写入别名指向新索引。这是处理时序数据的关键。 |
| Warm | 索引只读,低频查询 | allocate |
将索引的分片分配到具有特定属性(如 warm)的节点上。 |
readonly |
将索引设置为只读,防止后续写入。 | ||
forcemerge |
强制合并段文件,减少段数量以提升查询效率和释放磁盘空间。 | ||
shrink |
减少索引的主分片数量,以降低开销。 | ||
| Cold | 极少访问的历史数据 | allocate |
将索引迁移到冷节点(如 data_cold)。 |
searchable_snapshot |
创建可搜索快照并将其存储在对象存储(如 S3)中,极大降低存储成本。 | ||
| Delete | 过期数据清理 | delete |
永久删除索引及其数据。 |
在 7.10+ 版本中还增加了 Frozen 阶段,用于极致压缩归档。
假设我们要管理应用程序的日志,需求是:
- 日志索引达到 50GB 或创建满 1 天就滚动更新。
- 滚动 1 天后,将旧索引移到暖节点并设为只读。
- 滚动 7 天后,将索引移到冷节点。
- 滚动 180 天后,自动冻结。
- 滚动 1年后,删除索引。
对应的ILM配置如下(8.0后):
PUT _ilm/policy/my_logs_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50gb",
"max_age": "1d"
}
}
},
"warm": {
"min_age": "1d", // 从索引创建开始算起,1天后进入warm阶段
"actions": {
"allocate": {
"require": {
"data": "warm"
}
},
"readonly": {} // 设为只读
}
},
"cold": {
"min_age": "7d", // 从索引创建开始算起,7天后进入cold阶段
"actions": {
"allocate": {
"require": {
"data": "cold"
}
}
}
},
"frozen": {
"min_age": "180d",
"actions": {
"allocate": {
"require": {
"data": "frozen"
}
},
"freeze": {} // 自动冻结
}
},
"delete": {
"min_age": "365d", // 从索引创建开始算起,1年后进入delete阶段
"actions": {
"delete": {} // 删除索引
}
}
}
}
}
将 ILM 策略绑定到索引:
PUT _index_template/my_logs_template
{
"index_patterns": ["my-logs-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_logs_policy", // 应用ILM策略
"index.lifecycle.rollover_alias": "my-logs-write" // 指定滚动别名
}
}
}
- 应用程序不断向别名
my-logs-write写入数据,实际上是在写my-logs-000001。 - ILM 服务(ES 内部的一个后台进程)每隔一段时间检查一次策略。
- 当
my-logs-000001满足rollover条件(达到 50GB 或存活了 1 天)时,ILM 触发rollover动作。- 创建一个新索引
my-logs-000002。 - 将别名
my-logs-write的写入指针从-000001切换到-000002。
- 创建一个新索引
- 从此,
my-logs-000001进入只读状态,并开始计算它在生命周期中的年龄。 - 当它存活了 1 天后,自动进入 Warm 阶段,执行迁移到暖节点和设为只读的动作。
- 存活 7 天后,进入 Cold 阶段,执行迁移到冷节点的动作。
- 存活 180 天后,进入冻结阶段,数据迁移到冻结节点。
- 存活 1年后,进入 Delete 阶段,索引被自动删除。