在Apache Kafka中的负载均衡

4

我是 Apache Kafka 的新手,正在尝试使用它。如果我有 2 个代理和一个包含 4 个分区的主题,并且假设其中一个代理负载很重,那么 Kafka 是否会处理从生产者到另一个空闲代理的流量平衡?如果是,它是如何完成的?

2个回答

3
如果您有多个分区,那么生产者需要/可以选择将消息发送到哪个分区。
生产者将数据发布到他们选择的主题中。生产者负责选择将哪个消息分配给主题中的哪个分区。这可以简单地通过循环方式来平衡负载,也可以根据某些语义分区函数来完成(例如基于消息中的某个键)。在Kafka生产者中,可以指定分区键以指示消息的目标分区。默认情况下,使用基于哈希的分区器来确定给定键的分区ID,并且人们也可以使用自定义分区器。为了减少打开套接字的数量,在0.8.0版本中(https://issues.apache.org/jira/browse/KAFKA-1017),当未指定或为空时,生产者会选择一个随机分区并在一段时间内固定在该分区上(默认为10分钟)然后切换到另一个分区。
如果您指定要将数据放入哪个分区,它将始终进入该特定分区。如果不指定,则生产者可以将其发送到任何分区。Kafka代理永远不会在内部移动或平衡消息/分区。
我认为这个决定是为了在Kafka分区中保证消息顺序提供某些保证

3
Kafka生产者通常会将消息平均分布在所有分区中,除非您覆盖了这种行为,然后您需要查看四个分区是否均匀分布在代理之间。如果你说的是"其中一个代理负载过重",那就要看看是因为哪个主题或者这个集群有其他主题(例如__consumer_offset)。
您可以使用Kafka的cli工具或像Yahoo kafka-manager这样的UI选择分区所在的代理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接