我发现Kafka的分区机制既尴尬又不舒服。Kafka 不支持导致以下情况的自动分区重新分配功能:
- 如果要添加节点,则必须手动执行
bin/kafka-reassign-partitions.sh
脚本。您必须以 JSON 格式手动写出每个主题的分区重新分配。 - 在代理失败时,我想应该在不重新分区的情况下激活副本。这可能会导致热点。我说的对吗?
问题:
- Kafka 没有/不应该重新分配自动分区有什么架构/设计原因吗?那是因为它降低了性能吗?
-
什么是
bin/kafka-reassign-partitions.sh
后面的分区重新分配算法?Kafka 是否使用任何优化(即一致哈希)或原始哈希范围划分?
-
由于数据存储在代理上,如果将分区重新分配给另一个代理,则必须复制所有数据。
此外,为了不失去任何保证,在 复制,您必须维护额外的副本(旧副本和新副本) 的)。请注意,正在进行一个 KIP 来改善该特定行为 (KIP-435)。
移动数据是集群的额外负载,显然会对性能产生重大影响
-
kafka-reassign-partitions.sh
的默认行为非常幼稚,如果您打算在真实环境中使用它,我真的建议您自己制作重新分配文件。默认情况下,它将重新分配所有分区,基本上模拟使用新代理创建所有主题。虽然这可以很好地平衡领导者,但这会导致需要复制大量数据。
在实践中,只需移动分区的一小部分即可获得类似的结果,从而限制数据复制和对集群的影响。
如果您不确定如何制作重新分配文件,有一堆工具可以生成和应用重新分配:kafka-kit,巡航控制