背景:
项目迁移至云平台各项要求按照云平台规则。kafka配置修改等操作要通过平台界面。
项目程序分为核心节点和省份节点,通过kafka进行消息传递。
现象:
起初消息收发正常,进行下一步调试,期间同事进行了扩容,暂停几天后消息无法发送,报错如下。
无法创建topic。而使用扩容前的测试topic则是可以正常收发消息的。
判断:
1、怀疑kafka配置auto.create.topics.enable=false,使程序无法自动创建topic,改为true,仍不行。
2、通过kafka控制平台手动创建topic,还是不可以。
3、怀疑是扩容新增机器导致,停掉新增服务器并在配置中去掉。依然不行。
分析:
扩容前的topic可以,新的topic为什么不行呢?于是在程序中打印所能获取到的topic列表
Seq allTopics = zkUtils.getAllTopics();
Iterator iterator = allTopics.iterator();
while (iterator.hasNext()){
String next = iterator.next();
logger.info("all topics-----> {}",next);
}
发现只有测试的topic,推断应该是zk节点的问题,于是查看旧的topic和新的topic在zk上的路径,果然不同:
扩容前topic在zk上的路径:/brokers/topics
扩容后新的路径:/xxxkafka/467624363/xxx-xxxkafka/brokers/topics
但是!在获取topic时又没有指定zk路径,于是在代码中加了一行测试一下
zkClient.getAcl("/xxxkafka/467624363/xxx-xxxkafka/brokers/topics");
试图指定路径来获取新的topic列表,但是报错
java.lang.RuntimeException: trying to get acls on non existing node /xxxkafka/467624363/xxx-xxxkafka/brokers/topics
看来不能从代码层面解决这个问题,那就在配置上找。
解决:
在kafka配置文件server.properties中看到(不知什么时候被改了)
zookeeper.connect=10.123.20.123:12013/xxxkafka/467624363/xxx-xxxkafka
而程序中kafka设置的zk
ZkUtils.apply("10.123.20.123:12013", 30000, 30000, false)
于是修改程序的配置为和kafka配置zookeeper.connect= 的相同
ZkUtils.apply("10.123.20.123:12013/xxxkafka/467624363/xxx-xxxkafka ", 30000, 30000, false)
问题解决!