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 | {"version":1, "partitions":[ |
这里居然写了个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 | [zk: timo-zk1(CONNECTED) 1] get /brokers/topics/timo_log |
好了,我把这里错误的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直接就不翼而飞了。