Kafka组件《控制器》

在启动Kafka集群的时候,每个代理都会实例化并启动一个KafkaController,并将该代理的brokerId注册到Zookeeper的相应的节点当中。Kafka集群中各代理会根据选举机制选出其中一个代理作为Leader,即Leader控制器。

作用: 负责Topic的创建与删除,分区和副本的管理以及代理故障转移的功能等。
程序入口: Kafka核心core工程下kafka.controller.KafkaController类

注意:无特殊情况下,下面控制器指的都是Leader控制器

术语

  • controller_epoch:用于记录控制器发生变更次数。即记录当前控制器是第几代控制器。
    初始值为0,当控制器发生变更时,每选出一个新的控制器需将该字段+1,每个向控制器发送的请求都会带上该字段,如果请求的controller_epoch的值小于内存中的controller_epoch的值,则认为这个请求是向已过期的控制器发送请求,那么本次请求就是一个无效的请求。若该值大于内存中的controller_epoch,则说明已有新的控制器当选了。通过该值来保证集群控制器的唯一性,进而保证相关操作的一致性。(zookeeper client执行get /controller_epoch查看该字段对应的值)
  • zkVersion:作用类似数据库乐观锁,用于更新zookeeper路径下相应的元数据信息,如controller_epoch,ISR信息等
  • leader_epoch:分区Leader更新次数。由于各请求到达的顺序不同,控制器通过controller_epoch和leader_epoch来确定具体应该执行哪个命令操作。
  • 已分配副本(AR):每个分区的所有的副本集合。 ISR是与分区Leader保持同步的副本列表。
  • LeaderAndIsr:Kafka将Leader对应的brokerId和Isr列表封装成一个LeaderAndIsr类,以JSON串表示为{“Leader”:Leader的brokerId,“leader_epoch”:leader更新次数,“isr”:ISR列表}
  • 优先副本:在AR中,第一个副本称为preferred replica,也就是我们所说的优先副本。理想情况下,优先副本是该分区的Leader,Kafka要确保所有的主题优先副本在Kafka集群中均衡分配。这样就保证了所有分区的Leader的均衡分布。Kafka提供了五种分区选举器。

一 控制器初始化

以下 KafkaController实例化时主要完成的操作
1,创建一个ControllerContext实例对象,重要作用:缓存控制器各种处理操作所需要的数据结构。
ControllerContext实例化时会初始化用于记录控制器选举次数的epoch及与之对应的zkVersion字段的值,初始值为0。同时设置当前正在运行的代理列表,主题列表,各主题对应分区及副本的AR列表等。声明控制器与其他代理通信的ControllerChannelManager对象,ControllerChannelManager在这里只是声明并没有创建和启动。
2,实例化用于维护和管理分区状态的状态机。Kafka分区定义了四种状态:NewPartition,OnlinePartition,OfflinePartition,NonExistentPartion。
Kafka组件《控制器》_第1张图片

3,实例化一个对副本管理的状态机ReplicaStateMachine.Kafka对副本定义了七种状态:NewReplica,OnlienReplica,OfflineReplica,ReplicaDeletionStarted,ReplicaDeletionSuccessful,ReplicaDeletionIneligible,NonExistentReplica。
4,创建用于将当前代理选举为控制器的ZookeeperLeaderElector选举器对象,实例化该对象需要传递两个回调函数。
OnControllerFailover():完成控制器相应的初始化操作方法
OnControllerResignation():当前控制器当选的时候让先前的控制器注销控制器权限的方法
控制器选举的策略: 在Zookeeper的controller路径创建一个临时节点,并注册一个LeaderChanngeListener,通过该监控器来监听该临时节点,当该临时节点发送变更的时候,就会触发该监控器,当新当选的控制器信息被保存的时候,就会触发该监控器的handleDataChannge方法进行相应的处理;当监听器监听到/controller路径下的控制器消息被删除的时候,将触发onControllerResignation回调方法。同时触发重新选举机制。
5,创建一个独立定时的任务KafkaScheduler,该定时任务用于控制器进行平衡操作,其生命周期只在代理成为Leader控制器期间有效,当代理不再是Leader控制器的时候,即调用onControllerResignation方法时该定时任务就会被关闭。
6,声明一个对主题操作管理的TopicDeletionManager对象。
7,创建一个用于在分区状态发生变化的时为分区选举出Leader副本的分区选举器PartitionLeaderSelector。Kafka提供五种分区选举器。
8,实例化ControllerBrokerRequestBatch。 ControllerBrokerRequestBatch封装了leaderAndIsrRequestMap,stopReplicaRequestMap,updateMetadataRequestMap三种集合,用来记录和缓存handleStateChange()方法中产生的request,控制器将这些request交由ControllerBrokerRequestBatch.sendRequestsToBrokers()方法批量发送出去,交由KafkaApis调用相应的handle方法进行处理。
9,实例化三个监听器。
PartitionsReassignedListener:监听分区重分配。
PreferredReplicaElectionLIstener:监听当分区状态变化的时触发PreferredReplicaPartitionLeaderSelector选举器将优先副本选举为Leader.
IsrChangeNotificationListener:用于监听当ISR发生变化将ISR变化通知给Zookeeper进行更新操作,同时向所有的代理节点发送元数据修改请求。

你可能感兴趣的:(中间件,kafka,分布式)