索引生命周期管理ILM看完不懂你锤我

2022-11-24  本文已影响0人  醉鱼java

阅读完本文你可以学到什么是索引生命周期管理,各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略,下面就跟我一起来吧

基础理论篇

索引生命周期管理(ILM)是一种可以让我们随着时间推移自动化的管理索引的一种方式。我们可以根据性能,索引文档数量、大小等弹性要求,文档的保留需求等方面来自定义索引生命周期管理策略,我们可以使用ILM实现如下需求

在ILM策略期间可以触发的操作有:Set Priority,Unfollow,Rollover,Read-only,Shrink,Force merge,Searchable snapshot,Allocate,Migrate,Wait for snapshot,Delete

下面是每个操作具体的含义

ILM可以很轻松的管理索引的各个阶段,常见的就是处理日志类型或者度量值等时间序列的数据

需要注意的是,ILM要生效的前提是集群中所有的节点都必须是使用相同的版本。虽说可以在混合版本汇中创建或者应用ILM,但是不能保证ILM按照预期的策略执行

下面我们就详细说一下索引生命周期的几个阶段

在上面的这几个阶段中,每个阶段的执行操作是不同的以及从一个阶段转到另一个阶段的时间也是不固定的

操作 Hot Warm Cold Frozen Delete
Set Priority
Unfollow
Rollover
Read-only
Shrink
Force merge
Searchable snapshot
Allocate
Migrate
Wait for snapshot
Delete

通过上面的学习我们知道了ILM相关的基本概念,下面我们进入实操环节,首先ILM策略的使用可以直接绑定索引,也可以在索引模版创建时绑定使用,下面跟我一起来操作起来吧

环境信息

Docker 部署,yml文件中具体映射文件地址自行修改,可以替换D:\zuiyuftp\docker\es8.1\为自己本地文件路径

需要注意的是,ES三个节点指定不同的自定义属性

// eshot节点
node.attr.node_type=hot
// eswarm节点
node.attr.node_type=warm
// escold节点
node.attr.node_type=cold

windows docker启动中如遇到vm最大限制错误可使用如下命令修改

1、打开终端
wsl -d desktop
sysctl -w vm.max_map_count=262144
exit

ILM验证

如果索引具有未分配的碎片,并且集群运行状况为黄色,则该索引仍然可以根据其索引生命周期管理策略过渡到下一阶段。然而,由于Elasticsearch只能在绿色集群上执行某些清理任务,因此可能会产生意想不到的副作用。

创建索引生命周期策略

到此、一个完整的索引生命周期策略就创建完成了,以上我们只是做测试,具体数值使用中还是要根据实际场景设置,上面演示了一个完整的索引生命周期,下面是使用语句创建,也就是上面我们图形化创建的东西使用API创建

创建索引模版

指定分片数量为3,副本分片为0,生命周期策略为zuiyu_policyrollover操作时别名为zuiyu-index,索引分配策略为 "node_type":"hot",匹配索引模式为zuiyu-开头的索引名

PUT _index_template/zuiyu_template
{
  "index_patterns": ["zuiyu-*"],
  "template":{
     "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 0,
      "index.lifecycle.name": "zuiyu_policy",    
      "index.lifecycle.rollover_alias": "zuiyu-index" , 
      "index.routing.allocation.require.node_type":"hot"
    }
  }
}

创建测试索引

分片数量3,索引别名zuiyu-index

PUT zuiyu-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "aliases": {
    "zuiyu-index": {}
  }
}

查看分片分布可以看到,所有的分片都按照分配策略分不到了hot节点上,访问cerebro可看到如下(http://host:9000)

插入测试文档

连续执行多次,大于10次即可

POST zuiyu-index/_doc
{
  "id":"zuiyu index",
  "content":"ilm alias insert content"
}

查看文档数量

GET zuiyu-index/_count
// 返回结果如下
{
  "count" : 21,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  }
}

我在上面插入了21条数据,按照刚才我们定义的ILM,在文档数量大于10个的时候会发生rollover操作,滚动生成一个新的索引(具体索引名规则、不生效约束查看前文rollover小节)

验证ILM策略

ILM策略刷新的时间默认是10分钟(并不是固定10分钟,哪怕我们设置为10分钟也可能20分钟才能执行,甚至可能赶巧的话马上就执行也说不准),我们可以通过如下API进行修改为10s测试,也可以等待ILM自动执行

官网的说明如下

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/ilm-index-lifecycle.html

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

按照上面ILM策略执行的话,我们当时定义的是一天之后删除,也就是24小时之后,移动到cold节点上的索引就会被删除,这个大家可以自行验证一下,这边就不演示了,不过我本地是测试成功过的

我们还可以通过创建索引时直接绑定索引生命周期策略,API如下,测试就不测试了,感兴趣的自己下面测试下吧

注意测试时别与上面的索引模版冲突覆盖了哦

PUT zy-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0,
    "index.lifecycle.name": "zuiyu_policy",
     "index.lifecycle.rollover_alias": "zy-index" , 
    "index.routing.allocation.require.node_type":"hot"
  },
  "aliases": {
    "zy-index": {}
  }
}

上面我们测试了通过索引模版创建索引,并且应用索引生命周期策略,下面来测试一下数据流索引,与索引模版的类似,首先还是创建一个数据流模版

创建数据流模版

该模版会匹配zyds-开头的,匹配为数据流索引,创建的分片数量为3,应用刚才我们创建的ILM策略,路由分片到hot节点

PUT _index_template/zyds_template
{
  "index_patterns": ["zyds-*"],
  "data_stream": {},
  "priority": 200,
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas":0,
      "index.lifecycle.name": "zuiyu_policy",
      "index.routing.allocation.require.node_type": "hot"
    }
  }
}

创建数据流索引

PUT _data_stream/zyds-stream

查看生成的数据流索引

此时我们在cerebro页面输入zyds进行过滤,并且勾选special,可以看到生成的数据流也是在hot节点上

验证数据流ILM策略

后面就不演示了,相信大家也看到了,本篇文章耗时巨长了,感觉写的还不错的可以点赞分享哦

总结

通过上面的学习我们学会了ILM期间的各种操作,并且实操了索引模版,数据流模版使用索引生命周期策略的例子,相信大家看完本篇文章也有一定的收获,毕竟我可以非常自信的说的是,看完本篇文章,你可能不会很精通ILM,但是ILM入门你绝对可以

参考链接

ILM:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-lifecycle-management.html

上一篇 下一篇

猜你喜欢

热点阅读