3.3 Zookeeper 存储结构

/controller 节点

这个节点是临时节点.

集群里第一个启动的 broker 通过在 Zookeeper 里创建一个临时节点 /controller让自己成为控制器。

控制器其实就是一个 broker,只不过它除了具有一般 broker 的功能之外,还负责分区 首领的选举.

其他 broker 在启动时也会尝试创建这个节点,不过它们会收到一个 “节点已存在” 异常 , 然后“意识”到控制 器节点已存在, 也就是说集群里已经有一个控制器了。 其他 broker 在控制器节点上创建 Zookeeper watch 对象, 这样它们就可以收到这个节点的变更通知。 这种方式可以确保集群里一次只有一个控制器存在。

如果控制器被关闭或者与 Zookeeper 断开连接, Zookeeper 上的临时节点就会消 失。 集群里的其他 broker 通过 watch 对象得到控制器节点消失的通知,它们会尝试让自己成为新的控制器。 第一个在 Zookeeper 里成功创建控制器节点的 broker 就会成为新的控制器, 其他节点会收到“节点已存在”的异常,然后在新的控制器节点上再次创建 watch 对象。

当控制器发现一个 broker 已经离开集群(通过观察相关的 Zookeeper 路径,它就知道, 那些失去首领的分区需要一个新首领(这些分区的首领刚好是在这个 broker 上)。 控制器遍历这些分区,并确定谁应该成为新首领(简单来说就是分区副本列表里的下一个副本), 然后向所有包含新首领或现有跟随者的 broker 发送请求。 该请求消息包含了谁是新首领以及谁是分区跟随者的信息。 随后,新首领开始处理来自生产者和消费者的请求,而跟随者开始从新首领那里复制消息。

简而言之, Kafka 使用 Zookeeper 的临时节点来选举控制器, 并在节点加入集群或 退出集群时通知控制器。 控制器负责在节点加入或离开集群时进行分区首领选举。 控制器使用 epoch 来避免“脑裂” 。 “脑裂”是指两个节点 同时认为自己是当前的控制器。


/brokers 节点

这个节点存储了当前所有 broker 的信息.

它包含 3 个子节点: ids, topics, seqid

  1. /brokers/ids

    每个 broker 都会在这个子节点下创建以自己的 id 值为名的子节点. 这些自己点存储这个 broker 相关的信息:

  2. /brokers/topics

    这个节点存储了所有的 topic.


/consumers

保存了消费者的相关信息.

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-11-20 18:14:17

results matching ""

    No results matching ""