Kafka 批量增加 Topic 副本数
网上没找到合适的脚本,于是自己写了个
找到副本为 1 的 Topic
cat filter.sh
#!/bin/bash
ZK_HOST=zk1:2181
topics=`kafka-topics.sh --zookeeper $ZK_HOST -list`
for i in $topics;do
replicsNum=`kafka-topics.sh --zookeeper $ZK_HOST -describe --topic $i|grep ReplicationFactor|awk '{print $3}'|awk -F: '{print $2}'`
if [ $replicsNum == 1 ];then
echo $i >> ./topic.txt
fi
done
生成 reassignment.json
根据自己 Kafka 集群的 Broker ID 创建 leaders.txt,如下所示:
# Broker ID 为 0 1 2
cat leaders.txt
0
1
2
cat run.sh
#!/bin/bash
ZK_HOST=zk1:2181
topics=`cat ./topic.txt`
IFS=$'\n'
echo '{"version":1,"partitions":[' > topic-reassignment.json
for i in $topics;do
leaders=`kafka-topics.sh --zookeeper $ZK_HOST -describe --topic $i|grep Leader`
for leader in $leaders;do
partition=`echo $leader |awk '{print $4}'`
leader=`echo $leader |awk '{print $6}'`
# 用 shuf 保证 副分片 和 主分片 不在同一个 Broker 且随机分配在剩余的节点中
follwer=`grep -vxF $leader ./leaders.txt | shuf -n1`
echo '{"topic":"'$i'","partition":'$partition',"replicas":['$leader','$follwer']},' >> ./topic-reassignment.json
done
done
echo ']}' >> topic-reassignment.json
执行 reassignment
topic-reassignment.json 最后会多一个逗号,删掉后执行如下命令即可完成所有 Topic 的副本数调整:
kafka-reassign-partitions.sh --zookeeper zk1:2181 --reassignment-json-file topic-reassignment.json --execute