2

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

这是我有某些疑问的地方?

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

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

  3. 为什么我们在引导服务器属性中给出多个节点地址详细信息一个地址是否足够?

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

4

2 回答 2

3
  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不保存主题 2的任何数据)。

主题,应该replication-factor大于 1(通常是 2 或 3),这样当一个代理宕机时,另一个可以为主题的数据提供服务。例如,假设我们有一个包含 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失败了。代理 1和 3 仍然可以为主题 1 提供数据。因此,a replication-factorof 3 始终是一个好主意,因为它允许一个代理因维护目的而被关闭,也允许另一个代理意外关闭。因此,Apache-Kafka 提供了强大的持久性和容错保证。

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

于 2020-04-14T08:25:03.217 回答
1

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

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

broker.rack:代理的机架。这将用于机架感知复制分配以实现容错。例子:RACK1, us-east-1d

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

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

为什么我们在引导服务器属性中给出多个节点地址详细信息一个地址是否足够?

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

于 2020-04-14T08:42:59.063 回答