典型回答
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后):
| |
将 ILM 策略绑定到索引:
| |
- 应用程序不断向别名
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 阶段,索引被自动删除。