0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Elasticsearch索引生命周期常见的阶段

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-10-13 10:38 次阅读

引入索引生命周期的作用

在 Elasticsearch的日常管理中,有很多如系统日志,行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长索引的数量也会持续增长,然而这些场景基本上只有最近一段时间的数据有使用价值或者会被经常使用(热数据),而历史数据几乎没有作用或者很少会被使用(冷数据),这个时候就需要对索引进行一定策略的维护管理甚至是删除清理,否则随着数据量越来越多除了浪费磁盘与内存空间之外,还会严重影响 Elasticsearch 的性能。

在 Elastic Stack 6.6 版本后推出了新功能 Index Lifecycle Management(索引生命周期管理),支持针对索引的全生命周期托管管理,并且在 Kibana 上也提供了一套UI界面来配置策略。

索引生命周期常见的阶段

hot: 索引还存在着大量的读写操作。

warm:索引不存在写操作,还有被查询的需要。

cold:数据不存在写操作,读操作也不多。

delete:索引不再需要,可以被安全删除。

注意:以上只是索引生命周期阶段的常见定义,具体策略可以根据实际业务情况来定义。

部署Elasticsearch集群

部署一个由2个hot节点,2个warm节点,2个cold节点组成的Elasticsearch集群,并且部署了Kibana和Cerebro方便调试和观察。docker-compose.yaml文件如下:

version:'2.2'
services:
cerebro:
image:lmenezes/cerebro:0.8.3
container_name:hwc_cerebro
ports:
-"9000:9000"
command:
--Dhosts.0.host=http://elasticsearch:9200
networks:
-hwc_es7net
kibana:
image:docker.elastic.co/kibana/kibana:7.1.0
container_name:hwc_kibana7
environment:
#-I18N_LOCALE=zh-CN
-XPACK_GRAPH_ENABLED=true
-TIMELION_ENABLED=true
-XPACK_MONITORING_COLLECTION_ENABLED="true"
ports:
-"5601:5601"
networks:
-hwc_es7net
elasticsearch:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_hot1
environment:
-cluster.name=cr7-hwc
-node.name=es7_hot1
-node.attr.box_type=hot
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_hot1:/usr/share/elasticsearch/data
ports:
-9200:9200
networks:
-hwc_es7net
elasticsearch2:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_warm1
environment:
-cluster.name=cr7-hwc
-node.name=es7_warm1
-node.attr.box_type=warm
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_warm1:/usr/share/elasticsearch/data
networks:
-hwc_es7net
elasticsearch3:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_cold1
environment:
-cluster.name=cr7-hwc
-node.name=es7_cold1
-node.attr.box_type=cold
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_cold1:/usr/share/elasticsearch/data
networks:
-hwc_es7net
elasticsearch4:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_hot2
environment:
-cluster.name=cr7-hwc
-node.name=es7_hot2
-node.attr.box_type=hot
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_hot2:/usr/share/elasticsearch/data
networks:
-hwc_es7net
elasticsearch5:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_warm2
environment:
-cluster.name=cr7-hwc
-node.name=es7_warm2
-node.attr.box_type=warm
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_warm2:/usr/share/elasticsearch/data
networks:
-hwc_es7net
elasticsearch6:
image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name:es7_cold2
environment:
-cluster.name=cr7-hwc
-node.name=es7_cold2
-node.attr.box_type=cold
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m-Xmx512m"
-discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
-cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2
ulimits:
memlock:
soft:-1
hard:-1
volumes:
-hwc_es7data_cold2:/usr/share/elasticsearch/data
networks:
-hwc_es7net

volumes:
hwc_es7data_hot1:
driver:local
hwc_es7data_warm1:
driver:local
hwc_es7data_cold1:
driver:local
hwc_es7data_hot2:
driver:local
hwc_es7data_warm2:
driver:local
hwc_es7data_cold2:
driver:local

networks:
hwc_es7net:
driver:bridge

执行docker-compose up -d命令即可启动Elasticsearch集群。(前提安装好docker和docker-compose)

修改IML刷新时间

将ILM刷新时间设定为1秒,便于实验演示(默认为10分钟):

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

设置Index Lifecycle Policies

设置hot/warm/cold和delete四个阶段:

hot:超过5个文档以后rollover。

warm:20s后进入warm阶段,将索引设置为只读。

cold:40s后进入warm阶段,将副本分别从1缩小为0。

delete:60s后进入delete阶段,删除索引。

PUT/_ilm/policy/log_ilm_policy
{
"policy":{
"phases":{
"hot":{
"actions":{
"rollover":{
"max_docs":5
}
}
},
"warm":{
"min_age":"20s",
"actions":{
"allocate":{
"include":{
"box_type":"warm"
}
},
"readonly":{}
}
},
"cold":{
"min_age":"40s",
"actions":{
"allocate":{
"include":{
"box_type":"cold"
},
"number_of_replicas":0
}
}
},
"delete":{
"min_age":"60s",
"actions":{
"delete":{}
}
}
}
}
}

创建第一个索引

将索引分配到hot节点,并且调用之前设置的IML策略log_ilm_policy,设置rollover的别名为ilm_alias,设置主分片为1,副本分片为1。设置"is_write_index": true在rollover的时候,alias会包含所有rollover文档。

PUTilm_index-000001
{
"settings":{
"number_of_shards":1,
"number_of_replicas":1,
"index.lifecycle.name":"log_ilm_policy",
"index.lifecycle.rollover_alias":"ilm_alias",
"index.routing.allocation.include.box_type":"hot"
},
"aliases":{
"ilm_alias":{
"is_write_index":true
}
}
}

创建文档

连续执行5次POST,创建5个文档。

POSTilm_alias/_doc
{
"name":"cr7",
"age":15
}

观察

刚开始可以看到总共有5个doc。5a6d60f8-4a37-11ed-a3b6-dac502259ad0.png

当达索引iml_index-000001到5个doc时,做了rollover操作,新建了新的索引iml_index-000002。

5a7c987a-4a37-11ed-a3b6-dac502259ad0.png

等待20s后,将索引iml_index-000001移动到warm节点。

5a88fbb0-4a37-11ed-a3b6-dac502259ad0.png

等待40s后,将索引iml_index-000001移动到cold节点,并且将副本数从1缩小为0。

5a977afa-4a37-11ed-a3b6-dac502259ad0.png

等待60s后,索引iml_index-000001被删除。

5aa446ae-4a37-11ed-a3b6-dac502259ad0.png

由于在warm阶段设置了readonly,在warm和cold阶段如果尝试往iml_index-000001写入或修改数据,将会收到以下报错:

{
"error":{
"root_cause":[
{
"type":"cluster_block_exception",
"reason":"blockedby:[FORBIDDEN/8/indexwrite(api)];"
}
],
"type":"cluster_block_exception",
"reason":"blockedby:[FORBIDDEN/8/indexwrite(api)];"
},
"status":403
}

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6867

    浏览量

    88800
  • ui界面
    +关注

    关注

    0

    文章

    11

    浏览量

    1569
  • Elasticsearch
    +关注

    关注

    0

    文章

    27

    浏览量

    2820

原文标题:Elasticsearch 索引生命周期管理

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于Rust语言中的生命周期

    Rust是一门系统级编程语言具备高效、安和并发等特,而生命周期是这门语言中比较重要的概念之一。在这篇教程中,我们会了解什么是命周期、为什么需要生命周期、如何使用生命周期,同时我们依然会
    的头像 发表于 09-19 17:03 866次阅读

    Traveo II B-H中的SECURE和SECURE_WITH_DEBUG生命周期阶段有何不同?

    Traveo II B-H 中的 SECURE 和 SECURE_WITH_DEBUG 生命周期阶段有何不同?
    发表于 05-21 07:07

    AutoScaling 生命周期挂钩功能

    摘要: AutoScaling 伸缩组实例管理功能全面升级,新上线生命周期挂钩(LifecycleHook)功能,方便用户更加灵活地管理伸缩组内实例。使用生命周期挂钩可以在伸缩组发生伸缩活动时将伸缩
    发表于 06-27 17:13

    在S32G2 RM中有“生命周期”,生命周期的完整含义是什么?

    在S32G2 RM中,有“生命周期”。生命周期的完整含义是什么,我们应该如何使用它?
    发表于 04-23 10:37

    贯穿于全生命周期的功能安全

    简要介绍了功能安全在SIS 全安全生命周期的主要活动,叙述了全生命周期的功能安全管理。简要阐述了贯穿于整体安全生命周期的功能安全进行的主要阶段,同时提出了在设计SIS
    发表于 12-19 15:50 15次下载

    贯穿于全生命周期的功能安全

    简要介绍了功能安全在SIS 全安全生命周期的主要活动,叙述了全生命周期的功能安全管理。简要阐述了贯穿于整体安全生命周期的功能安全进行的主要阶段,同时提出了在设计SIS 时
    发表于 01-06 17:11 6次下载

    一文读懂Android Activity生命周期

    正常情况下Activity的生命周期: Activity的生命周期大概可以归为三部分 整个的生命周期:onCreate()可以设置所有的“全局”状态, onDestory()可以释放所有的资源 可见
    发表于 05-30 01:03 1566次阅读

    基于延长WSN生命周期的LEACH算法的改进

    基于延长WSN生命周期的LEACH算法的改进(开关电源技术与设计pdf百度云)-基于延长WSN生命周期的LEACH算法的改进                    
    发表于 09-15 11:17 14次下载
    基于延长WSN<b class='flag-5'>生命周期</b>的LEACH算法的改进

    了解产品制造生命周期中的安全风险问题

    列的 第一篇文章 所解释的,IC 生命周期的最后两个阶段,即电路板组装和电路板测试,由原始设备制造商 (OEM) 拥有和控制。 点击查看完整大小的图片 图 1:OEM 负责确保 IC 生命周期的最后
    的头像 发表于 07-13 18:03 2514次阅读
    了解产品制造<b class='flag-5'>生命周期</b>中的安全风险问题

    深入分析芯片生命周期管理平台

    (SLM)平台,通过收集芯片上各个阶段的有用数据,并在其整个生命周期中对这些数据进行智能化分析,优化芯片生命周期中每个阶段
    的头像 发表于 08-02 10:43 2194次阅读

    Vue入门Vue的生命周期

    .生命周期 4.1生命周期是什么 Vue的生命周期, 就是Vue实例从创建到销毁的过程.
    的头像 发表于 02-06 16:16 840次阅读
    Vue入门Vue的<b class='flag-5'>生命周期</b>

    编译器的标准生命周期

    编译器的标准生命周期
    发表于 03-14 19:06 0次下载
    编译器的标准<b class='flag-5'>生命周期</b>

    编译器的标准生命周期

    编译器的标准生命周期
    发表于 07-05 19:32 0次下载
    编译器的标准<b class='flag-5'>生命周期</b>

    鸿蒙开发:【PageAbility的生命周期

    PageAbility生命周期是PageAbility被调度到INACTIVE、ACTIVE、BACKGROUND等各个状态的统称。PageAbility生命周期流转及状态说明见如下图1、表1所示。
    的头像 发表于 06-17 10:05 661次阅读
    鸿蒙开发:【PageAbility的<b class='flag-5'>生命周期</b>】

    鸿蒙开发组件:DataAbility的生命周期

    应用开发者可以根据业务场景实现data.js/data.ets中的生命周期相关接口。DataAbility生命周期接口说明见下表。
    的头像 发表于 06-20 09:39 391次阅读