如何在不同版本的 Elasticsearch& 集群之间迁移数据

探索在 Elasticsearch 版本和集群之间传输数据的方法。

刚接触 Elasticsearch 吗?欢迎参加我们的 Elasticsearch 入门网络研讨会。您也可以开始免费云服务试用,或立即在您的计算机上试用 Elastic。

当你想升级 Elasticsearch 集群时,有时创建一个新的、独立的集群并将数据从旧集群转移到新集群会更容易。这样做的好处是,用户可以在新的集群上测试其所有数据和配置以及所有应用程序,而不会有任何停机或数据丢失的风险。

这种方法的缺点是需要一些重复的硬件,在试图顺利传输和同步所有数据时可能会造成困难。

如果需要将应用程序从一个数据中心迁移到另一个数据中心,也可能需要执行类似的程序。

本文将讨论并详细介绍在 Elasticsearch 集群之间传输数据的三种方法。

如何在 Elasticsearch 集群之间迁移数据?

在 Elasticsearch 集群之间传输数据有 3 种方法:

  1. 从远程群集重新编排索引
  2. 使用快照传输数据
  3. 使用 Logstash 传输数据

使用快照通常是最快速、最可靠的数据传输方法。不过,请记住,您只能将快照还原到相同或更高版本的群集上,而不能还原到相差一个主版本以上的群集上。这意味着您可以将 6.x 快照还原到 7.x 群集上,但不能还原到 8.x 群集上。

如果需要增加一个以上的主要版本,则需要重新索引或使用 Logstash。

现在,让我们分别详细了解在 Elasticsearch 集群之间传输数据的三个选项。

1.从远程群集重新索引数据

在开始重新索引之前,请记住您需要为新群集上的所有索引设置适当的映射。为此,您必须使用适当的映射直接创建索引,或者使用索引模板。

从远程重新索引 - 需要配置

要从远程重新索引,应将以下配置添加到接收数据的群集的 elasticseearch.yml 文件中,在 Linux 系统中,该文件通常位于此处:/etc/elasticsearch/elasticsearch.yml。要添加的配置如下:

如果使用 SSL,则应将 CA 证书添加到每个节点,并在 elasticsearch.yml 中每个节点的命令中包含以下内容:

或者,也可以在所有 Elasticsearch 节点上添加下面一行,以禁用 SSL 验证。不过,由于这种方法不如前一种方法安全,因此不太推荐使用:

您需要在每个节点上进行这些修改,并进行滚动重启。有关如何操作的详细信息,请参阅我们的指南

重编索引命令

在 elasticsearch.yml 文件中定义远程主机,并在必要时添加 SSL 证书后,就可以使用下面的命令开始重新索引数据了:

在此过程中,您可能会遇到超时错误,因此最好为超时设置宽松的值,而不是依赖默认值。

现在,让我们来看看从远程重新索引时可能会遇到的其他一些常见错误。

从远程重新索引时的常见错误

1.重新索引未列入白名单

如果遇到此错误,则表明您没有按照上文所述在 Elasticsearch 中定义远程主机 IP 地址或节点名称 DNS,或者忘记重启 Elasticsearch 服务。

要解决 Elasticsearch 集群的问题,需要将远程主机添加到所有 Elasticsearch 节点,并重新启动 Elasticsearch 服务。

2.SSL 握手异常

这个错误说明,你忘记按上文所述在 elasticsearch.yml 中添加 reindex.ssl.certificate_authorities。加进去:

2.使用快照传输数据

请记住,如上所述,您只能将快照还原到相同或更高版本的群集上,而不能还原到相差一个主要版本以上的群集上。

如果需要增加一个以上的主要版本,则需要重新索引或使用 Logstash。

通过快照传输数据需要以下步骤:

步骤 1.将版本库插件添加到第一个 Elasticsearch 群集--为了通过快照在群集间传输数据,需要确保新旧群集都能访问版本库。AWS、Google 和 Azure 等云存储库通常是理想的选择。要拍摄快照,请参阅我们的指南并按照其中描述的步骤操作。

步骤 2.重启 Elasticsearch 服务(滚动重启)。

第 3 步为第一个 Elasticsearch 集群创建一个存储库。

步骤 4- 将版本库插件添加到第二个 Elasticsearch 集群。

第 5 步--向第二个 Elasticsearch 集群添加只读版本库--您需要重复创建第一个 Elasticsearch 集群的相同步骤来添加版本库。

重要提示:将第二个 Elasticsearch 集群连接到同一个 AWS S3 存储库时,应将存储库定义为只读存储库:

这一点很重要,因为你要防止在同一个快照存储库中出现混合 Elasticsearch 版本的风险。

第 6 步 - 将数据还原到第二个 Elasticsearch 群集 - 采取上述步骤后,您可以还原数据并将其传输到新的群集。请按照本文所述步骤将数据恢复到新群集。

3.使用 Logstash 传输数据

在开始使用 logstash 传输数据之前,请记住您需要为新群集上的所有索引设置适当的映射。为此,您需要直接创建索引或使用索引模板。

要在两个 Elasticsearch 集群之间传输数据,可以设置一个临时 Logstash 服务器,并用它在两个集群之间传输数据。对于小型集群,2GB 内存的实例就足够了。对于较大的集群,可以使用配备 8GB 内存的四核 CPU。

有关安装 Logstash 的指导,请参阅此处

将数据从一个群集传输到另一个群集的 Logstash 配置

将单个索引从群集 A 复制到群集 B 的基本配置是

对于安全的 elasticsearch,可以使用下面的配置:

索引元数据

上述命令将写入一个命名索引。如果要传输多个索引并保留索引名称,则需要在 Logstash 输出中添加以下一行:

此外,如果您想保留文件的原始 ID,则需要添加:

请注意,设置文档 ID 会大大降低数据传输的速度,因此只有在必要时才保留原始 ID。

同步更新

上述所有方法都需要相对较长的时间,您可能会发现在等待过程完成时,原始群集中的数据已被更新。

有多种策略可以同步数据传输过程中可能发生的任何更新,在开始这一过程之前,你应该考虑一下这些问题。您尤其需要考虑

  • 您有什么方法来识别自数据传输过程开始以来已更新/添加的任何数据(例如,数据中的 "最后更新时间 "字段)?
  • 您可以使用什么方法来传输最后一个数据?
  • 是否存在记录重复的风险?通常会有,除非您使用的方法在重新索引时将文档 ID 设置为已知值)。

下文介绍了实现同步更新的不同方法。

1.使用排队系统

有些摄取/更新系统使用队列,可以 "重放 "过去 x 天内收到的数据修改。这可以为同步任何更改提供一种手段。

2.从远程重新索引

对 "last_update_time"> x 天前的所有项目重复重新索引过程。您可以在重新索引请求中添加一个 "查询 "参数。

3.Logstash

在 Logstash 输入中,可以添加一个查询来过滤所有 "last_update_time"> x 天前的项目。不过,除非设置了 document_id,否则这一过程会导致非时间序列数据出现重复。

4.快照

不可能只恢复索引的一部分,因此必须使用上述其他数据传输方法之一(或脚本)来更新数据传输过程后发生的任何更改。

不过,快照恢复比重新索引/Logstash 快得多,因此可以在传输快照时短暂暂停更新,以完全避免问题。

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用