跳转至

什么是ILM(索引生命周期管理)?

典型回答

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 阶段,用于极致压缩归档。

假设我们要管理应用程序的日志,需求是:

  1. 日志索引达到 50GB 或创建满 1 天就滚动更新。
  2. 滚动 1 天后,将旧索引移到暖节点并设为只读。
  3. 滚动 7 天后,将索引移到冷节点。
  4. 滚动 180 天后,自动冻结。
  5. 滚动 1年后,删除索引。

对应的ILM配置如下(8.0后):

PUT _ilm/policy/my_logs_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "50gb",
            "max_age": "1d"
          }
        }
      },
      "warm": {
        "min_age": "1d", // 从索引创建开始算起,1天后进入warm阶段
        "actions": {
          "allocate": {
             "require": {
              "data": "warm" 
            }
          },
          "readonly": {} // 设为只读
        }
      },
      "cold": {
        "min_age": "7d", // 从索引创建开始算起,7天后进入cold阶段
        "actions": {
          "allocate": {
             "require": {
              "data": "cold" 
            }
          }
        }
      },
       "frozen": {
        "min_age": "180d",
        "actions": {
          "allocate": { 
             "require": {
                "data": "frozen"  
              }
          },
          "freeze": {}   // 自动冻结
        }
      },
      "delete": {
        "min_age": "365d", // 从索引创建开始算起,1年后进入delete阶段
        "actions": {
          "delete": {} // 删除索引
        }
      }
    }
  }
}

将 ILM 策略绑定到索引:

PUT _index_template/my_logs_template
{
  "index_patterns": ["my-logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.lifecycle.name": "my_logs_policy", // 应用ILM策略
      "index.lifecycle.rollover_alias": "my-logs-write" // 指定滚动别名
    }
  }
}
  1. 应用程序不断向别名 my-logs-write 写入数据,实际上是在写 my-logs-000001
  2. ILM 服务(ES 内部的一个后台进程)每隔一段时间检查一次策略。
  3. my-logs-000001 满足 rollover 条件(达到 50GB 或存活了 1 天)时,ILM 触发 rollover 动作。
    • 创建一个新索引 my-logs-000002
    • 将别名 my-logs-write 的写入指针从 -000001 切换到 -000002
  4. 从此,my-logs-000001 进入只读状态,并开始计算它在生命周期中的年龄。
  5. 当它存活了 1 天后,自动进入 Warm 阶段,执行迁移到暖节点和设为只读的动作。
  6. 存活 7 天后,进入 Cold 阶段,执行迁移到冷节点的动作。
  7. 存活 180 天后,进入冻结阶段,数据迁移到冻结节点。
  8. 存活 1年后,进入 Delete 阶段,索引被自动删除。