Вы задаете очень общие вопросы о том, как был разработан Кафка. Для этого нет лучшего места, чем официальная документация Кафки:
https://kafka.apache.org/documentation.html#impl_zookeeper
Официальное объяснение контроллера, из документов (мои основные моменты):
Также важно оптимизировать процесс выборов руководства, так как
это критическое окно недоступности. Наивная реализация
выборов лидера в конечном итоге будет проводить выборы на раздел для
все разделы, размещенные узлом при сбое этого узла. Вместо этого мы выбираем
один из брокеров в роли «контролера». Этот контроллер обнаруживает
сбои на уровне брокера и несет ответственность за изменение
лидер всех затронутых разделов в отказавшем брокере. Результат
что мы можем объединить многие из необходимого руководства
изменить уведомления, что делает процесс выборов намного дешевле и
быстрее для большого количества разделов. Если контроллер выходит из строя, один
из оставшихся в живых брокеров станет новым контролером.
https://kafka.apache.org/documentation.html#design_replicamanagment
Итак, контроллер - это брокер, который отвечает за мониторинг лидеров каждой из тем / разделов. Если одна или несколько тем / разделов лидера становятся недоступными, контроллер затем запускает выборы лидера и назначает нового лидера для каждой из этих тем / разделов, чтобы клиенты (как потребители, так и производители) могли использовать / производить там.
Причина, по которой вы ничего не видите под /controller
, заключается в том, что вы предполагаете, что это «каталог», тогда как в действительности это узел информации. Вам нужно выполнить команду get /controller
, чтобы увидеть результат. Вы должны увидеть что-то вроде этого:
[zk: s1:2181(CONNECTED) 1] get /controller
{"version":1,"brokerid":100,"timestamp":"1506197069724"}
cZxid = 0xf9
ctime = Sat Sep 23 22:04:29 CEST 2017
mZxid = 0xf9
mtime = Sat Sep 23 22:04:29 CEST 2017
pZxid = 0xf9
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15eaa3a4fdd000d
dataLength = 56
numChildren = 0