第4章 KRaft モードへの移行
Kafka クラスターでのメタデータ管理に ZooKeeper を使用している場合は、KRaft モードで Kafka を使用するように移行できます。KRaft モードは ZooKeeper を置き換えて分散調整を行い、信頼性、スケーラビリティー、およびスループットを強化します。
クラスターを移行するには、以下を実行します。
- クラスター管理のために 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 が 各ホストにインストールされており、設定ファイルが使用可能である。
- Streams for Apache Kafka 2.7 以降を Kafka 3.7.0 以降に使用している。以前のバージョンの Streams for Apache Kafka を使用している場合は、KRaft モードに移行する前にアップグレードしてください。
移行プロセスを確認するためにログが有効になっている。
クラスター内のコントローラーおよびブローカーのルートロガーの
log4j.properties
にDEBUG
レベルを設定します。詳細な移行固有のログについては、移行ロガーにTRACE
を設定します。コントローラーロギング設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow log4j.rootLogger=DEBUG log4j.logger.org.apache.kafka.metadata.migration=TRACE
log4j.rootLogger=DEBUG log4j.logger.org.apache.kafka.metadata.migration=TRACE
手順
Kafka クラスターのクラスター ID を取得します。
zookeeper-shell
ツールを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /cluster/id
/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /cluster/id
このコマンドはクラスター ID を返します。
KRaft コントローラークォーラムをクラスターにインストールします。
controller.properties
ファイルを使用して、各ホスト上でコントローラーノードを設定します。各コントローラーには少なくとも次の設定が必要です。
- 一意のノード ID
-
移行有効フラグの
true
への設定 - ZooKeeper の接続の詳細
- コントローラークォーラムによって使用されるリスナー名
- コントローラー投票者のクォーラム
inter-broker 通信のリスナー名
コントローラー設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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 コントローラーが移行を開始するには、inter-broker リスナー名が必要です。
各コントローラーノードのログディレクトリーをセットアップします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/kafka-storage.sh format -t <uuid> -c /opt/kafka/config/kraft/controller.properties
/opt/kafka/bin/kafka-storage.sh format -t <uuid> -c /opt/kafka/config/kraft/controller.properties
戻り値:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Formatting /tmp/kraft-controller-logs
Formatting /tmp/kraft-controller-logs
<uuid> は、取得したクラスター ID に置き換えます。クラスター内の各コントローラーノードに同じクラスター ID を使用します。
デフォルトでは、
controller.properties
設定ファイルで指定されたログディレクトリー (log.dirs
) は/tmp/kraft-controller-logs
に設定されます。/tmp
ディレクトリーは通常、システムが再起動するたびにクリアされるため、開発環境のみに適しています。必要に応じて、コンマ区切りのリストを使用して複数のログディレクトリーを設定します。各コントローラーを起動します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/controller.properties
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/controller.properties
Kafka が稼働していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jcmd | grep kafka
jcmd | grep kafka
戻り値:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow process ID kafka.Kafka /opt/kafka/config/kraft/controller.properties
process ID kafka.Kafka /opt/kafka/config/kraft/controller.properties
各コントローラーのログをチェックして、KRaft クラスターに正常に参加していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tail -f /opt/kafka/logs/controller.log
tail -f /opt/kafka/logs/controller.log
各ブローカーで移行を有効にします。
実行中の場合は、ホスト上で実行している Kafka ブローカーを停止します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/kafka-server-stop.sh jcmd | grep kafka
/opt/kafka/bin/kafka-server-stop.sh jcmd | grep kafka
マルチノードクラスターを使用している場合は、「Kafka ブローカーの正常なローリング再起動の実行」 を参照してください。
server.properties
ファイルを使用して移行を有効にします。各ブローカーには少なくとも次の追加設定が必要です。
- バージョン 3.7 に設定された inter-broker プロトコルバージョン
- 移行有効フラグ
- コントローラーノードと一致するコントローラー設定
- コントローラー投票者のクォーラム
ブローカー設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow broker.id=0 inter.broker.protocol.version=3.7 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
broker.id=0 inter.broker.protocol.version=3.7 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
ZooKeeper の接続の詳細はすでに存在するはずです。
更新したブローカーを再起動します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
移行は自動的に開始しますが、クラスター内のトピックとパーティションの数によっては時間がかかる場合があります。
Kafka が稼働していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jcmd | grep kafka
jcmd | grep kafka
戻り値:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow process ID kafka.Kafka /opt/kafka/config/kraft/server.properties
process ID kafka.Kafka /opt/kafka/config/kraft/server.properties
アクティブなコントローラーにログオンし、移行が完了したことを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /controller
/opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /controller
Completed migration of metadata from ZooKeeper to KRaft.
というINFO
ログエントリーを探します。各ブローカーを KRaft モードに切り替えます。
- 前述の手順と同様にブローカーを停止します。
server.properties
ファイル内のブローカー設定を更新します。-
broker.id
を、同じ ID を使用するnode.id
に置き換えます。 -
ブローカーの
broker
KRaft ロールを追加します。 -
ブローカー間プロトコルバージョン (
inter.broker.protocol.version
) を削除します。 -
移行有効フラグ (
zookeeper.metadata.migration.enable
) を削除します。 - ZooKeeper 設定を削除します。
-
コントローラーおよびブローカー通信のリスナーを削除します(
control.plane.listener.name
)。
KRaft のブローカー設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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
を削除します。
移行後のコントローラー設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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
- 前述のように、ブローカーと同じ方法でコントローラーを再起動します。