kafka分配leader的时候,是依据什么条件?

開開新新 发表于: 2020-11-16   最后更新时间: 2020-11-16 19:38:25   1,395 游览

screenshot

比如这上面这个 leader都是1,如何判断该指向哪个broker?依据什么思路?

发表于 2020-11-16
添加评论

Leader: 1,1表示的就是brokder.id

開開新新 -> 半兽人 4年前

我知道broker 1就是Leader: 1,我是不明白为什么会选择用leader:1? 因为它保存的数据最多吗?那怎么知道哪个broker的数据最多最完整?

開開新新 -> 半兽人 4年前

另外一个问题,为什么每个分区的数据大小不同? 有什么方法让它们同步吗?

半兽人 -> 開開新新 4年前

你是如何验证分区数据大小的?
消息是轮询存储在不同的parition上的,除非生产者指定往其中某个parition里发。

開開新新 -> 半兽人 4年前

1、我就是用./kafka-run-class.sh kafka.tools.GetOffsetShell查看 分区消息数量的。
2、生产者指定了写入到分区0,原先的副本因子是默认的1,后面改为3,按我的理解,broker应该能感知到副本数的变化,然后将每个broker的数据数量同步保持一致。 那么kafka.tools.GetOffsetShell的结果应该是每个分区数量都相等,这样丢了一个broker,数据还有保留备份。

上面这个图,分区数量不一致,broker:1 如果宕机了,其他两个broker怎么办?

半兽人 -> 開開新新 4年前

这个是3个分区,概念你理解错了吧? 你3个分区,比如有100条消息,会分别存到这3个分区上,a分区33条,b分区33,c分区34条。副本因子是备份的数量 a的副本因子存在了broker2上,同步a分区的数据。如果broker1挂了 broker2中a副本因子就成为了leader,leader就成了2。如果broker2也挂了,那这33条消息就丢了。
可参考:https://www.orchome.com/5

開開新新 -> 半兽人 4年前

你说的和我想的一致,那么有什么方法让分区消息数量保持一致? 比如上面图片,生产者已经有数据了 而且指定写入分区0。

半兽人 -> 開開新新 4年前

什么叫分区消息数量保持一致? 如果理解了我感觉你就不会这么问。
我感觉你把分区和分区副本搞混了。

開開新新 -> 半兽人 4年前

我表达的不对,按你说的是这样, broker:1 a:33 、 broker:2 b:33 、broker:3 c:34,如有副本就是broker:1 a:33 c:34、 broker:2 b:33 a:33、broker:3 c:34 b:33,大概是这样吧? 我的问题是上面图片的消息分布不均或是说有点消息倾斜了,本身生产者是有指定写入分区0的,那么就意味0分区消息保存的就会多吗? 有什么办法让消息分配均衡一点?

半兽人 -> 開開新新 4年前

对,我在稍微优化一下,a变成分区0,b变成分区1,c变成分区2

broker: 1
0:33 2(副本):34 

broker: 2
1:33 0(副本):33

broker: 3
2:34 1(副本):33

生产者指定了写入分区0上,那么,12分区,肯定就不会收到任何新消息(你都要求发送到0分区了,怎么可能会平均)。

如果生产者不指定,那么这3个分区,就会相对平均了(轮询发送机制)。

開開新新 -> 半兽人 4年前

指定了写入分区0,如果分区0所在的broker宕机了,生产者是直接报错还是会等待broker 1和2选举(假设2节点能选举)产生新的broker leader,再写入?
写入的分区是0,消费者读取的分区可以是1和2吗?

半兽人 -> 開開新新 4年前

选举后发到新leader上,看生产者允许重试次数和超时时间。

消费者是消费者的策略,也可以指定消费哪些分区,这些文章里都有兄弟,你可参考:https://www.orchome.com/451

你的答案

查看kafka相关的其他问题或提一个您自己的问题