20.4. ブローカーの削除前のパーティションの再割り当て
Kafka クラスター内のブローカーの数を減らす前に、kafka-reassign-partitions.sh
ツールによって生成された再割り当てファイルを使用してパーティションを再割り当てします。再割り当てファイルでは、Kafka クラスターの残りのブローカーにパーティションを再割り当てする方法を記述する必要があります。ファイルで指定された再割り当てをブローカーに適用し、新しいパーティションの割り当てを確認します。最も番号の大きい Pod のブローカーが最初に削除されます。
この手順では、TLS を使用するセキュアなスケーリングプロセスについて説明します。TLS 暗号化と mTLS 認証を使用する Kafka クラスターが必要です。
kafka-reassign-partitions.sh
ツールは、クラスターを通じてすべてのノードを管理しているか、クラスター内のノードグループを管理するためにノードプールを使用しているかに関係なく、Kafka クラスター内のパーティションを再割り当てするために使用できます。
kafka-reassign-partitions.sh
ツールを使用することもできますが、パーティション再割り当てとクラスターの再バランシングを自動化 するには、Cruise Control の使用を推奨します。Cruise Control は、ダウンタイムなしでトピックをあるブローカーから別のブローカーに移動でき、パーティションを再割り当てする最も効率的な方法です。
前提条件
-
内部 TLS 暗号化と mTLS 認証で設定された
Kafka
リソースに基づいて実行中の Kafka クラスターがあります。 -
reassignment.json
という名前の 再割り当て JSON ファイルを生成 している。 - 実行中の Kafka ブローカーに接続されている対話型 Pod コンテナーを実行している。
-
KafkaUser
として接続されている。このユーザーは、Kafka クラスターとそのトピックの管理権限を指定する ACL ルールで設定されている。
手順
-
まだ確認していない場合には、インタラクティブな Pod コンテナーを実行 して
reassignment.json
という名前の再割り当てJSONファイルを生成します。 reassignment.json
ファイルを対話型 Pod コンテナーにコピーします。oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
<interactive_pod_name> は Pod の名前に置き換えます。
インタラクティブな Pod コンテナーでシェルプロセスを開始します。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
<namespace> を Pod が実行されている OpenShift namespace に置き換えます。
インタラクティブな Pod コンテナーから
kafka-reassign-partitions.sh
スクリプトを使用して、パーティション再割り当てを実行します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
<cluster_name> は、独自の Kafka クラスターの名前に置き換えます。例:
my-cluster-kafka-bootstrap:9093
レプリケーションにスロットリングを適用する場合、
--throttle
とブローカー間のスロットル率 (バイト/秒単位) を渡すこともできます。以下に例を示します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute
このコマンドは、2 つの再割り当て JSON オブジェクトを出力します。最初の JSON オブジェクトには、移動されたパーティションの現在の割り当てが記録されます。後で再割り当てを元に戻す必要がある場合に備え、この値をローカルファイル (Pod のファイル以外) に保存します。2 つ目の JSON オブジェクトは、再割り当て JSON ファイルに渡したターゲットの再割り当てです。
再割り当ての最中にスロットルを変更する必要がある場合は、同じコマンドに別のスロットル率を指定して実行します。以下に例を示します。
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute
ブローカー Pod のいずれかから
kafka-reassign-partitions.sh
コマンドラインツールを使用して、再割り当てが完了したかどうかを確認します。これは先ほどの手順と同じコマンドですが、--verify
オプションの代わりに--execute
オプションを使用します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
--verify
コマンドによって、移動した各パーティションが正常に完了したことが報告されると、再割り当ては終了します。この最終的な--verify
によって、結果的に再割り当てスロットルも削除されます。- 割り当てを元のブローカーに戻すために JSON ファイルを保存した場合は、ここでそのファイルを削除できます。
すべてのパーティション再割り当てが終了すると、削除されるブローカーはクラスター内のいずれのパーティションにも対応しないはずです。これは、ブローカーのデータログディレクトリーにライブパーティションのログが含まれていないことを確認すると検証できます。ブローカのログディレクトリーに、拡張正規表現
\.[a-z0-9]-delete$
に一致しないディレクトリーが含まれている場合、ブローカには、まだライブパーティションがあるため、停止しないでください。これを確認するには、以下のコマンドを実行します。
oc exec my-cluster-kafka-0 -c kafka -it -- \ /bin/bash -c \ "ls -l /var/lib/kafka/kafka-log_<n>_ | grep -E '^d' | grep -vE '[a-zA-Z0-9.-]+\.[a-z0-9]+-delete$'"
n は削除された Pod の数に置き換えます。
上記のコマンドによって出力が生成される場合、ブローカーにはライブパーティションがあります。この場合、再割り当てが終了していないか、再割り当て JSON ファイルが適切ではありません。
-
ブローカーにライブパーティションがないことを確認できたら、
Kafka
リソースのKafka.spec.kafka.replicas
プロパティーを編集してブローカーの数を減らすことができます。