Elastic:warm,cold,delete节点中min_age设置的是增量还是累计值

举报
wu@55555 发表于 2022/11/17 22:03:20 2022/11/17
【摘要】 0. 引用做了一些关于ILM的试验,特记录以供参考 1. 题目说明一下,关于考题版本第一个版本是中文的见下述版本一,第二个版本是英文的见下述版本二,实际的考题是版本二,但不妨由版本一引入,大家可以更加深刻的理解ILM版本一:给出了一条数据,把这条数据插入数据流mylogds.prod,要求使得这条数据再开始5分钟在datahot节点,然后立即滚动到datawarm节点,datawarm节点...

0. 引用

做了一些关于ILM的试验,特记录以供参考

1. 题目

说明一下,关于考题版本第一个版本是中文的见下述版本一,第二个版本是英文的见下述版本二,实际的考题是版本二,但不妨由版本一引入,大家可以更加深刻的理解ILM

版本一:

给出了一条数据,把这条数据插入数据流mylogds.prod,要求使得这条数据再开始5分钟在datahot节点,然后立即滚动到datawarm节点,datawarm节点存在3分钟以后,滚动到datacold节点,在datacold节点保持6分钟删除。匹配模板名称task1 匹配所有mylogds.*

为了方便测试我们把要求改成秒

版本二:

Define a new data stream on `cluster1` that satisfies the following requirements:

* the index pattern for the data stream is `mylogs-*-*`
* the corresponding index template is named `task1`
* the data is assigned to data_hot nodes for the first 5 minutes, then the data rolls over immediately to data_warm nodes
* the data is on data_warm nodes for 3 minutes, then moves to data_cold nodes
* 6 minutes after rolling over, the data is deleted

After your data stream is defined, index the following document into `cluster1`:

为了方便测试我们把要求改成秒

2. 环境准备

1、准备1个集群,三个节点,
2、分别设置自定义属性hot_warm_cold为data_hot,data_warm,data_cold
3、并且设置生命周期检测时间为1s

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

4、开启分片分配感知

# 开启分片分配感知
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.awareness.attributes": "hot_warm_cold"
  }
}

3 解题思路

这道题的重点在于设置ILM策略上,应该怎么设置呢?

我们把题目拆解:
1、数据在开始5分钟在data_hot节点,然后立即滚动到data_warm节点
2、data_warm节点存在3分钟以后,滚动到data_cold节点
3、在data_cold节点保持6分钟删除

很明确,我们要设置5,3,6这三个值,hot转到warm可以在那里设置呢,首先在warm节点上就可以设置min_age,其次我们要理解一点,那就每个节点上的min_age是增量值还是累加值?这是什么意思?换句话说:我们是要在节点上设置5,3,6还是5,8,14?答案是累加值,所以我们应该要设置5,8,14,这点大家可以尝试验证一下。

因为设置的为累加值,所以也就说明了一点,warm,cold,delete节点上的min_age是递增的,因此设置的时候也不能设置的后续的节点min_age比前面的少。

4. 测试第一种设置 5 8 14

4.1 创建ILM策略

第一种设置方案如下:
在这里插入图片描述
api形式

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "5s",
        "actions": {
          "set_priority": {
            "priority": 50
          },
          "allocate": {
            "require": {
              "hot_warm_cold": "data_warm"
            }
          }
        }
      },
      "cold": {
        "min_age": "8s",
        "actions": {
          "set_priority": {
            "priority": 0
          },
          "allocate": {
            "require": {
              "hot_warm_cold": "data_cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "14s",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}

4.2 创建组件模版、索引模版

注意这里声明索引刚开始所在的服务器节点用的require,而不是include,使用include会导致索引不流转
“index.routing.allocation.require.hot_warm_cold”: “data_hot”

如果使用的是data_hot,data_warm,data_cold角色来配置ILM,则不用再执行上述语句,这是因为角色配置了data_hot角色,相当于集群已经知道哪个节点是hot节点了。使用自定义属性时,之所以要指定一下,是因为属性是你自定义的,集群还不知道哪个属性表示的是hot节点

如何使用data_hot,data_warm配置ILM可以查看我另一篇博客:data_hot,data_warm,data_cold角色有什么用

# 创建组件模版、索引模版
PUT _component_template/my-settings
{
  "template": {
    "settings": {
      "index.lifecycle.name": "my_policy",
      "index.routing.allocation.require.hot_warm_cold": "data_hot",
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}

PUT _index_template/task1
{
  "index_patterns": ["mylogds*.*"],
  "composed_of": [ "my-settings"],
  "data_stream": { }
}

4.3 创建数据流

 POST mylogds.prod/_doc
{
  "message": "1",
  "@timestamp": "2021-01-01T00:00:00"
}

4.4 观察节点变化

这里可以使用head插件观察节点变化,或者直接使用下列指令观察

GET _cat/shards?v

结果如下:
1s时:
在这里插入图片描述
6s时:
在这里插入图片描述
9s时:
在这里插入图片描述
15s时:
在这里插入图片描述

4.5 结果分析

如上述所示数据流的第一条索引创建的前5s在node1中,之后转到node2,然后转到node3,最后被删除

那么题目的所要求的设置就达到了。所以此题的答案是5 8 14

4.6 引申问题

在开始后续的讲解前,我们来提出两个问题:
1、在索引删除之后,也就是14s之后,插入新数据,会创建新索引吗?
2、在索引未删除之前,也就是索引创建14s之前插入新数据,那么会创建新索引吗?

先看第一个问题,14s之后查询数据流,会发现,数据流和索引都被删除了,也就是说当数据流中没有索引后数据流本身也被删除了,那么再插入新数据时,就会创建新数据流新索引

再看第二个问题,14s之前索引是存在的,但是我们这里是没有配置rollover的,所以本身是不会触发滚动创建新索引的,那么当我们的索引移动到warm、cold节点时,我们插入的新数据会放到哪里,这里其实大家试验一下就会发现,新数据会插入到原索引中,也就是说原索引的doc数会变成2。
在这里插入图片描述

通过上述两个问题,大家感受到ILM和rollover的关系了吗?创建索引是有谁来触发的?

上述这题设置是比较简单的,他并没有涉及到我们实际生产中更加常用的设置,那就是结合上rollover,所以接下来,我们新加一个要求:

索引数据在hot保留5分钟(测试时用秒),然后立即滚动到warm节点,并且创建新增索引用于盛装后续的数据

5. 滚动并创建索引

5.1 思路

分析题目要求:要求在索引在由hot滚动到warm的时候创建新索引,该怎么做呢?不要忘记我们还有rollover,rollover在滚动时是会创建索引的,所以我们要在ILM里面开启rollover并且设置滚动条件

那么问题来了,滚动条件设置什么呢?我们先来看滚动条件有哪些:
1、主分片容量
2、滚动时间
3、文档数量
4、索引容量
在这里插入图片描述
题目中没有要求使用容量和文档数来滚动,那么我们只能从过期时间入手,过期时间设置多少呢?

我们回想一下题目要求:前5分钟在hot节点,之后3分钟在warm,最后6分钟在cold,然后删除

那么假设先设置过期时间为5分钟,也就是说前5分钟在hot,滚动之后就转移到warm节点,但是warm节点上有个min_age,我们应该设置多少呢?

思考一个问题:在min_age大于0的情况下,触发rollover后是马上转移到warm节点吗?还是说要等到warm节点的min_age达到才会转移到warm?

这里大家实际操作就知道了,我这里直接说明答案:是在rollover触发并且达到min_age后才会转移到后续的节点。

也就是说因为rollover已经占用了5min,那么warm的min_age就只能设置0,那么转移到cold同样也是触发rollover后min_age分钟才执行,为了实现要在warm待3分钟,我们需要设置cold的min_age为3,同样为了满足要在cold待6分钟,那么delete的min_age为3+6=9分钟。最后我们的设置就是5,0,3,9

接下来我们测试一下:
在这里插入图片描述

5.2 测试结果

在这里插入图片描述
6s时:
在这里插入图片描述
9s时:
在这里插入图片描述
15s时:
在这里插入图片描述

5.3 结果分析

由上述的结果可以看到,索引001在5s后滚动到了warm节点,并且创建了新的索引,8s后转移到了cold,再过了6s后被删除了。同时新增索引也跟着流转起来了。

这就是ILM结合rollover的使用,实际生产中会将rollover的过期时间设置得更大,也会添加上最大容量的设置结合使用。

最后提出一个问题供大家深入思考:
上述题目中,rollover的max_age只能设置为5吗,能够设置为1,2,3,如果设置为1时warm,cold,delete上的min_age设置为多少?
【欢迎大家在下方留言探讨】

6. 版本二考题解析

Define a new data stream on `cluster1` that satisfies the following requirements:

* the index pattern for the data stream is `mylogs-*-*`
* the corresponding index template is named `task1`
* the data is assigned to data_hot nodes for the first 5 minutes, then the data rolls over immediately to data_warm nodes
* the data is on data_warm nodes for 3 minutes, then moves to data_cold nodes
* 6 minutes after rolling over, the data is deleted

After your data stream is defined, index the following document into `cluster1`:

版本二中明确要求5分钟后rollover到warm节点,所以不用怀疑,需要使用rollover,然后说明了在warm节点待3min,之后转移到cold节点,之后一句话是重点:在rollover6分钟之后,这个数据被删除,这句话说明了一件事,rollover发生后的6分钟就进入了delete,所以实际上在cold节点待了3min。

结合以上分析,可以得到,我们需要在rollover的max_age设置5min,然后warm节点中因为是立即转移的,所以min_age是0min。要在warm节点待3min的话,就需要在cold节点设置min_age为3min。最后rollover6min后被删除,需要在delete节点设置min_age为6min。所以最终的答案是5 0 3 6

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。