【问题标题】:How to change the number of replicas of a Kafka topic?如何更改Kafka主题的副本数?
【发布时间】:2016-10-23 23:12:00
【问题描述】:

生产者或管理员创建了Kafka主题后,如何更改该主题的副本数?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    在第一步中,我们需要使用副本更改主题

    ./kafka-topics.sh --describe --zookeeper prod-az-p1-zk01.<domain>.prod:2181 --topic test2
    

    然后在下一步中,我们需要确定需要同步副本的代理列表,并且需要重新平衡主题来执行此操作,创建一个 json 文件并定义所有 ISR 代理和主题

        {"version":1,
        "partitions":[
         {"topic":"test2","partition":0,"replicas":[0,10]},
         {"topic":"test2","partition":1,"replicas":[10,20]}
        ]}
    

    最后我们需要重新平衡分区的主题

    ./kafka-reassign-partitions.sh --zookeeper prod-az-p1-zk01.<domain>.prod:2181 --reassignment-json-file /tmp/increase-replication-factor.json --execute
    

    验证

    [root@prod-az-p2-kafka02 bin]# ./kafka-topics.sh --describe --zookeeper prod-az-p1-zk01.<domain>.prod:2181 --topic test2
    Topic: test2    TopicId: -LoL36ztSeyC8rzvnp4YMw PartitionCount: 2   ReplicationFactor: 2    Configs:
        Topic: test2    Partition: 0    Leader: 10  Replicas: 0,10  Isr: 10
        Topic: test2    Partition: 1    Leader: 20  Replicas: 10,20 Isr: 20,10
    

    【讨论】:

      【解决方案2】:

      您也可以为此使用kafkactl

      # first run with --validate-only to see what kafkactl will do
      kafkactl alter topic my-topic --replication-factor 2 --validate-only
      
      # then do the replica reassignment
      kafkactl alter topic my-topic --replication-factor 2
      

      请注意,kafkactl 用于此目的的 Kafka API 仅适用于 Kafka ≥ 2.4.0。

      免责声明:我是这个项目的贡献者

      【讨论】:

      • 这确实是一个很棒的工具。是否允许增加和减少副本的数量?我来自 stackoverflow.com/a/65571902/2148953 ,所以也许这就是我的问题中的 OP 需要的答案
      • 是的,可以增加和减少副本的数量
      • 你应该回答这个问题,我肯定会赞成
      • 你能更新到 2.8 版吗,我尝试运行它,它说 api 不受支持
      • 实际上正在运行 2.8 的 confluent 6.2.0
      【解决方案3】:

      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
      

      2。运行 kafka-reassign-partitions.sh 生成重新平衡的文件

      kafka-reassign-partitions.sh --zookeeper localhost:2181 --broker-list "0,1,2" --generate --topics-to-move-json-file alltopics.json > reassign.json
      

      3.清理包含现有值和建议值的 reassign.json 文件

      4.运行 kafka-reassign-partitions.sh 重新平衡主题

      kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file reassign.json --execute
      

      【讨论】:

      • 这对我帮助很大。没有大惊小怪,只是简单而直接的步骤。干得好@bhargav joshi
      【解决方案4】:

      @Дмитрий-Шепелев 的脚本答案不包括针对具有多个分区的主题的解决方案。此更新版本可以:

      #!/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 '  ]
      }'
      

      注意:它还会随机化代理并为每个分区选择两个副本。因此,请确保脚本中的 brokerid 定义正确。

      执行如下:

      $ ./reassign.sh > reassign.json
      $ kafka-reassign-partitions --zookeeper zookeeper:2181 --reassignment-json-file reassign.json --execute
      

      【讨论】:

      • pcount 对我不起作用-使用 kafka 2.5.0。改写为:pcount=$(/opt/kafka/bin/kafka-topics.sh --describe --zookeeper zookeeper:2181 --topic $t | grep 'Partition:' | wc -l)
      【解决方案5】:

      编辑:我被证明是错误的 - 请检查excellent answer from Łukasz Dumiszewski.

      为了完整起见,我暂时保留原来的答案。



      我不认为你可以。通常它会像

      ./kafka-topics.sh --zookeeper localhost:2181 --alter --topic test2 --replication-factor 3

      但它说

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

      有趣的是,您可以即时更改分区数量(在运行时执行此操作通常具有巨大的破坏性),但不能增加复制因子,这应该是透明的。但请记住,它是 0.10,而不是 10.0...请参阅此处获取增强请求https://issues.apache.org/jira/browse/KAFKA-1543

      【讨论】:

      • 感谢您及时回复,您的意思是在Kafka运行时更改副本没有必要或不寻常,对吧?或者如果我确实想更改它,我可以在您粘贴的链接中安装补丁,对吗?
      • 我认为这个补丁不会开箱即用——它是针对一年前的版本完成的。最重要的是,它不是动态工作的 - 它只是更改元数据,所以据我了解,您需要重新启动整个集群才能使其生效。如果您仍然关闭整个系统,删除和重新创建主题可能会更容易。至于真正的解决方案——在系统运行时添加副本,我认为没有人在做这个,添加它肯定是一些努力(但在当前架构下应该是可能的)。
      • 复制因子无法改变,您需要指定 --replicas 选项
      • 我不确定这个答案是否有任何用途?只删除它有意义吗?它只是指向正确答案的链接,如果删除此答案,它将出现在顶部(此答案是公认的答案,因此 SO 在 Łukasz Dumiszewski 的相关答案之前显示此答案)。
      【解决方案6】:

      如果您想更改所有主题的复制因子,此脚本可能会对您有所帮助:

      #!/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
      

      【讨论】:

      • 你能解释一下为什么这应该有效吗?请为此答案添加一些细节,以便有类似问题的人也可以使用它!谢谢!
      • 当我发现我团队的开发人员创建了没有副本的主题时,我编写了这个脚本。我们没有使用很多分区。不是每个人都知道默认的 Kafka 将复制因子设置为 1。高容错性是集群的主要要求。
      • 为什么这不起作用?脚本获取所有主题。形成 json。并应用它。
      • 这不是很安全,因为它假设您只有 3 个同等规模的经纪人,他们已经平均分配了
      • 从脚本文本中不是很明显吗?网络管理员的第一条规则是不要运行晦涩的脚本。))) 如果我没有 3 个相同大小的代理,我怎么能说集群是高可用的?我知道我的剧本不是灵丹妙药。但在我的情况下,他帮助了我。如果您的情况不同,您可以根据需要修复我的脚本或使用其他脚本。
      【解决方案7】:

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

      • 如果您使用的是kafka-manager tool,从版本2.0.0.2 开始,您可以在主题视图的Generate Partition Assignment 部分更改复制因子。然后你应该点击Reassign Partitions来应用生成的分区分配(如果你选择不同的复制因子,你会得到一个警告,但你可以在之后点击Force Reassign)。

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

      • 如果您更喜欢 nodejs,您也可以使用this gist 生成文件。

      【讨论】:

      • 这对我来说是最简单的方法,因为我有一个正在运行的 Kafka 管理器实例。值得一提的是,您必须“强制重新分配”两次:当您收到警告时,您必须单击“尝试强制运行”链接,这将带您返回主题概览屏幕。现在将有一个修改后的按钮“强制重新分配分区”,它将发挥作用。感谢您的提示!
      【解决方案8】:

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

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

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

      2。在自定义重新分配 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-reassign-partitions 工具的 --execute 选项的文件

      bin/kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file increase-replication-factor.json --execute

      4.使用 kafka-topics 工具验证复制因子

      bin/kafka-topics --zookeeper localhost:2181 --topic topic-to-increase --describe

      【讨论】:

        【解决方案9】:

        如果您有很多分区,使用kafka-reassign-partitions 生成 Ł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
            ....
        

        【讨论】:

          【解决方案10】:

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

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

          例如,您可以创建 increase-replication-factor.json 并将此内容放入其中:

          {"version":1,
            "partitions":[
               {"topic":"signals","partition":0,"replicas":[0,1,2]},
               {"topic":"signals","partition":1,"replicas":[0,1,2]},
               {"topic":"signals","partition":2,"replicas":[0,1,2]}
          ]}
          

          2。将该文件与 kafka-reassign-partitions 工具的 --execute 选项一起使用

          [或 kafka-reassign-partitions.sh - 取决于 kafka 包]

          例如:

          $ kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file increase-replication-factor.json --execute
          

          3。使用 kafka-topics 工具验证复制因子

          [或 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
          

          另请参阅:the part of the official documentation that describes how to increase the replication factor

          【讨论】:

          • 以编程方式设置复制因子的位置...即消费者端或生产者端
          • Kafka-reassign-partitions 可以通过指定 --generate--topics-to-move-json-file,但是文档没有很好地解释内容:{ "topics": [ { "topic": "YOUR_TOPIC_NAME_1" }, { "topic": "YOUR_TOPIC_NAME_2" } ], "version": 1 } 该命令看起来像kafka-reassign-partitions.sh --zookeeper #.#.#.#:2181,#.#.#.#:2181,#.#.#.#:2181 --broker-list #,#,# --topics-to-move-json-file reassignment.topics.json --generate
          • 第 2 步 kafka-reassign-partitions 是否会导致停机?我有一些复制因子为 1 的主题(默认,创建时忘记指定),我想知道我的生产者在重新分配分区时是否会出错。
          • 如何自动执行此操作?第一步迫使我手工制作这个,了解现有的代理数量,分区。
          • @beatrice 在 Kafka 中,目前的主题管理是半手动过程。您可以使用 ./kafka-topics.sh –zookeeper zkhost:9092 --describe 获取有关分区的信息 对于代理信息,请使用 zookeeper-shell.sh zkhost:9092 ls /brokers/ids
          猜你喜欢
          • 2023-01-11
          • 2017-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-09
          • 2020-09-02
          • 2019-11-16
          • 2016-09-23
          相关资源
          最近更新 更多