Elasticsearch集群索引生命周期管理与冷热数据分层架构实战

Elasticsearch集群随着数据量增长面临磁盘空间不足、查询性能下降和集群状态膨胀等问题。索引生命周期管理(Index Lifecycle Management, ILM)通过策略自动执行索引的滚动、收缩、迁移和删除操作,配合冷热数据分层架构将SSD用于热数据查询、HDD用于冷数据归档,在控制成本的同时保持查询性能。

ILM策略定义与阶段配置

ILM策略将索引生命周期分为五个阶段:Hot(热数据,高频读写)、Warm(温数据,只读查询)、Cold(冷数据,低频查询)、Frozen(冻结数据,按需查询)、Delete(删除)。每个阶段定义触发条件和操作动作。

PUT _ilm/policy/logs-lifecycle-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "1d",
            "max_primary_shard_size": "50gb",
            "max_docs": 100000000
          },
          "set_priority": { "priority": 100 }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "shrink": { "number_of_shards": 1 },
          "forcemerge": { "max_num_segments": 1 },
          "allocate": {
            "include": { "data_temperature": "warm" }
          },
          "set_priority": { "priority": 50 }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "allocate": {
            "include": { "data_temperature": "cold" }
          },
          "freeze": {},
          "set_priority": { "priority": 0 }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": { "delete": {} }
      }
    }
  }
}

策略解读:

  • Hot阶段:索引主分片超过50GB或写入超过1亿条文档或存在超过1天时,触发rollover滚动创建新索引
  • Warm阶段(7天后):将分片数收缩为1,强制合并segment,迁移到warm节点
  • Cold阶段(30天后):迁移到cold节点并冻结,冻结后索引不在内存中维护缓存
  • Delete阶段(90天后):直接删除索引

索引模板与别名绑定

ILM要求索引通过别名写入,rollover通过别名指向新索引实现透明切换。

PUT _index_template/logs-template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "index.lifecycle.name": "logs-lifecycle-policy",
      "index.lifecycle.rollover_alias": "logs-current",
      "index.routing.allocation.include.data_temperature": "hot"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "service": { "type": "keyword" },
        "message": { "type": "text" },
        "host": { "type": "keyword" },
        "duration_ms": { "type": "long" }
      }
    }
  }
}

PUT logs-000001
{
  "aliases": {
    "logs-current": { "is_write_index": true }
  }
}

POST logs-current/_doc
{
  "@timestamp": "2026-08-20T10:00:00Z",
  "level": "INFO",
  "service": "api-gateway",
  "message": "Request processed",
  "host": "node-1",
  "duration_ms": 42
}

is_write_index: true标记当前索引为别名的写入索引。rollover触发后,Elasticsearch自动创建logs-000002,将别名指向新索引,旧索引进入Warm阶段。应用层始终向logs-current别名写入,无需感知索引切换。

冷热节点架构与数据分层

冷热分层通过elasticsearch.yml中的node.roles标记节点角色。

# Hot节点(SSD,高CPU/内存)
node.name: hot-node-1
node.roles: [data_hot]
node.attr.data_temperature: hot

# Warm节点(SSD,中等配置)
node.name: warm-node-1
node.roles: [data_warm]
node.attr.data_temperature: warm

# Cold节点(HDD,低配置)
node.name: cold-node-1
node.roles: [data_cold]
node.attr.data_temperature: cold

硬件规格参考:

Hot节点:   64核 / 256GB RAM / 4x 3.84TB NVMe SSD
Warm节点:  32核 / 128GB RAM / 4x 7.68TB SATA SSD
Cold节点:  16核 / 64GB RAM / 8x 16TB HDD

Frozen阶段在Elasticsearch 7.12后被Searchable Snapshots替代,冷数据存储在对象存储(S3/MinIO)中,查询时按需从快照拉取,大幅降低存储成本,代价是查询延迟增加2-10倍。

Force Merge与Segment合并优化

Warm阶段的forcemerge操作将索引的segment合并为单个段,对于只读索引收益显著:

  • 减少segment文件数量,降低文件句柄占用
  • 减少查询时需要扫描的segment数,降低I/O开销
  • 回收deleted文档占用的磁盘空间
  • 压缩字段数据(FST、doc values)到单个segment中
POST logs-000001/_forcemerge?max_num_segments=1
GET _cat/segments/logs-000001?v
GET logs-000001/_stats/store?human

forcemerge是I/O密集型操作,执行期间磁盘吞吐会被占满。ILM策略中Warm阶段设置min_age为7天,确保forcemerge在索引转为只读后执行。手动forcemerge应避开业务高峰期。

ILM策略监控与故障排查

GET logs-000001/_ilm/explain
POST logs-000001/_ilm/retry
POST _ilm/stop
POST _ilm/start

常见ILM卡住原因:

  • allocation失败:目标节点磁盘水位超限(85%低水位,90%高水位)
  • shrink失败:源索引仍有写入,shrink要求索引为只读状态
  • freeze失败:节点内存不足,冻结操作需要将索引元数据加载到内存
  • reroute失败:集群存在未分配分片,ILM会等待集群状态green

Shrink操作与分片数规划

Shrink将索引分片数从N缩减为M(M必须能整除N)。操作原理是创建目标索引,使用硬链接复制segment文件,不产生实际数据拷贝。前提是源索引和目标索引在同一节点上。

分片数规划对Shrink效率有直接影响。初始分片数应为shrink目标值的整数倍。如果最终需要1分片,初始可选1/2/3/5;如果需要2分片,初始可选2/4/6/10。分片数过多会导致shard metadata膨胀,加重master节点负担;过少则并行度不足,写入吞吐受限。

PUT logs-000001/_settings
{
  "index": {
    "routing.allocation.require.data_temperature": "warm",
    "blocks.write": true
  }
}

POST logs-000001/_shrink/logs-shrinked
{
  "settings": {
    "index.number_of_shards": 1,
    "index.number_of_replicas": 1
  }
}

Shrink完成后,原索引可安全删除。ILM自动管理这个过程,手动操作仅用于排查问题或紧急调整。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-ji-qun-suo-yin-sheng-ming-zhou-qi-guan-li-yu/

(0)
小编小编
上一篇 10小时前
下一篇 10小时前

相关推荐