记一次kafka配置的坑

背景:

项目迁移至云平台各项要求按照云平台规则。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)

 

问题解决!

你可能感兴趣的:(kafka,分布式)