ilm

简介

index lifecycle management:索引生命周期管理。对于随着时间不停增长的数据,我们经常需要定期归档和清理,如数据库可以对表进行分片,日志可以按照日期,大小进行切换。elk的ilm机制就是用来自动归档,迁移,删除日志的机制。

生命周期

在elk中,数据的生命周期可以有5个,并不是所有的阶段都必须有,可能只有其中几个:

  • hot:索引数据会被更新和查询
  • warm:索引数据只被查询
  • cold:索引数据很少被查询,可以接受查询速度很慢
  • frozen:索引数据更少被查询,可以接受更慢的查询速度
  • delete:索引数据可以被删除

每个生命周期可以执行的操作不一样:

  • 设置索引优先级:优先级高的索引在系统重启之后先恢复,比如hot阶段一般设置的优先级比其他阶段高
  • 索引切换:主要是作用于data_stream和alias,当后端索引满足一定条件后(如大小达到多少,文档数量达到多少,索引生命长度),创建新的索引,写数据都写到新的索引,有点像数据库的表分片。
  • 迁移索引到特定节点,如果索引不再被频繁访问了,可以将数据迁移到配置差一些的节点
  • 设置索引只读
  • 减少索引分片数量
    等等

测试

ilm主要是用于data_stream的后端索引的自动管理,这里结合data_stream测试ilm的功能,关于data_stream可以查看我的博文data stream

#先调整集群配置,将状态检测配置为3s(默认10min),方便测试
#如果不调整,当生命周期切换条件达到的时候,对应的actions并不会立即执行
put _cluster/settings
{
  "persistent":{
    "indices.lifecycle.poll_interval": "3s"
  }
}


#创建ilm
put /_ilm/policy/ilm_dsqtest_10c_1min
{
  "policy":{
    "phases":{
      "hot":{
        "actions":{
          "rollover":{
            "max_primary_shard_docs": 10
          }
        }
      },
      "delete":{
        "min_age":"1m",
        "actions":{
          "delete":{}
        }
      }
    }
  }
}
#上面这个ilm有hot,delete两个阶段
#当文档数量等于10,会触发rollover,也就是创建新的index,然后写data stream的数据是写到新创建的索引
#索引进入delete阶段1分钟后删除索引

#创建component_template,与上面创建的ilm绑定
PUT  _component_template/ct_ilm_dsqtest_10c_1min
{
  "template":{
    "settings":{
      "index.lifecycle.name": "ilm_dsqtest_10c_1min"
    }
  },
  "_meta":{
    "description":"rollover when 10 c or 1 min"
  }
}

#创建index template
put _index_template/it_dsqtestx
{
  "index_patterns":["dsqtestx*"],
  "data_stream":{},  
  "composed_of":["ct_ilm_dsqtest_10c_1min"],
  "priority": 200,
  "_meta":{
    "description":"template for dsqtestx*"
  }
}
#data_stream字段说明该模板用于data stream,而不是普通的index
#如果用户创建的普通索引名称与正则dsqtestx*匹配上了,就会报错;也就是当名称与dsqtestx*匹配的时候,只能是创建data stream。 
#当一个data_stream名称与多个索引模板的index_patterns匹配,那就用模板的priority值去判断选择哪个模板,值越大,优先级越高

#创建data stream
#data stream会按照固定的模式创建新的索引,如.dx_{dsname}-{day}-{xxxxx}
put _data_stream/dsqtestx_app1
#查看创建的data stream信息
get dsqtestx_app1

#插入数据,kibana dev tools的可以ctrl+回车执行当前光标所在语句
#或者使用reindex从其他index导入数据
post dsqtestx_app1/_doc
{
  "@timestamp":"0",
  "name":"dsq"
}

#插入10条数据后查看data stream信息
get dsqtestx_app1
#可以看到有两个索引了,说明触发了ilm的rollover
".ds-dsqtestx_app1-2023.08.18-000001"
".ds-dsqtestx_app1-2023.08.18-000002"
#等待一分钟后再次查询只剩下索引".ds-dsqtestx_app1-2023.08.18-000002"了,说明触发了ilm的delete

#如果没有正常触发ilm,可以排查一下
get dsqtestx_app1/_ilm/explain

总结

这里主要是简单测试ilm的功能,实际应用中还要给不同配置服务器设置不同角色,然后设置数据的迁移策略。

参考

生命周期切换触发条件
不同生命周期支持的action
不同层次的ilm配置

posted @ 2023-08-18 18:04  董少奇  阅读(54)  评论(0)    收藏  举报