我有一组Kafka代理实例作为集群运行。我有一个客户正在生产数据给Kafka:
props.put("metadata.broker.list", "broker1:9092,broker2:9092,broker3:9092");
当我们使用tcpdump进行监控时,我可以看到只有到broker1和broker2的连接被建立,而对于broker3,没有来自我的生产者的连接。我有一个只有一个分区的单一主题。
我的问题是:
>
为什么在我的情况下,我无法连接到broker3?或者至少我的网络监控没有显示我的制作人与broker3建立了连接?
如果我能从制片人的角度更深入地了解与经纪人的联系是如何运作的,那就太好了。
显然,您的制作人不需要连接到broker3
:)
我将尝试向您解释向Kafka生成数据时会发生什么:
foo
,有2个分区,复制因子2。很简单的例子,但对某人来说可能是一个真实的例子。metadata.broker.list
(或新生产者中的bootstrap.servers
)的生产者。值得一提的是,您不一定要指定群集中的所有代理,事实上您可以只指定其中的1个,它仍然可以工作。我稍后也会解释这一点。foo
发送消息。foo
的每个分区有哪些代理是领导者,以及您的foo
主题有多少分区。由于这是第一次发送到生产者,本地缓存不包含任何内容。 TopicMetadataRequest
到每个代理在metadata.broker.list
顺序,直到第一个成功的响应。这就是为什么我提到列表中的一个经纪人只要活着就会工作。TopicMetadataSolutions
将包含有关请求的主题的信息,在您的情况下是群集中的foo
和代理。该答复基本上包含以下内容:
制作人不需要打开到所有代理的不必要的连接,因为您要制作的主题可能不由某些代理提供服务,并且您的集群可能相当大。设想一个1000个代理集群有很多主题,但其中一个主题只有一个分区——您只需要一个连接,而不需要1000个。
在你的特殊情况下,我不能100%确定为什么你有2个到代理的开放连接,如果你只有一个分区,但是我假设一个连接是在元数据发现期间打开的,并且被缓存用于重用,第二个是到的实际代理连接产生数据。然而,在这种情况下,我可能错了。
但无论如何,根本不需要有第三个经纪人的连接。
关于您的问题“我是否应该始终拥有经纪人数量=参与方数量?”答案很可能是否定的。如果你解释一下你正在努力实现的目标,也许我能为你指出正确的方向,但这太宽泛了,无法笼统地解释。我建议读这篇文章来澄清一些事情。
UPD回答评论中的问题:
元数据缓存在两种情况下更新:
>
如果生产者由于任何原因未能与代理通信-这包括当代理根本无法访问和代理响应错误时的情况(如我不再是这个分区的领导者,走开)
如果没有发生故障,客户端仍然会每隔元数据刷新一次元数据。最大年龄。ms
(https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/CommonClientConfigs.java#L42-L43)发现新的代理和分区本身。
我有两台机器localhost和192.168.1.110来运行两台独立的单机kafka。 kafka2.11-0.10.0.0 bin/kafka-console-producer.sh--broker-list 192.168.1.110:9092--topic test这是一条消息[2016-08-24 18:15:27,441]错误将消息发送到topic test时出错,关键字:null,
有没有其他方法可以得到认可? 我使用kafka-client api 0.9.1和broker版本0.8.2。
我们正在运行活动 MQ 5.6.0。在我们的测试环境中,我们有 3 个代理在静态网络中运行。下面是当前方案。我们有6个消费者随机连接到3个经纪人。一个经纪人有3个消费者,第二个有2个,第三个有1个。当我们向队列堆积消息时,我们看到消息积压在第三个代理上,有 1 个使用者,另外两个代理没有获得任何积压,其余 5 个使用者处于空闲状态。 在下面,您将找到我们所有一个代理(dev.queue01)的配置
我有一个运行apache kafka 2.2.1的安全MSK集群。如果我在私有子网(amazon Linux2)中创建一个ec2实例并安装java和kafka,我可以执行以下操作来与kafka通信: 然后制作一个文件,如 并将参数中的文件传递给一些kafka cli命令。 我现在正试图在ECS容器中运行kafdrop,我需要传入这个文件。文档说明我可以为和传入一个base64编码版本(我想我可以省
为什么消费者连接到zookeeper来检索分区位置?kafka制作者必须连接到其中一个代理来检索元数据。 我的观点是,当每个经纪人都已经有了所有必要的元数据来告诉生产者发送信息的位置时,动物园管理员到底有什么用?经纪人不能把同样的信息发送给消费者吗? 我可以理解为什么经纪人拥有元数据,而不必在每次向他们发送新消息时都与动物园管理员建立连接。动物园管理员有什么功能是我错过的吗?我发现很难想到为什么在
问题内容: 我的Celery配置中 但是,每当我运行celery时,都会出现此错误 为什么它不连接到我正在运行的Redis代理,而后者正在运行? 问题答案: 导入您的Celery并像这样添加您的经纪人: 该代码属于celery.py