制作者通过设置kafka代理的列表来发送消息,如下所示。
props.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092");
我想知道“制片人”如何知道三个经纪人中的哪一个知道哪一个有分区负责人。对于一个典型的分布式服务器,要么有一个承载服务器,要么有一个虚拟ip,但是对于kafka,它是如何加载的?producers程序是否尝试随机连接到一个代理并查找具有分区引线的代理?
制作者通过设置kafka代理的列表来发送消息,如下所示。
props.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092");
我想知道“制片人”如何知道三个经纪人中的哪一个知道哪一个有分区负责人。对于一个典型的分布式服务器,要么有一个承载服务器,要么有一个虚拟ip,但是对于kafka,它是如何加载的?producers程序是否尝试随机连接到一个代理并查找具有分区引线的代理?
1条答案
按热度按时间l7mqbcuq1#
kafka集群包含多个代理示例。在任何给定的时间,只有一个代理是领导者,而其余的是包含复制数据的同步副本(isr)。当主代理意外被取下时,其中一个isr将成为主代理。
kafka使用zookeeper选择一个代理分区的副本作为领导者。当生产者将消息发布到主题中的分区时,它将被转发给它的领导者。
根据Kafka的文件:
日志的分区分布在kafka集群中的服务器上,每个服务器处理数据和对分区共享的请求。每个分区跨可配置数量的服务器进行复制以实现容错。
每个分区都有一个充当“领导者”的服务器和零个或多个充当“追随者”的服务器。leader处理分区的所有读写请求,而followers则被动地复制leader。如果领导者失败,其中一个追随者将自动成为新的领导者。每台服务器都充当其部分分区的引导者和其他分区的跟随者,因此集群内的负载平衡良好。
您可以使用这段代码找到主题和分区引线。
编辑:
producer向您在配置producer时提供的代理之一发送带有主题列表的元请求。
来自代理的响应包含这些主题中的分区列表以及每个分区的前导。生产者缓存这些信息,因此,它知道在哪里重定向消息。