集群中有多少个 Kafka 控制器,控制器的用途是什么?

How many Kafka controllers are there in a cluster and what is the purpose of a controller?

Kafka 集群中的 Kafka 控制器负责管理分区领导者和复制。

如果一个Kafka集群有100个broker,controller是不是只有一个Kafka broker?那么在100个broker中,controller是leader吗?

您怎么知道哪个经纪人是控制人?

Kafka Controller的管理对Kafka系统管理至关重要吗?

在 Kafka 集群中,单个代理充当主动控制器,负责分区和副本的状态管理。因此,在您的情况下,如果您有一个包含 100 个代理的集群,其中一个将充当控制器。

可以找到有关集群控制器职责的更多详细信息here

为了找到哪个代理是集群的控制器,您首先需要通过 ZK CLI 连接到 Zookeeper:

./bin/zkCli.sh -server localhost:2181 

然后是get控制器

[zk: localhost:2181(CONNECTED) 0] get /controller

输出应如下所示:

{"version":1,"brokerid":100,"timestamp":"1506423376977"}
cZxid = 0x191
ctime = Tue Sep 26 12:56:16 CEST 2017
mZxid = 0x191
mtime = Tue Sep 26 12:56:16 CEST 2017
pZxid = 0x191
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15ebdd241840002
dataLength = 56
numChildren = 0

Zookeeper是Kafka集群状态的存储。它用于在最开始或当前控制器崩溃时进行控制器选举。当一个主题的分区领导代理fails/crashes时,控制器还负责告诉其他副本成为分区领导。

控制器是 Kafka 代理之一,它还负责选举分区领导者的任务(除了通常的代理功能之外)。

controller只是一个broker吗?

一次只有1个控制器。

在内部,每个代理都试图在动物园管理员(/控制器)中创建一个临时节点。第一个成功,成为控制器。其他人只是得到一个适当的异常("node already exists"),并在控制器节点上观察。当控制器死亡时,临时节点将被删除,并通知观察代理。同样,其中第一个成功注册临时节点的人成为新的控制器,其他人将再次获得 "node already exists" 异常并继续等待。

你怎么知道谁是 Kafka 的控制器?

当一个新的控制器被选出时,它会从 zookeeper 得到一个 "controller epoch" 编号。经纪人知道当前的控制器纪元,如果他们收到来自控制器的旧编号消息,他们知道忽略它。

控制器是leader吗?

不是真的.. 每个分区都有自己的领导者。当代理死亡时,控制器遍历所有需要新领导者的分区,确定新领导者应该是谁(只是同步副本列表中的随机副本,也就是 ISRs of该分区)并向所有包含这些分区的新领导者或现有追随者的经纪人发送请求。

新领导现在知道他们需要开始为制作人和 来自客户端的消费者请求,而追随者现在知道他们需要从新的领导者开始复制。

Kafka 控制器是 Kafka 集群的大脑。它监控代理的活跃度并在代理失败时采取行动。

集群中只有一个Kafka控制器。控制器是集群中的 Kafka 代理之一,除了通常的代理功能外,还负责在现有代理离开集群或代理加入集群时选举分区领导者。

在集群中启动的第一个代理将通过在 Zookeeper 中创建一个名为“/controller”的临时节点成为 Kafka Controller。其他broker在启动的时候也尝试在Zookeeper中创建这个节点,但是会收到一个“node already exists”的异常,据此他们知道集群中已经选出了一个Controller。

当Zookeeper没有收到来自Controller的心跳消息时,Zookeeper中的临时节点将被删除。然后它通过 Zookeeper watcher 通知集群中的所有其他 broker Controller 已经消失,这将再次开始对新 Controller 的新选举。所有其他经纪人将再次尝试创建一个临时节点“/controller”,第一个成功的将被选为新的控制器。

一个集群中可能有多个Controller。考虑一个情况,在当前Kafka Controller ("Controller_1") 导致 Zookeeper 在配置的时间内没有收到来自 Controller 的心跳消息。这会导致“/controller”节点从 Zookeeper 中删除,并且集群中的另一个代理被选为新的控制器(“Controller_2”)。

在这种情况下,集群中有 2 个控制器“Controller_1”和“Controller_2”。 "Controller_1" GC 已完成,它可能会尝试 write/update Zookeeper 中的状态。 "Controller_2" 也会尝试 write/update Zookeeper 中的状态,这会导致 Kafka 集群与旧 Controller 和新 Controller 的写入不一致。

为了避免这种情况,每次进行Controller选举时都会生成一个新的“epoch”。 每次选举控制器时,它都会通过 Zookeeper 条件增量操作接收一个新的更高纪元。

由此,当旧控制器(Controller_1")尝试更新某些内容时,Zookeeper 将当前纪元与旧控制器在其[=36 中发送的旧纪元进行比较=] 请求,它只是忽略它。 集群中的所有其他代理也知道当前的控制器时代,如果他们从旧控制器收到带有旧时代的消息,他们也会忽略它。