索引生命周期管理(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
下载并解压 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 索引模板。
索引关联ILM
进入 index management
由于该索引默认关联的是 Beat 自带的策略,如默认策略没有生成,需要指定自定义的policy,点击Manage,需要先remove lifecycle policy。
再为该索引添加新策略
如下关联成功
过滤各阶段索引
过滤Hot阶段滚动索引。
过滤出处于 Warm 阶段的索引
过滤出 Cold 阶段索引
ILM策略周期
大家是否有观察到,策略中明明指定max_doc为100,为何 docs count 数达到100多后才滚动?
由于索引生命周期策略默认是10分钟检查一次符合策略的索引,索引可能会超出指定的阈值。 可通过修改 indices.lifecycle.poll_interval 参数来控制检查频率。
慎重修改,避免时间间隔太短给节点造成不必要的负载,本测试中将其改成了1m
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}
总结
• 索引必须定义“模板”和“别名”两个条件才可以设置索引生命周期策略。
• 索引添加生命周期策略有两种方式:
1、在索引生命周期中添加管理的模板:可以将策略应用到整个别名覆盖的索引下。
2、对单个索引添加索引生命周期策略:只能覆盖当前索引,新滚动的索引不再受周期策略影响。
• 索引滚动中对策略做了修改,新策略将在下一个滚动索引生效。
【阿里云Elastic Stack】100%兼容开源ES,独有9大能力
相关活动
更多折扣活动,请访问阿里云 Elasticsearch 官网
阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费
阿里云 Logstash 2核4G首月免费