使用数据层进行数据生命周期管理

作者:来自 Elastic Stef Nestor

Elasticsearch 7.10 使配置数据生命周期变得不再那么复杂。在这篇博文中,我将介绍一些变化、如何使用它们以及一些最佳实践。

数据生命周期可以包含很多阶段,因此我们将涉及:

  • 将集群划分为层(hot、warm、cold),确保新数据到达正确的位置。
  • 在索引生命周期管理 (index lifecycle management - ILM) 中使用这些层在层之间迁移数据。
  • 使用 Elastic 可搜索快照(Elastic searchable snapshots)增加冷层内的数据密度。
  • 将所有内容与数据如何流经层的真实示例结合起来。

放弃属性,加入节点角色 

处理时间序列数据时,一个常见用例是将集群拓扑分成不同的层。这些层被命名为 hot 层(新数据被提取和查询)、warm 层(中期数据被保存和查询)和 cold 层(数据通常被保存很长时间,查询频率较低)。

用户通常会使用不同的硬件配置这些层,以便将最强大、最昂贵的硬件用于 hot 层,而将较便宜、存储密度更高的硬件用于 warm 层或 cold 层。

在 7.10 之前,配置不同节点层的最常见方法之一是使用节点属性,因此用户可以配置以下内容:

# On hot nodes 
node.attr.node_type: hot# On warm nodes 
node.attr.node_type: warm # On cold nodes: 
node.attr.node_type: cold

然后可以将这些与集群和索引级别分配参数一起使用。例如,可以使用以下命令创建索引:

PUT /myindex 
{ "settings": { "index.routing.allocation.include.node_type": "hot" } 
}

这创建了一个分配给热节点的索引。

让我们来看看新的做事方式。

正式化流程

在 7.10 中,这种类型的配置已经正式化,我们现在拥有与 hot 、warm 和 cold 层(以及另一个层,我们将介绍)相对应的特定角色。这意味着,我们无需添加 node.attr.node_type 属性,而是可以将 data_hot、data_warm 或 data_cold 节点角色之一添加到 node.roles 设置中:

# On hot nodes 
node.roles: ["data_hot"] # On warm nodes 
node.roles: ["data_warm"] # On cold nodes 
node.roles: ["data_cold"]

记得将你可能需要的任何其他角色添加到列表中!例如,对于较小的集群,数据节点可能如下所示:

node.roles: ["master", "ingest", "ml", "data_hot", "data_content"]

(本文后面将进一步解释 data_content 角色。)

注意:你可能想知道现有数据角色发生了什么。好吧,数据角色的作用就像已指定所有层一样,因此它同时成为 hot 层、warm 层和 cold 层的一部分。这意味着已升级到 7.10 或更高版本但未使用 node.roles 设置指定自定义节点角色的节点是每个数据层的一部分。

在层级间移动数据

设置这些角色后,可以使用与之前相同的集群和索引级分配过滤器在集群间移动数据:

  • cluster.routing.allocation.require._tier
  • cluster.routing.allocation.include._tier
  • cluster.routing.allocation.exclude._tier
  • index.routing.allocation.require._tier
  • index.routing.allocation.include._tier
  • index.routing.allocation.exclude._tier

还有一个新参数,其行为与常规的包含(include)、排除(exclude)和需要(require)过滤略有不同。这是 _tier_preference 索引级设置:index.routing.allocation.include._tier_preference。

要了解其工作原理,让我们看一个例子:

PUT /myindex 
{ "settings": { "index.routing.allocation.include._tier_preference": "data_cold,data_warm,data_hot" } 
}

此代码段创建一个索引,该索引优先位于 cold 层,然后是 warm 层,最后是 hot 层。

如果集群不包含冷节点,则必须将其分配给 warm 节点。 如果集群中没有 warm 节点,则必须将其分配给 hot 节点。 此配置允许策略或模板设置首选项,而不必担心每个层都是集群的一部分 - 它可以指定其首选层。

要确切了解此新设置的行为方式,请查看此流程图:

节点属性(node attributes)和正式化数据层角色(formalized data tier roles)之间还有最后一个区别 —— 索引在最初创建时分配的位置。这里有一个简单的规则,它决定了索引最初放在何处:

任何作为数据流一部分的索引在创建时都会自动添加 “index.routing.allocation.include._tier_preference: data_hot” 设置。

这意味着所有数据流支持索引将默认分配在热 (data_hot) 节点上。

对于不属于数据流的索引:

任何不属于数据流的索引在创建时都会自动添加 “index.routing.allocation.include._tier_preference: data_content” 设置。

这两个设置都可以被覆盖。只需将 _tier_preference 索引设置为 null,或在创建期间设置任何其他索引级分配过滤设置即可。

但请稍等:这个新的 data_content 角色是什么?让我们考虑另一种不适合生命周期模型的数据:不适合时间序列模型的数据。

不符合时间序列的数据

某些数据被编入索引,然后仅被查询,但在概念上没有年龄或时间戳。这包括企业搜索数据、电子商务数据或用户信息数据库。

对于此类数据,有一个特定角色:data_content 角色。此角色的配置与其他角色一样,使用 node.roles 设置。

值得一提的是,这些角色都不是互斥的,因此如果你希望非时间序列数据和 hot 数据位于同一节点上,你可以像这样配置节点:

# This node can hold either "hot" tier data, or "content" tier data 
node.roles: ["data_hot", "data_content"]

而且,你可能已经猜到了,现有的默认数据角色也是 content 层的一部分。这意味着数据角色与将 data_hot、data_warm、data_cold 和 data_content 角色添加到 node.roles 设置相同。

如上一节所述,Elasticsearch 确定时间序列数据和非时间序列数据的方式是该索引是否属于数据流。

最佳实践:确保你的集群始终至少有一个 data_hot 节点和一个 data_content 节点,即使它们是同一个节点。如果没有这两个节点角色,则无法分配不同类型的索引。

现在我们了解了所有不同的层级并配置了一些,让我们看看 ILM 如何利用这些层级。

数据层世界中的 ILM

与旧的基于属性的分配相比,单独配置层并没有太大变化。但是,现在我们有了内置且一致的方式来识别 Elasticsearch 中的层,ILM 可以利用这些设置在层之间自动迁移数据。

在 7.10 之前,可以使用以下策略完成分层配置:

{ "phases" : { "hot" : { "actions" : { "rollover" : { "max_age" : "30d", "max_size" : "50gb" } } }, "warm" : { "min_age" : "45d", "actions" : { "allocate" : { "include" : { "node_type" : "warm" } }, "forcemerge" : { "max_num_segments" : 1 } } }, "cold" : { "min_age" : "60d", "actions" : { "allocate" : { "include" : { "node_type" : "cold" } } } }, "delete" : { "min_age" : "90d", "actions" : { "delete" : { } } } } 
}

此策略依赖于索引模板将数据分配到热层,然后在每个 ILM 阶段内使用“分配”操作更新 node_type 以移动数据。

在 7.10 中,有更好的方法!

由于 Elasticsearch 现在能够优先选择特定层,因此 ILM 可以通过在进入新阶段时自动设置 index.routing.allocation.include._tier_preference 来利用此偏好。以下是使用与上述相同策略的示例,但删除了分配步骤:

{ "phases" : { "hot" : { "actions" : { "rollover" : { "max_age" : "30d", "max_size" : "50gb" } } }, "warm" : { "min_age" : "45d", "actions" : { "forcemerge" : { "max_num_segments" : 1 } } }, "cold" : { "min_age" : "60d", "actions" : { } }, "delete" : { "min_age" : "90d", "actions" : { "delete" : { } } } } 
}

当使用此策略创建新数据流时,最初首选项将设置为 index.routing.allocation.include._tier_preference: data_hot。

当索引进入 warm 阶段时,设置将更新为 index.routing.allocation.include._tier_preference: data_warm,data_hot。

进入 cold 阶段后,它将更新为 index.routing.allocation.include._tier_preference: data_cold,data_warm,data_hot,然后索引最终将在删除阶段被删除。

此自动迁移不适用于 hot 阶段,因为它在索引创建时自动管理。

当集群拓扑也包含该层的节点时,此自动迁移允许数据位置自动匹配当前 ILM 阶段。

此行为会自动应用,但有两个注意事项:

  • 如果 "migrate": {"enabled": false} action 添加到阶段的操作列表中,则自动迁移不会生效。
  • 如果 ILM 阶段操作包含设置 include、require 或 exclude 过滤器的分配步骤,则自动迁移不会生效。

这两个阶段都不会自动迁移数据:

"warm": { "actions": { "migrate": { "enabled": false } } 
}

或者:

"warm": { "actions": { "allocate": { "include": { "node_type": "warm" } } } 
}

最佳实践:在集群拓扑中采用了新角色后,请确保从使用节点属性依赖默认数据层迁移的 ILM 策略中删除任何先前的分配操作。

使用可搜索快照将数据保存更长时间

创建和维护数据的生命周期可让你控制新数据与旧数据的硬件属性和性能特征。

但你的集群实际上可以容纳多少数据?

这个问题的答案几乎总是决定数据的保留期限,因为磁盘空间有限,必须从集群中删除最旧的数据以腾出空间容纳新数据。这需要在保留洞察和监管原因所需的数据量之间取得微妙的平衡,而不会耗尽集群磁盘资源或为集群磁盘资源支付过多费用。

但如果我们可以将数据保存更长时间,而对集群资源的影响却很小,那会怎样?

这正是可搜索快照可以提供帮助的地方。7.10 版引入的可搜索快照允许 Elasticsearch 在集群本地保留一份数据副本,而另一份副本(充当副本)则驻留在快照存储库中。这意味着不需要副本,因为任何本地副本的丢失都可以从存储库快照中自动本地恢复。

我们也可以在 ILM 中使用此功能,当索引达到冷阶段时,自动将其转换为可搜索的快照,使可存储的数据密度加倍,因为不需要副本来实现冗余。

使用此功能非常简单,只需使用 searchable_snapshot 操作配置冷阶段即可:

"cold": { "min_age": "90d", "actions": { "searchable_snapshot": { "snapshot_repository" : "backing_repo" } } 
}

在内部,当达到此操作时,Elasticsearch 将:

  • 强制将索引合并到单个段
  • 在 backing_repo 存储库中创建索引的新快照
  • 以新名称将索引挂载为可搜索快照支持的索引
  • 将原始索引交换为可搜索快照支持的索引

瞧!我们现在不再需要本地副本,因为我们有一个快照,可以在数据的主要副本丢失时使用。

注意:如果你是 Elastic Cloud 用户,你甚至可以在可搜索快照操作配置中使用已配置的 “found-snapshots” 存储库(或配置你自己的单独存储库)。

整合所有部分

数据生命周期的数据层配置包含许多不同的移动部分,以构成一个有效的生命周期。让我们将这些部分整合成一个有效的示例。

首先,我们需要一些节点。在此示例中,我们将使用四个节点,分别表示为 a、b、c 和 d:

NodeA

node.name: node-a-hot 
node.roles: ["master", "data_hot", "data_content", "ingest"]

NodeB:

node.name: node-b-hot 
node.roles: ["master", "data_hot", "data_content", "ingest"]

NodeC:

node.name: node-c-cold 
node.roles: ["master", "data_cold", "ingest"]

NodeD:

node.name: node-d-cold 
node.roles: ["master", "data_cold", "ingest"]

集群启动后,我们来配置一个快照存储库:

PUT /_snapshot/my-repository 
{ "type": "fs", "settings": { "location": "my-backup-location" }
}

并添加我们的 ILM 策略,利用一些常见的操作和新的 searchable_snapshot 操作:

PUT /_ilm/policy/my-data-lifecycle 
{"policy" : { "phases" : { "hot" : { "actions" : { "rollover" : { "max_size" : "50gb", "max_age" : "3d" } } }, "warm" : { "min_age" : "5d", "actions" : { "shrink" : { "number_of_shards" : 1 } } }, "cold" : { "min_age" : "7d", "actions" : { "searchable_snapshot" : { "snapshot_repository" : "my-repository" } } }, "delete" : { "min_age" : "365d", "actions" : { "delete" : { } } } } } 
}

还有一个先决条件:索引模板(index template),以便索引可以是数据流并自动使用我们之前创建的 ILM 策略。确保每个节点至少有两个以容纳副本,或者将 index.number_of_replicas 设置为 0 以进行测试。

PUT /_index_template/my-lifecycle-template 
{ "index_patterns": ["test-index"], "data_stream" :{}, "template": { "settings": { "index.lifecycle.name": "my-data-lifecycle", "index.number_of_shards": 2 } } 
}

现在可以通过将文档直接索引到测试索引数据流来将数据发送到这个新索引:

POST /test-index/_doc?op_type=create 
{ "message": "test document", "@timestamp": "2020-01-12" 
}

现在,随着更多数据的发送,它将自动从集群中的热节点移动到 cold 节点,最终进入可搜索的快照,并在一年后最终被删除。

开始使用 Elastic Cloud

我们希望从技术角度介绍数据层对你有所帮助。请试用这些功能,并在我们的讨论论坛中告诉我们你对它们的喜好!

你还可以通过 Elastic Cloud 的 14 天免费试用版试用这些测试版功能。敬请期待 7.11,届时我们的数据层功能将全面推出。

原文:Elasticsearch data lifecycle management with data tiers | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…

用Python绘制医学热图

在医学研究和临床实践中,数据的可视化是不可或缺的一部分。通过直观的数据展示,医学专业人员可以更好地理解各种疾病的治愈率、治疗效果以及医院之间的差异。今天,我们将介绍一种强大的数据可视化工具——热图(Heatmap&#xff09…

WPF 本地生成验证码

1、效果如下图&#xff0c;点击图片可更新验证码&#xff08;其实图片就是一个Button的背景图&#xff09;。 2、主要使通过用户控件创建&#xff0c;UCVerificationCode.xaml代码如下。 <UserControl x:Class"UC.UCVerificationCode"xmlns"http://schemas.…

彻底理解ThreadLocal的应用场景和底层实现

一.概念 定义&#xff1a; ThreadLocal 是 Java 中所提供的线程本地存储机制&#xff0c;可以利用该机制将数据缓存在某个线程内部&#xff0c;该线程可以在任意时刻、任意方法中获取缓存的数据。 其实是可以通过调用 Set() 方法往里面存入值&#xff0c;存入的值是每个线程互…

视频 的 音频通道提取 以及 视频转URL 的在线工具!

视频 的 音频通道提取 以及 视频转URL 的在线工具&#xff01; 工具地址: https://www.lingyuzhao.top/toolsPage/VideoTo.html 它提供了便捷的方法来处理视频文件&#xff0c;具体来说是帮助用户从视频中提取音频轨道&#xff0c;并将视频转换为可以通过网络访问的URL链接。无…

shell自动显示当前git的branch

效果简介&#xff1a; 1. 如果没在git仓库&#xff0c;显示无变化 2. 如果在git仓库&#xff0c;显示当前分支 实现方法&#xff1a; 在~/.bashrc 里添加&#xff1a; function git_branch { test -d .git && branch"git branch | grep "^\*" | sed…

pytorch生成对抗网络

# 生成对抗网络 import os import torch import torchvision import torch.nn as nn from torchvision import transforms from torchvision.utils import save_image # Device configuration device torch.device(cuda if torch.cuda.is_available() else cpu) # 超参数 late…

从GCC源码分析C语言编译原理——源码表层分析(脚本篇)

目录 一、目录结构 二、有意思的小功能 三、install脚本 脚本变量和设置 程序名称变量 模式和命令 参数解析 主要逻辑 四、主要功能脚本 ------------------------------------------------------------------------------------------------------------------------…

自定义指令,全局,局部,注册

让输入框自动获取焦点(每次刷新自动获取焦点&#xff09; <template><div><h3>自定义指令</h3><input ref"inp" type"text"></div> </template><script> export default {mounted(){this.$refs.inp.focus…

二、点亮希望之光:寄存器与库函数驱动 LED 灯

文章目录 一、寄存器1、存储器映射2、存储器映射表3、寄存器4、寄存器映射5、寄存器重映射6、总线基地址、外设基地址、外设寄存器地址7、操作寄存器&#xff08;以操作一个GPIO口为例&#xff09;1. 寄存器地址定义部分2. GPIOD_Configuration 函数部分3. main 函数部分 二、库…

梯度下降法求解局部最小值深入讨论以及 Python 实现

文章目录 0. 前期准备1. 局部最小值2. 例子3. 讨论3.1 增加迭代次数3.2 修改学习率 η \eta η3.3 修改初始值 x 0 x^0 x0 4. 总结参考 0. 前期准备 在开始讲梯度下降法求解函数的局部最小值之前&#xff0c; 你需要有梯度下降法求解函数的最小值的相关知识。 如果你还不是…

css部分

前面我们学习了HTML&#xff0c;但是HTML仅仅只是做数据的显示&#xff0c;页面的样式比较简陋&#xff0c;用户体验度不高&#xff0c;所以需要通过CSS来完成对页面的修饰&#xff0c;CSS就是页面的装饰者&#xff0c;给页面化妆&#xff0c;让它更好看。 1 层叠样式表&#…

7-zip如何分卷压缩文件并加密?

想要压缩的文件过大&#xff0c;想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置&#xff1f; 想要分卷压缩文件并加密一起操作就可以完成了&#xff0c;设置方法如下&#xff1a; 打开7-zip&#xff0c;选中需要压缩的文件&#xff0c;选择…

14.在 Vue 3 中使用 OpenLayers 自定义地图版权信息

在 WebGIS 开发中&#xff0c;默认的地图服务通常会带有版权信息&#xff0c;但有时候我们需要根据项目需求自定义版权信息或添加额外的版权声明。在本文中&#xff0c;我们将基于 Vue 3 的 Composition API 和 OpenLayers&#xff0c;完成自定义地图版权信息的实现。 最终效果…

【游戏】超休闲游戏:简单易上手的游戏风潮

1. 什么是超休闲游戏&#xff1f; 超休闲游戏&#xff08;Hyper-Casual Games&#xff09; 是一种专注于简单玩法、快速上手、短时间内能完成的游戏类型。这类游戏通常具有以下特点&#xff1a; 玩法简单&#xff1a;规则直观&#xff0c;用户无需教程即可上手。碎片化体验&a…

无法找到 msvcr120.dll,无法执行程序要怎么处理?修改msvcr120.dll文件

遇到“无法找到 msvcr120.dll&#xff0c;无法执行程序”这类错误通常指示着你的计算机缺少了一个核心组件&#xff0c;即 Microsoft Visual C 2013 Redistributable 的一部分&#xff1a;msvcr120.dll 文件。这个文件是许多依赖 Visual C 的应用程序运行的基础。目前修复此类问…

Kruskal 算法在特定边权重条件下的性能分析及其实现

引言 Kruskal 算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它通过逐步添加权重最小的边来构建最小生成树,同时确保不会形成环路。在本文中,我们将探讨在特定边权重条件下 Kruskal 算法的性能,并分别给出伪代码和 C 语言实现。特别是,我们将分…

实战 | C# 中使用GPU加速YOLOv11 推理

导 读 本文主要介绍如何在C#中使用GPU加速YOLOv11推理。 YOLOv11介绍 C# 中使用YOLOv11 (GPU版本) 【1】环境和依赖项。 下载安装CUDA12.6和CUDNN9.6,截止文章日期最新版本,注意选择自己的版本,我的系统是win11 64位。

大数据-244 离线数仓 - 电商核心交易 ODS层 数据库结构 数据加载 DataX

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

C# 高效编程指南:从命名空间到异常处理的技巧与最佳实践

在这条成长的路上&#xff0c;有一些核心概念将成为你开发过程中的得力助手—命名空间、预处理指令、正则表达式、异常处理和文件输入输出&#xff0c;这些看似独立的技术&#xff0c;实际上在大多数应用中都紧密相连&#xff0c;共同构成了C#开发的基础。 目录 C#命名空间 C…