@xtccc
2016-01-06T14:22:16.000000Z
字数 850
阅读 2711
Kafka
Kafka的5个brokers正常启动,但是在创建topic时,Kafka认为当前没有可用的brokers,如下:
Kafka是怎样探测当前可用的brokers?
Kafka的配置项 zookeeper.chroot
指定了Kafka集群在ZK中使用的root znode,所有与该Kafka集群相关的ZK数据都会保存在该root znode下。Kafka客户端会根据命令中的 --zookeeper
参数来查看当前可用的brokers。例如,如果这个参数为“{zk_quorum}/kafka”,那么可以看到这个目录下有这些数据:
为什么会找不到可用brokers?
再看创建topic的命令,其中关于ZK的参数ZK_QUORUN
,我们为它设置的实际值是 ecs2:2181,ecs3:2181,ecs4:2181
,这样会导致ZK client在使用ZK的相关数据时,使用的root znode是根目录,而不是Kafka参数zookeeper.chroot
。
由于这个集群之安装过Kafka,那时设置的Kafka root znode就是根目录,所以在root znode下也会有目录/brokers/ids
,但是这个znode是空的,因此找不到可用的brokers。
为Kafka client指定正确的ZK root znode
我们将创建topic的命令中的参数--zookeeper
改为{ZK_QUORUM}/{chroot}
即可。例如,我们的Kafak集群的实际zookeeper.chroot
值为kafka
,那么,参数--zookeeper
的值如下:
实际上,Kafka broker的启动命令的配置文件中,也是这么类似设置root znode的。例如,我们实际集群中Kafka启动的配置文件中(/var/run/cloudera-scm-agent/process/3779-kafka-KAFKA_BROKER/kafka.properties)有一项设置为: