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

2021-08-23 16:46:35 浏览数 (1)

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

0 人点赞