elasticsearch 索引_Elasticsearch索引生命周期策略实践

主题介绍

在ELK中,我们会存储大量的监控数据和日志数据,这需要我们定期对数据进行清除,如只保存一个月内的日志数据,过期的数据我们进行删除。我们使用elasticsearch提供的索引生命周期策略来对数据进行定期管理。

遇到的问题与困惑

我打算通过ELK 6.8 来搜集监控数据,我启动了Kibana和Elasticsearch以及filebeat和metricbeat,在使用了两天后,发现测试机的磁盘快满了。于是我找到了索引生命周期策略 index_lifecycle_management 相关内容。

我最初是在Kibana界面配置了一个名字为test-policy的生命周期策略。如下:

ed57df54ffdb0418a17f49ca17794d40.png

就是简单的开启了热阶段和删除阶段,同时将策略和索引模板相关联,想着这样保存策略应该就可以使用了吧。

b0ba05642b86ceca4e01983d40230481.png

但是仍旧遇到了一些问题,在第二天的时候,我发现索引出现生命周期错误。

43f15007fbba95cce323c7455c35b686.png
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 这样的名字。如下图所示:

feffaef5c7d540cde7f815aed154ee1c.png

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为例。

  1. 首先关闭metricbet
  2. sudo service metricbeat stop
  3. 在Kibana界面上配置索引生命周期策略,和上文提到的相同。

1d58b2a71ee071347a82513f60d4c8c9.png
  1. 在Metricbeat的配置文件中修改配置,默认iml是关闭的,我们需要把它打开。

ilm.enabled 设为true、setup.ilm.rollover_alias 、setup.ilm.pattern 进行配置。

62b104178406854122c135dc4b7399b1.png

注意:如果是我们的测试环境,最好把之前的metricbeat相关的索引清除掉,metricbeat可能会有一些策略导致不创建新的索引。

  1. 启动Metricbeat 即可
  2. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值