Apache Kafka:镜像与复制

Apache Kafka: Mirroring vs. Replication

Mirroring 是在 Kafka 集群之间复制数据,而 Replication 是在 Kafka 集群内复制节点。

如果已经设置了MirroringReplication有什么具体的用途吗?

它们用于不同的用例。让我们试着澄清一下。

documentation

中所述

The purpose of adding replication in Kafka is for stronger durability and higher availability. We want to guarantee that any successfully published message will not be lost and can be consumed, even when there are server failures. Such failures can be caused by machine error, program error, or more commonly, software upgrades. We have the following high-level goals:

集群内部可能存在网络分区(单个服务器故障等),因此我们希望在节点之间提供复制。给定三个节点和一个集群的设置,如果 server1 发生故障,Kafka 可以从两个副本中进行选择。相同的集群意味着 相同的响应时间 (好吧,当然,这也取决于这些服务器的配置方式,但在正常情况下它们不应该相差太多)。

另一方面,镜像似乎非常有价值,例如,当您正在迁移数据中心时,或者当您有多个数据中心时(例如,美国的 AWS 和爱尔兰的 AWS)。当然,这些只是几个用例。因此,您在这里所做的是为属于同一数据中心的应用程序提供一种更快、更好的访问数据的方式——在某些情况下,数据局部性就是一切。

如果您在每个集群中有一个节点,万一发生故障,您可能会有更长的响应时间,比方说,从位于爱尔兰的 AWS 到美国的 AWS。

您可能会声称,为了实现数据局部性(集群一中的服务从集群一中的 kafka 中读取),仍然需要将数据从一个集群复制到另一个集群。这绝对是真的,但是使用镜像获得的优势可能比直接从位于另一个数据中心的 Kafka 读取(通过 SSH 隧道?)获得的优势更高,例如单个连接中断,客户端 connection/session时间更长(取决于数据中心的位置)、立法(一些数据可以在一个国家/地区收集,而另一些数据不应该)。

复制是更高可用性的基础。在数据局部性很重要的上下文中,您不应该使用镜像来处理高可用性。同时,你不应该在需要跨数据中心复制数据的地方只使用复制(我什至不知道你是否可以没有 Mirroring/an ssh 隧道)。