代理关闭时,kafka消息重新平衡

时间:2019-05-08 18:12:16

标签: apache-kafka partition

一个普遍的问题。假设一个主题在不同的服务器(经纪人)上有3个kafka分区,每个分区有10条带偏移量的消息作为其时间戳(0,1,...,9,更大的数字意味着在分区中停留的时间更短,也意味着是新出现的消息)。假设由于服务器完成,一个分区恰巧关闭了。 Kafka将关闭的分区中的10条消息重新平衡到其他分区中的策略是什么?

视觉上,我们有

经纪人1分区:| 1-0 | 1-1 | 1-2 | 1-3 | 1-4 | 1-5 | 1-6 | 1-7 | 1-8 | 1-9 |

经纪人2分区:| 2-0 | 2-1 | 2-2 | 2-3 | 2-4 | 2-5 | 2-6 | 2-7 | 2-8 | 2-9 |

经纪人3分区:| 3-0 | 3-1 | 3-2 | 3-3 | 3-4 | 3-5 | 3-6 | 3-7 | 3-8 | 3-9 |

现在,如果代理3完成,如何将3-0至3-9插入代理1和代理2?

(我的假设是默认情况下,它将根据代理3的时间戳随机分布一半,并插入到代理1和2的尾部,也许在某个地方可以通过代码配置行为?)

谢谢。

2 个答案:

答案 0 :(得分:4)

如果一个分区仅存在于单个代理上(复制因子1),则当该代理脱机时,该分区不可用。这就是您提出的问题。

要即使经纪人破产也要保持数据可用,您必须创建复制因子大于1的主题。

然后,分区的数据将被复制到多个代理,并且如果其中一个代理脱机,则将用户流量重新分配到可用副本。

我建议您仔细阅读文档中的Replication section,以了解其工作原理。

答案 1 :(得分:1)

下图将帮助您了解 Kafka 如何复制分区。如果一个代理发生故障,则由于Kafka具有复制功能,使用者可以从另一代理读取内容。 (当然,您需要按如下所示进行设置) 例如,如果经纪人1去世,则经纪人2将成为topic1-part1的负责人,并且消费者可以从中读取内容。

enter image description here

Zookeeper 将知道某个代理(分区)是否关闭,它将任命另一位领导者。