不停止业务的情况下优化 Elasticsearch Reindex

在使用 Elasticsearch 时,我们总有需要修改索引映射的时候,这时我们只能进行 _reindex。事实上,这是一个相当昂贵的操作,因为根据数据量和分片数量,完整复制一个索引可能需要几个小时。

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

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

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

常规的reindex程序分为两个步骤。

1. 调用 _reindex 命令开始数据迁移。
2. 数据迁移完成后,调用 _aliases 命令在新旧索引之间切换。
步骤 2 完成后,新索引正式运行,并将负责所有读写请求。然而,这只是一个完美的理想方案,现实中的情况并非如此。

下面是一种正常情况。

实际上,在数据迁移期间或切换别名之前,客户端会继续向原始索引写入数据,这些新的更改不会迁移到新索引,从而导致数据不一致。

对于客户来说,他们的感觉是在更改别名后,刚才所做的所有更改都会消失。此外,正如我刚才提到的,一次大的索引迁移可能需要几个小时,因此客户的感觉一定很明显。

那么该怎么办呢?

reindex的正确流程

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 16:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 16:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 16:16:02       82 阅读
  4. Python语言-面向对象

    2023-12-29 16:16:02       91 阅读

热门阅读

  1. 前端vue部署nginx多端口文件配置

    2023-12-29 16:16:02       50 阅读
  2. Redis 大/热Key故障处理流程

    2023-12-29 16:16:02       61 阅读
  3. SpringBoot--自定义starter

    2023-12-29 16:16:02       49 阅读
  4. 工作纪实40-使用redis的几种姿势

    2023-12-29 16:16:02       58 阅读
  5. R语言【base】——file.path() 构建文件路径

    2023-12-29 16:16:02       63 阅读