web-dev-qa-db-ja.com

Kafkaトピックのレプリカの数を変更する方法は?

プロデューサーまたは管理者がKafkaトピックを作成した後、このトピックのレプリカの数をどのように変更しますか?

53
GuruPo

編集:私は間違っていることが証明されました-確認してください ŁukaszDumiszewskiからの優れた答え。

私は今のところ、完全さのために私の元の答えを残しています。



できるとは思わない。通常は次のようになります

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

しかし、それは言います

オプション「[replication-factor]」は、オプション「[alter]」と一緒に使用できません

パーティションの数をオンザフライで変更できるのは面白いことです(実行時に行われると非常に破壊的なアクションになることが多い)が、レプリケーション係数を増やすことはできません。ただし、10.0ではなく0.10であることを忘れないでください。拡張リクエストについてはこちらをご覧ください https://issues.Apache.org/jira/browse/KAFKA-154

11

特定のトピックのレプリカの数を増やすには、以下を行う必要があります。

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

参照: 複製係数を増やす方法を説明した公式ドキュメントの一部

99

ŁukaszDumiszewskiの answer は正しいですが、そのファイルを手動で生成するのは少し難しいです。幸いなことに、@ŁukaszDumiszewskiが言ったことを達成するためのいくつかのeasy方法があります。

  • kafka-managertool を使用している場合、バージョン2.0.0.2から、トピックビューのGenerate Partition Assignmentセクションでレプリケーション係数を変更できます。次に、Reassign Partitionsをクリックして、生成されたパーティション割り当てを適用する必要があります(別のレプリケーション係数を選択した場合、警告が表示されますが、Force Reassignをクリックできます)。

  • Rubyがインストールされている場合、これを使用できます ヘルパースクリプト

  • Nodejsを使用する場合は、 this Gistを使用してファイルを生成できます。

パーティションがたくさんある場合、kafka-reassign-partitionsを使用してŁukaszDumiszewskiの回答(および公式ドキュメント)で必要なjsonファイルを生成すると、時間を節約できます。すべてのパーティションを指定せずに1〜2台のサーバーから64パーティショントピックを複製する例を次に示します。

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
MilesHampson

このスクリプトは、すべてのトピックのレプリケーション係数を変更する場合に役立ちます。

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