Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch 8.X reindex 源码剖析及提速指南

Elasticsearch 8.X reindex 源码剖析及提速指南

作者头像
铭毅天下
发布于 2023-09-09 06:19:09
发布于 2023-09-09 06:19:09
51900
代码可运行
举报
文章被收录于专栏:铭毅天下铭毅天下
运行总次数:0
代码可运行

1、reindex 源码在线地址

为方便大家验证,这里给出 reindex github 源码地址。

https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java

reindex 常见问题:

2、reindex 源码本质

reindex 操作的本质是从一个或多个源索引中读取文档,并将这些文档索引到一个目标索引中,可能还涉及对文档的某些转换。

以下是从源码中得出的 reindex 操作的关键点:

2.1 源和目标

ReindexRequest 定义了源索引(从中读取文档)和目标索引(将文档索引到其中)。

2.2 查询和过滤

可以为源索引定义一个查询(使用 setSourceQuery 方法),以确定哪些文档应该被重新索引。

也就是可以迁移满足给定检索语句的数据。

2.3 文档转换

如果提供了一个脚本,它可以在文档从源索引移动到目标索引之前对文档进行修改或转换

2.4 批量处理

文档是批量从源索引读取并批量索引到目标索引的。

批处理的大小可以通过 setSourceBatchSize 方法进行调整。

这个值究竟可以多大,源码并没有明示。但是如下规则咱们得知道!

  • 设置一个非常大的滚动大小仍然可能会对集群造成压力,因为它会增加内存使用和集群节点之间的数据传输。
  • 因此,选择一个合适的滚动大小是很重要的,以确保在取得良好性能的同时,不会过度压迫集群。

2.5 远程源索引

reindex 不仅可以在当前 Elasticsearch 集群中的索引之间移动文档(如图 1 所示),还可以从一个远程的 Elasticsearch 集群读取文档(如图 2 所示)。

这是通过 RemoteInfo 类实现的,它包含了远程集群的所有必要信息。

包含信息如下:

  • 远程集群的地址(可能是一个 URL 或 URI)
  • 认证信息(例如用户名和密码)
  • 请求头(为远程请求定制的特定头信息)
  • 连接超时和套接字超时
  • 其他与远程集群交互所需的配置信息

2.6 验证

在执行 reindex 操作之前,会进行一系列的验证检查(使用 validate 方法),以确保请求是合法的。

2.7 序列化/反序列化

ReindexRequest 类包含了将请求序列化到网络传输格式并从该格式反序列化的方法。

这允许 Elasticsearch 节点之间有效地通信并执行 reindex 请求。

2.8 输出

ReindexRequest 可以被转化为一个描述性的字符串(使用 toString 方法)或一个XContent格式(通常是JSON,使用 toXContent 方法),这对于日志记录和调试非常有用。

总结起来,reindex 操作的本质是从源索引读取文档、可能进行一些转换,然后将这些文档索引到目标索引。

此操作可以在当前集群的索引之间进行,也可以跨集群进行。这是一种强大的方式,可以用于数据迁移、索引重组、数据转换等任务。

3、reindex 加速

重新索引操作的速度受多个因素的影响, 如果希望加速 reindex 操作,以下是一些建议:

3.1 调整批次大小:

ReindexRequest 有一个 setSourceBatchSize 方法,允许我们设置每批处理的文档数量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

  /**

     * Sets the scroll size for setting how many documents are to be processed in one batch during reindex

     */

    public ReindexRequest setSourceBatchSize(int size) {

        this.getSearchRequest().source().size(size);

        return this;

    }

增加批次大小可能会提高性能,但请注意,太大的批次可能会导致内存问题或请求超时。

3.2 slice 并行处理

slice 在 Elasticsearch 的重索引操作中确实可以帮助提速。slice 是一种将大型查询分解为多个较小部分并并行执行它们的方法,从而使整体操作更快。

在 ReindexRequest 类中,我们可以看到方法 forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices),它允许我们为给定的滚动请求创建一个子切片。

如何实操?

关于设置切片数量: 当我们执行重索引操作时,可以设置 slices 参数来指定我们想要的切片数。

例如,如果我们选择 slices: 5,那么 Elasticsearch 将尝试将查询拆分成5个子查询,并尽可能均匀地分布文档。

并行执行提速

使用切片后,每个切片都可以在单独的线程或节点上并行执行。这样,如果我们有多个节点或足够的资源,切片可以显著提高重索引的速度。

实际命令:

在 Elasticsearch REST API 中,进行带切片的重索引操作的命令可能如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST _reindex
{
  "source": {
    "index": "old_index",
    "size": 1000,
    "slice": {
      "id": 0,
      "max": 5
    }
  },
  "dest": {
    "index": "new_index"
  }
}

在上面的命令中,我们将原始索引分成了5个切片,并使用 id 参数来指定当前切片的编号。

要并行执行所有切片,需要为每个切片编号运行此命令(在此例中,从0到4)。

slice 注意事项

虽然切片可以加速操作,但它也会增加集群的负担,因为每个切片都会创建自己的滚动上下文。确保的 Elasticsearch 集群有足够的资源来处理我们选择的切片数量。

切片操作的最佳数量取决于数据、查询和集群配置。可能需要进行一些性能测验来找到最佳的切片数量。

总的来说,slice 可以显著提高重索引操作的速度(一会我们验证一把,用事实证明),但需要确保正确使用它,以便在提高速度的同时不过度负担集群。

3.3 优化查询

如果我们在 reindex 请求中使用了查询来筛选文档,确保该查询是优化的。避免使用复杂或低效的查询。比如:复杂嵌套查询、wildcard模糊查询等都尽量避免。

3.4 增加硬件资源

增加 Elasticsearch节点的 CPU、内存和I/O能力可以提高 reindex 的速度。

如果我们正在从远程集群进行重新索引,确保两个集群都有足够的资源。

这种针对数据量极大的情况。

3.5 优化索引设置:

在目标索引上临时禁用一些功能,如刷新和副本。完成 reindex 后,再启用它们:

设置 index.number_of_replicas 为 0 以禁用副本

设置 index.refresh_interval 为 -1 以禁用刷新

3.6 使用 Ingest Pipelines

如果我们正在在 reindex 操作中使用脚本对文档进行转换,考虑使用 Ingest Pipelines,这可能比脚本更高效。

3.7 网络优化

如果从远程集群重新索引,确保网络连接是高速、低延迟的。限制其他网络密集型操作的使用,以确保 reindex 请求可以充分利用带宽。

这属于边缘化建议,一般常识属于必知必会的。

3.8 限制其他操作

尝试在集群的非高峰时段执行 reindex 操作,并限制执行其他资源密集型操作,如大型搜索或其他索引操作(如段合并等)。

3.9 检查插件和外部脚本

确保没有任何插件或外部脚本影响 reindex 操作的性能。

3.10监控并调优

使用Elasticsearch的监控工具,如 Elastic Stack 的监控功能,来监控 reindex 操作的性能。这可以帮助我们识别瓶颈并进行相应的调优。

考虑到这些建议,最好在生产环境中进行测试,以找到最佳的设置和优化策略。

4、reindex 借助 slice 加速验证

4.1准备工作

  • 条件1——选择或创建一个足够大的数据。

需要一个大型索引,这样性能差异才会明显。小数据集可能不会显示出明显的差异。

  • 条件2——确保集群健康。

确保 Elasticsearch 集群在开始测试之前是健康的,所有节点都是在线的,没有挂起的任务。

  • 条件3——关闭其他大型操作。

确保集群上没有其他大型查询或索引操作在运行,以免影响性能测试结果。

4.2 不使用 slice 的重索引

  • 记录开始时间。
  • 使用 _reindex API 执行重索引操作,但不使用 slice。
  • 记录完成时间。
  • 计算持续时间。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 第一种:直接迁移。

  "took": 4005,

POST _reindex
{
  "source": {
    "index": "image_index"
  },
  "dest": {
    "index": "image_index_direct"
  }
}

GET image_index_direct/_count

4.3 使用 slice 的重索引

  • 选择一个切片数量:例如,如果有5个数据节点,我们可能想尝试5个切片。
  • 记录开始时间。
  • 使用 _reindex API 执行重索引操作,为每个切片创建一个单独的请求。可以使用并发工具(如 parallel 命令或脚本)来并行运行所有的请求。
  • 记录所有切片完成的时间。
  • 计算总持续时间。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 第二种,加了并行处理!
 
POST _reindex
{
  "source": {
    "index": "image_index",
    "slice": {
      "id": 0,
      "max": 5
    }
  },
  "dest": {
    "index": "image_index_slice"
  }
}

4.4 比较

比较两次重索引的总时间。理论上,使用 slice 的版本应该更快,尤其是在有多个节点和大量数据的集群中。

如下视频所示,我优先小范围做了验证。

视频

数据量 16MB,上万条数据迁移结果对比:

迁移方式

耗时

直接迁移

4005ms

slice迁移

1123ms

数据量 112MB,15万条长津湖影评数据迁移结果对比:

视频

迁移方式

耗时

直接迁移

30000ms左右(事后视频回放看到的)

slice迁移

10263ms

综上两种数量级不同数据的 reindex 结果可以看出,加了 slice 能提速 3-4倍

更多节点规模集群和大规模数据,期待大家留言反馈结果。

5、小结

有了方案,更多的付诸实践,拿出结果才更有谁服力!

加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Elasticsearch探索: Reindex API
5.X版本后新增Reindex。Reindex可以直接在Elasticsearch集群里面对数据进行重建,如果你的mapping因为修改而需要重建,又或者索引设置修改需要重建的时候,借助Reindex可以很方便的异步进行重建,并且支持跨集群间的数据迁移。
HLee
2021/01/14
2.5K0
Elasticsearch探索: Reindex API
【Elasticsearch系列之八】通过reindex迁移ES数据
reindex 是 ES 提供的一个 api 接口,可以把数据从源 ES 集群导入到当前 ES 集群,实现集群内部或跨集群同步数据。
Vicwan
2020/04/27
10.2K0
干货 | Elasticsearch 8.X 版本升级指南
所以,市面上的各家公司在使用 Elasticsearch 过程中,都有自己的版本选型。根据我个人的调研和不完全观察,当前 1.X、2.X、5.X、6.X、7.X、8.X 版本都有大量的公司在使用。
铭毅天下
2022/09/26
3.5K0
干货 | Elasticsearch 8.X 版本升级指南
关于重建索引 API 使用和故障排查的 3 个最佳实践
您的客户端将在 N 秒后关闭非活动套接字;以 Kibana 为例,如果重建索引操作无法在 120 秒内(v7.13 中默认的 server.socketTimeout 值)完成,您将看到“backend closed connection”(后端已关闭连接)消息。
周银辉
2024/05/09
3550
ElasticSearch的Reindex
ES在BI应用中常常仅仅只作为全文检索库,数据的加工在数据库中进行,数据如何同步到ES中?一般的思路有增量和全量,对于超大数量的场景,如千万、亿+,全量的同步会非常慢,如何进行增量呢?ES支持在内部reindex,其包含哪些场景?给索引增、删、改一列或某些列是否可以单独只同步修改的列?
零分影魔
2020/08/20
2.8K0
Elasticsearch 线上实战问题及解决方案探讨
我有 1tb 的一个大索引若干,要迁移到另外一个新集群去,有没有好办法?reindex好像会中断......
铭毅天下
2023/11/27
4120
Elasticsearch 线上实战问题及解决方案探讨
elasticsearch文档Delete By Query API(二)
开发者可以利用Task API获取任何正在运行的 deletebyquery操作的状态,如下:
江南一点雨
2018/12/27
1.5K0
elasticsearch文档Delete By Query API(二)
干货 | Elasticsearch Reindex性能提升10倍+实战
reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶颈),reindex/snapshot的时候CPU还是IO使用率都很低,是不是集群受什么参数限制了reindex和snapshot的速率?
铭毅天下
2018/08/14
3.8K0
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元!
Elasticsearch是一个强大的搜索和分析引擎,随着新版本的发布,升级是保持系统性能和安全性的关键。将Elasticsearch从7.16升级到8.13.4是一个复杂且关键的过程,涉及多方面的准备和实施步骤。
DBA实战
2024/09/06
3720
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元!
干货 | Elasticsearch开发人员最佳实战指南
几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样适用于其他编程语言。我尝试尽量避免重复教程和Elasticsearch官方文档中已经介绍的内容。本文梳理的内容都是从线上实践问题和个人总结的经验汇总得来的。
铭毅天下
2020/04/08
1.8K0
干货 | Elasticsearch开发人员最佳实战指南
Elasticsearch 8.X 最新学习路线图——一图在手,进阶跟我走!
在大数据时代,Elasticsearch 作为一款强大的搜索和分析引擎,被广泛应用于各种场景。无论是实时日志分析、全文搜索还是复杂数据的实时处理,Elasticsearch 都能胜任。
铭毅天下
2024/05/28
1.8K0
Elasticsearch 8.X 最新学习路线图——一图在手,进阶跟我走!
Elasticsearch 跨网络、跨集群同步选型指南
这是个经常被问到的问题。涉及到跨版本、跨网络、跨集群的索引数据的迁移或同步。我们拆解一下:
铭毅天下
2021/06/25
4.1K1
Elasticsearch 跨网络、跨集群同步选型指南
所有您需要了解的关于Elasticsearch 5.0:索引管理
我们看到两种主要的Elasticsearch索引使用模式 - 全局索引和滚动索引。多年来,Elasticsearch增加了一些功能,可以极大地改善这些模式的工作体验。Elasticsearch 5引入了几项新功能,进一步构建了这些功能,并产生了一个非常好的索引管理故事。
Noah____________________
2018/06/01
1.8K1
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版
Elasticsearch是一个强大的搜索和分析引擎,随着新版本的发布,升级是保持系统性能和安全性的关键。将Elasticsearch从7.16升级到8.13.4是一个复杂且关键的过程,涉及多方面的准备和实施步骤。
DBA实战
2024/09/06
5280
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版
全文检索的极致之选:Elasticsearch完全指南
倒序索引也被称为“反向索引”或“反向文件”,是一种索引数据结构。倒序索引在“内容”和存放内容的“位置”之间的映射,其目的在于快速全文索引和使用最小处理代价将新文件添加进数据库。通过倒序索引,可以快速根据“内容”查到包含它的文件。这种数据结构被广泛使用在搜索引擎中,倒排索引有两种不同的索引形式:
用户1413827
2023/11/28
1.3K0
Elasticsearch文档和映射
在Elasticsearch的说法中,文档是序列化的JSON数据。在典型的ELK设置中,当您发送日志或度量标准时,它通常会发送到Logstash,Logstash按照Logstash配置的定义进行格式化,变异处理和以其他方式处理数据。生成的JSON在Elasticsearch中编制索引。
February
2018/11/08
1.9K0
Elasticsearch: Reindex接口
在我们开发的过程中,我们有很多时候需要用到 Reindex 接口。它可以帮我们把数据从一个 index 到另外一个 index 进行重新reindex。这个对于特别适用于我们在修改我们数据的 mapping 后,需要重新把数据从现有的 index 转到新的 index 建立新的索引,这是因为我们不能修改现有的 index 的 mapping 一旦已经定下来了。在接下来的介绍中,我们将学习如何使用 reindex 接口。
腾讯云大数据
2020/09/25
1.2K0
Elasticsearch: Reindex接口
Elasticsearch 8.X 检索实战调优锦囊 001
可以考虑用 filter “包裹一层”,如处理时间范围检索,Elasticsearch 能缓存部分结果。但,要说明的是更换时间窗口,换不同时间段检索,原有缓存不起作用。
铭毅天下
2022/09/26
1.3K0
Elasticsearch 8.X 检索实战调优锦囊 001
Elasticsearch:Index 生命周期管理入门
如果你要处理时间序列数据,则不想将所有内容连续转储到单个索引中。 取而代之的是,您可以定期将数据滚动到新索引,以防止数据过大而又缓慢又昂贵。 随着索引的老化和查询频率的降低,您可能会将其转移到价格较低的硬件上,并减少分片和副本的数量。
腾讯云大数据
2020/10/09
4K1
Elasticsearch:Index 生命周期管理入门
[转]Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex
在使用 Elasticsearch 的时候,总会有需要修改索引映射的时候,遇到这种情况,我们只能做 _reindex。 事实上,这是一项相当昂贵的操作,因为根据数据量和分片数量,完成索引的完整复制可能需要长达几个小时的时间。
保持热爱奔赴山海
2024/05/08
3400
推荐阅读
相关推荐
Elasticsearch探索: Reindex API
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验