冷热分离需节点打box_type标签、索引建时设require.box_type、ilm用include分配冷节点、冷节点挂载hdd并禁新主分片。

确认节点已正确打上 box_type 标签
冷热分离的前提是节点能被 ES 识别出角色。只改配置不验证,迁移会静默失败。必须在每个节点的 elasticsearch.yml 中显式设置:node.attr.box_type: hot 或 node.attr.box_type: cold,然后重启节点。验证是否生效,不能只看配置文件,要查 API:GET _cat/nodeattrs?v&h=node,attr,value&s=attr。如果返回里没有 box_type 这一行,说明标签没加载成功——常见原因是拼写错误(比如写成 box_typee)或未重启。
索引必须用 index.routing.allocation.require.box_type 初始化
新索引创建时若没指定分配偏好,ES 默认可能把分片打到任意节点,后续再改 setting 只能触发副本重分配,主分片不会动。所以建索引时就要锁定:PUT /my-log-2026-10-01 {"settings":{"index.routing.allocation.require.box_type":"hot"}}。注意:这个值是字符串匹配,不是布尔值;也不能写成 require.hot 或 include.box_type ——那些是旧版本或别名语法,6.8+ 必须用 require.box_type。
用 ILM 策略自动触发冷层迁移
手动调 PUT /index/_settings 改 box_type 只适合测试,线上必须靠 ILM。关键点有三个:
-
warm阶段的allocate动作必须用include而非require,否则当冷节点暂时不可用时,索引会卡在 warm 阶段无法推进 -
allocate的include字段要写成{"box_type": "cold"},不是{"_tier_preference": "data_cold"}(后者是 7.10+ 的新 tiering 机制,和传统冷热分离不兼容) - 确保
min_age计算基准是索引创建时间,不是文档时间戳;如果用@timestamp控制生命周期,得配合rollover和index.lifecycle.parse_origination_date
机械硬盘节点实际承载数据前必做两件事
即使 ILM 策略跑通、分片也显示分配到了 cold 节点,也不代表数据真在 HDD 上——ES 默认仍会在所有节点缓存部分 segment。必须确认:
- 冷节点的
path.data指向的是机械硬盘挂载路径(比如/mnt/hdd/es-data),而不是和热节点共用 SSD 目录 - 冷节点配置了
node.attr.box_type: cold后,还需关闭其写入能力:cluster.routing.allocation.enable: new_primaries(防止新索引误创建到冷节点) - 迁移完成后检查分片物理位置:
GET /_cat/allocation?v&h=node,disk.used_percent,disk.total,确认 cold 节点的磁盘使用量明显上升,且disk.used_percent增长趋势与索引大小匹配











