【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

索引生命周期管理(ILM)是指:ES数据索引从设置,创建,打开,关闭,删除的全生命周期过程的管理;为了降低索引存储成本,提升集群性能和执行效率,我们可以通过对存储在阿里云 Elasticsearch 的数据做生命周期管理。

本文作者:阿里云 Elasticsearch团队—Lettie

阿里云 Elasticsearch (>=6.6) 提供 ILM 功能,同时将索引生命周期分为 Hot,Warm、Cold、Delete 4个阶段。

阶段 描述
Hot 主要处理时序数据的实时写入,根据索引的文档数大小时长决定是否调用 Rollover API 来滚动索引。
Warm 主要用来提供查询,索引不再写入。
Cold 查询较少,查询速度变慢,索引不再被更新。
Delete 删除数据

说明:Rollover 配置归档,目前仅支持三种策略,分别是:max_docs、max_size、max_age,其中任何一个条件满足都会触发索引归档操作。

场景介绍


业务场景中存在大量 heartbeat-* 时序索引,且每天新增单个索引大小都在 4MB 左右.数据越多,导致 Shard 数越多,导致增加集群负载过高。为了有效避免该类情况,需要规划不同的 Rollover 策略,滚动 heartbeat-* 开头的历史监控索引,实现 Warm 阶段对索引进行分片收缩及合并段,Cold 阶段将数据从 Hot 节点移动到 Cold(Warm)节点,并定期删除索引数据。

操作说明


Heartbeat下配置ILM

为了使 Heartbeat 与 阿里云 Elasticsearch 的ILM无缝衔接,可在 Beat yml 配置中定义 ES ILM

详细配置参考Set up index lifecycle management

下载并解压 Heartbeat 安装包,通过以下命令编辑 Heartbeat.yml 配置分别定义 Heartbeat.monitors、setup.kibana、output.elasticsearch。

heartbeat.monitors:
- type: icmp
  schedule: '*/5 * * * * * *'
  hosts: ["47.111.169.233"]
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-4591jumei000u1zp5.kibana.elasticsearch.aliyuncs.com:5601"
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["es-cn-4591jumei000u1zp5.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: "Elastic@363"

ILM 及 Settings 配置说明:

1、index.number_of_shards:指定主分片数,默认是1。
2、index.routing.allocation.require.box_type:将索引数据写入hot节点。
3、ilm.enabled:设置为true,用来启用index lifecycle management。
4、setup.template.overwrite: 覆盖原template数据,如果以前已将此版本的索引模板加载到es中,则必须通过该配置重新覆盖。
5、ilm.rollover_alias:定义rollover 别名,默认是heartbeat-{beat.version},通过该参数可指定别名前缀。
6、ilm.pattern:定义滚动索引的pattern,这里支持date math,默认是{now/d}-000001,当触发条件后,新索引名称在最后一位数字上加1,比如第一次滚动产生的索引名称是heartbeat-2020.04.29-000001,当满足上述定义的rollover中的一项触发滚动后,创建新的索引,名称为heartbeat-2020.04.29-000002。

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

自定义ILM策略


heartbeat支持通过 ./heartbeat setup --ilm-policy 命令,可加载默认的策略写进 Elasticsearch,默认策略可通过 ./heartbeat export ilm-policy 命令打印在stdout,可以对该命令进行修改,实现手动创建策略。

以下主要介绍如何手动创建策略。

索引生命周期策略支持通过 API 或 Kibana 配置,下面示例是通过 ilm policy API 创建 hearbeat-policy 。

提示:通过 kibana --> management-->index lifecycle policies 配置索引生命周期策略。

PUT /_ilm/policy/hearbeat-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": {
            "include": {
              "box_type": "warm"
            }
          }
        }
      },
      "delete": {
        "min_age": "1h",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

Hot:

该策略将在写入达到 5MB 、使用超过1天、doc数超过100时,只要满足任一条件,都会触发 Rollover,系统将创建一个新索引,该索引将重新启动策略,而当前的索引将在滚动更新后等待 60s 后进入 Warm 阶段。

Warm:

索引进入 Warm 阶段后,ILM 会将索引收缩到 1 个分片,将索引强制合并为 1 个段,完成该操作后,索引将等待 3M (从滚动更新时算起)后进入 Cold 阶段。

Cold:

索引进入 Cold 阶段后,ILM将索引从 Hot 节点移动到冷数据(warm)节点,完成操作后,将等待1小时进入删除阶段。

Delete:

索引进入delete阶段,将在1小时后删除。

各个阶段支持不同种类的 Action,详细说明 请参考Action。

kibana 管理滚动索引


完成以上准备工作后,使用下面命令启动 Heartbeat 服务。

# sudo ./heartbeat -e

ILM关联模板

进入kibana Index lifecycle policies,为自定义的策略关联 Heartbeat 索引模板。

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

索引关联ILM

进入 index management

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

由于该索引默认关联的是 Beat 自带的策略,如默认策略没有生成,需要指定自定义的policy,点击Manage,需要先remove lifecycle policy。

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

再为该索引添加新策略

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

如下关联成功

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

过滤各阶段索引

过滤Hot阶段滚动索引。

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

过滤出处于 Warm 阶段的索引

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

过滤出 Cold 阶段索引

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

ILM策略周期


大家是否有观察到,策略中明明指定max_doc为100,为何 docs count 数达到100多后才滚动?
由于索引生命周期策略默认是10分钟检查一次符合策略的索引,索引可能会超出指定的阈值。 可通过修改 indices.lifecycle.poll_interval 参数来控制检查频率。

慎重修改,避免时间间隔太短给节点造成不必要的负载,本测试中将其改成了1m

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

总结


• 索引必须定义“模板”和“别名”两个条件才可以设置索引生命周期策略。
• 索引添加生命周期策略有两种方式:
1、在索引生命周期中添加管理的模板:可以将策略应用到整个别名覆盖的索引下。
2、对单个索引添加索引生命周期策略:只能覆盖当前索引,新滚动的索引不再受周期策略影响。
• 索引滚动中对策略做了修改,新策略将在下一个滚动索引生效。


【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

阿里云Elastic Stack】100%兼容开源ES,独有9大能力

相关活动


更多折扣活动,请访问阿里云 Elasticsearch 官网

阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费
阿里云 Logstash 2核4G首月免费


【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

【最佳实践】阿里云 Elasticsearch 索引数据生命周期管理

上一篇:阿里云 Elasticsearch 向量检索,轻松玩转人脸识别、搜索推荐等29个业务场景


下一篇:redis-full-check校验工具