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

news2025/1/15 6:30:53

 

在很多的时候,由于一些需求,我们不得不修改索引的映射,也即 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 中处理数据时的最佳实践:

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

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

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

相关文章

Python3-数字

Python3 数字(Number) Python 数字数据类型用于存储数值。 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值&#xff0c;将重新分配内存空间。 Python 支持三种不同的数值类型&#xff1a; 整型(int) - 通常被称为是整型或整数&#xff0c;是正或负整数&#x…

8.Spring Security 权限控制

1.简介入门JavaEE和SpringMVC &#xff1a;Spring Security就是通过11个Fliter进行组合管理小Demouser实体类user.type字段&#xff0c;0普通用户&#xff0c;1超级管理员&#xff0c;2版主补全get set tostringimplement UserDetails&#xff0c;重写以下方法// true: 账号未过…

_improve-2

-------------------- 左边定宽&#xff0c;右边自适应方案 float margin&#xff0c;float calc /* 方案1 */ .left {width: 120px;float: left; } .right {margin-left: 120px; } /* 方案2 */ .left {width: 120px;float: left; } .right {width: calc(100% - 120px);fl…

【深度学习】线性回归、逻辑回归、二分类,多分类等基础知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1. 线性回归2、逻辑回归3. 单层神经元的缺陷&多层感知机softmax 多分类前言 入行深度学习快2年了,是时间好好总结下基础知识了.现在看可能很多结论和刚学的…

SystemVerilog-时序逻辑建模(5)多个时钟和时钟域交叉

数字硬件建模SystemVerilog-时序逻辑建模&#xff08;5&#xff09;多个时钟和时钟域交叉数字门级电路可分为两大类&#xff1a;组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点&#xff0c;在后面会作为单独的主题处理。组合逻辑描述了门级电路&#xff0c;其中逻…

办公室人员离岗识别检测系统 yolov7

办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术&#xff0c;办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;30…

2023/2/26 Vue学习笔记 配置代理解决跨域[CORS ]的问题

利用vue的脚手架巧妙的解决ajax跨域的问题 1 我们首先利用springboot服务搭建 注意这里引出了跨域[CORS ]的问题: Access to XMLHttpRequest at http://localhost:5000/getUserInfo from origin http://localhost:8080 has been blocked by CORS policy: No Access-Control-A…

【Java】Spring Boot 2 集成 nacos

【Java】Spring Boot 2 集成 nacos 官方文档&#xff1a;https://nacos.io/zh-cn/docs/quick-start-spring-boot.html pom 本次Springboot版本 2.2.6.RELEASE&#xff0c;nacos-config 版本 0.2.7&#xff0c;nacos-discovery版本 0.2.7 parent <parent><groupId&…

带你深层了解c语言指针

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨今天…

麻省理工学院,Web3 人才辈出

2 月 22 日&#xff0c;NFT 交易平台 Blur 创始人公开身份&#xff0c;曾就读于麻省理工学院计算机系。除了 NFT 交易平台&#xff0c;在公链、交易所、VC、媒体、Layer2 等 Web3 和 Crypto 的多个赛道&#xff0c;麻省理工学院&#xff08;MIT&#xff09;的毕业生和教授们均有…

HDMI协议介绍(二)--DataIsland Packets

前言 前文简单介绍了HDMI传输的三个周期&#xff1a;控制周期、DataIsland周期和Video周期。DataIsland传输音频和辅助数据&#xff0c;这些数据以Packet的形式传输。本文简单介绍DataIsland Packet。 目录 前言 数据岛概述 数据岛包的构造 Packet Header Paket Body Dat…

从0开始学python -40

Python3 面向对象-3 类属性与方法 类的私有属性 __private_attrs &#xff1a;两个下划线开头&#xff0c;声明该属性为私有&#xff0c;不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs 。 类的方法 在类的内部&#xff0c;使用 def 关键字…

Linux驱动——设备模型

目录 一、起源 二、新方案 2.1 sysfs: 2.2 uevent 三、代码中自动mknod 四、实例 一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a;&#xff08;硬编&#xff09; 1. 热插拔&#xff08;插上usb设备就立马能安装驱动&#xff09; 2. 不支持…

蓝桥杯2015年第六届真题-奇怪的数列C++

题目&#xff1a;从X星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a;13111331131321131113122113....YY博士经彻夜研究&#xff0c;发现了规律&#xff1a;第一行的数字随便是什么&#xff0c;以后每一行都是对上一行“读出来”比如第2行&#xff0c;是对第…

hadoop网站流量日志数据统计

系统背景介绍 数据提供企业决策能力 网站日志的数据分析------》受欢迎程度如何评价你这个网站的受欢迎程度 用数据 下载的人多了 观看的人多了 通过Hadoop 对某个网站产生的日志数据流量进行统计分析 得出该网站的访问流量 继而做出决策我们可以采用flume收集nginx的success文…

AcWing算法提高课-2.1.1池塘计数

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 农夫约翰有一片 N∗M 的矩形土地。 最近&#xff0c;由于降雨的原因&#xff0c;部分土地被水淹没了。 现在用一个字符矩阵来表示他的土地。 每个单元格内&…

EasyRecovery16最新免费版电脑数据恢复软件功能介绍

EasyRecovery是一款支持Windows/Mac平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;推荐摄影爱好者使用。适用于主流相机、无人机、PC、存储卡、USB 闪存驱动器等&#xff0c;由于删除、损坏或意外格式…

【项目精选】医院管理住院系统的研究与实现(源码+论文+视频)

点击下载源码 本系统主要分为六大模块&#xff0c;分别是医生管理模块、病人管理模块、病床管理模块、收费管理模块、统计分析模块和系统功能模块 &#xff0c;医生、病人和医院的管理人员都可以通过此系统寻找出自己所需要的信息。 1.1 背景 医院管理住院系统是当今大部分现代…

Nginx安装及介绍

前言&#xff1a;传统结构上(如下图所示)我们只会部署一台服务器用来跑服务&#xff0c;在并发量小&#xff0c;用户访问少的情况下基本够用但随着用户访问的越来越多&#xff0c;并发量慢慢增多了&#xff0c;这时候一台服务器已经不能满足我们了&#xff0c;需要我们增加服务…

华为OD机试用Python实现 -【天然蓄水库 or 天然蓄水池】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲天然蓄水库 or 天然蓄水池题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明示例三输入输出说明Python 代码实现算法思路华为OD机试300题大纲 参加华为