日志索引生命周期管理:ILM 概念与阶段划分
在日志平台中,索引数量会随着时间持续增长。如果不加管理,集群将面临存储膨胀、查询性能下降、运维成本飙升等问题。索引生命周期管理(Index Lifecycle Management, ILM)正是为了解决这一核心矛盾而生的自动化治理机制。ILM 允许运维人员定义索引从创建到删除的完整策略,让集群根据索引的“年龄”、“大小”或“文档数”等指标,自动将索引在不同存储层之间迁移,并最终安全删除。
ILM 的核心概念
ILM 是 Elasticsearch 内置的索引管理框架,其核心思想是将索引的生命周期划分为若干个连续的阶段(Phase),每个阶段对应不同的存储介质、副本数、段合并策略和访问模式。ILM 策略通过以下三个要素驱动:
- 策略(Policy):定义阶段顺序、每个阶段的触发条件(如 rollover 条件)、以及阶段内的动作(如 shrink、force merge、freeze)。
- 索引模板(Index Template):将策略绑定到匹配的索引上,确保新创建的索引自动应用 ILM 策略。
- 滚动(Rollover):当索引满足指定条件(如大小达到 50GB 或文档数超过 1000 万)时,自动创建新索引,并将写入指针指向新索引。
ILM 的四个标准阶段
Elasticsearch 默认支持四个阶段:Hot → Warm → Cold → Delete。每个阶段都可以配置进入条件(如索引存在时间、索引大小)和执行动作。下表总结了各阶段的核心特征:
| 阶段 | 存储层 | 硬件类型 | 主要动作 | 访问模式 |
|---|---|---|---|---|
| Hot | 热节点 | SSD / NVMe | rollover、shrink、force merge | 高频写入 + 实时查询 |
| Warm | 温节点 | HDD / 混合 | allocate(设置副本数)、force merge | 只读、偶尔查询 |
| Cold | 冷节点 | 大容量 HDD | freeze、allocate(设置副本数) | 极少查询、可接受慢响应 |
| Delete | — | — | delete | 完全移除 |
阶段详解
1. Hot 阶段(热阶段)
索引刚创建时处于 Hot 阶段。此阶段索引承担主要的写入负载,同时需要支持近实时的搜索。Hot 节点通常配备高性能 SSD 磁盘。ILM 在 Hot 阶段最常用的动作是 rollover:当索引大小或文档数达到阈值时,自动创建新索引,并将别名指向新索引。同时可以执行 shrink 减少分片数,或 force merge 合并段文件以优化存储。
2. Warm 阶段(温阶段)
当索引不再被写入,但仍需要被查询时,可以将其迁移到 Warm 阶段。Warm 节点通常使用 HDD 磁盘,成本更低。此阶段可以执行 allocate 动作,将索引迁移到指定属性(如 data_warm)的节点上,并调整副本数(例如从 2 副本降为 1 副本)。还可以执行 force merge 进一步合并段,减少磁盘占用。
3. Cold 阶段(冷阶段)
Cold 阶段适用于几乎不再被查询的历史数据。索引在 Cold 阶段通常被 freeze(冻结),冻结后的索引无法写入,查询时需要解冻,响应时间较长。Cold 节点使用大容量 HDD,存储成本最低。此阶段同样可以通过 allocate 将索引迁移到冷节点。
4. Delete 阶段(删除阶段)
当索引超过保留期限后,ILM 自动执行 delete 动作,彻底删除索引及其数据。这是生命周期管理的终点,确保集群不会无限膨胀。
ILM 阶段流转示意图
下图展示了 ILM 策略从 Hot 到 Delete 的完整流转路径,以及每个阶段的关键动作:
ILM 策略配置示例
以下是一个完整的 ILM 策略配置,包含 Hot、Warm、Cold、Delete 四个阶段:
PUT _ilm/policy/logs_retention_90d
{
"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": {
"data": "warm"
},
"number_of_replicas": 1
},
"forcemerge": {
"max_num_segments": 1
},
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "60d",
"actions": {
"allocate": {
"require": {
"data": "cold"
}
},
"freeze": {},
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
- Hot 阶段:索引创建后立即进入,当索引大小达到 50GB 或存在超过 30 天时触发 rollover。
- Warm 阶段:索引存在 30 天后进入,迁移到 warm 节点,副本数降为 1,并合并为单个段。
- Cold 阶段:索引存在 60 天后进入,迁移到 cold 节点并冻结。
- Delete 阶段:索引存在 90 天后自动删除。
ILM 与节点角色映射
为了让 ILM 正确地将索引分配到对应硬件,需要在 Elasticsearch 节点上配置节点属性。以下是一个典型的节点角色与属性映射:
| 节点角色 | elasticsearch.yml 配置 | 硬件建议 |
|---|---|---|
| Hot 节点 | node.attr.data: hot |
SSD / NVMe,高 IOPS |
| Warm 节点 | node.attr.data: warm |
HDD 7200 RPM,大容量 |
| Cold 节点 | node.attr.data: cold |
HDD 大容量,可接受低吞吐 |
在 ILM 策略的 allocate 动作中,通过 require 指定节点属性,即可实现索引的精准调度。
ILM 阶段决策树
在实际运维中,需要根据业务需求决定是否启用所有阶段。下图展示了常见的 ILM 阶段决策逻辑:
ILM 最佳实践
- 合理设置 rollover 阈值:建议 max_size 设置在 30GB~50GB 之间,避免索引过大导致分片恢复慢。
- 副本数按阶段调整:Hot 阶段保持 2 副本保证写入可靠性;Warm/Cold 阶段可降为 1 副本节省空间。
- 优先使用 freeze 而非 close:freeze 后的索引仍可被搜索(虽然慢),而 close 的索引完全不可用。
- 监控 ILM 执行状态:通过
GET _ilm/status和GET _ilm/policy/<policy_name>检查策略执行情况。 - 预留缓冲时间:在 min_age 设置上预留 1~2 天的缓冲,避免因集群负载波动导致阶段切换失败。