该文章基于zk + kafka 分布式部署的场景描述的。
控制器是Kafka的核心组件,它的主要作用是在Zookeeper的帮助下管理和协调整个Kafka集群。集群中任意一个Broker都能充当控制器的角色,但在运行过程中,只能有一个Broker成为控制器。
Kafka控制器选举,又名broker选举机制。所谓选举分为leader和follower两个角色,选举为leader的broker负责对接消费端,完成消息的消费。其他follower则是备份节点,当leader出现异常时,会重新从follower中选举出leader。
集群中第一个启动的broker会通过在zk中创建一个临时节点/controller来让自己成为控制器。其他的broker也会在zk中创建一个临时节点,当他们发现zk中已经存在了controller,那么zk就会抛出异常给他们r,并在zk中创建watch对象,便于接收controller变更的通知。
如果controller因网络原因和zk断连了,那么其他的broker就会根据watch对象收到zk发过来的选举通知(是zk主动通知还是watch对象检测到??),在zk上创建临时节点/controller,如果有一个创建成功,就会成为leader,其他的就会收到异常,就会创建新的watch‘对象(沿用原有的watch对象还是销毁旧的,创建新的??)
控制器脑裂
当控制器因网络原因或者Full GC导致zk的seesion 超时了,zk会选举出新的controller。过了一段时间,旧的控制器又恢复了,导致zk中出现了2个controller,这种现象就是控制器脑裂。
解决方案:zk中还有一个与controller有关的持久节点(controller_epoch),存放的是一个整形值epoch number(纪元编号,也称隔离令牌),集群中每次选举一次,就会创建一个数值更大的epoch number,broker会忽略掉epoch number较小 的消息。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。