主题分区是否应该跨 Kafka 集群中的所有代理节点进行复制?

Should topic partitions be replicated across all broker nodes in a Kafka cluster?

虽然上面类似的问题都有答案。我的好奇心在于假设 n1-5 个节点在集群中,其中主题 t1 在 n1、n2 和 n3 上,主题 t2 在 n3、n4、n5 上。现在,如果假设 p1 在 t1 中推送消息,c1 从 t1 中消费,类似地,p2 和 c2 消费 t2。

这里是我有疑惑的地方?

  1. 假设节点 n3- n5 全部关闭,现在 p1 和 c1 仍将与集群建立活动连接,这有点无用,因为无论如何发布和消费都会失败。 (指标 connection_count 大于 0 表示存在来自生产者或消费者的集群连接)

  2. 将主题复制到Kafka集群中的所有节点是否正确?

  3. 为什么我们在bootstrap服务器中给出多个节点地址的详细信息属性一个地址就足够了吗?

注意:我是 Kafka 世界的初学者,仍在尝试使用本地设置来发现现实世界中可能出现的潜在问题。

  1. 为什么会失败?节点 n1 和 n2 仍在运行并且 运行 并假设该主题有 replication-factor=3 所有数据应该仍然可以访问。

  2. 我会说这取决于。跨所有节点复制主题不会有什么坏处,但有时它是多余的(尤其是当集群中有大量代理时)。为了获得高可用性,您应该至少设置 replication-factor=3。例如,这允许一个代理被关闭进行维护,而另一个代理意外失败。

  3. bootstrap.servers用于设置Kafka集群的连接。一个地址通常足以访问整个集群,但最好始终提供所有地址,以防其中一台服务器出现故障。请注意,无论 bootstrap.servers 中指定了哪些服务器,客户端(生产者或消费者)都会使用所有代理。


2 个主题的示例(每个主题分别有 3 个和 2 个分区):

经纪人 1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+

经纪人 2:

+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+

经纪人 3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(并且 Broker 3 不包含 topic 2 的任何数据)。

主题,应该有一个 replication-factor > 1(通常是 2 或 3),这样当一个 broker 宕机时,另一个可以提供主题的数据。例如,假设我们有一个包含 2 个分区的主题,其中 replication-factor 设置为 2,如下所示:

经纪人 1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

经纪人 2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+

经纪人 3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

现在假设 Broker 2 失败了。 Broker 1 和 3 仍然可以为主题 1 提供数据。因此 replication-factor of 3 始终是一个好主意,因为它允许为了维护目的而关闭一个 broker还有另一个意外被取消。 因此,Apache-Kafka 提供了强大的持久性和容错保证。

关于领导者的注意事项: 在任何时候,只有一个 broker 可以成为分区的领导者,并且只有该领导者才能接收和提供该分区的数据。其余代理将只同步数据(同步副本)。另请注意,当 replication-factor 设置为 1 时,当代理失败时 leader 无法移动到其他地方。一般情况下,当一个分区的所有副本都失效或下线时,leader会自动设置为-1

Assume nodes n3- n5 are all down, now still p1 and c1 will have active connection to cluster which is kind of useless as anyways publishing and consuming fails. (metric connection_count is greater than 0 means there are connections to cluster from either producer or consumer)

答案: 如果作为您的主题副本的三个代理都已关闭,那么您将无法从该主题中生产或消费。为避免这种情况,建议将代理定位在不同的机架中并在代理配置中提供 broker.rack 信息。

broker.rack: Rack of the broker. This will be used in rack aware replication assignment for fault tolerance. Examples: RACK1, us-east-1d

Is it correct way to replicate a topic to all nodes in a Kafka cluster?

答:这完全取决于您的容错需求。如果您将主题复制到所有 6 个代理,那么您最多可以容忍 5 个代理失败。 (当然 min.insync.replicasacks 配置也很重要。如果副本数为 6,min.insync.replicas=2acks=all 那么您最多可以容忍 4 个代理失败以继续发送消息)

Why do we give multiple node address details in bootstrap server property is one address is sufficient?

回答:bootstrap.servers 配置用于初始连接到 Kafka 集群。是的,一个地址就够了,但是如果这个地址的broker挂了怎么办。您无法连接到集群。所以建议多提供一个地址,避免这种冗余的情况。