跨集群复制

编辑

使用跨集群复制,您可以跨集群复制索引以

  • 在数据中心发生故障时继续处理搜索请求
  • 防止搜索量影响索引吞吐量
  • 通过在靠近用户的地理位置处理搜索请求来降低搜索延迟

跨集群复制使用主动-被动模型。您向leader 索引编制索引,数据被复制到一个或多个只读的follower 索引。在将 follower 索引添加到集群之前,必须配置包含 leader 索引的远程集群

当 leader 索引收到写入时,follower 索引从远程集群上的 leader 索引拉取更改。您可以手动创建 follower 索引,或配置自动跟随模式以自动为新的时间序列索引创建 follower 索引。

您可以以单向或双向设置配置跨集群复制集群

  • 在单向配置中,一个集群仅包含 leader 索引,另一个集群仅包含 follower 索引。
  • 在双向配置中,每个集群都包含 leader 和 follower 索引。

在单向配置中,包含 follower 索引的集群必须运行与远程集群相同或更新版本的 Elasticsearch。如果版本更新,则版本也必须如以下矩阵中所述兼容。

版本兼容性矩阵

本地集群

远程集群

5.0–5.5

5.6

6.0–6.6

6.7

6.8

7.0

7.1–7.16

7.17

8.0–8.16

5.0–5.5

Yes

Yes

No

No

No

No

No

No

No

5.6

Yes

Yes

Yes

Yes

Yes

No

No

No

No

6.0–6.6

No

Yes

Yes

Yes

Yes

No

No

No

No

6.7

No

Yes

Yes

Yes

Yes

Yes

No

No

No

6.8

No

Yes

Yes

Yes

Yes

Yes

Yes

Yes

No

7.0

No

No

No

Yes

Yes

Yes

Yes

Yes

No

7.1–7.16

No

No

No

No

Yes

Yes

Yes

Yes

No

7.17

No

No

No

No

Yes

Yes

Yes

Yes

Yes

8.0–8.16

No

No

No

No

No

No

No

Yes

Yes

多集群架构

编辑

使用跨集群复制在 Elastic Stack 中构建多个多集群架构

  • 灾难恢复,以防主集群发生故障,辅助集群充当热备份
  • 数据本地性,以维护靠近应用程序服务器(和用户)的数据集的多个副本,并减少代价高昂的延迟
  • 集中式报告,用于最小化查询多个地理分布式 Elasticsearch 集群时的网络流量和延迟,或通过将搜索卸载到辅助集群来防止搜索负载干扰索引

观看跨集群复制网络研讨会,以了解有关以下用例的更多信息。然后,在您的本地机器上设置跨集群复制,并完成网络研讨会中的演示。

在所有这些用例中,您必须独立地为每个集群配置安全。在为灾难恢复配置跨集群复制时,不会复制安全配置。为了确保 Elasticsearch security 功能状态得到备份,定期进行快照。然后,您可以从安全配置中恢复本机用户、角色和令牌。

灾难恢复和高可用性

编辑

灾难恢复为您的关键任务应用程序提供容忍数据中心或区域故障的能力。此用例是跨集群复制最常见的部署方式。您可以配置不同架构中的集群以支持灾难恢复和高可用性

单个灾难恢复数据中心
编辑

在此配置中,数据从生产数据中心复制到灾难恢复数据中心。由于 follower 索引复制了 leader 索引,因此如果生产数据中心不可用,您的应用程序可以使用灾难恢复数据中心。

Production datacenter that replicates data to a disaster recovery datacenter
多个灾难恢复数据中心
编辑

您可以将数据从一个数据中心复制到多个数据中心。此配置提供灾难恢复和高可用性,确保如果主数据中心关闭或不可用,数据将在两个数据中心中复制。

在下图中,来自数据中心 A 的数据被复制到数据中心 B 和数据中心 C,它们都具有来自数据中心 A 的 leader 索引的只读副本。

Production datacenter that replicates data to two other datacenters
链式复制
编辑

您可以跨多个数据中心复制数据以形成复制链。在下图中,数据中心 A 包含 leader 索引。数据中心 B 从数据中心 A 复制数据,数据中心 C 从数据中心 B 中的 follower 索引复制数据。这些数据中心之间的连接形成了链式复制模式。

Three datacenters connected to form a replication chain
双向复制
编辑

双向复制设置中,所有集群都可以访问查看所有数据,并且所有集群都有一个索引可以写入,而无需手动实现故障转移。应用程序可以写入每个数据中心内的本地索引,并跨多个索引读取以全局查看所有信息。

当集群或数据中心不可用时,此配置不需要任何手动干预。在下图中,如果数据中心 A 不可用,您可以继续使用数据中心 B,而无需手动故障转移。当数据中心 A 重新上线时,集群之间的复制将恢复。

Bi-directional configuration where each cluster contains both a leader index and follower indices

此配置对于仅索引的工作负载特别有用,在这些工作负载中,不会发生对文档值的更新。在此配置中,Elasticsearch 编制索引的文档是不可变的。客户端位于每个数据中心以及 Elasticsearch 集群旁边,并且不与不同数据中心的集群通信。

数据本地性

编辑

将数据靠近您的用户或应用程序服务器可以减少延迟和响应时间。此方法也适用于在 Elasticsearch 中复制数据时。例如,您可以将产品目录或参考数据集复制到全球 20 个或更多数据中心,以最大程度地减少数据和应用程序服务器之间的距离。

在下图中,数据从一个数据中心复制到另外三个数据中心,每个数据中心都在其自己的区域。中央数据中心包含 leader 索引,其他数据中心包含 follower 索引,这些索引复制该特定区域中的数据。此配置使数据更靠近访问它的应用程序。

A centralized datacenter replicated across three other datacenters

集中式报告

编辑

当跨大型网络查询效率低下时,使用集中式报告集群非常有用。在此配置中,您将数据从许多较小的集群复制到集中式报告集群。

例如,一家大型全球银行可能在全球拥有 100 个 Elasticsearch 集群,这些集群分布在每个银行分支机构的不同区域。使用跨集群复制,银行可以将来自所有 100 家银行的事件复制到中央集群,以在本地分析和聚合事件以进行报告。银行无需维护镜像集群,而是可以使用跨集群复制来复制特定索引。

在下图中,来自不同区域三个数据中心的数据被复制到集中式报告集群。此配置使您能够将数据从区域中心复制到中央集群,您可以在其中本地运行所有报告。

Three clusters in different regions sending data to a centralized reporting cluster for analysis

复制机制

编辑

尽管您在索引级别设置跨集群复制,但 Elasticsearch 在分片级别实现复制。创建 follower 索引时,该索引中的每个分片都会从 leader 索引中相应的分片拉取更改,这意味着 follower 索引的分片数量与其 leader 索引相同。leader 上的所有操作都将由 follower 复制,例如创建、更新或删除文档的操作。这些请求可以从 leader 分片的任何副本(主分片或副本)提供服务。

当 follower 分片发送读取请求时,leader 分片将响应任何新的操作,受配置 follower 索引时建立的读取参数的限制。如果没有任何新的操作可用,leader 分片将等待配置的超时时间以获取新的操作。如果超时时间到期,leader 分片将响应 follower 分片,表明没有新的操作。follower 分片更新分片统计信息并立即向 leader 分片发送另一个读取请求。此通信模型确保远程集群和本地集群之间的网络连接持续使用,避免被外部来源(如防火墙)强制终止。

如果读取请求失败,将检查失败的原因。如果确定失败的原因是可恢复的(例如网络故障),则 follower 分片将进入重试循环。否则,follower 分片将暂停直到您恢复它

处理更新

编辑

您不能手动修改 follower 索引的映射或别名。要进行更改,必须更新 leader 索引。由于 follower 索引是只读的,因此在所有配置中都拒绝写入。

尽管对 leader 索引上的别名的更改会复制到 follower 索引,但写入索引会被忽略。follower 索引无法接受直接写入,因此,如果任何 leader 别名将 is_write_index 设置为 true,则该值将强制为 false

例如,您在数据中心 A 中编制名为 doc_1 的文档的索引,该文档会复制到数据中心 B。如果客户端连接到数据中心 B 并尝试更新 doc_1,则请求将失败。要更新 doc_1,客户端必须连接到数据中心 A 并更新 leader 索引中的文档。

当 follower 分片从 leader 分片接收操作时,它会将这些操作放入写入缓冲区。follower 分片使用写入缓冲区中的操作提交批量写入请求。如果写入缓冲区超过其配置的限制,则不会发送其他读取请求。此配置对读取请求提供背压,允许 follower 分片在写入缓冲区不再满时恢复发送读取请求。

要管理如何从 leader 索引复制操作,您可以在创建 follower 索引时配置设置。

leader 索引上的索引映射中的更改将尽快复制到 follower 索引。此行为也适用于索引设置,但某些特定于 leader 索引的设置除外。例如,更改 leader 索引上的副本数量不会由 follower 索引复制,因此可能无法检索该设置。

如果您对 leader 索引应用 follower 索引所需的非动态设置更改,则 follower 索引将关闭自身,应用设置更新,然后重新打开自身。在此循环期间,follower 索引无法读取,也无法复制写入。

使用远程恢复初始化 follower

编辑

创建跟随者索引后,在它完全初始化之前无法使用。远程恢复过程通过从领导者集群中的主分片复制数据,在跟随者节点上构建分片的新副本。

Elasticsearch 使用此远程恢复过程,利用领导者索引中的数据引导跟随者索引。即使由于 Lucene 分段合并导致领导者上没有完整的更改历史记录,此过程仍会为跟随者提供领导者索引当前状态的副本。

远程恢复是一个网络密集型过程,它会将所有 Lucene 分段文件从领导者集群传输到跟随者集群。跟随者请求在领导者集群中的主分片上启动恢复会话。然后,跟随者会并发地从领导者请求文件块。默认情况下,此过程会并发请求五个 1MB 的文件块。此默认行为旨在支持领导者和跟随者集群之间网络延迟较高的场景。

您可以修改动态的远程恢复设置,以限制传输数据的速率并管理远程恢复消耗的资源。

在包含跟随者索引的集群上使用恢复 API,以获取有关正在进行的远程恢复的信息。由于 Elasticsearch 使用快照和恢复基础架构实现远程恢复,因此在恢复 API 中,正在运行的远程恢复被标记为类型snapshot

复制领导者需要软删除

编辑

跨集群复制的工作原理是重放对领导者索引分片执行的单个写入操作的历史记录。Elasticsearch 需要保留这些操作的历史记录,以便跟随者分片任务可以提取它们。用于保留这些操作的基础机制是软删除

每当删除或更新现有文档时,就会发生软删除。通过将这些软删除保留到可配置的限制,可以在领导者分片上保留操作的历史记录,并在其重放操作历史记录时提供给跟随者分片任务。

index.soft_deletes.retention_lease.period 设置定义了在将分片历史记录保留租约视为过期之前保留它的最长时间。此设置决定了包含跟随者索引的集群可以脱机多长时间,默认为 12 小时。如果分片副本在其保留租约过期后恢复,但领导者索引上仍然存在丢失的操作,则 Elasticsearch 将建立一个新的租约并复制丢失的操作。但是,Elasticsearch 无法保证保留未租用的操作,因此丢失的一些操作也可能已被领导者丢弃,现在完全不可用。如果发生这种情况,则跟随者无法自动恢复,因此您必须重新创建它

对于要用作领导者索引的索引,必须启用软删除。在 Elasticsearch 7.0.0 或更高版本上创建的新索引上,默认情况下启用了软删除。

跨集群复制不能用于使用 Elasticsearch 7.0.0 或更早版本创建的现有索引(其中禁用了软删除)。您必须重新索引您的数据到一个启用了软删除的新索引中。

使用跨集群复制

编辑

以下部分提供了有关如何配置和使用跨集群复制的更多信息。

跨集群复制限制

编辑

跨集群复制旨在仅复制用户生成的索引,并且目前不复制以下任何内容。

如果要复制任何此数据,则必须手动将其复制到远程集群。

可搜索快照 索引的数据存储在快照存储库中。即使这些索引在 Elasticsearch 节点上部分或完全缓存,跨集群复制也不会完全复制这些索引。要在远程集群中实现可搜索快照,请在远程集群上配置快照存储库,并使用本地集群中的相同索引生命周期管理策略将数据移动到远程集群上的冷或冻结层。