全部产品
Search
文档中心

检索分析服务Elasticsearch版:通过索引生命周期管理Heartbeat数据

更新时间:Mar 25, 2026

Heartbeat产生的时序监控数据会随时间持续增长,导致shard数量增多和集群负载加重。通过索引生命周期管理ILM(Index Lifecycle Management),可以对heartbeat-*索引制定滚动更新策略:在hot阶段滚动更新索引,在warm阶段收缩分片并合并段,在cold阶段将数据迁移到冷数据节点,在delete阶段定期删除过期数据。

操作流程

  1. 步骤一:创建并配置冷热集群

    创建包含冷、热属性节点的集群,启用自动创建索引功能,并配置公网地址访问白名单。

  2. 步骤二:在Heartbeat下配置ILM

    在heartbeat.yml中启用ILM功能并配置参数,启动后系统自动在Elasticsearch中生成Heartbeat索引模板。

  3. 步骤三:创建ILM策略

    通过ilm policy API创建生命周期管理策略,定义索引滚动更新和归档的条件。

  4. 步骤四:为ILM策略关联索引模板

    将ILM策略关联到Heartbeat索引模板。

  5. 步骤五:为索引关联ILM策略

    为第一个Heartbeat索引关联ILM策略,使策略应用到索引模板覆盖的所有索引。

  6. 步骤六:查看各阶段索引

    查看归档在各阶段(hot、warm、cold、delete)的索引。

步骤一:创建并配置冷热集群

  1. 创建冷热集群并查看节点的冷热属性。冷热集群包含冷、热两种属性的节点,两者区别如下:

    节点类型

    存储数据要求

    读写性能要求

    规格要求

    存储要求

    热节点(hot)

    近期数据,例如最近2天的日志数据。

    高,例如32核64 GB

    建议使用SSD云盘。

    冷节点(warm)

    历史数据,例如2天之前的日志数据。

    低,例如8核32 GB

    建议使用高效云盘,或使用OpenStore实现海量冷数据Serverless存储。

    阿里云Elasticsearch中,冷数据节点的box_type值为warm(非cold),这是因为冷数据节点在Elasticsearch原生架构中对应warm tier。
    1. 创建阿里云Elasticsearch实例时,启用冷数据节点,即可创建冷热集群。

      启用冷数据节点并购买后,系统会在节点启动参数中加入-Enode.attr.box_type参数:

      • 热数据节点:-Enode.attr.box_type=hot

      • 冷数据节点:-Enode.attr.box_type=warm

      只有启用冷数据节点后,数据节点才会变成热节点。
    2. 登录该集群的Kibana控制台,具体操作请参见通过Kibana连接集群

    3. 在左侧导航栏,单击Dev Tools

    4. Console 中,执行如下命令,查看集群冷热节点属性。

      GET _cat/nodeattrs?v&h=host,attr,value

      返回结果中包含hot和warm节点,表示集群已支持冷热架构。

  2. 开启目标集群的自动创建索引功能,具体操作步骤请参见通过配置YML参数开启自动创建索引

  3. 配置集群的公网地址访问白名单,将安装Heartbeat服务器的IP地址添加到白名单中,具体操作步骤请参见设置IP白名单

步骤二:在Heartbeat下配置ILM

详细的ILM配置说明请参见Set up index lifecycle management

  1. 下载Heartbeat安装包,并解压缩。

  2. 编辑heartbeat.yml,分别定义heartbeat.monitors、setup.template.settings、setup.kibana和output.elasticsearch。

    配置示例如下。

    heartbeat.monitors:
    - type: icmp
      schedule: '*/5 * * * * * *'
      hosts: ["47.111.xx.xx"]
    
    setup.template.settings:
      index.number_of_shards: 3
      index.codec: best_compression
      index.routing.allocation.require.box_type: "hot"
    
    setup.template.overwrite: true
    
    setup.kibana:
      host: "https://es-cn-4591jumei00xxxxxx.kibana.elasticsearch.aliyuncs.com:5601"
    
    output.elasticsearch:
      hosts: ["es-cn-4591jumei00xxxxxx.elasticsearch.aliyuncs.com:9200"]
      ilm.enabled: true
      ilm.rollover_alias: "heartbeat"
      ilm.pattern: "{now/d}-000001"
      username: "elastic"
      password: "<your_password>"

    部分参数说明如下,更多参数说明请参见Heartbeat配置文档

    参数

    说明

    index.number_of_shards

    设置主分片数,默认是1。

    index.routing.allocation.require.box_type

    设置将索引数据写入hot节点。

    setup.template.overwrite

    设置是否覆盖原索引模板。如果已将此版本的索引模板加载到Elasticsearch中,必须设置为true以覆盖原模板。该参数为顶级配置项,与setup.template.settings同级。

    host

    替换为Kibana服务的公网访问地址,可在Kibana的配置页面获取。

    hosts

    替换为Elasticsearch集群的公网或私网访问地址,可在集群的基本信息页面获取,详细信息请参见查看实例基本信息。如果设置为公网地址,需要配置集群的公网地址访问白名单,具体操作请参见设置IP白名单;如果设置为私网地址,需要确保集群与安装Heartbeat的服务器在同一专有网络下。

    ilm.enabled

    设置为true,表示启用索引生命周期管理ILM。

    ilm.rollover_alias

    设置滚动更新索引时生成的索引别名,默认是heartbeat-\{beat.version\}。

    ilm.pattern

    设置滚动更新索引时生成的索引模式。支持date math,默认是{now/d}-000001。当触发索引滚动更新条件后,新的索引名称会在最后一位数字上加1。例如第一次滚动更新产生的索引名称是heartbeat-2020.04.29-000001,触发滚动后新索引名称为heartbeat-2020.04.29-000002。

    username

    用户名默认为elastic。

    password

    elastic用户的密码在创建实例时设定,如果忘记可重置。重置密码的操作步骤请参见重置实例访问密码

    重要

    如果在加载索引模板后修改ilm.rollover_alias或ilm.pattern,则必须设置setup.template.overwrite为true,重写索引模板。

  3. 启动Heartbeat服务。

    sudo ./heartbeat -e

步骤三:创建ILM策略

Elasticsearch支持通过API和Kibana控制台两种方式创建ILM策略。以下以API方式为例,创建heartbeat-policy策略。

Heartbeat支持通过./heartbeat setup --ilm-policy命令加载默认的策略并写入Elasticsearch,默认策略可通过./heartbeat export ilm-policy命令导出。可以修改该默认策略,实现手动创建策略。

在Kibana控制台中,执行以下命令,创建ILM策略。

PUT /_ilm/policy/heartbeat-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "5mb",
            "max_age": "1d",
            "max_docs": 100
          }
        }
      },
      "warm": {
        "min_age": "60s",
        "actions": {
          "forcemerge": {
                "max_num_segments":1
              },
          "shrink": {
                "number_of_shards":1
              }
        }
      },
      "cold": {
        "min_age": "3m",
        "actions": {
          "allocate": {
            "require": {
              "box_type": "warm"
            }
          }
        }
      },
      "delete": {
        "min_age": "1h",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

参数

说明

hot

索引满足任一条件(数据达到5 MB、使用超过1天、文档数超过100)时触发滚动更新。旧索引在滚动更新后等待60秒进入warm阶段。rollover支持max_docs、max_size、max_age三种条件,满足任一即触发。

warm

将索引收缩到1个分片,强制合并为1个段。完成后,索引在3分钟(从滚动更新时算起)后进入cold阶段。

cold

将索引从hot节点迁移到warm(冷数据)节点。完成后,索引在1小时后进入delete阶段。

delete

索引被删除。

策略名创建后无法更改。通过Kibana控制台也可以创建策略,但Kibana上max_age最小单位为小时,API方式最小单位为秒。

步骤四:为ILM策略关联索引模板

启动Heartbeat后,系统会自动在Elasticsearch中创建Heartbeat索引模板。将步骤三:创建ILM策略中创建的heartbeat-policy策略关联该索引模板。

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,具体步骤请参见通过Kibana连接集群

  2. 在左侧导航栏,单击 Management

  3. Elasticsearch 区域,单击 Index Lifecycle Policies

  4. Index lifecycle policies 列表中,找到heartbeat-policy策略,单击该策略行对应的 Actions > Add policy to index template

  5. 在弹出的对话框中,从 Index template 列表中选择索引模板,并在 Alias for rollover index 文本框中输入索引别名。

  6. 单击 Add policy

步骤五:为索引关联ILM策略

启动Heartbeat后,系统会自动在Elasticsearch中创建索引。为第一个索引关联ILM策略,该策略已在步骤四:为ILM策略关联索引模板中关联了索引模板。

  1. Management 页面的 Elasticsearch 区域中,单击 Index Management

  2. Index management列表中,找到目标索引,单击索引名称。

  3. Summary 页面,选择 Manage > Remove lifecycle policy ,移除Heartbeat自带的默认策略。

  4. 在弹出的对话框中,单击 Remove policy

  5. 再选择 Manage > Add lifecycle policy

  6. 在弹出的对话框中,从 Lifecycle policy 列表中选择步骤三:创建ILM策略中创建的heartbeat-policy策略,并在 Index rollover alias 输入框中输入步骤四:为ILM策略关联索引模板中定义的索引别名,单击 Add policy

步骤六:查看各阶段索引

Index management 页面,单击 Lifecycle phase 下拉列表,选择生命周期阶段(如Hot、Warm、Cold)过滤查看对应阶段的索引。

常见问题

如何调整ILM策略检查频率?

ILM默认每10分钟检查一次符合策略的索引,在此期间数据量可能超出设定阈值。例如在步骤三:创建ILM策略中设置max_docs为100,实际文档数可能在超过100后才触发滚动更新。

通过修改indices.lifecycle.poll_interval参数可控制检查频率:

重要

检查频率过高会增加节点负载,建议根据业务需求谨慎设置。

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"1m"
  }
}