KafkaController分析4-Partition选主

  • 我们都知道, Kafka的每个Topic的存储在逻辑上分成若干个Partition,每个Partition又可以设置自己的副本Replica;
  • 这样的设计就引出了几个概念:
    1. Partition: 消息在Kafka上存储的最小逻辑单元, 在物理上对应在不同的Broker机器上;
    2. Replica: 每个Partition可以设置自己的副本Partition, 这样主Partition叫作Leader, 副本叫作Replica;从灾备的角度考虑, 在物理上Replica尽量不要与Leader在同一台Broker物理机上;
    3. Ack: 客户端produce消息时, 可以设置Kafka服务端回应ack的策略: 3.1 不用回Ack, 客户端发送效率最高, 但无法确认是否真的发送成功; 3.2 仅Partition leader回ack, 发送效率次之, 可以确认Leader已经接收到消息;在这种情况下,如果leader挂了, 客户端将无法消费到这个消息; 3.3 所有Replica(实际上这不是真的)都需要回ack, 发送效率最差, Replica需要从Leader拉取消息;
    4. ISR: In Sync Replica, 是所有Replica的一个子集. Partition的replica可能很多, 针对上面的3.3,如果需要所有replicat都拉取到消息后再回ack,发送效率会很差,因此Kafka用了折衷的办法, 仅需要ISR中的replica接收了消息即可.ISR中的replica的消息应一直与leader同步;
  • 既然有Leader的角色,又有多个replica, 就存在一个在选主的问题, 我们就来讲下多种情况下的选主策略;

PartitionLeaderSelector

  • 所在文件: core/src/main/scala/kafka/controller/PartitionLeaderSelector.scala
  • 这个trait, 各种选主策略类都实现了它.声明了如下的方法, 返回LeaderAndIsr类型的request
/**
   * @param topicAndPartition          The topic and partition whose leader needs to be elected
   * @param currentLeaderAndIsr        The current leader and isr of input partition read from zookeeper
   * @throws NoReplicaOnlineException If no replica in the assigned replicas list is alive
   * @return The leader and isr request, with the newly selected leader and isr, and the set of replicas to receive
   * the LeaderAndIsrRequest.
   */
  def selectLeader(topicAndPartition: TopicAndPartition, currentLeaderAndIsr: LeaderAndIsr): (LeaderAndIsr, Seq[Int])

OfflinePartitionLeaderSelector

  • 所在 core/src/main/scala/kafka/controller/PartitionLeaderSelector.scala
  • 可用于Offline状态Partitions的选主,比如Topic刚刚创建后;
  • 规则, 源码中的注释

Select the new leader, new isr and receiving replicas (for the LeaderAndIsrRequest):

  1. If at least one broker from the isr is alive, it picks a broker from the live isr as the new leader and the live isr as the new isr.
  2. Else, if unclean leader election for the topic is disabled, it throws a NoReplicaOnlineException.
  3. Else, it picks some alive broker from the assigned replica list as the new leader and the new isr.
  4. If no broker in the assigned replica list is alive, it throws a NoReplicaOnlineException Replicas to receive LeaderAndIsr request = live assigned replicas
  5. Once the leader is successfully registered in zookeeper, it updates the allLeaders cache
  • 翻译成图:

PartitionLeaderSelector.png

ReassignedPartitionLeaderSelector

  • 所在 core/src/main/scala/kafka/controller/PartitionLeaderSelector.scala
  • 用于Partitions再分配后的LeaderSelect;
  • 规则:

  • New leader = a live in-sync reassigned replica
  • New isr = current isr
  • Replicas to receive LeaderAndIsr request = reassigned replicas

ControlledShutdownLeaderSelector

  • 所在 core/src/main/scala/kafka/controller/PartitionLeaderSelector.scala
  • 用于ControllerShutdown时的leader select
  • 规则:

  • New leader = replica in isr that's not being shutdown;
  • New isr = current isr - shutdown replica;
  • Replicas to receive LeaderAndIsr request = live assigned replicas

NoOpLeaderSelector

  • 所在 core/src/main/scala/kafka/controller/PartitionLeaderSelector.scala
  • 其实什么都不作,返回当前的Leader, ISR和Replicas;
def selectLeader(topicAndPartition: TopicAndPartition, currentLeaderAndIsr: LeaderAndIsr): (LeaderAndIsr, Seq[Int]) = {
    warn("I should never have been asked to perform leader election, returning the current LeaderAndIsr and replica assignment.")
    (currentLeaderAndIsr, controllerContext.partitionReplicaAssignment(topicAndPartition))
  }
Kafka源码分析-汇总

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Bug生活2048

.net core下配置、数据库访问等操作实现

.net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Exten...

9220
来自专栏IT技术精选文摘

Kafka剖析系列之高可用(下)

本文主要阐述了HA相关各种场景,如Broker failover、Controller failover、Topic创建/删除、Broker启动、Followe...

24560
来自专栏技术博文

excel导入与导出

基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存...

31160
来自专栏恰童鞋骚年

Hadoop学习笔记—6.Hadoop Eclipse插件的使用

开篇:Hadoop是一个强大的并行软件开发框架,它可以让任务在分布式集群上并行处理,从而提高执行效率。但是,它也有一些缺点,如编码、调试Hadoop程序的难度较...

56710
来自专栏GopherCoder

『No18: Go 实现世界杯后台管理系统』

趁着周末更新一期,上一期讲到 如何快速熟悉一个项目, 文章的最后讲到,最好的方法是借用相同的技术栈重新实现一个项目。

19810
来自专栏分布式系统进阶

ReplicaManager源码解析2-LeaderAndIsr 请求响应

其中最主要的操作调用ReplicaManager.becomeLeaderOrFollower来初始化Partition

7510
来自专栏积累沉淀

CXF 框架拦截器

CXF的拦截器 •为什么设计拦截器? 1.为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. •拦截器分类: 1...

20460
来自专栏从零开始学自动化测试

python接口自动化24-token关联登录

登录网站的时候,经常会遇到传token参数,token关联并不难,难的是找出服务器第一次返回token的值所在的位置,取出来后就可以动态关联了

12720
来自专栏Kubernetes

原 荐 Kubernetes Resourc

更多关于kubernetes的深入文章,请看我csdn或者oschina的博客主页。 ResoureQuota介绍 关于ResoureQuota和Resourc...

53990
来自专栏Kubernetes

Kubernetes ReplicationController源码分析

虽然在Kubernetes v1.2中,Kubernetes推出了Deployments特性,Deployment通过创建ReplicaSet来管理Pod,R...

76280

扫码关注云+社区

领取腾讯云代金券