第4章 KRaft モードへの移行
Kafka クラスターでのメタデータ管理に ZooKeeper を使用している場合は、KRaft モードで Kafka を使用するように移行できます。KRaft モードは ZooKeeper を置き換えて分散調整を行い、信頼性、スケーラビリティー、およびスループットを強化します。
現在、ZooKeeper から KRaft に移行するには、静的コントローラークォーラムを使用する必要があります。Streams for Apache Kafka 2.9 (LTS) で、静的および動的コントローラークォーラムの両方のサポートが導入される予定です。その時点で KRaft サポートも GA に昇格される予定です。
クラスターを移行するには、次の手順を実行します。
- クラスター管理用の ZooKeeper を置き換えるために、コントローラーノードのクォーラムをインストールします。
-
コントローラー設定で
zookeeper.metadata.migration.enableプロパティーをtrueに設定して、KRaft の移行を有効にします。 - コントローラーを起動し、同じ設定プロパティーを使用して現在のクラスターブローカーで KRaft の移行を有効にします。
- ブローカーのローリング再起動を実行して、設定の変更を適用します。
- 移行が完了したら、ブローカーを KRaft モードに切り替え、コントローラーで移行を無効にします。
KRaft モードへの移行が完了すると、ZooKeeper へのロールバックができなくなります。移行を進める前に、この点を慎重に検討してください。
移行を開始する前に、ご使用の環境が KRaft モードの Kafka をサポートできることを確認してください。
- 移行は専用コントローラーノードでのみサポートされ、broker と controller の二重のロールを持つノードではサポートされません。
- 移行プロセス全体を通じて、ZooKeeper と KRaft コントローラーノードが並行して動作するため、クラスター内に十分なコンピュートリソースが必要です。
前提条件
-
Red Hat Enterprise Linux に
kafkaユーザーとしてログインしている。 - Streams for Apache Kafka が 各ホストにインストールされており、設定ファイルが使用可能である。
- Kafka 3.7.0 以降と Streams for Apache Kafka 2.7 を使用している。以前のバージョンの Streams for Apache Kafka を使用している場合は、KRaft モードに移行する前にアップグレードしてください。
移行プロセスを確認するためにログが有効になっている。
クラスター内のコントローラーおよびブローカーのルートロガーに対して
log4j.propertiesでDEBUGレベルを設定してください。移行固有の詳細なログを取得するには、移行ロガーにTRACEを設定します。コントローラーロギング設定
log4j.rootLogger=DEBUG log4j.logger.org.apache.kafka.metadata.migration=TRACE
手順
Kafka クラスターのクラスター ID を取得します。
zookeeper-shellツールを使用します。/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /cluster/idこのコマンドはクラスター ID を返します。
KRaft コントローラークォーラムをクラスターにインストールします。
controller.propertiesファイルを使用して、各ホスト上でコントローラーノードを設定します。各コントローラーには少なくとも次の設定が必要です。
- 一意のノード ID
-
移行有効フラグの
trueへの設定 - ZooKeeper の接続の詳細
- コントローラークォーラムが使用するリスナー名
- コントローラー投票者のクォーラム
ブローカー間通信のリスナー名
コントローラー設定の例
process.roles=controller node.id=1 zookeeper.metadata.migration.enable=true zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090 inter.broker.listener.name=PLAINTEXTコントローラークォーラムの形式は、コンマ区切りリストの
<node_id>@<hostname>:<port>です。KRaft コントローラーが移行を開始するには、ブローカー間リスナー名が必要です。
各コントローラーノードのログディレクトリーをセットアップします。
/opt/kafka/bin/kafka-storage.sh format -t <uuid> -c /opt/kafka/config/kraft/controller.properties戻り値:
Formatting /tmp/kraft-controller-logs<uuid> は、取得したクラスター ID に置き換えます。クラスター内の各コントローラーノードに同じクラスター ID を使用します。
デフォルトでは、
controller.properties設定ファイルで指定されたログディレクトリー (log.dirs) は/tmp/kraft-controller-logsに設定されます。/tmpディレクトリーは通常、システムが再起動するたびにクリアされるため、開発環境のみに適しています。必要に応じて、コンマ区切りリストを使用して複数のログディレクトリーを設定します。各コントローラーを起動します。
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/controller.propertiesKafka が稼働していることを確認します。
jcmd | grep kafka戻り値:
process ID kafka.Kafka /opt/kafka/config/kraft/controller.properties各コントローラーのログをチェックして、KRaft クラスターに正常に参加していることを確認します。
tail -f /opt/kafka/logs/controller.log
各ブローカーで移行を有効にします。
実行中の場合は、ホスト上で実行している Kafka ブローカーを停止します。
/opt/kafka/bin/kafka-server-stop.sh jcmd | grep kafkaマルチノードクラスターを使用する場合は、「Kafka ブローカーの正常なローリング再起動の実行」 を参照してください。
server.propertiesファイルを使用して移行を有効にします。各ブローカーには少なくとも次の追加設定が必要です。
- ブローカー間プロトコルバージョンをバージョン 3.8 に設定する
- 移行有効フラグ
- コントローラーノードと一致するコントローラー設定
- コントローラー投票者のクォーラム
ブローカー設定の例
broker.id=0 inter.broker.protocol.version=3.8 zookeeper.metadata.migration.enable=true zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090ZooKeeper の接続の詳細はすでに存在するはずです。
更新したブローカーを再起動します。
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties移行は自動的に開始しますが、クラスター内のトピックとパーティションの数によっては時間がかかる場合があります。
Kafka が稼働していることを確認します。
jcmd | grep kafka戻り値:
process ID kafka.Kafka /opt/kafka/config/kraft/server.properties
アクティブなコントローラーのログをチェックして、移行が完了したことを確認します。
/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /controllerCompleted migration of metadata from ZooKeeper to KRaft.というINFOログエントリーを探します。各ブローカーを KRaft モードに切り替えます。
- 前述の手順と同様にブローカーを停止します。
server.propertiesファイル内のブローカー設定を更新します。-
broker.idを、同じ ID を使用するnode.idに置き換えます。 -
ブローカーの
brokerKRaft ロールを追加します。 -
ブローカー間プロトコルバージョン (
inter.broker.protocol.version) を削除します。 -
移行有効フラグ (
zookeeper.metadata.migration.enable) を削除します。 - ZooKeeper 設定を削除します。
-
コントローラーおよびブローカー通信用のリスナー (
control.plane.listener.name) を削除します。
KRaft のブローカー設定の例
node.id=0 process.roles=broker listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090-
ブローカー設定で ACLS を使用している場合は、
authorizer.class.nameプロパティーを使用して、オーソライザーを KRaft ベースの標準オーソライザーに更新します。ZooKeeper ベースのブローカーは
authorizer.class.name=kafka.security.authorizer.AclAuthorizerを使用します。KRaft ベースのブローカーに移行する場合は、
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizerを指定します。- 前述の手順と同様にブローカーを再起動します。
各コントローラーを移行モードから切り替えます。
- ブローカーと同じ前述の方法でコントローラーを停止します。
controller.propertiesファイル内のコントローラー設定を更新します。- ZooKeeper 接続の詳細を削除します。
-
zookeeper.metadata.migration.enableプロパティーを削除します。 -
inter.broker.listener.nameを削除します。
移行後のコントローラー設定の例
process.roles=controller node.id=1 listeners=CONTROLLER://0.0.0.0:9090 controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT controller.quorum.voters=1@localhost:9090- ブローカーと同じ前述の方法でコントローラーを再起動します。