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

開開新新 发表于: 2020-11-16   最后更新时间: 2020-11-16  

screenshot

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



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: 虚拟机CentOS 7下的docker(CentOS 7)内的kafka消费者无法消费到来自windows下Java客户端(IDE)生产者生产的消息
下一条: kafka往虚拟机中的kafka发送消息失败

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

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

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

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

            • 这个是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

                • 我表达的不对,按你说的是这样, 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分区消息保存的就会多吗? 有什么办法让消息分配均衡一点?

                    • 对,我在稍微优化一下,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个分区,就会相对平均了(轮询发送机制)。

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