作者:来自 Elastic Alex Salgado

学习如何使用四种实用方法在 Elasticsearch 中重命名索引。

想获得 Elastic 认证?看看下一期 Elasticsearch Engineer 培训什么时候开始!

Elasticsearch 拥有丰富的新功能,帮助你根据使用场景构建最佳搜索方案。深入了解我们的示例笔记本,开始免费云试用,或立即在本地机器上体验 Elastic。

你是否曾尝试在 Elasticsearch 中重命名索引,却发现根本没有 rename 的 API 接口?很多人都会遇到这种情况,因为与操作系统中的普通文件不同,Elasticsearch 的索引是复杂且分布式的结构。因此,你不能直接更改名称。如果你想了解如何创建、列出、查询和删除索引,可以查看这篇指南。

在本文中,我们将解释为什么会这样,并介绍四种实用方法来应对这个限制,具体包括:

  • 别名,是最轻量的选项;

  • Clone API,可以快速复制索引;

  • 快照与恢复,用于基于完整备份的复制;

  • Reindex API,功能最强大,但资源消耗也最大。

为什么 Elasticsearch 不允许直接重命名索引?

Elasticsearch 将数据组织成索引,而索引由分布在集群多个节点上的分片组成。每个分片本质上是一个独立的 Lucene 引擎实例,负责物理存储数据。

如果可以直接重命名索引,系统就必须在所有节点的所有分片中以绝对原子的方式更新索引名称,以避免不一致。这种复杂性以及数据损坏的风险让开发者决定不实现这个功能。

然而,在很多场景下确实有重命名索引的需求,例如更改字段映射或数据类型、使命名符合公司新标准、解决多租户集群中的冲突,或替换从旧系统继承的名称。

别名:最简单且最灵活的解决方案

当我们只需要让应用程序通过另一个名字访问索引时,最好的解决方案是使用别名(alias)。可以把别名看作索引的昵称。它们不会复制数据,也不会更改磁盘上的任何内容 —— 它们只是更新集群中的元数据,使新名称 “指向” 真实索引。这种更改几乎是瞬时完成的,因为它只更新集群元数据,不会影响查询性能,无论索引有多大。

例如,如果我们有一个名为 old_index 的索引,并希望应用程序开始使用 new_index,只需添加如下别名:

POST /_aliases
{"actions": [{"add": {"index": "old_index","alias": "new_index"}}]
}

如果你的应用程序通过别名写入数据,你可能需要指定写入索引(write index):

POST /_aliases
{"actions": [{"add": {"index": "new_index","alias": "production_alias","is_write_index": true}}]
}

关于写入索引的行为及其适用场景的更多详情,请参阅 Write index 文档。

这种方式为我们的应用程序提供了灵活性,有助于实现平滑过渡和逻辑隔离,尤其适用于基于微服务的架构,每个服务可能需要不同的访问数据方式或命名约定。

Clone API:快速复制,但有一些限制

如果不能使用别名,并且需要一个具有新名称的索引,下一步可以使用 Clone API。这一功能会创建原始索引的物理副本,但不会复制数据,而是通过文件系统中的硬链接重用数据文件。这使得操作比完全重建索引要快得多。

重要提示: Clone API 有多个限制。它不会复制索引元数据,如别名、ILM 策略或 CCR 设置。目标索引必须不存在,并且两个索引必须拥有相同数量的主分片。完整的要求与限制请参见 Clone Index API 文档。

在克隆之前,原始索引需要处于只读模式且健康状态为 green,以确保操作期间数据不会被修改:

PUT /old_index/_settings
{"settings": {"index.blocks.write": true}
}

然后,只需执行克隆操作:

POST /old_index/_clone/new_index

最后,如有需要,我们可以解除新索引的写入限制:

PUT /new_index/_settings
{"settings": {"index.blocks.write": false}
}

即使数据通过硬链接被重用,确保有足够的磁盘空间仍然很重要,因为新索引需要保持独立。

快照/恢复:基于备份的重命名

如果你需要索引的完整且独立的副本,快照和恢复提供了一个有趣的替代方案,尤其对于大索引来说,可能比重建索引更快。此方法利用了 Elasticsearch 的备份功能,并且在恢复过程中支持重命名索引。

这种方法特别适合已经将快照作为备份策略一部分的情况。它也适用于处理大索引时重建索引过于耗时、在集群间迁移数据,或需要保证数据的时间点一致性副本的场景。

首先,确保你已经配置了快照仓库。如果没有,而这是使用此方法的前提条件,请参阅快照仓库文档。你可以用以下命令检查现有仓库:

GET /_snapshot

接下来,创建索引的快照:

PUT /_snapshot/my_repository/rename_snapshot?wait_for_completion=true
{"indices": "old_index","include_global_state": false
}

重要提示:和重建索引一样,确保在快照过程中索引没有写操作,以保证数据一致性。

最后,使用 rename_pattern 和 rename_replacement 以新名称恢复快照:

POST /_snapshot/my_repository/rename_snapshot/_restore
{"indices": "old_index","rename_pattern": "old_index","rename_replacement": "new_index"
}

对于更复杂的重命名模式,你可以使用正则表达式:

POST /_snapshot/my_repository/rename_snapshot/_restore
{"indices": "logs-*","rename_pattern": "logs-(.+)","rename_replacement": "archived-logs-$1"
}

重建索引:最强大且灵活的工具

当需要超越简单复制或重命名时,应该使用 Reindex API。它不仅允许我们将数据从一个索引复制到另一个索引,还可以执行转换、过滤、结构调整、合并多个索引等复杂操作。

可选的安全步骤:重建索引操作本身不会修改或影响原始索引。但如果你计划在重建后删除原索引(如本文后面所示),建议先创建备份:

PUT /_snapshot/my_backup/snapshot_before_reindex?wait_for_completion=true
{"indices": "old_index"
}

对于大索引,考虑使用 wait_for_completion=false 来避免超时,然后通过 GET /_snapshot/my_backup/snapshot_before_reindex/_status 监控快照进度。

接下来,我们获取原始索引的设置和映射,以正确创建目标索引:

GET /old_index 

这个命令会同时返回设置和映射。

现在,我们需要用这些设置创建目标索引。如果你没有配置索引模板,必须在重建索引之前手动创建索引:

PUT /new_index
{"settings": {// paste the settings obtained from the original index here, but remove any system-generated settings like index.provided_name, etc.},"mappings": {// paste the mappings obtained from the original index here}
}

重要注意事项

  • 复制设置时,删除所有只读和系统生成的属性。只保留可配置的设置,如 number_of_replicas、refresh_interval、analysis 等。关于哪些设置可以在创建索引时指定,详见索引设置文档。
  • 如果跳过这一步且没有模板,Elasticsearch 会在重建索引时自动创建索引,使用动态映射,可能导致字段数据类型错误。
  • 正确创建目标索引后,按如下方式执行基本的重建索引操作:
POST /_reindex
{"source": { "index": "old_index" },"dest": { "index": "new_index" }
}

对于大索引,我们可以通过后台运行、使用 slices 并行处理,以及控制吞吐量来优化操作,避免集群过载。还可以应用脚本,在复制数据时修改内容。

例如:

POST /_reindex?slices=auto&wait_for_completion=false&refresh=false
{"source": { "index": "old_index" },"dest": {"index": "new_index"},"conflicts": "proceed","script": {"source": "ctx._source.status = 'migrated';"}
}

让我们了解每个参数的作用:

  • slices=auto:通过将任务分成多个片(线程)实现并行处理。auto 让 Elasticsearch 根据分片数量自动决定最佳线程数。

  • wait_for_completion=false:后台执行操作,立即返回任务 ID,而不是等待完成。

  • "refresh": false:复制期间禁用目标索引的自动刷新,显著提升性能。数据只有在手动刷新后才可被搜索。重建完成后,运行:POST /new_index/_refresh。

  • "conflicts": "proceed":遇到文档版本冲突时继续执行重建,而不是在第一个错误停止。

  • "script":在复制时对每个文档应用转换。例如,在此示例中,给所有文档添加了一个值为 "migrated" 的字段 "status"。

控制传输速率(限流)

为了避免集群过载,我们可以限制重建索引的速度:

POST /_reindex?requests_per_second=500
{"source": { "index": "old_index" },"dest": { "index": "new_index" }
}

使用 wait_for_completion=false 时,响应会立即返回一个任务 ID:

{"task": "oTUltX4IQMOUUVeiohTt8A:12345"
}

保存这个 ID,因为你需要用它来跟踪进度,尤其是当你同时运行多个重建索引操作时。

要跟踪特定任务的进度,可以这样使用任务 ID:

GET /_tasks/oTUltX4IQMOUUVeiohTt8A:12345 

或者,要查看所有正在进行的重建索引操作:

GET /_tasks?actions=*reindex&detailed=true

如果你丢失了任务 ID,可以列出所有活动任务并查找你的任务:

GET /_tasks?actions=*reindex&detailed=true&group_by=parents 

在修改别名前,先确认重建索引是否成功。检查文档数量、索引大小和健康状态,并运行一些测试搜索,确保数据正确。

  1. 比较文档数量:

    GET /old_index/_count 
    GET /new_index/_count 
  2. 检查索引大小和健康状态:

    GET /_cat/indices/old_index,new_index?v&h=index,docs.count,store.size,health 
  3. 运行一些测试搜索,确保数据正确:

    GET /new_index/_search
    {"size": 5,"query": {"match_all": {}}
    } 

    确认并验证无误后,更新别名指向新索引,确保应用程序持续正常运行:

    POST /_aliases
    {"actions": [{ "remove": { "index": "old_index", "alias": "production_alias" } },{ "add": { "index": "new_index", "alias": "production_alias", "is_write_index": true } }]
    } 

    只有在确认无误后,才能安全地删除旧索引:

    DELETE /old_index 

什么时候使用 Reindex API?

这个工具适用于多种日常场景。它可以用来迁移遗留数据到新结构、修正字段或值的数据类型、将多个索引的数据合并到一个索引中、只重建符合特定条件的文档,甚至在迁移过程中应用 ingest pipeline 来丰富数据。

尽管功能多样,重建索引消耗资源较大,因此务必先进行测试并密切监控集群。

各方法特点总结:

方法什么时候使用速度集群影响
Alias

只需要更改访问名称

InstantaneousNone
Clone

需要完全相同的物理副本

Fast (hard links)Low
Snapshot/Restore

需要硬拷贝或跨集群复制

ModerateLow
Reindex

需要转换数据或结构

Slow (copies everything)High

结论

在 Elasticsearch 中,不能直接重命名索引。这个限制源自系统的分布式架构,索引由分布在集群节点上的多个分片组成。

如果只需更改应用访问索引的名称,可以使用别名 —— 速度快、安全且无影响。需要完全相同的物理副本时,使用克隆。对于完整的硬拷贝或跨集群操作,快照/恢复提供可靠方案。只有在必须转换数据或结构时,才使用重建索引,但需谨慎操作。

无论哪种情况,都要在操作后验证数据、记录变更,并保持备份更新,以确保操作的完整性和连续性。

参考资料

有关本文讨论概念的详细信息,请参阅官方 Elasticsearch 文档:

  • Aliases API — 创建和管理索引别名的完整指南

  • Clone Index API — 使用硬链接克隆索引的文档

  • Reindex API — 重建索引操作的全面指南,包括限流和异步执行

  • Task Management API — 如何监控重建等长时间运行的操作

  • Index Settings — 了解索引设置,包括只读限制

  • Restore a snapshot — 恢复 API 的完整指南,包括 rename_pattern 的使用

  • Snapshot and restore overview — 覆盖快照/恢复整个流程的综合指南

原文:Elasticsearch rename index - Elasticsearch Labs

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

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

相关文章

高通8255 Android Virtio Virtio-SPI 配置方法

目录 一:VirtIO和Passthrough的区别 二:配置逻辑 三:配置方法 步骤一:QNX SPI资源配置 & 测试 配置 测试 步骤二:BE配置 &测试 配置 测试 步骤三:Hypervisor配置 配置 测试 步骤四&…

从零手写红黑树(C++实现详解)

目录 一、红黑树概述 二、红黑树节点设计 (1)枚举红黑 (2)红黑树的节点设计 三、红黑树核心实现:Insert 1.首先将节点遍历到对应位置创建对应节点并插入到二叉搜索树对应的位置 2.本文重点的重点 (1)parent为黑时直接插入即…

【黄山派-SF32LB52】—硬件原理图学习笔记

目录 一、硬件介绍 二、芯片主控 1.模组介绍 2.原理图介绍 3.模组供电电路 三、电源转换部分 1.OVP过压保护电路 2.CHG充电电路 3.系统电源桥接电路 4.LDO电路 四、Debug电路 1.一键下载电路 五、QSPI屏幕 六、SD卡 七、AUDIO音频 八、GPIO电路 1.按键部分…

从五次方程到计算机:数学抽象如何塑造现代计算

引言 数学的发展往往始于一个具体的问题,而后在寻求解答的过程中,催生出深刻的抽象理论。从五次方程的求解到抽象代数,再到范畴论和λ演算,最终影响图灵机和现代计算机的设计,这一历程展现了数学如何从实际问题演变为通…

剧本杀小程序开发:科技赋能,重塑推理娱乐新形态

在科技飞速发展的今天,各个行业都在积极探索与科技的融合,以实现创新发展。剧本杀行业也不例外,剧本杀小程序的开发,正是科技赋能传统娱乐的生动体现,它重塑了推理娱乐的新形态,为玩家带来了前所未有的游戏…

机器学习sklearn入门:归一化和标准化

bg:归一化(Normalization)通常指将数据按比例缩放至某个特定范围,但具体范围并不一定是固定的 0到1。标准化是将数据转换成均值为0,标准差为1的分布。使用场景:用归一化:需要严格限定范围&#…

【Project】kafka+flume+davinci广告点击实时分析系统

一、项目需求分析 某电商平台需实现广告实时点击分析系统,核心需求为实时统计以下内容的Top10: 各个广告的点击量各个省份的广告点击量各个城市的广告点击量 通过实时掌握广告投放效果,为广告投放策略调整和大规模投入提供依据,以…

JAVA后端开发——success(data) vs toAjax(rows): 何时用

toAjax(int rows)用途:用于不返回任何数据的 “写” 操作(增、删、改)。工作原理:它只接收一个 int 类型的参数(通常是数据库操作影响的行数)。它只关心这个数字是不是大于0,然后返回一个通用的…

pdf格式怎么提取其中一部分张页?

想从PDF里提取几个页面,办法还挺多的,下面给你唠唠常见的几种,保准你一看就懂。一、用专业PDF编辑软件提取 像Adobe Acrobat,这可是PDF编辑界的“老手”了。你先把要处理的PDF文件在Adobe Acrobat里打开,接着找到菜单栏…

Spring监听器

1、监听器的原理 ApplicationListener<T>是Spring框架中基于观察者模式实现的事件监听接口&#xff0c;用于监听应用程序中特定类型的事件。该接口是一个函数式接口&#xff0c;从Spring 4.2开始支持Lambda表达式实现。 接口定义如下&#xff1a; FunctionalInterface …

基于Rust游戏引擎实践(Game)

Rust游戏引擎推荐 以下是一些流行的Rust游戏引擎,适用于不同开发需求: Bevy 特点:数据驱动、模块化设计,支持ECS架构,适合初学者和复杂项目。 适用场景:2D/3D游戏、原型开发。 Amethyst 特点:成熟的ECS框架,支持多线程,社区活跃。 适用场景:大型游戏或高性能应用。…

PyTorch 数据加载实战:从 CSV 到图像的全流程解析

目录 一、PyTorch 数据加载的核心组件 1.1 Dataset 类的核心方法 1.2 DataLoader 的作用 二、加载 CSV 数据实战 2.1 自定义 CSV 数据集 2.2 使用 TensorDataset 快速加载 三、加载图像数据实战 3.1 自定义图像数据集 3.2 使用 ImageFolder 快速加载 四、加载官方数据…

程序人生,开启2025下半年

时光匆匆&#xff0c;2025年已然过去一半。转眼来到了7月份。 回望过去上半年&#xff0c;可能你也经历了职场的浮沉、生活的跌宕、家庭的变故。 而下半年&#xff0c;生活依旧充满了各种变数。 大环境的起起伏伏、生活节奏的加快&#xff0c;都让未来的不确定性愈发凸显。 在这…

在 .NET Core 中创建 Web Socket API

要在 ASP.NET Core 中创建 WebSocket API&#xff0c;您可以按照以下步骤操作&#xff1a;设置新的 ASP.NET Core 项目打开 Visual Studio 或您喜欢的 IDE。 创建一个新的 ASP.NET Core Web 应用程序项目。 选择API模板&#xff0c;因为这将成为您的 WebSocket API 的基础。在启…

Python 之地址编码识别

根据输入地址&#xff0c;利用已有的地址编码文件&#xff0c;构造处理规则策略识别地址的编码。 lib/address.json 地址编码文件&#xff08;这个文件太大&#xff0c;博客里放不下&#xff0c;需要的话可以到 gitcode 仓库获取&#xff1a;https://gitcode.com/TomorrowAndT…

kafka的部署

目录 一、kafka简介 1.1、概述 1.2、消息系统介绍 1.3、点对点消息传递模式 1.4、发布-订阅消息传递模式 二、kafka术语解释 2.1、结构概述 2.2、broker 2.3、topic 2.4、producer 2.5、consumer 2.6、consumer group 2.7、leader 2.8、follower 2.9、partition…

小语种OCR识别技术实现原理

小语种OCR&#xff08;光学字符识别&#xff09;技术的实现原理涉及计算机视觉、自然语言处理&#xff08;NLP&#xff09;和深度学习等多个领域的融合&#xff0c;其核心目标是让计算机能够准确识别并理解不同语言的印刷或手写文本。以下是其关键技术实现原理的详细解析&#…

GPT:让机器拥有“创造力”的语言引擎

当ChatGPT写出莎士比亚风格的十四行诗&#xff0c;当GitHub Copilot自动生成编程代码&#xff0c;背后都源于同一项革命性技术——**GPT&#xff08;Generative Pre-trained Transformer&#xff09;**。今天&#xff0c;我们将揭开这项“语言魔术”背后的科学原理&#xff01;…

LeetCode|Day19|14. 最长公共前缀|Python刷题笔记

LeetCode&#xff5c;Day19&#xff5c;14. 最长公共前缀&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;14. 最长公共前缀 难度&#xff1a;简单…

安全事件响应分析--基础命令

----万能密码oror1 or # 1or11 1 or 11安全事件响应分析------***windoes***------方法开机启动有无异常文件 【开始】➜【运行】➜【msconfig】文件排查 各个盘下的temp(tmp)相关目录下查看有无异常文件 &#xff1a;Windows产生的 临时文件 可以通过查看日志且通过筛…