Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex

这篇具有很好参考价值的文章主要介绍了Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现零停机、高效率和成功迁移更新的指南。更多阅读:Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引 reindex 你的数据。

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

在使用 Elasticsearch 的时候,总会有需要修改索引映射的时候,遇到这种情况,我们只能做 _reindex。 事实上,这是一项相当昂贵的操作,因为根据数据量和分片数量,完成索引的完整复制可能需要长达几个小时的时间。

花费的时间并不是一个大问题,但更严重的是,它会影响生产环境的性能甚至功能。

相信大家都明白,数据迁移会消耗大量的硬盘资源,肯定会影响性能,但是功能呢?

我们以常规的 _reindex 为例。 假设我们在索引上创建了一个别名。 如果我们没有别名,我们就有大麻烦了。

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

常规 _reindex 过程分为两个步骤。

  1. 调用 _reindex 命令开始数据迁移。
  2. 数据迁移完成后,调用 _aliases 命令进行新旧索引切换。

步骤 2 之后,新索引正式运行,并将负责所有读写请求。 然而,这只是一个完美的理想场景,事实上,事情不会那样发展。

下面是一个正常的场景。

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

实际上,在数据迁移期间或者切换别名之前,客户端会不断向原来的索引写入数据,而这些新的变化并不会迁移到新的索引中,从而导致数据不一致。

对于客户端来说,感觉是更改别名后,刚才所做的所有更改都会消失。 此外,正如我刚才提到的,一个大的索引迁移可能需要几个小时,所以客户的感受一定是显而易见的。

那么该怎么办?

Reindex 的正确流程

上述流程对原始流程进行了两处更改。

  1. _reindex 必须使用外部类型(external type)
  2. 切换别名后再次需要 _reindex。

我们来解释一下外部类型的概念。

默认情况下,_reindex 是内部的,这种数据迁移是通过使用原始索引覆盖新索引来完成的,并删除文档的 _version,因此新索引中的所有文档重新开始。

如果使用外部类型,则数据迁移时文档的 _version 会被带入新索引,那么如果新旧索引的 _id 冲突,则会比较 _version。 只有当原始文档的版本大于目标文档时才会被覆盖。

有点抽象? 让我们举个例子。

假设原始索引有一个如下所示的文档,Elasticsearch 元数据位于下划线开头。

PUT test/_doc/1
{
  "data": "Hello Elastic"
}

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

{
    "_id": "1",
    "_version": 1,
    "data": "Hello Elastic"
}

我们再次运行上面的命令一次以使得它的版本号码变为 2:

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

假如我们使用如下的命令来进行 reindex:

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_reindexed"
  }
}

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

我们查看 test_reindexed 的内容:

GET test_reindexed/_doc/1

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

从上面的输出中,我们可以看出来无论之前的 version 号码是多少,在 reindex 之后,它的版本在新的索引中是 1,也即回到最初的版本。

上面的命令是 reindex 在默认时的表现。它相当于如下的命令格式:

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_reindexed",
    "version_type": "internal"
  }
}

在进行迁移的时候,我们可以把  version_type 设置为 external。那么它的命令格式是这样的:

DELETE test_reindexed

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_reindexed",
    "version_type": "external"
  }
}

运行完上面的命令后,我们可以查看 test_reindexd 里的数据:

GET test_reindexed/_doc/1

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

从上面的结果中,我们可以看出来,在新的索引中,它的 version 不再是之前 version_type 为 internal 时的情况。它的版本号现在是 2,而不是之前的 1。

当我们进行外部数据迁移时,_version: 2 也会被写入到新索引中。 如果有人在数据迁移期间将原始文档更改为 Hello Search,那么完整的文档将如下所示。

PUT test/_doc/1
{
  "data": "Hello Search"
}

那么,ID 为 1 的文档的版本会变为 3.

{
    "_id": "1",
    "_version": 3,
    "data": "Hello Search"
}

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

重做 _reindex 将发现 3 > 3,因此它将被 Hello Search 覆盖。

我们再次重新进行 reindex,我们会发现由于 _version 的值变为 3,它是大于 test_reindexed 索引中的版本号码 2:

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_reindexed",
    "version_type": "external"
  }
}

我们再次查看最新的文档的值:

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

从上面的过程中,我们可以看出来:如果在迁移的过程中,或者我们再次运行 reindex,如果 test 中的值有变化,那么再次运行 reindex 后,它的值也会被更新到新的索引中。

那么,如果第二个 _reindex 有人修改了新索引中的文档怎么办? 例如,如果有人在新索引中将 Hello Elatic 更改为 Hello Elasticsearch,是否会被旧值覆盖? 整个过程如下所示。

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

答案是否定的,因为原始版本必须大于要覆盖的新版本才可以覆盖。

我们可以做如下的练习:

我们把 test_reindexed 中的文档的值修改为 Hello Elasticsearch:

PUT test_reindexed/_doc/1
{
  "data": "Hello Elasticsearch"
}

我们可以通过如下命令来查看它的值:

GET test_reindexed/_doc/1

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

我们再次确认 test 中的版本号码:

GET test/_doc/1

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

我们可以看到它们的版本号码是一致的。我们运行如下的 reindex:

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_reindexed",
    "version_type": "external"
  }
}

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

很显然,由于 test 文档中版本号要低于 test_reindexed 中的版本号,那么我们的文档不会被更新。

还有一个问题。

虽然我们会进行第二次 _reindex 来修补数据,但是如果修补时间很长,对于用户来说仍然会不一致。比如,在我们第一次的时候有多次更新,从而使得 test 中的 version 号码比较高。在切换之后,在 test_reindexed 中的文档更新过一次。那么在第二次 reindex 的过程中极有可能把 test 中的文档覆盖最新的数据中,从而造成数据的丢失。

有两种方法可以缩短重新索引时间。

  1. 尽可能减少第一次 _reindex 的时间。
  2. 提前过滤补丁数据。

关于第一点,_reindex 过程是由 Elasticsearch 控制的,我们还能做些什么来提高效率呢? 嘿,有。

我们可以修改新索引的设置,以尽量减少数据迁移过程中的 IO 开销。

refresh_interval = -1
number_of_replicas = 0

这非常简单。 首先,关闭 refresh_interval 的目的是让数据迁移期间只专注于写入 Translog,而不是在 Lucene 上花费额外的磁盘 IO。

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索,数据库

其次,关闭 number_of_replicas 可以减少集群必须处理的额外数据复制开销。

另一方面,除了减少第一次 _reindex 的时间之外,还可以通过一些数据过滤来减少第二次 _reindex 的数据量。

例如,在 _reindex 期间引入数据的最后更新时间是一种可能的解决方案。 假设每个文档都有一个 updated_at 字段,那么在 _reindex 的查询中添加以下条件就会有效。

{
    "range": {
        "updated_at": { "gte": "now-1d"}
    }
}

结论

基于上述细节,让我们列出重建索引的理想流程。

  1. 创建目标索引。
  2. 更新目标索引的设置。 (refresh_interval = -1 且 number_of_replicas = 0)
  3. 使用外部类型进行 _reindex。
  4. 将别名从原始索引切换到目标索引。
  5. 使用外部类型再次执行 _reindex,最好进行额外的过滤。
  6. 再次更新目标索引设置。 (refresh_interval = null 且 number_of_replicas = null)

根据官方文档,设置为 null 可以恢复原来的设置。

因为 _reindex 是不可避免的,所以了解如何在不停机的情况下执行 _reindex 很重要。

事实上,利用 Elasticsearch 的流式索引,有更优雅的方法来完成它。 然而,流式索引的用例有很多限制,因此在实践中更常见的是使用常规索引。

本文提供了一个完整的过程来尽可能快地执行 _reindex 并最大限度地减少数据不一致的时间。 然而,所有这些都假设别名已正确创建,如果没有正确创建,则需要更多额外的步骤。 我觉得缺少别名已经违反了 Elasticsearch 的最佳实践,因此本文不会专门讨论这种情况。文章来源地址https://www.toymoban.com/news/detail-766637.html

到了这里,关于Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在不启动Unity引擎的情况下修改默认打开的场景Scene

    当上次关闭Unity前打开了一个不经常用的但是又比较大的Scene,重新打开Unity时会重新加载这个默认场景,可能会比较耗时,如果开发者想要快速打开项目并且不想打开这个Scene,这个时候我们可以通过修改配置文件来达到修改Unity默认打开的场景: 在项目工程路径下找到 Lib

    2024年02月12日
    浏览(41)
  • 如何在不使用任何软件的情况下将 PDF 转换为 Excel

    通常,您可能会遇到这样的情况:您需要的数据不在 Excel 工作表中,而是以数据表形式出现在 PDF 文件中。为了将此数据放入 Excel 工作表中,如果您尝试将数字复制并粘贴到电子表格中,则列/行将无法正确复制和对齐。因此,如果您想使用该表进行任何类型的分析,则无需

    2024年02月11日
    浏览(43)
  • SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?

    前段时间看到群友讨论压缩包能不能运行,想起了n年前用自解压文件SFX实现的一个“需求”:在没有安装任何应用软件的Windows(当时还要支持XP)上能双击打开自定义格式的文件。当时第一反应是这“需求”太奇葩了,简直是不可能。但思考后认为这个“需求”存在一定的合

    2024年02月05日
    浏览(58)
  • [ Azure - VM ] 如何在不删除配置的情况下重新部署VM虚拟机

    本文会介绍在Azure cloud中如何进行重新部署虚拟机。 一般可以解决:连接虚拟机出现问题、VM出现卡在失败状态等疑难杂症。 重新部署 VM 时,Azure 将关闭虚拟机, 将 VM 移动到 Azure 基础结构中的新节点 ,然后重新启用它,同时 保留所有配置选项和相关资源 。 注意:重新部

    2024年02月06日
    浏览(84)
  • 【Elasticsearch】小白实战!ES使用Reindex迁移数据

    文章有点长,如果你想认真阅读,建议到我语雀文档上观看,格式友好 - ES 迁移工作 最近有一个需求是需要我负责将服务器A里的 ES 数据迁移到服务器B上,但是由于环境不通,所以就先在公司的测试环境和我本地上进行测试,因为之前没有接触过 ES 数据的迁移,所以上手时

    2024年02月05日
    浏览(42)
  • 【鼠标在不点击的情况下,直接移动到QT控件上不显示提示信息】

      当你想用图标作为按钮时,为了让用户知道按钮的功能,这时候就会在QT控件上加上提示信息,在初始化时,使用QT自带的 setToolTip 方法即可: 但有时明明已经调用了 setToolTips 方法,鼠标移动到QT控件上仍然不会有提示信息,这时候就需要具体分析下 setToolTips 方法是如何

    2024年02月10日
    浏览(40)
  • 【用Percona Toolkit给mysql大表在不锁表的情况下建索引】

    共分为两步骤: 配置仓库 安装文档1 安装 安装文档2 由于mysql8默认使用的是caching_sha2_password,认证方式,而Percona Toolkit在centos7中使用的perl-dbd-mysql版本目前是4.023,暂时不支持这种认证方式,因此需要在mysql中新建一个以mysql_native_password认证的用户 建立索引 根据提示输入密码

    2024年02月07日
    浏览(39)
  • Elasticsearch 8.X reindex 源码剖析及提速指南

    为方便大家验证,这里给出 reindex github 源码地址。 https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java reindex 常见问题: reindex 操作的本质是从一个或多个源索引中读取文档,并将这些文档索引到一个目标

    2024年02月09日
    浏览(34)
  • 如何在不使用脚本和插件的情况下手动删除 3Ds Max 中的病毒?

    如何加快3D项目的渲染速度? 3D项目渲染慢、渲染卡顿、渲染崩溃, 本地硬件配置不够,想要加速渲染,在不增加额外的硬件成本投入的情况下,最好的解决方式是使用 渲云云渲染 ,在云端批量渲染,批量出结果,maya可分块渲染,享受高配置、高内存、高性能服务器带来极

    2024年02月14日
    浏览(47)
  • SpringBoot(11)AOP切入方法在不改变Controller任何代码的情况下获取额外参数

    有一个Controller的方法addw(int name){},返回值为void,映射路径是/addw,前端传入的参数有name、id、age,现在希望在不改变Controller的方法的前提下,使用AOP切入一个新的方法addall(),此时,addall方法可以获取的参数为name,有没有什么办法,在不改变Controller任何代码的情况下获取到

    2024年02月01日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包