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 内部维护一个状态机,每个索引在生命周期中只处于一个阶段。下图展示了标准四阶段流程及阶段间的迁移条件:

ILM 四阶段状态机与迁移条件 Hot 写入 + 实时查询 Warm 合并 + 只读 Cold 归档 / 快照 Delete 彻底删除 rollover 后 30d 90d 180d 阶段迁移触发条件 1. 时间条件:min_age 从索引创建时间开始计算,到达阈值后触发迁移。 2. 滚动条件:Hot 阶段依赖 rollover 动作,新索引创建后旧索引进入下一阶段。 3. 手动触发:可通过 POST /_ilm/move 强制索引进入指定阶段。 4. 回退机制:迁移失败时 ILM 会重试,超过重试次数后索引进入 ERROR 状态。

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 策略配置、别名绑定、状态监控是构建生产级日志平台的基础。下一章将深入讲解如何在实际集群中部署热、温、冷节点并配置节点属性。