Apache kafka 如何更改卡夫卡主题的副本数量?

Apache kafka 如何更改卡夫卡主题的副本数量?,apache-kafka,Apache Kafka,制作人或管理员创建卡夫卡主题后,您将如何更改此主题的副本数量?编辑:我被证明是错误的-请检查 我现在把我的原始答案留给完整性 我想你做不到。通常是这样的 ./kafka-topics.sh--zookeer localhost:2181--alter--topic test2 --复制因子3 但是它说 选项“[replication factor]”不能与选项“[alter]”一起使用 有趣的是,您可以动态更改分区的数量(在运行时这样做通常会造成极大的破坏),但不能增加复制因子,这应该是透明

制作人或管理员创建卡夫卡主题后,您将如何更改此主题的副本数量?

编辑:我被证明是错误的-请检查

我现在把我的原始答案留给完整性



我想你做不到。通常是这样的

./kafka-topics.sh--zookeer localhost:2181--alter--topic test2 --复制因子3

但是它说

选项“[replication factor]”不能与选项“[alter]”一起使用


有趣的是,您可以动态更改分区的数量(在运行时这样做通常会造成极大的破坏),但不能增加复制因子,这应该是透明的。但是记住,它是0.10,不是10.0。。。有关增强请求,请参见此处。要增加给定主题的副本数量,您必须:

1.在自定义重新分配json文件中指定额外副本 例如,您可以创建增加复制因子.json,并将此内容放入其中:

{"version":1,
  "partitions":[
     {"topic":"topic-to-increase","partition":0,"replicas":[0,1,2]},
     {"topic":"topic-to-increase","partition":1,"replicas":[0,1,2]},
     {"topic":"topic-to-increase","partition":2,"replicas":[0,1,2]}
]}
{“版本”:1,
“分区”:[
{“主题”:“信号”,“分区”:0,“副本”:[0,1,2]},
{“主题”:“信号”,“分区”:1,“副本”:[0,1,2]},
{“主题”:“信号”,“分区”:2,“副本”:[0,1,2]}
]}
2.将该文件与kafka重新分配分区工具的--execute选项一起使用 [或kafka-reassign-partitions.sh-取决于kafka包]

 $ kafka-topics --zookeeper localhost:2181 --topic signals --describe

Topic:signals   PartitionCount:3    ReplicationFactor:3 Configs:retention.ms=1000000000
Topic: signals  Partition: 0    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1
Topic: signals  Partition: 1    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1
Topic: signals  Partition: 2    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1
例如:

$kafka重新分配分区--zookeeper localhost:2181--重新分配json文件increase-replication-factor.json--执行
3.使用kafka主题工具验证复制系数 [或kafka-topics.sh-取决于kafka包]

 $ kafka-topics --zookeeper localhost:2181 --topic signals --describe

Topic:signals   PartitionCount:3    ReplicationFactor:3 Configs:retention.ms=1000000000
Topic: signals  Partition: 0    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1
Topic: signals  Partition: 1    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1
Topic: signals  Partition: 2    Leader: 2   Replicas: 0,1,2 Isr: 2,0,1

另请参见:.

如果您有很多分区,那么使用
卡夫卡重新分配分区
来生成Łukasz Dumiszewski的答案(以及官方文档)所需的json文件可以节省时间。下面是一个将64分区主题从1台服务器复制到2台服务器的示例,无需指定所有分区:

expand_topic=TestTopic
current_server=111
new_servers=111,222
echo '{"topics": [{"topic":"'${expand_topic}'"}], "version":1}' > /tmp/topics-to-expand.json
/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file /tmp/topics-to-expand.json --broker-list "${current_server}" --generate | tail -1 | sed s/\\[${current_server}\\]/\[${new_servers}\]/g | tee /tmp/topic-expand-plan.json
/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file /tmp/topic-expand-plan.json --execute
/bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic ${expand_topic}
产出:

Topic:TestTopic PartitionCount:64   ReplicationFactor:2 Configs:retention.ms=6048000
    Topic: TestTopic    Partition: 0    Leader: 111 Replicas: 111,222   Isr: 111,222
    Topic: TestTopic    Partition: 1    Leader: 111 Replicas: 111,222   Isr: 111,222
    ....

要增加给定主题的副本数量,您必须:

1。使用下面的命令指定现有主题的额外分区(假设从2增加到3)

bin/kafktopics.sh--zookeer localhost:2181--alter--topic topic to increase--partitions 3

2。在自定义重新分配json文件中指定额外副本

#!/bin/bash
topics=`kafka-topics.sh --zookeeper localhost:2181 --list`

while read -r line; do lines+=("$line"); done <<<"$topics"
echo '{"version":1,
 "topics":['
 for t in $topics; do
     echo -e '     { "topic":' \"$t\" '},'
done

echo '  ]
}'

bash alltopics.sh > alltopics.json
kafka-reassign-partitions.sh --zookeeper localhost:2181 --broker-list "0,1,2" --generate --topics-to-move-json-file alltopics.json > reassign.json
例如,您可以创建increase-replication-factor.json并将以下内容放入其中:

{"version":1,
  "partitions":[
     {"topic":"topic-to-increase","partition":0,"replicas":[0,1,2]},
     {"topic":"topic-to-increase","partition":1,"replicas":[0,1,2]},
     {"topic":"topic-to-increase","partition":2,"replicas":[0,1,2]}
]}
3。将该文件与kafka重新分配分区工具的--execute选项一起使用

bin/kafka重新分配分区--zookeeper localhost:2181--重新分配json文件increase-replication-factor.json--执行

4。使用卡夫卡主题工具验证复制系数

bin/kafka主题——zookeeper localhost:2181——要增加的主题——描述

ukasz Dumiszewski的是正确的,但手动生成该文件有点困难。 幸运的是,有一些简单的方法可以实现@ukasz Dumiszewski所说的

  • 如果使用的是
    kafka管理器
    ,则从版本
    2.0.0.2
    可以在主题视图的
    生成分区分配
    部分更改复制系数。然后,您应该单击
    重新分配分区
    以应用生成的分区分配(如果您选择不同的复制因子,您将收到警告,但您可以单击
    强制重新分配

  • 如果你安装了ruby,你可以使用这个

  • 如果你喜欢nodejs,你也可以用gist生成文件
如果您希望更改所有主题的复制系数,此脚本可能会帮助您:

#!/bin/bash

topics=`kafka-topics --list --zookeeper zookeeper:2181`

while read -r line; do lines+=("$line"); done <<<"$topics"
echo '{"version":1,
  "partitions":[' > tmp.json
for t in $topics; do 
    if [ "${t}" == "${lines[-1]}" ]; then
        echo "    {\"topic\":\"${t}\",\"partition\":0,\"replicas\":[0,1,2]}" >> tmp.json
    else
        echo "    {\"topic\":\"${t}\",\"partition\":0,\"replicas\":[0,1,2]}," >> tmp.json
    fi
done

echo '  ]
}' >> tmp.json

kafka-reassign-partitions --zookeeper zookeeper:2181 --reassignment-json-file tmp.json --execute
#/bin/bash
topics=`kafka topics--list--zookeeper zookeeper:2181`
而read-r行;do行+=(“$line”);完成tmp.json
其他的
echo“{\'topic\”:\“${t}\”,“partition\”:0,“replications\”:[0,1,2]},”>>tmp.json
fi
完成
回声']
}'>>tmp.json
kafka重新分配分区--zookeeper zookeeper:2181--重新分配json文件tmp.json--执行

脚本式回答@Бцццццц-цццццццццццццццц。此更新版本包括:

#!/bin/bash

brokerids="1,2,3"
topics=`kafka-topics --list --zookeeper zookeeper:2181`

while read -r line; do lines+=("$line"); done <<<"$topics"
echo '{"version":1,
  "partitions":['
for t in $topics; do
    sep=","
    pcount=$(kafka-topics --describe --zookeeper zookeeper:2181 --topic $t | awk '{print $2}' | uniq -c |awk 'NR==2{print $1}')
    for i in $(seq 0 $[pcount - 1]); do
        if [ "${t}" == "${lines[-1]}" ] && [ "$[pcount - 1]" == "$i" ]; then sep=""; fi
        randombrokers=$(echo "$brokerids" | sed -r 's/,/ /g' | tr " " "\n" | shuf | tr  "\n" "," | head -c -1)
        echo "    {\"topic\":\"${t}\",\"partition\":${i},\"replicas\":[${randombrokers}]}$sep"
    done
done

echo '  ]
}'

1。将所有主题复制到json文件

#!/bin/bash
topics=`kafka-topics.sh --zookeeper localhost:2181 --list`

while read -r line; do lines+=("$line"); done <<<"$topics"
echo '{"version":1,
 "topics":['
 for t in $topics; do
     echo -e '     { "topic":' \"$t\" '},'
done

echo '  ]
}'

bash alltopics.sh > alltopics.json
kafka-reassign-partitions.sh --zookeeper localhost:2181 --broker-list "0,1,2" --generate --topics-to-move-json-file alltopics.json > reassign.json
3。Cleanup reassign.json文件它包含现有值和建议值

kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file reassign.json --execute
4。运行kafka-reassign-partitions.sh以重新平衡主题

kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file reassign.json --execute
您还可以为此使用:

#第一次运行时使用--validate仅查看kafkactl将执行的操作
kafkactl alter topic我的主题--复制因子2--仅验证
#然后重新分配复制副本
卡夫卡特尔变换话题我的话题——复制因子2
请注意,kafkactl为此使用的Kafka API仅适用于Kafka≥ 2.4.0


免责声明:我是该项目的参与者

感谢您及时回复,您的意思是没有必要或不寻常地在Kafka运行时更改副本,对吗?或者,如果我真的想更改它,我可以在你粘贴的链接中安装补丁,对吗?我不认为这个补丁可以开箱即用——它是根据一年前的版本完成的。最重要的是,它不是动态工作的——它只是更改元数据,所以据我所知,您需要重新启动整个集群才能使其生效。若你们关闭了整个系统,那个么删除和重新创建这个主题可能会更容易。至于真正的解决方案-在系统运行时添加副本,我认为没有人在做这方面的工作,添加副本当然需要一些努力(但在当前的体系结构中应该是可能的)。用户端或生产者端Kafka可以重新分配分区