kafka-lead 的选举过程


1.了解控制器的启动顺序


在kafka集群中,每个代理节点(Broker)在启动都会实例化一个KafkaController类。该类会执行一系列业务逻辑,选举出主题分区的leader节点。
(1)第一个启动的代理节点,会在Zookeeper系统里面创建一个临时节点/Controller,并写入该节点的注册信息,使该节点成为控制器。
(2)其他代理节点陆续启动时,也会尝试在zookeeper系统里面创建/controller节点。但是由于/controller节点已经存在,所以会抛出
创建/controller节点失败的异常信息。创建失败的代理节点会根据返回的结果,判断出在kafka集群中已经有一个控制器被创建成功了,
所以放弃创建/controller节点。这样确保了kafka集群控制器的唯一性。
(3)其他的代理节点,会在控制器上注册相应的监听器。各个监听器监听各自代理节点的状态变化,当监听到节点状态变化时,会触发相应的监听函数进行处理。


2.了解主题分区的leader节点的选举过程


控制器的选举核心是:各个代理节点公平竞争在zookeeper中创建/controller节点,最先在zookeeper中成功创建的是其成为控制器,具有选举主题分区leader的功能。
在这里插入图片描述


触发elect方法的四种情况的解释:


1、代理节点启动
2、上一次创建临时节点成功后,由于网络原因或服务器故障等导致连接中断,后resign()函数并删除zookeeper系统中的/controller节点
3、上一次创建临时节点成功后,由于网络原因或服务器故障等导致连接中断,再次进入elect方法,发现kafka系统中已经有了代理节点成了leader
4、上一次创建临时节点成功后,执行onBecomingLeader()函数时抛出了异常信息,执行业务逻辑后,在尝试选举leader。


解释kafkacontroller类,zookeeperLeaderElect类、leaderChangeListener类和SessionExpriationListener类的作用:


kafkacontroller类:实例化zookeeperLeaderElector类时,分别设置了两个关键的回调函数onControllerFailover和onControllerResignation。

zookeeperLeaderElect类:主要实现主题分区的leader节点选举功能,但是它并不会处理代理节点与zookeeper系统之间会话超时。主要负责创建元数据存储路径、实例化变更监听器等,并通过订阅数据变更监听器来实时监听数据的变化,进而开始执行选举leader的逻辑。

leaderChangeListener类:如果节点数据发生变化,则kafka系统中的其他代理节点可能已经成为leader,接着kafka控制器会调用OnResigningAsLeader()函数。当kafka代理节点宕机或者被人为误删除时,则处于该节点上的leader会被重新选举。通过调用OnResigningAsLeader()函数重新选择其他正常的运行中的代理节点成为新的leader

SessionExpriationListener类:kafka系统的代理节点和zookeeper系统建立连接后,sessionExpriationListerner中的handleNewSession()函数会被调用。对于zookeeper系统中的会话过期的连接,会先进行依一下判断:
如果当前的控制器ID和代理节点的ID相同,则kafka会跳过重新选举的环节。
如果当前的控制器ID和代理节点的ID不相同,则kafka会关闭当前的控制器,然后尝试重新选举。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值