对于时间序列数据,随着时间的积累,数据量会越来越大,您可以通过索引生命周期管理ILM(Index Lifecycle Management)定期将数据滚动到新索引,防止因数据过大影响查询效率和成本。随着索引的老化和查询频率的降低,您可以将其转移到价格较低的磁盘上,并减少分片和副本的数量。本文介绍通过ILM管理Heartbeat数据的方法。
背景信息
本文使用的测试场景如下:
在业务场景中,存在大量的heartbeat-*时序索引,每个索引的大小约为4 MB。随着数据量的不断增加,shard的数量也将随之增多,进而导致集群负载加重。因此,有必要制定不同的滚动更新策略。在hot阶段,对heartbeat-*开头的历史监控索引进行滚动更新;在warm阶段,对索引实施分片收缩及段合并;在cold阶段,将数据从hot节点迁移至warm节点(处理冷数据);在delete阶段,定期删除索引数据。
注意事项
- 索引必须定义模板和别名之后,才可以设置生命周期管理策略。 
- 如果在滚动更新索引时修改了生命周期管理策略,新策略将在下一次滚动更新时生效。 
操作流程
- 在创建集群时,应配置集群中节点的冷热属性、启用自动创建索引功能,并设置公网地址访问白名单。 
- 在heartbeat.yml中开启阿里云Elasticsearch的生命周期管理功能,并配置其参数。配置完成并启动后,系统会自动在对应阿里云Elasticsearch实例中生成Heartbeat索引模板。 
- 通过ilm policy API创建生命周期管理策略,该策略用来定义索引滚动更新和归档的条件。 
- 为上一步创建的生命周期管理策略关联Heartbeat索引模板。 
- 为第一个Heartbeat索引关联生命周期管理策略,以便将该策略应用到整个Heartbeat索引模板覆盖的索引下。 
- 查看归档在各阶段(hot、warm、cold、delete)的索引。 
步骤一:创建并配置冷热集群
- 创建冷热集群并查看集群的冷热节点属性。 - 冷热集群是指在集群中包含冷、热两种属性的节点,可以提高Elasticsearch的处理性能和服务稳定性。两者区别如下。 - 节点类型 - 存储数据要求 - 读写性能要求 - 规格要求 - 存储要求 - 热节点(hot) - 近期数据,例如最近2天的日志数据。 - 高 - 高,例如32核64 GB - 建议使用SSD云盘存储数据,存储空间大小需根据数据大小进行设置。 - 冷节点(warm) - 历史数据,例如2天之前的日志数据。 - 低 - 低,例如8核32 GB - 建议使用高效云盘存储数据,存储空间大小需根据数据大小进行设置。 
- 建议使用阿里云自研OpenStore存储功能,实现海量冷数据Serverless存储,详细信息请参见通过OpenStore自定义冷热存储实现海量数据存储。 
 - 在购买阿里云Elasticsearch实例时,启用冷数据节点,即可创建冷热集群。 - 当您启用了冷数据节点并购买后,系统会在节点启动参数中加入-Enode.attr.box_type参数。 - 热数据节点:-Enode.attr.box_type=hot 
- 冷数据节点:-Enode.attr.box_type=warm 
 说明- 购买实例时,只有当启用了冷数据节点后,数据节点才会变成热节点。 
- 本文以阿里云Elasticsearch 6.7.0版本为例,所涉及的操作及图片仅适用于该版本,其他版本以实际界面为准。 
 
- 登录该集群的Kibana控制台。 - 登录Kibana控制台的具体操作请参见登录Kibana控制台。 
- 在左侧导航栏,单击Dev Tools。 
- 在Console中,执行如下命令,查看集群冷热节点属性。 - GET _cat/nodeattrs?v&h=host,attr,value- 结果显示集群中包含3个hot节点,2个warm节点,支持冷热架构。  
 
- 开启目标集群的自动创建索引功能。 - 具体操作步骤请参见配置YML参数。 
- 配置集群的公网地址访问白名单,将安装Heartbeat服务器的IP地址添加到白名单中。 - 具体操作步骤请参见配置实例公网或私网访问白名单。 
步骤二:在Heartbeat下配置ILM
为了使Heartbeat与Elasticsearch的ILM无缝衔接,可在heartbeat.yml配置中定义Elasticsearch的ILM,详细配置请参见Set up index lifecycle management。
- 下载Heartbeat安装包,并解压缩。 
- 编辑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.kibana: # Kibana Host # Scheme and port can be left out and will be set to the default (http and 5601) # In case you specify and additional path, the scheme is required: http://localhost:5601/path # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601 host: "https://es-cn-4591jumei00xxxxxx.kibana.elasticsearch.aliyuncs.com:5601" output.elasticsearch: # Array of hosts to connect to. hosts: ["es-cn-4591jumei00xxxxxx.elasticsearch.aliyuncs.com:9200"] ilm.enabled: true setup.template.overwrite: true ilm.rollover_alias: "heartbeat" ilm.pattern: "{now/d}-000001" # Enabled ilm (beta) to use index lifecycle management instead daily indices. #ilm.enabled: false # Optional protocol and basic auth credentials. #protocol: "https" username: "elastic" password: "<your_password>"- 部分参数说明如下,更多参数说明请参见官方Heartbeat配置文档。 - 参数 - 说明 - index.number_of_shards - 设置主分片数,默认是1。 - index.routing.allocation.require.box_type - 设置将索引数据写入hot节点。 - host - 需要替换为您Kibana服务的公网访问地址,可在Kibana的配置页面获取。 - hosts - 需要替换为您Elasticsearch集群的公网或私网访问地址,可在集群的基本信息页面获取,详细信息请参见查看实例的基本信息。 说明- 如果设置为公网地址,需要配置集群的公网地址访问白名单,具体操作请参见配置实例公网或私网访问白名单;如果设置为私网地址,需要确保集群与安装Heartbeat的服务器在同一专有网络下。 - ilm.enabled - 设置为true,表示启用索引生命周期管理ILM。 - setup.template.overwrite - 设置是否覆盖原索引模板。如果您已经将此版本的索引模板加载到Elasticsearch中,则必须将该参数设置为true,使用此版本的索引模板覆盖原索引模板。 - ilm.rollover_alias - 设置滚动更新索引时,生成的索引的别名,默认是heartbeat-\{beat.version\}。 - ilm.pattern - 设置滚动更新索引时,生成的索引的模式。支持date math,默认是{now/d}-000001。当触发索引滚动更新条件后,新的索引名称会在最后一位数字上加1。 - 例如第一次滚动更新产生的索引名称是heartbeat-2020.04.29-000001,当满足索引滚动更新条件后触发滚动,Elasticsearch会创建新的索引,名称为heartbeat-2020.04.29-000002。 - username - 用户名默认为elastic。 - password - elastic用户的密码在创建实例时设定,如果忘记可重置。重置密码的注意事项和操作步骤,请参见重置实例访问密码。 重要- 如果在加载索引模板后修改ilm.rollover_alias或ilm.pattern,则必须设置setup.template.overwrite为true,重写索引模板。 
- 启动Heartbeat服务。 - sudo ./heartbeat -e
步骤三:创建ILM策略
Elasticsearch支持通过API和Kibana控制台两种方式创建ILM策略。以下示例以API方式为例,介绍通过ilm policy API创建heartbeat-policy策略。
Heartbeat支持通过./heartbeat setup --ilm-policy命令加载默认的策略并写入Elasticsearch,默认策略可通过./heartbeat export ilm-policy命令到stdout。您可以修改该默认策略,实现手动创建策略。
在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天、doc数超过100,就会触发索引滚动更新。此时系统将创建一个新索引,该索引将重新启动策略,而旧索引将在滚动更新后等待60秒进入warm阶段。 重要  目前Elasticsearch支持在rollover中配置三种归档策略:max_docs、max_size、max_age,满足其中任何一个条件都会触发索引归档操作。 | 
| warm | 索引进入warm阶段后,ILM会将索引收缩到1个分片,强制合并为1个段。完成该操作后,索引将在3分钟(从滚动更新时算起)后进入cold阶段。 | 
| cold | 索引进入cold阶段后,ILM将索引从hot节点移动到warm(冷数据)节点。完成操作后,索引将在1小时后进入delete阶段。 | 
| delete | 索引进入delete阶段后被删除。 | 
- 策略名创建后将无法更改。 
- 您也可以在Kibana控制台上创建策略,但是Kibana上指定的max_age最小单位为小时,而通过API方式,可指定最小单位为秒。 
步骤四:为ILM策略关联索引模板
启动Heartbeat后,系统会自动在对应的Elasticsearch中创建Heartbeat索引模板。您需要为步骤三:创建ILM策略中创建的自定义ILM策略关联该索引模板。
- 登录目标阿里云Elasticsearch实例的Kibana控制台。 - 具体步骤请参见登录Kibana控制台。 
- 在左侧导航栏,单击Management。 
- 在Elasticsearch区域,单击Index Lifecycle Policies。 
- 在Index lifecycle policies列表中,选择。  
- 在弹出的对话框中,从Index template列表中选择索引模板,并在Alias for rollover index文本框中输入索引别名。  
- 单击Add policy。 
步骤五:为索引关联ILM策略
启动Heartbeat后,系统会自动在对应的Elasticsearch中创建索引。您需要为第一个索引关联对应的ILM策略,该ILM策略已经关联了索引模板(步骤四:为ILM策略关联索引模板)。
- 在Management页面的Elasticsearch区域中,单击Index Management。 
- 在Index management列表中,找到目标索引,单击索引名称。 
- 在Summary页面,选择,移除Heartbeat自带的默认策略。  
- 在弹出的对话框中,单击Remove policy。 
- 再选择。 
- 在弹出的对话框中,从Lifecycle policy列表中选择步骤三:创建ILM策略中创建的生命周期策略,并在Index rollover alias输入框中输入步骤四:为ILM策略关联索引模板中定义的索引别名,单击Add policy。  - 关联成功后,结果如下图。  
步骤六:查看各阶段索引
查看hot阶段的索引:在Index management页面,选择。
您也可以使用同样的方式,查看其他阶段的索引。
常见问题
Q:如何设置ILM策略周期?
A:由于索引生命周期策略默认是10分钟检查一次符合策略的索引,因此在这10分钟内索引中的数据可能会超出指定的阈值。例如在步骤三:创建ILM策略时,设置max_docs为100,但doc数量在超过100后才触发索引滚动更新,此时可通过修改indices.lifecycle.poll_interval参数来控制检查频率,使索引在阈值范围内滚动更新。
请慎重修改该参数值,避免时间间隔太短给节点增加不必要的负载,本测试中将其改成了1m。
PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"1m"
  }
}