KRaft は Apache Kafka のネイティブなメタデータ管理方式で、外部の ZooKeeper を不要にします。今後のメジャー版で ZooKeeper が非推奨・削除方向にあるため、計画的な移行が必要です。
本稿では、安全性と可用性を優先し、既存 ZK クラスタから新規 KRaft クラスタへ段階的に切り替えるブルー/グリーン型を主軸に、ダウンタイムを最小化するための具体策を解説します。
KRaft は Kafka 自身がメタデータのレプリケーションと合意形成(Raft 派生)を担う方式です。運用要素が単純化され、ZooKeeper の運用・監視・チューニングが不要になります。
移行前に確認すべき要点は、バージョンの対応、クライアント互換性、内部トピックのレプリケーション要件、セキュリティ設定(SASL/TLS)の再適用、監視・可観測性の切り替えです。一般に Kafka 3.5 以降で KRaft は実運用採用が進んでいますが、機能差分や運用モデルの違いを理解したうえで計画を立ててください。
| 観点 | ZooKeeper モード | KRaft モード |
|---|---|---|
| メタデータ管理 | 外部 ZooKeeper | 内蔵 Raft(KRaft) |
| 可用性の要点 | ZK クォーラム維持 + Broker | Controller クォーラム維持 + Broker |
| ローリングアップグレードの複雑さ | ZK と Broker の両方を考慮 | Broker/Controller のみ(役割分離が明確) |
| 運用対象 | ZK ノード + Broker | Controller ノード + Broker(ZK 不要) |
| 移行の推奨方式 | — | 新規 KRaft へミラーリング後に切替(段階移行) |
移行は技術的には新旧クラスタの入れ替えですが、実務的にはクライアント・運用・監視系を含む全体最適が必要です。以下のチェックリストで抜け漏れを防ぎます。
特に、ターゲットの KRaft クラスタは最初に正しくフォーマット・ブートストラップされている必要があります。フォーマット(cluster.id の生成と配布)ミスは取り返しがつきにくいため、標準化した手順書と自動化を用意します。
KRaft ではコントローラ(Controller)クォーラムがメタデータを合意し、ブローカはそれに従います。可用性は Controller の過半数と Broker 群のヘルスで決まります。本番は Controller を専用ノード 3 台(中規模)または 5 台(大規模)で構成し、Broker とは分離します。
ネットワークとリスナーは、クライアント用(例: PLAINTEXT/TLS)と Controller 用(CONTROLLER)を分け、inter.broker.listener.name を明確に設定します。
安全で一般的な方法は、新規 KRaft クラスタを並行稼働させ、MirrorMaker 2(OSS)または Cluster Linking(Confluent Platform)でデータとオフセットを同期し、最終同期後にクライアントのブートストラップ先を切り替えるブルー/グリーン方式です。
同一クラスタ内での"その場"移行は運用や復旧の複雑度が高く、長期的なリスクも大きいため、ダウンタイム最小化の観点でも多くの現場では新規構築→段階切替が選ばれます。
ブルー/グリーン移行(MirrorMaker 2 で同期)
以下は代表的な手順です。実環境では自動化(IaC/構成管理)と変更管理プロセスに組み込み、検証環境でのリハーサルを必ず実施してください。
KRaft 側の format はクラスタ ID を全ノードで共通にします。Controller を先に起動し、ブローカはその後に起動します。MM2 はチェックポイントとオフセット同期を有効にし、最終切替前にラグゼロを確認します。
設定と実行コマンド例(KRaft フォーマット/起動、MirrorMaker 2)
# Controller ノード(例: c1)の server.properties(抜粋)
process.roles=controller
node.id=1
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
listeners=CONTROLLER://0.0.0.0:9093
controller.quorum.voters=1@c1:9093,2@c2:9093,3@c3:9093
log.dirs=/var/lib/kafka/data
# Broker ノード(例: b1)の server.properties(抜粋)
process.roles=broker
node.id=11
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://b1:9092
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
inter.broker.listener.name=PLAINTEXT
controller.listener.names=CONTROLLER
controller.quorum.voters=1@c1:9093,2@c2:9093,3@c3:9093
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
unclean.leader.election.enable=false
log.dirs=/var/lib/kafka/data
# 1) クラスタ ID の生成(コントローラで一度だけ実行し、各ノードに配布)
CLUSTER_ID=$(kafka-storage.sh random-uuid)
echo $CLUSTER_ID
# 2) 各ノードでフォーマット(同一 CLUSTER_ID を使用)
sudo kafka-storage.sh format -t $CLUSTER_ID -c /etc/kafka/server.properties
# 3) Controller 起動 → Broker 起動(サービス管理で順序を担保)
# systemctl start kafka-controller; systemctl start kafka-broker ... 等
# 4) MirrorMaker 2 設定(connect-distributed 用の MM2 プラグイン構成)
# mm2.properties(抜粋)
name=mm2
connector.class=org.apache.kafka.connect.mirror.MirrorSourceConnector
tasks.max=4
# ソース(ZK クラスタ)とデスティネーション(KRaft)
source.cluster.alias=src
dest.cluster.alias=dst
src.bootstrap.servers=zk-b1:9092,zk-b2:9092
src.security.protocol=PLAINTEXT
dst.bootstrap.servers=kr-b1:9092,kr-b2:9092
dst.security.protocol=PLAINTEXT
# ミラー対象
topics=.*
groups=.*
replication.factor=3
sync.topic.acls.enabled=true
emit.checkpoints.enabled=true
sync.group.offsets.enabled=true
# 5) Connect ワーカーを起動し、MM2 コネクタを投入
# kafka-connect-distributed /etc/kafka/connect-distributed.properties &
# curl -X POST localhost:8083/connectors -H 'Content-Type: application/json' -d @mm2.json
# 6) ラグを確認(例:ConsumerGroups、MM2 のメトリクス/JMX)
# 7) ラグゼロで Producer/Consumer のブートストラップを KRaft 側に切替
切替は単なる DNS 変更ではなく、整合性の検証を伴います。エンドツーエンド遅延、エラー率、パーティション・リーダーの分布、オフセット整合を観測します。問題発生時は決めておいた時間内にロールバックします。
移行完了後は、不要なミラーリングを停止し、旧クラスタの退役を段階的に進めます。監視・アラート閾値の見直し、バックアップ/DR の更新、運用 Runbook の刷新を行います。
CCAAK
問題 1
ZK ベースの Kafka クラスタから KRaft クラスタへ、ダウンタイムを最小化して移行したい。適切な手順の組み合わせはどれか。
正解: A
最も安全で一般的な方法は新規 KRaft を並行稼働させ、MirrorMaker 2(または Cluster Linking)で事前に同期し、ラグゼロで切替えること。既存ブローカのその場転用や broker.id 共有は危険で、DNS 先行切替もデータ欠損や重複の恐れがある。
KRaft へ移行するとクライアントは変更が必要ですか?
通常はブートストラップアドレスの変更のみで動作します。API/ワイヤ互換のため、プロデューサ/コンシューマのコード変更は不要です。ただしセキュリティ設定(SASL/TLS)や DNS 名、リトライ/タイムアウトなどの接続パラメータは新旧で差異がないか確認してください。
ダウンタイムをゼロにできますか?
理論上は限りなく短縮可能ですが、完全ゼロを保証するにはネットワークやアプリ側の停止/切替影響も含めた制御が必要です。一般には短時間のメンテナンスウィンドウを取り、ラグゼロ確認後に Producer→Consumer の順で切替えると実務上の停止は数十秒〜数分に収まります。
ZooKeeper 退役後の注意点は?
旧クラスタの ACL/クォータ/設定スナップショットを保全し、監査要件に応じて一定期間保持します。監視・バックアップ・DR 手順を KRaft 前提に更新し、Controller クォーラムの健全性(リーダー交代時間、投票過半数維持)を重点監視項目に追加してください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...