kafka的broker id 填写错误的问题

近日要搞kafka集群降配,因此要检查一下这个kafka集群的所有topic是否副本数有等于1的。

1
./kafka-topics.sh --zookeeper timoq-zk1:2181 --describe | grep 'ReplicationFactor:1'

这样就能列出来,果然有几个topic还是1个副本的,那个就开始搞成2个副本。其实kafka可以给你生成的副本配置的json的。

1
./kafka-reassign-partitions.sh --zookeeper timo-zk1:2181 --topics-to-move-json-file topic-generate.json --broker-list "0,1,2,3,4,5,6" --generate

但是这种生成出来的json文件无法跟现有的对照起来,我是希望现在分区谁是leader,后面还是leader,于是就手动写了个json文件。

1
2
3
4
5
{"version":1, "partitions":[
{"topic":"timo_log","partition":0,"replicas":[3,4]},
{"topic":"timo_log","partition":1,"replicas":[5,6]},
{"topic":"timo_log","partition":2,"replicas":[6,7]}]
}

这里居然写了个7,而这个broker是不存在的。

1
../bin/kafka-reassign-partitions.sh --zookeeper timo-zk1:2181 --execute --reassignment-json-file add_timo_log.json

果然执行了后,这个partition-1就一直在执行中。

而describe一下,也就是running中。这个我擅长啊,一次kafka增加Partition流程 | The Mirages

这里有提到的,进入zk

1
[zk: timo-zk1(CONNECTED) 1] rmr /admin/reassign_partitions

然后把json改对了,再执行一遍迁移,发现还是如此啊,一点变化都没有,还是broker-7,还是继续running中。

经过学习,这个Replicas的数据是存放在zookeeper的/brokers/topics/timo_log

1
2
3
[zk: timo-zk1(CONNECTED) 1] get /brokers/topics/timo_log
[zk: timo-zk1(CONNECTED) 2] set /brokers/topics/timo_log 'json'
[zk: timo-zk1(CONNECTED) 2] sync /

好了,我把这里错误的6,7改成了 6,3了。再跟前面删除了迁移任务,再跑一遍迁移个其他的topic试试,发现其他topic都迁移成功了,但是/brokers/topics/timo_log里的信息又变回去了6,7了。

看来是还有地方缓存了这个信息。那么信息存放在哪里呢。

Kafka实战宝典:Kafka的控制器controller详解 - WindyQin - 博客园

这篇文章写的非常清楚,这些信息都存放在了controller上了。而这些数据都在controller的内存里。

而一旦controller故障转移,它就会从zk里重新获取信息。那就让它转移一下呗,重新选举一下。正常就是登录zk,然后删除 /controller 就可以触发重新选举。

但是删除这个会引发什么问题,确实没有特别研究,还问了dp,它也不建议直接删除,它更建议重启对应的broker节点,主要说是kafka 2.0以前的版本这块代码写的比较复杂,容易有bug。那保险起见就重启broker,顺便也检查下所有客户端重连机制。

果然重启能够结果99%的问题,后面就还是修正好json文件重新执行就好了,那个broker 7直接就不翼而飞了。