ElasticSearch——索引生命周期管理
前言
在使用elk的时候,由于数据量较大,时间比较久远的数据就没有那么有价值了,因此就需要定期的清除这些历史数据,所以我们在设置es的索引策略的时候就可以进行数据的冷热策略设置。
本文介绍 ElasticSearch 7.14 版本的生命周期:
- Hot:正在积极更新和查询索引。
- Warm:索引不再更新,但仍在查询中。
- Cold:索引不再更新,很少被查询。信息仍然需要可搜索,但如果这些查询速度较慢也没关系。
- Delete:不再需要索引,可以安全地删除。
每个阶段可以触发的动作:
Kibana配置
- 创建策略
设置hot阶段的策略,这里我设置索引大小为20kb、文档数为3、30秒钟自动滚动,就是说只要达到其中一个条件就自动根据索引模板创建索引,设置删除阶段,6分钟之后删除索引数据。
- 创建索引模板
步骤1:
步骤2:
注:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。如下图所示:
步骤3:
步骤4:
- 创建索引
可使用kibana来创建索引。
注意:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。
- 测试验证
索引创建成功后,发现索引每隔30秒就会生成一个索引值,或者每插入3条数据就会生成一个索引。
到此说明配置的索引策略生效了,这里默认的情况,生成的索引的自增是6位的,比如000001。等待6分钟之后你会发现,有些索引已经被删除了,前面的两个索引已经被删除了。
命令配置
- 设置策略刷新时间【可选】
设置生命周期策略刷新时间,默认是10min,我们在测试的时候可以设置的短一些,如3s:
PUT _cluster/settings { "transient": { "indices.lifecycle.poll_interval": "3s" } }
- 创建策略
创建一个名为 my_policy 的策略,并添加了hot、delete两个phrase,hot 阶段单分片大于25G创建新索引,30天后删除旧索引。
PUT _ilm/policy/my_policy{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "25GB" } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }
- 创建索引模板并使用策略
创建一个索引模板,将 my_policy 赋值给 index.lifecycle.name,其中index.lifecycle.rollover_alias指定了索引别名,通过别名可以查询模板创建的所有索引。
PUT _index_template/test-template { "version": 1.0, "priority": 1, "index_patterns": ["test-*"], "template": { "settings":{ "number_of_shards": 3, "number_of_replicas": 1,"index.lifecycle.name": "my-policy", "index.lifecycle.rollover_alias": "test-alias"#这个别名记得和索引别名用的要一致不然会报illegal_argument_exception: index.lifecycle.rollover_alias [ilm_alias] does not point to index [ilm_index-
000001
]
} } }
- 创建索引
创建一个名为 test-000001 的索引,同时别名为test-alias,其中 is_write_index = true 意思是当前新建索引为写索引,触发hot阶段归档后的索引该值是false
PUT test-000001{ "aliases": { "test-alias":{ #这里的名字要和上面的模板一致 "is_write_index": true } } }
注:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。
- 插入数据
PUT test-000001/_doc/1 { "hello":"world" }
注意事项
一、错误
错误一:
- 错误信息:illegal_argument_exception: setting [index.lifecycle.rollover_alias] for index [index] is empty or not defined
- 错误原因:索引模板没有设置别名
- 解决方法:创建索引模板时手动设置[index.lifecycle.rollover_alias]别名
错误二:
- 错误信息:illegal_argument_exception: index.lifecycle.rollover_alias [metricbeat-alias] does not point to index [metricbeat-6.8.4-2020.10.13]
- 错误原因:索引没有设置别名,或者别名不一致
- 解决方法:创建索引时设置别名alias,值为跟索引模板中的[index.lifecycle.rollover_alias]别名一致
二、策略
策略中阶段中的各个动作都是可选的,可以只配置某个动作,如:
PUT _ilm/policy/auto-delete-iml-policy { "policy": { "phases": { "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }
也可以配置多个动作(如果某个动作失败了,后面的动作不会执行),如:
PUT _ilm/policy/full_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "7d", "max_size": "50G" } } }, "warm": { "min_age": "30d", "actions": { "forcemerge": { "max_num_segments": 1 }, "shrink": { "number_of_shards": 1 }, "allocate": { "number_of_replicas": 2 } } }, "cold": { "min_age": "60d", "actions": { "allocate": { "require": { "box_type": "cold" } } } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }
- 当前索引会在7天后或者单分片大于50G后进行归档,并生成新的索引;
- warm阶段在第30天后触发,将分片数降低为1分片,segment强制合并为1,通过allocation将副本数增大到2;
- cold阶段第60天触发,会关闭索引,并将数据转移至box_type = cold标签节点;
- 90天后删除索引。
三、索引别名
创建索引时的别名(alias)需要和索引模板中[index.lifecycle.rollover_alias]字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字,如果不指定,rollover将失败。
手动创建索引时可以配置alias,但使用ELK时自动创建索引(filebeat、logstash)如何配置alias呢? 这个还没有研究......
引用:
- https://blog.csdn.net/lyl54545/article/details/124173572