编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

从一个rollover实例来看ES索引的生命周期管理

wxchong 2024-07-26 22:38:46 开源技术 13 ℃ 0 评论

概述

ES最早在6.8版本在X-pack套件中引入了索引生命周期管理功能。x-pack的索引生命周期管理(ILM)模块具有支持功能全面(支持索引的创建,关闭,删除,更新配置,aliased-rotate等功能)在不需要其他工具支持下具备定时任务,高可用和跨集群管理等能力,并且支持全部ES版本的索引。

今天主要从一个实例来看ES索引的生命周期管理。

官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/ilm-configure-rollover.html


一、问题现象

最近在部署一套新的EFK环境时发现日志滚动很慢,而之前的那套环境却不存在该问题,以下设置ILM开始调试。

1、设置ILM(索引生命周期策略)调试


2、发现新部署的EFK环境rollover特别慢(忘记截图了..)

设置之后等了5分钟都一直没有新的滚动日志出现,且新出现的日志长时间处于unfollow状态。

在另外一个环境不存在这些情况。


3、日志如下:

以下是配置生命周期策略后滚动过程中的日志:

[2020-05-16T16:22:00,217][INFO ][o.e.c.m.MetaDataDeleteIndexService] [es_node] [fsl_uat.cas-2020.05.16-000002/ky3mk-N9ShSoZQ8zeru4Rg] deleting index
[2020-05-16T16:22:04,025][INFO ][o.e.c.m.MetaDataIndexTemplateService] [es_node] removing template [fsl_uat.cas]
[2020-05-16T16:22:43,427][INFO ][o.e.c.m.MetaDataIndexTemplateService] [es_node] adding template [fsl_uat.cas] for index patterns [fsl_uat.cas-*]
[2020-05-16T16:22:43,557][INFO ][o.e.c.m.MetaDataCreateIndexService] [es_node] [fsl_uat.cas-2020.05.16-000001] creating index, cause [api], templates [fsl_uat.cas], shards [1]/[1], mappings [_doc]
[2020-05-16T16:22:43,703][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
   from [null] to [{"phase":"new","action":"complete","name":"complete"}] in policy [filebeat]
[2020-05-16T16:22:43,794][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
   from [{"phase":"new","action":"complete","name":"complete"}] to [{"phase":"hot","action":"unfollow","name":"wait-for-indexing-complete"}] in policy [filebeat]
[2020-05-16T16:22:43,834][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
  from [{"phase":"hot","action":"unfollow","name":"wait-for-indexing-complete"}] to [{"phase":"hot","action":"unfollow","name":"wait-for-follow-shard-tasks"}] in policy [filebeat]
 =================================================================================================
[2020-05-16T16:31:24,632][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
 from [{"phase":"hot","action":"unfollow","name":"wait-for-follow-shard-tasks"}] to [{"phase":"hot","action":"unfollow","name":"pause-follower-index"}] in policy [filebeat]
[2020-05-16T16:31:24,703][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
 from [{"phase":"hot","action":"unfollow","name":"pause-follower-index"}] to [{"phase":"hot","action":"unfollow","name":"close-follower-index"}] in policy [filebeat]
[2020-05-16T16:31:24,761][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
 from [{"phase":"hot","action":"unfollow","name":"close-follower-index"}] to [{"phase":"hot","action":"unfollow","name":"unfollow-follower-index"}] in policy [filebeat]
[2020-05-16T16:31:24,813][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
from [{"phase":"hot","action":"unfollow","name":"unfollow-follower-index"}] to [{"phase":"hot","action":"unfollow","name":"open-follower-index"}] in policy [filebeat]
[2020-05-16T16:31:24,865][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
 from [{"phase":"hot","action":"unfollow","name":"open-follower-index"}] to [{"phase":"hot","action":"unfollow","name":"wait-for-yellow-step"}] in policy [filebeat]
[2020-05-16T16:31:24,913][INFO ][o.e.x.i.IndexLifecycleTransition] [es_node] moving index [fsl_uat.cas-2020.05.16-000001] 
 from [{"phase":"hot","action":"unfollow","name":"wait-for-yellow-step"}] to [{"phase":"hot","action":"rollover","name":"check-rollover-ready"}] in policy [filebeat]

可以看出在做wait-for-follow-shard-tasks过程很慢,大概需消耗9分钟,而另外一个环境是秒切换。



那么,这个是什么原因导致呢?实际上这里就是因为poll_interval这个参数影响了~具体看后面内容介绍

4、解决对策:配置poll_interval

因为之前是没有设置poll_interval参数的,这里配置poll_interval时间后解决,具体配置如下:

PUT /_cluster/settings
{
  "persistent" : {
    "indices" : {
      "lifecycle" : {
        "poll_interval" : "5s"
      }
    }
  },
  "transient" : { }
}



调整之后查看日志基本都是秒切,且瞬间产生很多滚动日志。


二、ILM日常管理

1、制定ILM规则

用户可以使用Kibana的图形界面,或者使用ES的ILM API定义多套规则。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "25GB" 
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {} 
        }
      }
    }
  }
}

这里使用了PUTAPI定义了一条ILM规则,这个规则中定义了2个阶段:hot和delete:

1)在hot阶段,会在索引大小达到25GB时对索引做rollover操作。

2)当索引的存在时间达到30天时,索引进入delete阶段,在此阶段,索引会被删除。

当然也可以在kibana的图形界面操作:


页面打开方式为:管理→索引生命周期策略,创建策略,


2、ILM规则绑定索引模板

PUT _template/my_template
{
  "index_patterns": ["test-*"], 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "my_policy", 
    "index.lifecycle.allocation.require.box_type": "hot",
    "index.lifecycle.rollover_alias": "test-alias"
  }
}

说明:

1)该模板适用于所有前缀为"test-"的索引。

2)使用index.lifecycle.name设置规则名称为"my_policy"。

3)设置该索引需要分配在拥有box_type为hot的节点上。

4)使用index.lifecycle.rollover_alias设置进行rollover的索引别名为"test-alias"。

当然也可以在kibana的图形界面操作:


3、创建索引开始生命周期管理

3.1、API创建

PUT test-000001
{
  "aliases": {
    "test-alias":{
      "is_write_index": true 
    }
  }

在创建这个索引时,这里将这个索引的alias设成了"test-alias",并将其写入属性"is_write_index"置为true。

3.2、filebeat中创建索引

在ES7的版本,默认情况下,filebeat自动适配es索引管理策略,自动创建的索引策略名称为filebeat,生成的日志索引名称为:filebeat-当前版本号。可以在filebeat.yml中通过如下属性,自定义索引名称前缀,并以当前日期作为尾缀。注意,ES中使用UTC时间,所以这里需要附带时区参数。

setup.ilm.rollover_alias: "fsl_sit.portal"
setup.ilm.pattern: "{now/d{yyyy.MM.dd|+08:00}}-000001"



三、ILM的四个阶段

ES在6.6之后,在x-pack中推出了索引生命周期管理相关的API来简化与增强类似日志数据索引的管理。该方案基于时间将索引数据分为四个阶段:Hot、Warm、Cold、Delete,对于这四种并给不同的数据阶段,ES也给出了不同的数据处理方式,最终实现日志的生命周期管理。


ILM拥有4个阶段:

1)Hot:索引写入和查询阶段。

2)Warm:索引不再被写入,但是会被查询阶段。

3)Cold:索引不再被写入,并且查询量也很少的阶段。

4)Delete:索引生命周期的完结,可以被从磁盘删除。

其中,Hot阶段是设置ILM规则必备的,而其他几个阶段属于可选。在规则的设置中,每个阶段都有一个"min_age"来控制每个阶段的进入时间点,如果不做设置,这个值默认为0ms。

1、检测周期

ILM规则检测周期由集群的配置indices.lifecycle.poll_interval进行设置,默认值是10分钟。设置方法:

PUT _cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval":"10s"
  }
}

这里将检测周期设置成了10秒钟。前面所提的一个例子实际上就是因为这个参数影响了。



四、ILM的四个操作

ILM在这四个阶段提供了一些操作,来完成索引生命阶段的重要行为。

rollover:在hot阶段防止单个索引体积过大,文档数量过高,或者写入事件过长。

allocate:在warm或者cold阶段,将索引转移到cold节点上,并更改其备份数。

shrink: 在warm阶段对分片进行合并,减少体积。

delete:在delete阶段,即索引的生命终点将其删除。


1、rollover

You control when the rollover action is triggered by specifying one or more rollover criteria:

  • Maximum size (the combined size of all primary shards in the index)--索引的最大容量
  • Maximum document count --索引中包含的最大文档数
  • Maximum age --索引存在时间

配置Rollover 操作时,需要设置上面三个参数中的一个或多个。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover" : {
            "max_age": "7d",
            "max_size": "100GB"
          }
        }
      }
    }
  }
}


2、allocate

allocate操作允许ILM在索引进入Warm或者Cold阶段时,指定其节点以及备份个数。

number_of_replicas: 指定索引备份个数。

require: 分配的节点必须包含的属性标签。

exclude: 分配的节点不能拥有的属性标签。

include: 分配的节点需要拥有include指定的属性标签之一。

这4个属性必须指定一个,否则规则设置会失败。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "allocate" : {
            "number_of_replicas": 1,
            "require" : {
              "box_type": "cold"
            }
        }
        }
      }
    }
  }
}

上述操作,将索引的备份数设为1,并且将其分配到cold节点上。


3、Shrink

Shrink操作能够减少索引的分片数,与索引操作的同名操作一样,源索引的分片数需要是目标索引的分片数的整数倍,比如说,在Hot阶段,索引有6个分片,那么在Warm阶段,只能指定将其缩减为3,2或者1个分片。同时,目标节点需要拥有足够的磁盘空间。缩减后的索引的单个分片要满足单个索引分片数的文档数限制。

number_of_shards:指定分片数,该属性必须被设置。

在该操作被运行时,该索引会被设为read-only。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "shrink" : {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}


4、Delete

在索引生命的终点将其删除,只能在Delete阶段被执行。该操作没有额外的参数。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "delete": {
        "actions": {
          "delete" : { }
        }
      }
    }
  }
}



五、启动/关闭/检查ILM的状态

1、检查状态

ILM会拥有三个状态:running,stopping,stopped。

其中stopping表明ILM已经接收到了停止的指令,但还有一些请求未执行完成。

 GET _ilm/status

2、关闭ILM的API

 POST _ilm/stop

3、启动ILM的API

 POST _ilm/start



觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表