ES数据冷热分层

简介: ES数据冷热分层

前言


数据的价值是有实效性的,一般实时性越高的信息,参考价值越大。

所以数据在对外提供服务的时候,也不是等价的,比如最近3个月的交易记录,用户会查询的比较频繁,那么应该存放在读写性能比较好的节点上。而3年前的交易记录,可以存放在读写性能一般的节点上。


ES中的索引生命周期管理ILM机制可以帮助我们轻松实现数据的冷热分层。


一、创建生命周期管理策略


说明:创建名为my-lifecycle-policy的索引生命周期策略。

该策略定义了索引生命周期的5个阶段,hot->warm->cold->frozen->delete。

(注意并不是所有的策略都要包含这5个阶段,这里主要是为了介绍数据冷热分层。)


hot阶段:


min_age属性没有配置,默认值为0ms,也就是数据添加后立刻进去hot阶段。

actions配置索引数据进入hot阶段触发的行为

rollover配置索引滚动的条件,主分片体积达到50gb触发索引滚动。

warm阶段:


min_age属性值为30d,表示当发送滚动30天后,索引数据进入warm阶段。

actions配置索引数据进入hot阶段触发的行为

shrink 压缩分片数量

forcemerge 合并段segments数量

cold阶段:


min_age属性值为60d,表示当索引数据进入warm阶段后60天会进入cold阶段。

actions配置索引数据进入hot阶段触发的行为

searchable_snapshot 生成可搜索快照

frozen阶段:


min_age属性值为90d,表示当索引数据进入cold阶段后90天后会进入frozen阶段。

actions配置索引数据进入hot阶段触发的行为

searchable_snapshot 生成可搜索快照

delete阶段:


min_age属性值为735d,表示当索引数据进入frozen阶段后735天后会进入delete阶段。

actions配置索引数据进入hot阶段触发的行为

delete 删除索引

PUT _ilm/policy/my-lifecycle-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50gb"
          }
        }
      },
      "warm": {
        "min_age": "30d",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      },
      "cold": {
        "min_age": "60d",
        "actions": {
          "searchable_snapshot": {
            "snapshot_repository": "found-snapshots"
          }
        }
      },
      "frozen": {
        "min_age": "90d",
        "actions": {
          "searchable_snapshot": {
            "snapshot_repository": "found-snapshots"
          }
        }
      },
      "delete": {
        "min_age": "735d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}


二、创建内容模板


1、创建mappings内容模板

主要是为了声明索引中的字段名和数据类型,如果是为数据流声明的内容模板,则必须含有@timestamp字段。

PUT _component_template/my-mappings
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date",
          "format": "date_optional_time||epoch_millis"
        },
        "message": {
          "type": "wildcard"
        }
      }
    }
  },
  "_meta": {
    "description": "Mappings for @timestamp and message fields",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}


2、创建settings内容模板

说明:

核心是在settings中指定索引生命周期名称index.lifecycle.name。

PUT _component_template/my-settings
{
  "template": {
    "settings": {
      "index.lifecycle.name": "my-lifecycle-policy"
    }
  },
  "_meta": {
    "description": "Settings for ILM",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}


三、创建索引模板


通过内容模板创建索引模板。

PUT _index_template/my-index-template
{
  "index_patterns": ["my-data-stream*"],
  "data_stream": { },
  "composed_of": [ "my-mappings", "my-settings" ],
  "priority": 500,
  "_meta": {
    "description": "Template for my time series data",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}


参数说明:

index_patterns 指定匹配的索引模式,即如果索引名称和index_patterns中的配置项匹配,则将该模板属性运用到索引中。

data_stream 声明是数据流。

composed_of 有哪些内容组成,配置内容模板component_template。

priority 优先级

_meta 原数据信息,用户自己配置的额外属性。


也可以不使用内容模板,直接通过template属性配置索引模板:

PUT _index_template/my-index-template
{
  "index_patterns": ["my-data-stream*"],
  "data_stream": { },
  "template": {
    "settings": {
      "index.lifecycle.name": "my-lifecycle-policy"
    },
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date",
          "format": "date_optional_time||epoch_millis"
        },
        "message": {
          "type": "wildcard"
        }
      }
    }
  },
  "priority": 500,
  "_meta": {
    "description": "Template for my time series data",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}


四、创建数据流


方式一:创建数据流,并批量添加数据


PUT my-data-stream/_bulk
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:21:15.000Z", "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736" }
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:25:42.000Z", "message": "192.0.2.255 - - [06/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" }


方式二:创建数据流,并添加单条数据


POST my-data-stream/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
}


方式三:仅创建数据流,不添加数据


PUT _data_stream/my-data-stream


注意⚠️:

1、添加的数据中必须含有@timestamp字段信息

2、创建的数据流名称必须和声明的索引模板中的索引模式index_patterns相匹配。


五、查看数据流信息


GET _data_stream/my-data-stream


六、删除数据流


DELETE _data_stream/my-data-stream


七、查看数据流生命周期状态


检索生命周期的进度

要获取托管索引的状态信息,可以使用 ILM 解释 API:


索引处于什么阶段以及何时进入这个阶段

当前操作和正在执行的步骤

如果发生任何错误或进度被阻塞

GET .ds-my-data-stream-*/_ilm/explain


八、冷热分层的前提条件


首先需要有一个具有冷热数据层的ES集群。


Elastic Stack云端配置:

如果采用的Elastic Stack服务,默认会有一个Hot层,其他数据层需要自己添加配置。Add capacity

105.png

如果是自维护的ES集群,需要在安装ES集群的时候,在elasticsearch.yml 文件中通过配置节点角色配置数据层。


node.roles: [ data_warm ]


只有具备了相应的数据层,那么索引才会在生命周期发送变化时转移到相应的数据层中。


总结


本文主要介绍了如果通过索引生命周期管理ILM机制实现数据的冷热分层。

目录
相关文章
|
存储 Kubernetes 监控
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
|
11月前
|
架构师 Java 程序员
程序员的出路:30岁,我们聊聊那些真实的选择
30岁程序员的迷茫与出路:技术焦虑、薪资倒挂、能力单一困扰着许多人。本文基于真实观察,梳理五条可行路径——深耕技术、理性转管理、务实搞副业、跨界融合、提前布局B计划,并总结三条铁律与自测问题,帮助你在变局中找到方向。出路不在远方,而在你写下的每一行“值钱”的代码里。(238字)
1819 117
|
开发框架 Java 编译器
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
962 1
|
机器学习/深度学习 人工智能 运维
运维告警别乱飞了!AI智能报警案例解析
运维告警别乱飞了!AI智能报警案例解析
1134 0
|
7月前
|
人工智能 自然语言处理 监控
2026年企业如何应用智能客服?企业应用智能客服全场景落地实施指南
2026年,智能客服已成企业“生存必需”。瓴羊Quick Service提供全场景落地解决方案:一阶段敏捷部署,实现全渠道接入与知识库快速构建;二阶段深度集成业务系统,强化人机协同与多模态交互;三阶段驱动服务转营销、预测式主动服务与数据持续优化,助企业从成本中心迈向价值中心。(239字)
|
存储 NoSQL Java
Redis如何处理Hash冲突?
在 Redis 中,哈希表是一种常见的数据结构,通常用于存储对象的属性,对于哈希表,最常遇到的是哈希冲突,那么,当 Redis遇到Hash冲突会如何处理?这篇文章,我们将详细介绍Redis如何处理哈希冲突,并探讨其性能和实现细节。
626 2
MyEclipse的字体大小设置(附图)
MyEclipse的字体大小设置(附图)
558 1
MyEclipse的字体大小设置(附图)
|
存储 缓存 负载均衡
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
70021 9
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
什么是 CAS(自旋锁)? 它的优缺点? 如何使用CAS实现一把锁?
该博客文章解释了什么是CAS(自旋锁),包括CAS的基本概念、实现原理、优缺点,以及如何使用CAS实现锁的逻辑,并提供了使用CAS实现锁的Java完整代码示例和测试结果。
什么是 CAS(自旋锁)? 它的优缺点? 如何使用CAS实现一把锁?
|
缓存 负载均衡 Java
Nacos 集群部署时性能优化配置
Nacos 集群部署时性能优化配置
893 2

热门文章

最新文章