在同一台主机上有多个Kafka分区的目的是什么?

o75abkj4  于 2023-04-11  发布在  Apache
关注(0)|答案(1)|浏览(234)

考虑以下设置:

  • 单个Kafka主机
  • 单一主题
  • 多分区

在这种情况下,所有分区都位于同一物理主机上。
我的理解是,分区执行三个功能:

  • 数据恢复能力
  • 负载均衡
  • 区域分布?(CDN)

最后两点我不是很确定,最后一点我可能是错的,因为我在Kafka API或设置配置中没有看到任何机制允许这样做。
详细解释每一个。

数据弹性:

如果有多个分区,并且消息被复制到多个partition,则数据对partition的故障具有弹性。这可以使用“复制因子”进行配置。分区必须位于不同的物理主机上,否则这将不起作用。

负载均衡:

Kafka似乎有一个自动化的负载平衡机制,根据Round-Robin机制将消息分发到分区。如果消息提供了一个密钥,则使用哈希算法来确保具有相同密钥的所有消息都分发到相同的分区,然而,在这种情况下我们仍然有负载平衡,因为可能会有多个消息键在使用。(不是所有消息都有相同的键。)

CDN:

如果Kafka主机分布在地球仪各地,那么来自消费者的消息更有可能被分发到地理位置附近的主机,这是很自然的,因为这些主机可能具有更低的延迟和更高的带宽连接。我相信,尽管我不完全确定,Kafka在这方面的行为有点像CDN,因为它可以自动进行领导者选举。
我可能是错的,如果不是这样,请纠正我。

单个主机还是多个分区?

这就引出了一个有趣的问题:既然在同一台主机上可以有多个分区,而且我们可以有比主机更多的分区,那么这样做的目的是什么呢?
在极端情况下,只有一台主机和至少两个分区,我们无法获得上述任何好处。没有故障转移或数据恢复能力。没有负载平衡效果或低延迟连接选择效果。
那么这有什么目的呢?
参考:https://www.dataversity.net/how-to-overcome-data-order-issues-in-apache-kafka/#

wz3gfoph

wz3gfoph1#

分区不是为了恢复,也与服务器数量无关。副本是为了恢复和服务器数量。
例如,Kafka中不像HTTP服务那样预先执行“负载平衡”。如您所说,记录被散列并分发到分区,或者您可以显式地告诉生产者或消费者写入任何可用的分区。此外,无论负载如何,客户端请求总是发送给分区的领导者代理。
因此,我说这不是为了负载平衡(因为它与服务器/客户端负载无关),而是吞吐量。如果您只有一台主机,显然您会受到那台机器的磁盘和网络速度的限制。同样,一台机器是单点故障,所以是的,在一台主机上不应有多个代理(Kafka甚至不允许你将replication.factor设置得比broker计数高)。(我想,理论上,你可以运行单独的Kafka JVM进程,使用不同的磁盘来存储日志,但是YMMV,因为网络会很奇怪)
对于多个代理,客户机在没有人工干预的情况下无法决定代理上的分区放置(kafka-reassign-partitions)。这就是load distribution 的原因,但它是“best effort,bin packing”上的 distributed,仍然不是“load”,因为代理无法预测分区将如何使用。因此,当在主机上使用多个分区时,并且你有多核CPU和多个物理磁盘挂载到Kafka log.dirs设置的卷上,只有这样,一台机器内的负载才能得到适当的平衡。但是,这仍然取决于客户端是否可以读写均匀分布的数据,否则你会得到“热分区”并开始填充磁盘,如果数据总是无键的,并且总是使用默认的分区器,应该没有什么可担心的。
Kafka(和Zookeeper)更喜欢低延迟,所以不,一个集群不应该是“全局”的。建议您不要在云提供商的可用区之外部署集群(区域隔离,独立的数据中心)。如果您需要全局分布式的Kafka设置,您可以部署区域集群,并使用MirrorMaker 2,Confluent Cluster Links等工具,或切换到其他项目,如Apache Pulsar(并启用其Kafka客户端兼容功能)
关于引用的博客,Kafka在添加代理或增加主题分区时不会自动重新平衡自己。

相关问题