Press "Enter" to skip to content

告别手动管理 Elasticsearch 索引:ILM 与数据分层实战指南

一、引言:为何需要管理 Elasticsearch 索引的生命周期?

  • 痛点引入:
    • 随着时间推移,日志、指标等时序数据不断增长。
    • 旧数据查询频率降低,但仍占用高性能、高成本存储。
    • 单个索引过大导致性能下降、维护困难。
    • 手动管理索引(创建、关闭、删除)繁琐且容易出错。
    • 数据保留策略难以统一执行。
  • 解决方案概览: Elasticsearch 的索引生命周期管理 (ILM) 和数据分层 (Data Tiers) 机制。
  • 本文目标: 详细解释 ILM 和数据分层的概念、工作原理及如何配置它们来优化集群。

二、核心概念解析

  1. 什么是索引生命周期管理 (ILM)?
    • 定义: 一种自动化管理索引从创建到删除整个生命周期的机制。
    • 四大阶段 (Phases):
      • Hot (热阶段): 索引活跃,频繁读写。强调写入吞吐和查询速度。
      • Warm (温阶段): 索引不再写入,查询频率降低。开始考虑成本和资源优化。
      • Cold (冷阶段): 索引极少查询,主要用于归档。极致的成本优化。
      • Delete (删除阶段): 索引不再需要,永久删除。
    • 关键动作 (Actions):
      • rollover: 核心动作,自动创建新索引并将别名指向新索引。
      • shrink: 减少主分片数量。
      • forcemerge: 合并段,减少资源占用,提升只读查询性能。
      • allocate: 将索引迁移到特定属性的节点。
      • freeze / unfreeze: (旧机制) 冻结/解冻索引以减少内存占用。
      • searchable_snapshot: (推荐的冷数据方案) 将索引数据备份到低成本对象存储(如 S3),同时保持可搜索。
      • delete: 删除索引。
      • set_priority: 设置索引恢复优先级。
      • readonly: 设置索引为只读。
  2. 什么是数据分层 (Data Tiers)?
    • 概念: 根据数据的访问频率和重要性,将其存储在不同性能和成本特性的硬件节点上。
    • 典型分层:
      • Hot Tier Nodes:
        • 硬件:高性能 SSD (如 NVMe)。
        • 角色:处理新数据写入和最频繁的查询。
        • 节点配置 (elasticsearch.yml): node.roles: [ data_hot, … ] (推荐) 或 node.attr.data_tier: hot。
      • Warm Tier Nodes:
        • 硬件:大容量 SATA SSD 或性能较好的 HDD。
        • 角色:存储不再写入但仍需查询的数据。
        • 节点配置: node.roles: [ data_warm, … ] 或 node.attr.data_tier: warm。
      • Cold Tier Nodes:
        • 硬件:大容量、低成本 HDD。
        • 角色:存储极少访问的归档数据,或作为可搜索快照的目标(数据实际在对象存储)。
        • 节点配置: node.roles: [ data_cold, … ] 或 node.attr.data_tier: cold。
      • (可选) Frozen Tier: 主要是通过 searchable_snapshot 实现,数据存储在对象存储中,由 data_frozen 角色的节点进行协调搜索。

三、ILM 与数据分层如何协同工作?—— 自动化的数据流转

  • 核心机制: ILM 策略中的 allocate 动作是连接 ILM 和数据分层的桥梁。
  • 工作流程:
    1. 节点标记: 首先,为集群中的不同节点配置不同的角色/属性 (e.g., data_hot, data_warm, data_cold)。
    2. ILM 策略定义: 创建 ILM 策略,在 Warm 和 Cold 阶段使用 allocate 动作,并指定 require 条件,如 {“data_tier”: “warm”} 或 {“data_tier”: “cold”}。
    3. 策略应用: 将 ILM 策略应用到索引模板 (Index Template),这样新创建的符合条件的索引会自动应用该策略。
    4. 自动迁移:
      • 当索引达到进入 Warm 阶段的条件 (如 min_age: “7d”), ILM 会执行 allocate 动作。
      • Elasticsearch 的分片分配器会查找具有 data_tier: warm 属性的节点。
      • 索引分片会自动从 Hot 节点迁移到 Warm 节点。
      • 同理,当进入 Cold 阶段时,会迁移到 Cold 节点或执行 searchable_snapshot。
  • 效果: 最新、最热的数据保留在高性能节点,旧数据自动迁移到成本更低的节点,最终按策略删除。

四、实战演练:配置一个典型的日志 ILM 策略

  • 场景假设: 系统日志,希望保留90天。
    • 最近7天:Hot 阶段,快速写入和查询。
    • 第8天 – 第30天:Warm 阶段,减少分片,强制合并,迁移到 Warm 节点。
    • 第31天 – 第90天:Cold 阶段,迁移到 Cold 节点 (或使用可搜索快照)。
    • 超过90天:Delete 阶段。
  • 步骤:

配置节点角色/属性:

(示例 elasticsearch.yml 片段)

# Hot 节点
node.name: hot-node-1
node.roles: [ master, data_hot, ingest ]
# ...其他配置

# Warm 节点
node.name: warm-node-1
node.roles: [ data_warm ]
# ...其他配置

# Cold 节点
node.name: cold-node-1
node.roles: [ data_cold ]
# ...其他配置

创建 ILM 策略 (Kibana Dev Tools 或 API):

(示例 JSON 策略)

PUT _ilm/policy/my_log_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_age": "1d", // 或 max_size, max_docs
            "max_primary_shard_size": "50gb"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d", // 7天后进入 warm
        "actions": {
          "set_priority": {
            "priority": 50
          },
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          },
          "allocate": {
            "number_of_replicas": 1, // 可选调整副本
            "require": {
              "data_tier": "warm"
            }
          },
           "readonly": {}
        }
      },
      "cold": {
        "min_age": "30d", // Hot 7天 + Warm 23天 = 30天后进入 cold
        "actions": {
          "set_priority": {
            "priority": 0
          },
          "allocate": {
            "require": {
              "data_tier": "cold"
            }
          }
          // 或者使用 searchable_snapshot
          // "searchable_snapshot": {
          //   "snapshot_repository": "my_s3_backup_repo"
          // }
        }
      },
      "delete": {
        "min_age": "90d", // Hot 7天 + Warm 23天 + Cold 60天 = 90天后删除
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

创建索引模板并关联 ILM 策略:

(示例 JSON 索引模板)

PUT _index_template/my_log_template
{
  "index_patterns": ["mylogs-*"], // 匹配你的日志索引名称
  "template": {
    "settings": {
      "number_of_shards": 3, // 初始主分片数
      "number_of_replicas": 1,
      "index.lifecycle.name": "my_log_policy", // 关联 ILM 策略
      "index.lifecycle.rollover_alias": "mylogs-write" // 设置 rollover 别名
    }
  }
}

创建初始写入别名 (如果使用 rollover):

PUT mylogs-000001
{
  "aliases": {
    "mylogs-write": {
      "is_write_index": true
    }
  }
}

之后,所有日志写入都应该指向 mylogs-write 这个别名。

五、为何以及何时选择配置 Warm 和 Cold 阶段?

  • 回顾你的场景: 当前只用到 Hot 和 Delete (比如保留60天)。
  • 何时需要 Warm/Cold:
    • 延长数据保留期但控制成本: 想保留数据超过60天(如180天、1年),但不想所有数据都占用昂贵的 Hot 存储。
    • Hot 存储压力大: 即使只保留60天,如果数据量巨大导致 Hot 节点成本过高或性能瓶颈。
    • 查询需求分级: 近期数据需要秒级响应,历史数据查询频率低、可容忍较慢响应。
    • 已有异构硬件: 集群中已经部署了不同性能/成本的硬件节点。
  • 决策点: 综合考虑数据量、保留需求、查询模式、硬件成本和运维复杂度。如果当前 Hot -> Delete 策略简单有效且成本可接受,则无需立即引入 Warm/Cold。

六、总结与最佳实践

  • ILM 和数据分层是 Elasticsearch 管理大规模时序数据的强大工具。
  • 它们能显著优化性能、降低存储成本并自动化管理任务。
  • 最佳实践:
    • 从小处着手: 如果刚开始,可以先从简单的 Hot -> Delete 策略开始,逐步引入 Warm/Cold。
    • 充分测试: 在非生产环境充分测试 ILM 策略。
    • 监控 ILM: 使用 GET /<index_name>/_ilm/explain API 或 Kibana UI 监控 ILM 执行状态。
    • 合理规划节点数量和容量: 确保每个 Tier 有足够的节点和存储空间来容纳数据迁移和峰值负载。
    • 考虑 searchable_snapshot: 对于 Cold Tier,searchable_snapshot 是现代且非常经济的选择,特别是结合对象存储。
    • 文档先行: 记录你的 ILM 策略和节点配置。
发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注