1. 问题描述

目的:这个es主要是做日志收集用的,每天的日志生成一个索引,类似于
ops-sysinfo-2020.10.23这种,然后用es的索引生命周期功能自动删除30天前的日志,实现滚动删除功能(不想用脚本),这个用法我在es6.8上已经实现过一次。

结果在es7.8上配置好之后,出现了下面的错误:
错误1:
illegal_argument_exception: index.lifecycle.rollover_alias [logs] does not point to index [logs-sysinfo-2020.10.19]
错误2:
illegal_argument_exception: rollover target [logs] does not point to a write index
错误3:
illegal_argument_exception: setting [index.lifecycle.rollover_alias] for index [logs-sysinfo-2020.10.19] is empty or not defined
主要是上面三个错误,刚开始只有第一个错误,后面两个是在我调试过程中遇到的。

先看看我之前的配置:
索引生命周期:
在这里插入图片描述
索引模板:

PUT _template/logs_template
{
  "index_patterns": ["logs-*"],   # 匹配所有以logs开头的索引
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "delete-30day",     # 绑定生命周期策略
    "index.lifecycle.rollover_alias": "logs"        # 别名
  }
}

2. 问题解决与正确的配置

使用下面的配置可以解决我的问题,且没有报错的情况

  1. 关闭滚动更新,因为滚动更新设置比较复杂,跟我的需求关系不大,而且上面的错误也是因为这个设置不正确引起的。
  2. 设置删除,30天后自动删除
  3. 重新绑定索引模板
    在这里插入图片描述
    重新绑定索引模板
    在这里插入图片描述
    覆盖就行了,覆盖之后就是重新更新。
    在这里插入图片描述
    然后原来的索引生命周期策略都需要重新配置(这个比较麻烦)
    配置完之后,正常情况如下:
    在这里插入图片描述

3. 问题说明

在解决这个问题的过程中,遇到很多问题。主要是没考虑清楚生命周期策略里面的一些配置细节。

生命周期策略中的滚动更新是需要对索引设置别名的,而且每个索引设置的别名不能一样。但我设置的是每天更新索引,索引是按天区分的,给每个索引设置别名的方式很明显不适合我,没办法自动设置索引,最多使用脚本定时去执行,这样增加了复杂度,必要性不强,真做到这一步,我还不如写脚本定时删除,不用生命周期策略了。

我们看一下一些beats生成的索引是什么样的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
索引别名:
在这里插入图片描述
别名设置方式(在kibana控制台的调试工具中操作):

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "ops-sysinfo-2020.10.23-00001",
        "alias": "sysinfo",          # 索引别名
        "is_write_index": true   # 这个参数必须有,没有会报错
      }
    }
  ]
}

参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/set-up-lifecycle-policy.html
注意:索引名称要设置成*-00001这种的,这样自动更新的时候,下一个就是*-00002,否则也会报错(参考beats的配置)

这些beats的索引,不是按天生成的,只有一个索引,启动了滚动更新功能(滚动更新创建的新索引将添加到索引别名,并被指定为写索引。)当现在的这个索引大于50千兆,即50g或者超过30天之后,索引将会更新,索引别名将会指向新生成的索引,旧的索引使用频率(读、写)会逐渐降低。

在这里插入图片描述

现在来看,滚动更新并不能解决我的问题,或者说我的按日期进行配置的索引已经进行了滚动,不需要通过生命周期策略进行滚动,这个策略并不能解决我的问题,还引发了新的问题,还不如把它去掉。

滚动更新更适合对于同一索引(不是按日期的),数据量非常大,且越新的数据调用越频繁,旧数据调用没那么频繁的场景。

至于如何正确设置滚动更新,关键是设置好更新策略和别名,具体的请参考官方文档。

参考:
https://www.cnblogs.com/mikelaowang/p/13345318.html
https://www.jianshu.com/p/358fde8d8e27
https://zhuanlan.zhihu.com/p/266030572?utm_source=wechat_timeline
https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-rollover-index.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐