当前位置: 首页 > news >正文

Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据

 

在很多的时候,由于一些需求,我们不得不修改索引的映射,也即 mapping,这个时候我们需要重新索引(reindex)来把之前的数据索引到新的索引中。槽糕的是,我们的这个索引还在不断地收集实时数据,那么我们该如何处理这种情况呢?

比如,我们有这样的一个案例。假设你有一个名为 production_logs 的索引处于活动状态,这意味着它不断接收新数据。现在假设你想要以需要重新索(reindex)引该索引的所有数据的方式更新其映射:通常,当你想要更改现有字段的数据类型(例如从keyword 到 integer)时,会发生这种情况。

好的,现在你拥有的选项将取决于你首先如何设置索引。

你需要一个 index template

如果你没有自己创建索引,Elasticsearch 能够创建索引,这意味着如果你尝试索引 foo 索引中的某些数据,Elasticsearch 将创建它(如果它尚不存在)。

通过这样做,它使用称为动态映射的功能为这个新索引创建默认映射。

这就是你需要索引模板的原因! 此功能允许你定义 Elasticsearch 自动创建的索引将获得的所有属性,包括其设置和映射。

因此,如果你的 production_logs 索引没有索引模板,仍然是时候创建它了。 我们称它为 production_logs_template 并将此模板的模式设置为 production_logs* ,这意味着每次 Elasticearch 将自动创建名称与模式 production_logs* 匹配的索引时,它将应用该模板(请参阅完整文档)。

以下是索引模板创建请求的示例:

PUT _index_template/production_logs_template
{"index_patterns": [ "production_logs*"],"template": {"settings": {...},"mappings": {...}}
}

案例 1:你已经有一个 index alias

将真实索引隐藏在索引别名后面始终是一个好习惯。

它引入的抽象级别可帮助你在后台执行修改,而不会影响索引的用户(无论是人还是软件)。

因此,假设你获得了当前链接到要修改的 production_logs 索引的日志别名,并且你想要根据 production_logs_template 更新索引的映射。

这里的方法很简单:

  • 更新索引模板以定义新映射
  • 创建一个新索引,其名称与 production_logs* 匹配(例如 production_logs_1 )
  • 切换日志别名以指向这个新索引
POST _aliases
{"actions": [{"add": {"index": "production_logs_1","alias": "logs"}},{"remove": {"index": "production_logs","alias": "logs"}}]
}

在上面我们的 add 及 remove 是一个原子操作,也即同时起作用。中间不会有其它的操作,这样保证在删除的同时,向我们的索引别名 logs 写入的数据能够正确地写入到新的索引中。

  • 将数据从 production_logs 重新索引到 production_logs_1
POST _reindex?wait_for_completion=false
{"source": {"index": "production_logs"},"dest": {"index": "production_logs_1"}
}

此请求将返回一个 task_id,你可以使用它来监视重建索引过程的进度。

以下是你收到的响应示例:

{"task": "<task_id>"
}

你可以发出请求以利用任务管理 API:

GET _tasks/<task_id>?human

上述命令可以让我们知道任务的进度。就是这么简单! 在重建索引过程结束时,你的 production_logs_1 索引将包含所有新旧数据,并具有正确的映射。 👏

案例2:你还没有一个 index alias

嗯,这会更难,但没有什么是不可能的,对吧?

从现在开始,我们仍然可以面临(至少)两种不同的情况:你是否使用摄入管道(ingest pipeline)。

在下文中,请记住我们已经创建了一个驱动 production_logs* 索引的索引模板。

案例 2.1:你正在使用一个 ingest pipeline

 

假设使用 production_logs_pipeline 将数据索引到 Elasticsearch,该管道处理任何传入事件,然后再将其索引到 production_logs 索引中。

以下是你想要更新实时索引的几个步骤。

首先,修改 production_logs_pipeline,在末尾添加 set processor。

{"set": {"field": "_index","value": "{{{_index}}}_1"}
}

现在,所有通过此摄取管道的文档都将重定向到 production_logs_1 索引。

然后,你可以将所有数据从 production_logs 重新索引到名为 production_logs_orig 的新索引索引。

POST _reindex?wait_for_completion=false
{"source": {"index": "production_logs"},"dest": {"index": "production_logs_orig"}
}

这里请注意,索引 production_logs_1 和 production_logs_orig 都将根据索引模板 production_logs_template 创建!

重新索引任务完成后,你可以安全地删除 production_logs 索引(它的所有数据都已存储在 production_logs_orig 索引中)。

现在我们可以创建一个新的索引别名,它将被命名为 production_logs 并将同时针对 production_logs_orig 和 production_logs_1 索引,后者将是写入索引。

POST _aliases
{"actions": [{"add": {"index": "production_logs_orig","alias": "production_logs"}},{"add": {"index": "production_logs_1","alias": "production_logs","is_write_index": true}}]
}

最后,你需要返回到以前版本的 production_logs_pipeline,以便传入的数据从现在开始将使用新创建的 production_logs 别名。

作为最终结果,我们现在有一个索引别名指向两个具有预期映射的索引👏

💡 有可能再次从 production_logs_orig 重新索引到 production_logs_1 最后只有一个索引。

案例 2.2:索引是直接对索引进行的,没有摄取管道

 

在这种情况下,需要执行更多步骤,遗憾的是无法创建别名来替换原始索引,但你仍然可以将新映射应用于实时索引。

因此,首先你必须创建一个新的摄取管道,我们将其命名为 temp_pipeline:

PUT _ingest/pipeline/temp_pipeline
{"processors": [{"set": {"field": "_index","value": "{{{_index}}}_1"}}]
}

它只有一个处理器,其作用是将传入的文档重定向到一个新索引,该索引的名称是原始索引并以 _1 为后缀。

现在我们要表明任何进入 production_logs 索引的文档现在都应该使用这个新的摄取管道。 我们可以在我们的索引上利用 index.default_pipeline 设置,这将允许我们应用管道,即使原始索引请求没有提到它。

PUT production_logs/_settings
{"index": {"default_pipeline": "temp_pipeline"}
}

从现在开始,每个传入的文档都将被重定向到 production_logs_1 索引,该索引将使用 production_logs_template 索引模板自动创建。

production_logs 索引不会获得任何新文档,因此我们可以将数据从该索引重新索引到一个名为 production_logs_orig 的新文档。

POST _reindex?wait_for_completion=false
{"source": {"index": "production_logs"},"dest": {"index": "production_logs_orig"}
}

和以前一样,我们可以使用任务管理 API来监控重建索引过程。

完成后,我们删除 production_logs,下一个传入文档到达后将立即重新创建! 它将获得预期的映射(感谢索引模板)所以我们处于这种情况:

  • production_logs_orig 索引包含在我们开始操作之前索引的所有数据
  • production_logs_1 索引包含从迁移开始到删除之前的 production_logs 索引之间已编制索引的所有数据
  • production_logs 索引已重新创建并收集所有新数据(在如下的步骤中进行操作)

要回到单索引状态,我们只需将数据从 production_logs_orig 和 production_logs_1 重新索引到 production_logs 。

POST _reindex?wait_for_completion=false
{"source": {"index": "production_logs_1, production_logs_orig"},"dest": {"index": "production_logs"}
}

作为最终结果,我们将所有以前的数据(以及所有新数据)与新映射一起存储在 production_logs 索引中 👏

结论

本文可以帮助实现一些数据操作,但请记住当前在 Elasticsearch 中处理数据时的最佳实践:

  • 始终使用别名从你用来与之交互的资源中抽象出你的真实索引
  • 如果处理时间序列,最好是使用数据流!

相关文章:

Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据

在很多的时候&#xff0c;由于一些需求&#xff0c;我们不得不修改索引的映射&#xff0c;也即 mapping&#xff0c;这个时候我们需要重新索引&#xff08;reindex&#xff09;来把之前的数据索引到新的索引中。槽糕的是&#xff0c;我们的这个索引还在不断地收集实时数据&…...

【算法笔记】前缀和与差分

第一课前缀和与差分 算法是解决问题的方法与步骤。 在看一个算法是否优秀时&#xff0c;我们一般都要考虑一个算法的时间复杂度和空间复杂度。 现在随着空间越来越大&#xff0c;时间复杂度成为了一个算法的重要指标&#xff0c;那么如何估计一个算法的时间复杂度呢&#xf…...

python实战应用讲解-【实战应用篇】函数式编程-八皇后问题(附示例代码)

目录 知识储备-迭代器相关模块 itertools 模块 创建新的迭代器 根据最短输入序列长度停止的迭代器...

【Servlet篇】如何解决Request请求中文乱码的问题?

前言 前面一篇文章我们探讨了 Servlet 中的 Request 对象&#xff0c;Request 请求对象中封装了请求数据&#xff0c;使用相应的 API 就可以获取请求参数。 【Servlet篇】一文带你读懂 Request 对象 也许有小伙伴已经发现了前面的方式获取请求参数时&#xff0c;会出现中文乱…...

SpringBoot:SpringBoot简介与快速入门(1)

SpringBoot快速入门1. SpringBoot简介2. SpringBoot快速入门2.1 创建SpringBoot项目&#xff08;必须联网&#xff0c;要不然创建失败&#xff0c;在模块3会讲到原因&#xff09;2.2 编写对应的Controller类2.3 启动测试3. Spring官网构建工程4. SpringBoot工程快速启动4.1 为什…...

RabbitMQ学习(十一):RabbitMQ 集群

一、集群1.1 为什么要使用集群前面我们介绍了如何安装及运行 RabbitMQ 服务&#xff0c;不过这些是单机版的&#xff0c;无法满足目前真实应用的 要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办&#xff1f;单台 RabbitMQ 服务器可以…...

学渣适用版——Transformer理论和代码以及注意力机制attention的学习

参考一篇玩具级别不错的代码和案例 自注意力机制 注意力机制是为了transform打基础。 参考这个自注意力机制的讲解流程很详细&#xff0c; 但是学渣一般不知道 key&#xff0c;query&#xff0c;value是啥。 结合B站和GPT理解 注意力机制是一种常见的神经网络结构&#xff0…...

网上这么多IT的培训机构,我们该怎么选?

说实话&#xff0c;千万不要把这个答案放在网上来找&#xff0c;因为你只能得到别人觉得合适的或者机构的广告&#xff1b;当然个人的培训经历可以听一听的&#xff0c;毕竟不靠谱的机构也有&#xff0c;比如让你交一两万去上线上课程或者一百号来人坐一起看视频&#xff0c;这…...

数据结构与算法—跳表(skiplist)

目录 前言 跳表 查询时间分析 1、时间复杂度 o(logn) 2、空间复杂度O(n) 动态插入和删除 跳表动态更新 跳表与红黑树比较 跳表实现 前言 二分查找用的数组 链表可不可以实现二分查找呢&#xff1f; 跳表 各方面性能比较优秀的动态数据结构&#xff0c;可以支持快速…...

【C++】5.C/C++内存管理

1.C/C内存管理 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof (int)*4);int* ptr2 …...

一文让你彻底理解关于消息队列的使用

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ&#xff0c;Rabbit…...

条件期望3

条件期望例题—连续发生的事情 连续地做二项实验, 每一次成功概率为p. 当连续k次成功时, 停止实验. 求停止实验时做的总实验次数的期望. 解: 错误解法 设NkN_kNk​为停止实验时做的总实验次数, 则 E[Nk]E[E[Nk∣Nk−1]]∑jk−1∞E[Nk∣Nk−1j]\begin{split} E[N_k] & E[E…...

第四届蓝桥杯省赛 C++ B组 - 翻硬币

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;翻硬币 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家都…...

linux shell 入门学习笔记14 shell脚本+数学计算

概念 把复杂的命令执行过程&#xff0c;通过逻辑代码&#xff0c;组成一个脚本文件的方式就叫做shell脚本。 shebang #! /bin/bash #! /bin/perl #! /bin/python执行脚本的方式 source my_first.sh . my_first.shbash my_first.sh ./my_first.sh变量引用 ${var} 取出变量结果 …...

ESP32设备驱动-MAX30100心率监测传感器驱动

MAX30100心率监测传感器驱动 1、MAX30100介绍 MAX30100 是一款集成脉搏血氧饱和度和心率监测传感器解决方案。 它结合了两个 LED、一个光电探测器、优化的光学器件和低噪声模拟信号处理,以检测脉搏血氧饱和度和心率信号。 MAX30100 采用 1.8V 和 3.3V 电源供电,可通过软件…...

RTD2169芯片停产|完美替代RTD2169芯片|CS5260低BOM成本替代RTD2169方案设计

RTD2169芯片停产|完美替代RTD2169芯片|CS5260低BOM成本替代RTD2169方案设计 瑞昱的RTD2169芯片目前已经停产了&#xff0c; 那么之前用RTD2169来设计TYPEC转VGA方案的产品&#xff0c;该如何生产这类产品&#xff1f;且RTD2169芯片价格较贵&#xff0c;芯片封装尺寸是QFN40&…...

urho3d数据库

只有在启用以下两个构建选项之一时&#xff0c;数据库子系统才会构建到Urho3D库中&#xff1a;Urho3D_Database_ODBC和Urho3D-Database_SQLITE。当两个选项都启用时&#xff0c;URHO3D_DATABASE_ODBC优先。这些构建选项决定子系统将使用哪个数据库API。ODBC DB API更适用于本地…...

141. 周期

Powered by:NEFU AB-IN Link 文章目录141. 周期题意思路代码141. 周期 题意 一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 5个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。 我们希望知道一…...

Windows下命令执行绕过技巧总结(渗透测试专用)

一、连接符1、双引号不要求双引号闭合举例&#xff1a;"who"a"mi" //闭合的 "who"a"mi //不闭合的2、圆括号必须在两边&#xff0c;不能包括中间的字符。举例&#xff1a;((whoami))3、^符号&#xff08;转译符号&#xff09;不可以在结尾&…...

mindspore的MLP模型(多层感知机)

导入模块 import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import mindspore import mindspore.dataset as ds from mindspore import nn import mindspore.ops as ops import mindspore.numpy as mnp from …...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...