刚接触 Elasticsearch 吗?欢迎参加我们的 Elasticsearch 入门网络研讨会。您也可以开始免费云服务试用,或立即在您的计算机上试用 Elastic。
当你想升级 Elasticsearch 集群时,有时创建一个新的、独立的集群并将数据从旧集群转移到新集群会更容易。这样做的好处是,用户可以在新的集群上测试其所有数据和配置以及所有应用程序,而不会有任何停机或数据丢失的风险。
这种方法的缺点是需要一些重复的硬件,在试图顺利传输和同步所有数据时可能会造成困难。
如果需要将应用程序从一个数据中心迁移到另一个数据中心,也可能需要执行类似的程序。
本文将讨论并详细介绍在 Elasticsearch 集群之间传输数据的三种方法。
如何在 Elasticsearch 集群之间迁移数据?
在 Elasticsearch 集群之间传输数据有 3 种方法:
使用快照通常是最快速、最可靠的数据传输方法。不过,请记住,您只能将快照还原到相同或更高版本的群集上,而不能还原到相差一个主版本以上的群集上。这意味着您可以将 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 快得多,因此可以在传输快照时短暂暂停更新,以完全避免问题。




