Kafka使用zookeeper来维护集群成员的信息。每个broker都有一个唯一标识符,这个标识符可以在配置文件中指定,也可以自动生成。在broker启动时,它通过建立临时节点把自己的ID注册到zookeeper。kafka组件订阅broker在zookeeper上的注册路径,当有broker进入或退出集群时,这些组件就可以获得通知。
在broker停机、出现网络分区或长时间垃圾回收停顿时,broker会从zookeeper上断开连接,此时broker在启动时创建的临时节点会自动从zookeeper上移除。监听broker列表的kafka组件会被告知该broker已移除。
在关闭broker时,它对应的节点也会消息,不过它的iD会继续存在于其他数据结构中。例如,主题的副本列表里就可能包含这些iD。在完全关闭一个broker之后,如果使用相同的ID启动另一个全新的broker,它会立即加入集群,并拥有与旧broker相同的分区和主题。
控制器其实也是一个broker,只不过它除了具有一般broker的功能之外,还负责分区首领的选举。集群里第一个启动的broker通过在zookeeper里创建一个临时节点让自己成为控制器。其他的broker在控制器节点上创建zookeeper watch对象,这样他们就可以收到这个节点的变更通知。
如果控制器被关闭或者与zookeeper断开连接,zookeeper上的临时节点就会消失。集群里的其他broker通过watch对象得到控制器节点消失的通知,他们尝试让自己成为新的控制器。第一个在zookeeper里成功创建控制器节点的broker成为新的控制器,其他的broker会在新的控制器节点上创建新的watch对象。
原文:https://www.cnblogs.com/htyj/p/14331849.html