【问题标题】:how producers find kafka reader生产者如何找到 kafka 阅读器
【发布时间】:2018-03-23 06:10:08
【问题描述】:

生产者通过如下设置Kafka Broker列表来发送消息。

props.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092");

我想知道“生产者”如何知道三个代理中的哪一个知道哪一个有一个分区领导。 对于典型的分布式服务器,要么你有一个承载服务器,要么有一个虚拟IP,但对于Kafka,它是如何加载的? 生产者程序是否尝试随机连接到一个代理并寻找具有分区领导者的代理?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    一个 Kafka 集群包含多个代理实例。在任何给定时间,只有一个代理是领导者,其余的是包含复制数据的同步副本(ISR)。当leader broker被意外关闭时,其中一个ISR成为leader。

    Kafka 使用 ZooKeeper 选择一个代理的分区副本作为领导者。当生产者将消息发布到主题中的分区时,它会转发给其领导者。

    根据Kafka documentation

    日志的分区分布在 Kafka 集群,每个服务器处理数据和共享请求 的分区。每个分区都被复制到一个可配置的 容错服务器的数量。

    每个分区都有一个服务器作为“领导者”,零或 更多充当“追随者”的服务器。领导者处理所有读取和 在追随者被动的情况下写入分区请求 复制领导者。如果领导者失败,其中一个追随者将 自动成为新的领导者。每个服务器充当领导者 它的一些分区和其他分区的追随者,所以负载很好 在集群内保持平衡。

    您可以使用this piece of code. 找到主题和分区负责人

    编辑:

    生产者向您在配置生产者时提供的代理之一发送包含主题列表的元请求。

    来自代理的响应包含这些主题中的分区列表以及每个分区的领导者。生产者缓存此信息,因此它知道将消息重定向到哪里。

    【讨论】:

    • 感谢您的回复。但是我想知道的是,当原始生产者发送消息时,生产者如何知道哪个broker有分区领导者。
    • @GiorgosMyrianthous 有没有办法明确地做到这一点,即获取 partitionInfo 并将生产请求直接发送给领导者?
    • @Novemberland 这由 Kafka 自动处理。生成到主题的消息总是被推送到分区的领导者,然后在整个集群中复制。
    【解决方案2】:

    这是一个很老的问题,但我有同样的问题,经过研究,我想分享答案,因为我希望它可以帮助别人。

    • 为确定分区的领导者,生产者使用称为元数据请求的请求类型,其中包括生产者感兴趣的主题列表。
    • 代理将响应指定主题中存在哪些分区、每个分区的副本以及哪个副本是领导者。
    • 元数据请求可以发送到任何代理,因为所有代理都有一个包含此信息的元数据缓存。

    【讨论】:

    • 这是正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2017-09-07
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多