前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elastic ILM 索引生命周期管理最佳实践

Elastic ILM 索引生命周期管理最佳实践

作者头像
Kevin song
发布2021-08-23 16:46:35
4.4K0
发布2021-08-23 16:46:35
举报

ILM介绍

引入索引生命周期管理的一个最重要的目的就是对大量时序数据在es读写操作的性能优化,对于日志或指标(metric)类时序性强的ES索引,因为数据量大,并且写入和查询大多都是近期时间内的数据。可以采用hot-warm-cold架构将索引数据切分成hot/warm/cold的索引。hot阶段索引负责最新数据的读写,可使用SSD存储;warm阶段索引负责较旧数据的读取,可使用高性能磁盘存储;cold阶段索引很少被读取,可使用大容量磁盘存储。delete阶段索引将被被删除。随着时间的推移,索引数据不断从hot阶段->warm阶段->cold阶段>delete阶段迁移。针对不同阶段的索引我们还可以调整索引的主分片数,副本数,单分片的segment数等等,更好的利用机器资源。

生命周期管理四个阶段

ES索引生命周期管理分为4个阶段:hot、warm、cold、delete,其中hot主要负责对索引进行rollover操作,warm、cold、delete分别对rollover后的数据进一步处理。

阶段

描述

hot

主要处理时序数据的实时写入

warm

可以用来查询,但是不再写入

cold

索引不再有更新操作,并且查询也会很少

delete

数据将被删除

注意:上述四个阶段不是必须同时存在。针对多数的小规模的日志场景下通常只需使用 hot 和 delete 阶段。

Elastic 节点类型配置(可选)

热节点

热节点类型的数据节点执行集群内所有的操作,节点存储的数据经常被查询,属于IO、CPU密集型操作,因而需要CPU比较空闲和装有高性能IO读写的磁盘(如SSD)的服务器支撑。

代码语言:javascript
复制
#配置方法
vim  /etc/elasticsearch/elasticsearch.yml
 
#每个热节点加入如下配置并重启服务
node.attr.box_type: hot
node.attr.rack: rack1
#这两项配置是为节点增加标签,具体名称并不是写死的,与后面模板和策略配置有关

温节点

温节点类型的数据节点处理不太常用的索引(比如前一天的日志数据),这种数据查询的实时性不算高,索引为只读索引,不会有写入操作,因此不需要SSD磁盘存储,降低存储成本。

代码语言:javascript
复制
#配置方法
vim  /etc/elasticsearch/elasticsearch.yml
 
#每个温节点加入如下配置并重启服务
node.attr.box_type: warm
node.attr.rack: rack1

冷节点

冷节点类型的数据适合作为归档使用,比温节点查询还要少(比如半月以上的归档日志),这种类型数据一般很少查询,并不会消耗CPU性能及IO,但是存储容量会很大,需要更低成本的存储,例如OSS或S3;ES可以使用经过fuse协议挂载的对象存储作为后端存储。

代码语言:javascript
复制
#配置方法
vim  /etc/elasticsearch/elasticsearch.yml
 
#每个温节点加入如下配置并重启服务
node.attr.box_type: cold
node.attr.rack: rack1

索引生命周期处理流程

索引生命周期策略可以触发以下操作

  • Rollover:当前索引达到特定大小、文档数量或周期时,创建一个新的写入索引。
  • Shrink:减少索引中主分片的数量。
  • force merge:触发强制合并以减少索引分片中的段数。
  • Freeze:冻结索引并使其只读。
  • delete:永久删除索引,包括其所有数据和元数据。

场景举例

例如日志数据输出到 Elasticsearch 集群中生成索引,可以定义一个策略,说明:

  • 当索引的主分片总大小达到 50GB 时,滚动到新索引。
  • warm阶段,将索引标记为只读,并将其缩小为单个分片。
  • 7 天后,将索引移至冷阶段并将其移至较便宜的硬件。
  • 达到所需的 30 天保留期后,删除索引。

索引生命周期实现步骤

  • 创建 ILM (Index Lifecycle Management)Policy
  • 创建 Index template
  • Logstash 写入数据并观察 ILM 的结果

创建 ILM policy

建议使用api创建,kibana 查看编辑。

api 创建

代码语言:javascript
复制
PUT _ilm/policy/bash_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
             "max_size": "50gb",
            "max_age": "30d",
            "max_docs": 5
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "delete": {
        "min_age": "5m",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

说明:热滚动更新和所属节点的冷热属性无关、即使索引模板使索引一开始分配到冷节点,但只要关联的生命周期配置了滚动更新,索引在达到触发条件时就会滚动更新。

Kibana 创建

索引生命周期管理

Rollover 滚动更新条件

索引删除阶段

ILM policy 说明

如果一个 index 的大小超过 50GB,那么自动 rollover

如果一个 index 日期已在30天前创建索引后,那么自动 rollover

如果一个 index 的文档数超过5,那么也会自动 rollover (文档数超过5仅测试使用)

在rollover后当一个 index 创建的时间超过5m,那么也自动删除(5分钟用于测试,可根据实际情况修改)

查看ILM策略

代码语言:javascript
复制
GET _ilm/policy/bash_policy

创建 Index template

api 创建

代码语言:javascript
复制
PUT _template/bash_template
{
  "index_patterns": ["bash-*"],                 
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1,
    "index.lifecycle.name": "bash_policy", 
    "index.routing.allocation.require.data": "hot",
    "index.lifecycle.rollover_alias": "bash"    
  }
}

模板参数介绍

PUT _template/bash_template

{

"index_patterns": ["bash-*"], #指定以 bash-* 开头的index遵循该模板规则

"settings": {

"number_of_shards": 2, #指定索引的分片

"number_of_replicas": 1, #指定索引的副本

"index.lifecycle.name": "bash_policy", #指定索引生命周期策略名称

"index.lifecycle.rollover_alias": "bash", #指定rollover别名(索引写入与读取时所用的名称)

"routing.allocation.require.box_type": "hot" #指定索引新建时所分配的节点(此项不指定会默认分配到所有节点,当没有指定节点属性时无需指定该参数)

}

}

kibana 创建模板

索引管理--索引模板--创建模板

保持默认即可

索引设置

代码语言:javascript
复制
{
  "lifecycle": {
    "name": "bash_policy",
    "parse_origination_date": "true",
    "rollover_alias": "bash"
  },
  "routing": {
    "allocation": {
      "require": {
        "data": "hot"
      }
    }
  },
  "refresh_interval": "1s",
  "number_of_shards": "2",
  "number_of_replicas" : "1"
}

保持默认即可

保持默认即可

完成索引模板创建

查看模板

代码语言:javascript
复制
GET _index_template/bash_template

ILM 检查时间

ILM 的检查时间默认的 10 分钟,修改成 10 秒。

代码语言:javascript
复制
PUT _cluster/settings
{
    "transient": {
      "indices.lifecycle.poll_interval": "10s"
    }
}

将 ILM 轮询间隔设置回其默认值,以防止主节点上出现不必要的负载。

代码语言:javascript
复制
PUT _cluster/settings
{
    "transient": {
      "indices.lifecycle.poll_interval": "null"
    }
}

logstash ilm 配置

代码语言:javascript
复制
output{
#stdout{codec => rubydebug}
  if "bash" in [tags]{
elasticsearch{
    ilm_enabled => true
    ilm_rollover_alias => "bash"
    ilm_pattern => "000001"
    ndex => "bash-%{+YYYY.MM.dd}"
    ilm_policy => "secure"
    #index => "secure-%{+YYYY.MM.dd}"
    hosts => ["192.168.10.33:9200"]
    user => "elastic"
    password => "password"
     }
   }
}

查看索引文档数

代码语言:javascript
复制
GET bash-000029/_count

查看索引

代码语言:javascript
复制
GET _cat/indices/bash-*

查看索引状态

索引完成自动 rollover,当前操作为complete ,三分钟后索引将会被删除!

正在写入索引,当前操作为rollover

查看索引ilm策略

通过下面的api用户可以查看当前索引调用的策略处于什么阶段

代码语言:javascript
复制
GET bash-000029/_ilm/explain

curl 操作

查看索引

代码语言:javascript
复制
 curl -u elastic:password -XGET http://ip:9200/_cat/indices

集群节点

代码语言:javascript
复制
curl -u elastic:password  http://ip:9200/_cat/nodes?v

集群健康状态

代码语言:javascript
复制
curl -u elastic:password  http://ip:9200/_cluster/health

删除指定索引

代码语言:javascript
复制
curl -u elastic:password -XDELETE  http://ip:9200/bash-000029

查看索引

代码语言:javascript
复制
curl -u elastic:password -XGET http://ip:9200/_cat/indices
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源搬运工宋师傅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档