【问题标题】:Should topic partitions be replicated across all broker nodes in a Kafka cluster?是否应该在 Kafka 集群中的所有代理节点上复制主题分区?
【发布时间】:2020-07-26 21:59:44
【问题描述】:

尽管有类似上述问题的答案。我的好奇心在于假设 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 世界的初学者,仍在尝试本地设置以发现现实世界中可能发生的潜在问题。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api kafka-producer-api kafka-topic


    【解决方案1】:
    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),这样当一个代理关闭时,另一个可以提供主题的数据。例如,假设我们有一个主题有 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 提供数据。因此,replication-factor 为 3 始终是一个好主意,因为它允许一个代理被删除以进行维护,也允许另一个代理被删除出乎意料地被取下来。 因此,Apache-Kafka 提供了强大的持久性和容错保证。

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

    【讨论】:

    • 但是,如果包含分区的所有节点都死了,如何访问数据(考虑到我们的复制因子为 3,并且集群中有大约 5-6 个节点)。这些消费者的 HA 不会失败吗?
    • @dvsakgec 我已经使用示例更新了我的答案。希望对您有所帮助。
    【解决方案2】:

    假设节点 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=2acks=all,那么您最多可以容忍4 个代理失败以继续发送消息)

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

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

    【讨论】:

    • 我在本地尝试过,生产者能够连接到集群中的其他代理,并且它能够在提供单个 kafka 主机信息的情况下发布消息
    • 所以你的 server.properties 中的 min.insync.replicas=1 (这是默认值),或者你的 acks 生产者配置参数不是 acks=all。这是正常的行为。
    • acks=all 并设置了 min.insync.replicas=3,即存在主题分区的节点数
    • @dvsakgec 抱歉,我误解了您之前的评论。当然,您可以通过在 bootstrap.server.properties 中提供一个服务器地址来访问集群并生成消息。正如我所说,bootstrap.servers 仅用于与集群的初始连接,一个代理地址就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2017-08-06
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多