15.4. 更改主题的复制因素


使用 kafka-reassign-partitions.sh 工具更改 Kafka 集群中主题的复制因素。这可以通过重新分配文件来完成,以描述如何更改主题副本。

先决条件

  • 现有的 Kafka 集群。
  • 您已创建了 JSON 文件,以指定要在操作中包含的主题。

    在此过程中,名为 my-topic 的主题有 4 个副本,而我们希望将其减小到 3。名为 topics.json 的 JSON 文件指定主题,用于生成 reassignment.json 文件。

示例 JSON 文件指定 my-topic

{
  "version": 1,
  "topics": [
    { "topic": "my-topic"}
  ]
}
Copy to Clipboard Toggle word wrap

流程

  1. 如果没有这样做,请使用 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 \ 
    1
    
      --broker-list 0,1,2,3,4 \ 
    2
    
      --generate
    Copy to Clipboard Toggle word wrap

    1
    指定主题的 JSON 文件。
    2
    用于包含在操作中的 kafka 集群中的代理 ID。

    显示当前和提议的副本分配的 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"]}]}
    Copy to Clipboard Toggle word wrap

    如果您需要稍后恢复更改,请将此文件的副本保存到本地。

  2. 编辑 reassignment.json,以从每个分区中删除副本。

    例如,使用 jq 删除主题的每个分区的列表中最后一个副本:

    删除每个分区的最后一个主题副本

    jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
    Copy to Clipboard Toggle word wrap

    显示更新的副本的重新分配文件示例

    {"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 Toggle word wrap

  3. 使用 --execute 选项使主题副本更改。

    /opt/kafka/bin/kafka-reassign-partitions.sh \
      --bootstrap-server localhost:9092 \
      --reassignment-json-file reassignment.json \
      --execute
    Copy to Clipboard Toggle word wrap
    注意

    从代理中删除副本不需要任何代理数据移动,因此不需要节流复制。如果要添加副本,则可能需要更改节流率。

  4. 使用 --verify 选项,验证对主题副本的更改是否已完成。

    /opt/kafka/bin/kafka-reassign-partitions.sh \
      --bootstrap-server localhost:9092 \
      --reassignment-json-file reassignment.json \
      --verify
    Copy to Clipboard Toggle word wrap

    --verify 命令报告正在移动的每个分区都成功完成时,重新分配已完成。最后 --verify 也具有删除任何重新分配节流的影响。

  5. 使用 --describe 选项运行 bin/kafka-topics.sh 命令,以查看对主题的更改结果。

    /opt/kafka/bin/kafka-reassign-partitions.sh \
      --bootstrap-server localhost:9092 \
      --describe
    Copy to Clipboard Toggle word wrap

    减少主题副本数的结果

    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 Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat