主题介绍
在ELK中,我们会存储大量的监控数据和日志数据,这需要我们定期对数据进行清除,如只保存一个月内的日志数据,过期的数据我们进行删除。我们使用elasticsearch提供的索引生命周期策略来对数据进行定期管理。
遇到的问题与困惑
我打算通过ELK 6.8 来搜集监控数据,我启动了Kibana和Elasticsearch以及filebeat和metricbeat,在使用了两天后,发现测试机的磁盘快满了。于是我找到了索引生命周期策略 index_lifecycle_management 相关内容。
我最初是在Kibana界面配置了一个名字为test-policy的生命周期策略。如下:
就是简单的开启了热阶段和删除阶段,同时将策略和索引模板相关联,想着这样保存策略应该就可以使用了吧。
但是仍旧遇到了一些问题,在第二天的时候,我发现索引出现生命周期错误。
illegal_argument_exception: index.lifecycle.rollover_alias [metricbeat-alias] does not point to index [metricbeat-6.8.4-2020.10.13]
调用的一些接口
1. 新增/更新生命周期策略
//新建 test-policy的生命周期策略,hot阶段时间为1min,磁盘空间大小为50G;在10min后即可进入删除阶段
PUT _ilm/policy/test-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1m",
"max_size": "50G",
"max_docs": 1
}
}
},
"delete": {
"min_age": "10m",
"actions": {
"delete": {}
}
}
}
}
}
2. 获取索引模板
// 获取metricbeat-6.8.4 索引模板 (盲猜:应该是metricbeat setup 的时候保存到es中的)
GET /_template/metricbeat-6.8.4
{
"metricbeat-6.8.4" : {
"order" : 1,
"index_patterns" : [
"metricbeat-6.8.4-*"
],
"settings" : {
"index" : {
"lifecycle" : {
"name" : "test-policy",
"rollover_alias" : "metricbeat-6.8.4"
},
...
}
需要注意的是 index_patterns 和 rollover_alias 字段。当索引的命名规则与index_patterns描述的相同,则索引就会自动匹配上这个模板;索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。如下图所示:
3.获取索引别名
GET metricbeat-6.8.4/_alias
{
"metricbeat-6.8.4-2020.10.15-000001" : {
"aliases" : {
"metricbeat-6.8.4" : {
"is_write_index" : true
}
}
}
}
可以看到,这里的配置与上面settings.index.rollover_alias 中设置的值相同,只有这样,生命周期策略才会生效。
ELK配置流程
在这里,我想将配置ELK 生命周期策略和 自己通过命令配置生命周期策略分开来说。先说ELK配置流程,以metricbeat为例。
- 首先关闭metricbet
- sudo service metricbeat stop
- 在Kibana界面上配置索引生命周期策略,和上文提到的相同。
- 在Metricbeat的配置文件中修改配置,默认iml是关闭的,我们需要把它打开。
ilm.enabled 设为true、setup.ilm.rollover_alias 、setup.ilm.pattern 进行配置。
注意:如果是我们的测试环境,最好把之前的metricbeat相关的索引清除掉,metricbeat可能会有一些策略导致不创建新的索引。
- 启动Metricbeat 即可
- sudo service metricbeat start
命令配置流程
我直接贴调用接口:
# 0. 设置生命周期策略刷新时间,默认是10min,我们在测试的时候可以设置的短一些,如3s
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "3s"
}
}
# 1. 创建my_policy2 生命周期策略,热阶段为1m/50G,删除阶段为1m
PUT _ilm/policy/my_policy2
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1m",
"max_size": "50G",
"max_docs": 1
}
}
},
"delete": {
"min_age": "1m",
"actions": {
"delete": {}
}
}
}
}
}
# 2. 创建tt_template模板,匹配规则是tt-*,生命周期策略的别名是tti
PUT _template/tt_template
{
"index_patterns":["tt-*"],
"settings":{
"number_of_shards":2 ,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy2",
"index.lifecycle.rollover_alias": "tti"
}
}
# 3. 创建tt-000001索引,匹配tt_template模板,同时别名为tti,is_write_index表示此为写入索引,相同别名的索引中只能有一个写入索引。
PUT tt-000001
{
"aliases": {
"tti":{
"is_write_index": true
}
}
}
# 4. 通过别名操作,往tti别名的索引中插入数据,这里可以改变_doc的id,多插入几条。
PUT tti/_doc/1
{
"halo":"world"
}
# 5. 查看tti别名的索引,可以看到多个索引tt-000002,tt-000003...,因为每分钟都会rollover出来一个
GET tti/_search