15.4. 更改主题的复制因素
使用 kafka-reassign-partitions.sh
工具更改 Kafka 集群中主题的复制因素。这可以通过重新分配文件来完成,以描述如何更改主题副本。
先决条件
- 现有的 Kafka 集群。
您已创建了 JSON 文件,以指定要在操作中包含的主题。
在此过程中,名为
my-topic
的主题有 4 个副本,而我们希望将其减小到 3。名为topics.json
的 JSON 文件指定主题,用于生成reassignment.json
文件。
示例 JSON 文件指定 my-topic
流程
如果没有这样做,请使用
kafka-reassign-partitions.sh
工具生成名为reassignment.json
的重新分配 JSON 文件。生成重新分配 JSON 文件的命令示例
/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --topics-to-move-json-file topics.json \ --broker-list 0,1,2,3,4 \ --generate
/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --topics-to-move-json-file topics.json \
1 --broker-list 0,1,2,3,4 \
2 --generate
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示当前和提议的副本分配的 JSON 文件示例
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您需要稍后恢复更改,请将此文件的副本保存到本地。
编辑
reassignment.json
,以从每个分区中删除副本。例如,使用
jq
删除主题的每个分区的列表中最后一个副本:删除每个分区的最后一个主题副本
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示更新的副本的重新分配文件示例
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
--execute
选项使主题副本更改。/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --reassignment-json-file reassignment.json \ --execute
/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --reassignment-json-file reassignment.json \ --execute
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意从代理中删除副本不需要任何代理数据移动,因此不需要节流复制。如果要添加副本,则可能需要更改节流率。
使用
--verify
选项,验证对主题副本的更改是否已完成。/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --reassignment-json-file reassignment.json \ --verify
/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --reassignment-json-file reassignment.json \ --verify
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当
--verify
命令报告正在移动的每个分区都成功完成时,重新分配已完成。最后--verify
也具有删除任何重新分配节流的影响。使用
--describe
选项运行bin/kafka-topics.sh
命令,以查看对主题的更改结果。/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --describe
/opt/kafka/bin/kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --describe
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 减少主题副本数的结果
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow