概述
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方面的内容,感兴趣的朋友可以关注下~
本文暂时没有评论,来添加一个吧(●'◡'●)