日志索引生命周期管理:ILM 概念与阶段划分

在日志平台中,索引数量会随着时间持续增长。如果不加管理,集群将面临存储膨胀、查询性能下降、运维成本飙升等问题。索引生命周期管理(Index Lifecycle Management, ILM)正是为了解决这一核心矛盾而生的自动化治理机制。ILM 允许运维人员定义索引从创建到删除的完整策略,让集群根据索引的“年龄”、“大小”或“文档数”等指标,自动将索引在不同存储层之间迁移,并最终安全删除。

ILM 的核心概念

ILM 是 Elasticsearch 内置的索引管理框架,其核心思想是将索引的生命周期划分为若干个连续的阶段(Phase),每个阶段对应不同的存储介质、副本数、段合并策略和访问模式。ILM 策略通过以下三个要素驱动:

  • 策略(Policy):定义阶段顺序、每个阶段的触发条件(如 rollover 条件)、以及阶段内的动作(如 shrink、force merge、freeze)。
  • 索引模板(Index Template):将策略绑定到匹配的索引上,确保新创建的索引自动应用 ILM 策略。
  • 滚动(Rollover):当索引满足指定条件(如大小达到 50GB 或文档数超过 1000 万)时,自动创建新索引,并将写入指针指向新索引。
实践要点:ILM 策略通常配合 rollover alias 使用。写入操作始终指向一个别名,rollover 动作会自动更新别名指向最新的索引,实现零停机索引切换。

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 动作,彻底删除索引及其数据。这是生命周期管理的终点,确保集群不会无限膨胀。

注意:Delete 阶段是不可逆的。在配置保留策略时,务必确认数据不再需要恢复。建议在删除前将索引快照备份到对象存储(如 S3、OSS)中。

ILM 阶段流转示意图

下图展示了 ILM 策略从 Hot 到 Delete 的完整流转路径,以及每个阶段的关键动作:

ILM 阶段流转与关键动作 Hot SSD / 高频写入 rollover / shrink 时间/大小 Warm HDD / 只读 allocate / force merge 时间 Cold 大容量 HDD freeze / allocate 保留期 Delete 删除 阶段流转说明 • 每个阶段可以设置 min_age 条件(如 7 天、30 天),索引达到条件后自动进入下一阶段。 • 并非所有阶段都必须启用。例如,可以跳过 Warm 直接从 Hot 进入 Cold。 • 每个阶段内的动作按顺序执行,动作失败不会阻塞后续阶段。

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 阶段启用决策树 是否需要 ILM? 是 → 配置 ILM 策略 否 → 手动管理索引 需要 Warm 阶段? Hot → Cold Hot → Warm → Cold 决策建议 • 数据保留 < 30 天:Hot → Delete • 数据保留 30~90 天:建议启用 Warm

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 天的缓冲,避免因集群负载波动导致阶段切换失败。
生产建议:在实施 ILM 之前,先在测试集群中验证策略的流转逻辑。重点关注 rollover 后的别名切换是否正常,以及 allocate 动作能否正确匹配节点属性。