Kafka分区重分配算法及原因

Kafka partitions reassignment algorithm and reasons

我发现 Kafka 的分区机制很笨拙和不舒服。 Kafka 不支持导致以下情况的自动分区重新分配功能:

  1. 如果要添加节点,您必须手动执行 bin/kafka-reassign-partitions.sh 脚本。您必须以 JSON 格式手动写出每个主题的分区重新分配。
  2. 在代理失败时,我认为应该在不重新分区的情况下激活副本。这会导致热点。 我说的对吗?

问题:

  1. Kafka 没有t/shouldn自动分区重新分配有什么architecture/design原因吗?那是因为它会降低性能吗?
  2. bin/kafka-reassign-partitions.sh背后的分区重分配算法是什么? Kafka 是否使用任何优化(即一致性哈希)或原始哈希范围分区?
  1. 由于数据存储在代理上,如果您将分区重新分配给另一个代理,则必须复制所有数据。

    此外,为了不失去任何保证,在 复制,你必须维护额外的副本(旧的和新的 那些)。请注意,正在进行 KIP 以改进该特定行为 (KIP-435)。

    移动数据是集群的额外负载,显然会对性能产生重大影响

  2. kafka-reassign-partitions.sh 的默认行为非常天真,如果您打算在真实环境中使用它,我真的建议您自己制作一个重新分配文件。

    默认情况下,它会重新分配所有分区,基本上是模拟使用新代理创建所有主题。虽然这很好地平衡了领导者,但这会导致大量数据需要复制。

    在实践中,只需移动分区的一小部分,从而限制数据复制和对集群的影响,就可以实现类似的结果。

    如果您不确定如何制作重新分配文件,有许多工具可以生成和应用重新分配:kafka-kit, cruise-control