Kafka集群运行时,为什么/ controller znode下没有节点?

时间:2018-11-16 05:46:32

标签: apache-kafka

zookepeer客户端的输出:

[zk: s1:2181(CONNECTED) 1] ls /brokers/ids
[1, 2, 3]
[zk: s1:2181(CONNECTED) 1] ls /controller
[]

集群中有3个kafka代理,所以为什么我也无法在/ controller znode中找到控制器?

另一个问题是,我怎么知道kafka,ZooKeeper主选举或Kafka主选举使用哪个主选举?卡夫卡大师选举是否会选举卡夫卡大师经纪人?那么什么是领导人选举?是要选举领导者分区吗?

1 个答案:

答案 0 :(得分:1)

您在问有关Kafka设计方式的非常笼统的问题。为此,没有比Kafka官方文档更好的地方了:

https://kafka.apache.org/documentation.html#impl_zookeeper

文档中的官方控制器说明(我的重点介绍):

  

优化领导者选举流程也很重要,因为   这是不可用的关键窗口。天真的实现   领导选举的结果将是每个分区进行一次选举   当该节点发生故障时,该节点将对所有节点进行分区。相反,我们选择   经纪人之一为“控制人”。 此控制器检测到   经纪人级别的失败,并负责更改   故障代理中所有受影响分区的领导者。结果是   我们能够将许多所需的领导者聚集在一起   更改通知,使选举过程便宜得多,并且   对于大量分区,速度更快。 如果控制器发生故障,则一个   尚存的经纪商将成为新的控制人。

https://kafka.apache.org/documentation.html#design_replicamanagment

因此,控制器是负责监视每个主题/分区负责人的经纪人。如果这些领导者主题/分区中的一个或多个不可用,则控制器将运行领导者选举,并为每个主题/分区指定新的领导者,以便客户(消费者和生产者)都可以在那里消费/生产。

/controller下看不到任何内容的原因是因为您假设它是一个“目录”,而实际上却是一个包含信息的znode。您需要发出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