Apache Kafka:镜像与复制

Tan*_*nay 5 replication distributed-computing mirroring apache-kafka

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

Replication如果Mirroring已经设置,是否有任何特定用途?

Mar*_*kon 4

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

文档中所述,

Kafka中添加复制的目的是为了更强的持久性和更高的可用性。我们希望保证任何成功发布的消息都不会丢失并且可以被使用,即使服务器出现故障。此类故障可能是由机器错误、程序错误或更常见的软件升级引起的。我们有以下高级目标:

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

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

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

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

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