3. 索引生命周期管理(ILM)基础
索引生命周期管理(Index Lifecycle Management, ILM)是 Elasticsearch 内置的策略引擎,用于自动化管理索引从创建到删除的完整过程。在冷热分层架构中,ILM 是核心调度器,负责根据时间、大小或文档数等条件,将索引自动迁移到对应的存储层。
3.1 ILM 核心概念
ILM 将索引的生命周期划分为四个标准阶段(Phase),每个阶段对应不同的存储介质和资源配置:
| 阶段 | 存储层 | 硬件特征 | 典型用途 |
|---|---|---|---|
| Hot | 热节点 | SSD/NVMe,高 IOPS,低延迟 | 实时写入、近期查询、高频聚合 |
| Warm | 温节点 | HDD 或混合存储,吞吐优先 | 近期历史数据、定期报表、中等频率查询 |
| Cold | 冷节点 | 大容量 HDD,可搜索快照 | 长期归档、合规审计、极少查询 |
| Delete | — | — | 数据过期后彻底删除,释放存储 |
阶段可选性: 并非所有策略都必须包含全部四个阶段。例如,短期日志可以只定义 Hot → Delete;而合规归档场景可能只需要 Hot → Cold → Delete,跳过 Warm 阶段。
3.2 ILM 阶段定义与动作
每个阶段可以配置一组动作(Actions),ILM 在进入该阶段时按顺序执行。以下是各阶段的标准动作清单:
| 阶段 | 可用动作 | 说明 |
|---|---|---|
| Hot | rollover、set_priority、forcemerge、shrink |
按大小/文档数/时长滚动索引;设置高优先级确保写入性能 |
| Warm | allocate、set_priority、forcemerge、readonly |
迁移到温节点;合并分段;降低副本数;设为只读 |
| Cold | allocate、set_priority、freeze、searchable_snapshot |
迁移到冷节点;冻结索引释放内存;或转为可搜索快照 |
| Delete | delete |
彻底删除索引及其数据 |
关键动作详解:
- rollover: 当索引满足条件(如超过 50GB 或 30 天)时,自动创建新索引并将写入别名指向新索引。这是 Hot 阶段最核心的动作。
- allocate: 通过指定
require属性(如box_type: warm)将索引迁移到特定节点组。 - forcemerge: 将分段合并为指定数量(通常为 1),减少存储开销并提升查询性能。
- searchable_snapshot: 将索引转为可搜索快照,数据存储在对象存储(如 S3)中,本地只保留元数据。
3.3 策略配置实战
以下是一个完整的 ILM 策略配置示例,覆盖 Hot → Warm → Cold → Delete 四个阶段:
PUT _ilm/policy/logs_retention_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "30d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "30d",
"actions": {
"allocate": {
"require": {
"box_type": "warm"
}
},
"forcemerge": {
"max_num_segments": 1
},
"set_priority": {
"priority": 50
},
"readonly": {}
}
},
"cold": {
"min_age": "90d",
"actions": {
"allocate": {
"require": {
"box_type": "cold"
}
},
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "180d",
"actions": {
"delete": {}
}
}
}
}
}
min_age 计算规则: 每个阶段的
min_age 是相对于索引创建时间的偏移量,而非相对于上一阶段结束时间。例如,Warm 阶段的 min_age: "30d" 表示索引创建 30 天后进入 Warm,而非 Hot 阶段结束后再等 30 天。
3.4 ILM 执行流程与状态机
ILM 内部维护一个状态机,每个索引在生命周期中只处于一个阶段。下图展示了标准四阶段流程及阶段间的迁移条件:
3.5 索引别名与滚动策略
ILM 通常与索引别名(Alias)配合使用。写入操作指向一个可写别名,rollover 动作自动更新别名指向新索引。以下是别名与 ILM 的绑定配置:
PUT _index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs_retention_policy",
"index.lifecycle.rollover_alias": "logs-write"
}
}
}
# 创建初始索引并设置别名
PUT logs-000001
{
"aliases": {
"logs-write": {
"is_write_index": true
}
}
}
最佳实践: 使用索引模板(Index Template)统一管理 ILM 策略绑定,避免手动为每个索引设置策略。模板中的
index.lifecycle.name 指定策略名称,index.lifecycle.rollover_alias 指定滚动别名。
3.6 ILM 状态监控与排错
ILM 提供了丰富的 API 用于查看索引当前所处的阶段和执行状态:
| API | 用途 | 示例 |
|---|---|---|
GET _ilm/status |
查看 ILM 插件运行状态(RUNNING/STOPPED) | {"status": "RUNNING"} |
GET logs-000001/_ilm/explain |
查看单个索引的 ILM 阶段、动作、错误信息 | 返回 phase、action、failed_step 等字段 |
GET _ilm/policy/logs_retention_policy |
查看已定义的策略详情 | 返回 phases 及各阶段动作配置 |
POST _ilm/retry |
手动重试处于 ERROR 状态的索引 | 对失败索引执行重试 |
常见错误场景:
- 阶段迁移失败: 目标节点组不存在或节点属性不匹配(如
box_type: warm未在节点上设置)。 - rollover 不触发: 别名未正确设置
is_write_index: true,或索引名称不匹配滚动模式。 - forcemerge 阻塞: 索引仍处于写入状态,需先执行
readonly动作。
GET */_ilm/explain 可以快速定位所有索引的 ILM 状态,是日常运维的必备命令。
3.7 本章小结
ILM 是冷热分层存储的调度中枢,通过四个标准阶段(Hot/Warm/Cold/Delete)和可配置的动作链,实现索引的自动化流转。掌握 ILM 策略配置、别名绑定、状态监控是构建生产级日志平台的基础。下一章将深入讲解如何在实际集群中部署热、温、冷节点并配置节点属性。