持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
一、前言
控制器组件(Controller):是 Apache Kafka 的核心组件
- 主要作用是:在
Apache Zookeeper的帮助下管理和协调整个Kafka集群。 - 集群中任意一台
Broker都能充当控制器的角色,但在运行过程中,只能有一个Broker成为控制器。
控制器 Controller 5大职责:
- 主题管理(创建、删除、增加分区)
执行
kafka-topics脚本时,大部分的后台工作都是控制器来完成的。
- 分区重分配
利用
kafka-reassign-partitions脚本,对已有主题分区进行细粒度的分配功能。
Preferred领导者选举
Preferred领导者选举主要是Kafka为了避免部分Broker负载过重而提供的一种换Leader的方案。
- 集群成员管理(新增
Broker、Broker主动关闭、Broker宕机)
控制器组件会利用
Watch机制检查ZooKeeper的/brokers/ids节点下的子节点数量变更。 当有新Broker启动后,它会在/brokers下创建专属的znode节点。
- 数据服务:就是向其他
Broker提供数据服务
控制器上保存了最全的集群元数据信息,其他所有
Broker会定期接收控制器发来的元数据更新请求,从而更新其内存中的缓存数据。
Tips:ZK 的数据模型类似文件系统的树形结构,根目录以 “/” 开始,该结构上的每个节点称为 znode。
znode 可分为:
- 持久性
znode:不会因为ZK集群重启而消失。 - 临时
znode:生命周期与创建该znode的ZK会话绑定,一旦会话结束,节点就会自动删除。
问题
1. 如何实现 Controller 选举以及故障转移?
(1)如何实现 Controller 选举?
-
Broker在启动时,会尝试去ZooKeeper中创建/controller节点。 -
Kafka当前选举控制器的规则是:第一个成功创建/controller节点的Broker会被指定为控制器。Zk会保证只有一个会创建成功。 -
没有创建节点成功的
Broker,都会在/controller节点上加个监听器。ZooKeeper赋予客户端监控znode变更的能力,即所谓的Watch通知功能。 一旦znode节点被创建、删除,子节点数量发生变化,抑或是znode所存的数据本身变更,ZooKeeper会通过节点变更监听器 (ChangeHandler) 的方式显式通知客户端。
(2)如何实现 Controller 故障转移?
故障转移指的是,当运行中的控制器突然宕机或意外终止时,
Kafka能够快速地感知到,并立即启用备用控制器来代替之前失败的控制器。
控制器故障转移的过程如下:
Broker 0一开始是控制器- 现在
Broker 0宕机了,Zk通过Watch机制感知到并删除了/controller临时节点 Broker 1 2 3监听到Zk的消息,都开始竞选成为新的控制器- 最终,
Broker 3赢得了选举,成功地在Zk上重建了/controller节点 Broker 3从Zk中读取集群元数据信息,并初始化到自己的缓存中。Broker 3开始行使正常的工作职责。
\