KRaft は Kafka 自身がメタデータをレプリケーションし、ZooKeeper を使わずにクラスタを成立させる運用形態。コントローラ・クォーラムが Raft 合意でメタデータログを管理し、ブローカはその適用結果を購読する。
本稿では、ZooKeeper 不要化の背景、KRaft のメタデータ設計、主要プロパティ設定、導入・移行、可用性/セキュリティ設計を、試験(CCAAK)で狙われやすいポイントに焦点を当てて解説する。
KRaft は Kafka のコントロールプレーンを内製化し、コントローラ・クォーラムがメタデータログを Raft で合意・複製する。ZooKeeper は不要となり、Kafka のライフサイクル内でクラスタ形成・メタデータ更新が完結する。
実務では、コントローラ専用ノードかブローカと同居させるかの選択、奇数ノードのクォーラム設計、ストレージ初期化(kafka-storage.sh)が肝。試験では、プロパティ名や起動順序、KRaft 専用の概念(メタデータログ、スナップショット)が頻出。
| 用語 | KRaft における意味 | 試験での要チェック点 |
|---|---|---|
| Controller Quorum | メタデータを合意・複製するコントローラ群 | 奇数台・voters 設定・リーダ概念 |
| Metadata Log | メタデータ変更の不変ログ(コントローラで管理) | スナップショットと再現の関係 |
| Snapshot | メタデータ状態の圧縮点 | 高速ブートストラップ・復旧手順 |
| process.roles | broker, controller の役割付与 | 同居/分離構成の可否と注意点 |
| node.id | KRaft での一意ノード ID | broker.id 非推奨との違い |
KRaft の論理構成(高レベル)
クラスタ ID の生成とストレージ初期化(必須手順)
# 1) クラスタ ID を生成
$ KAFKA_HOME/bin/kafka-storage.sh random-uuid
hd9a2a0f-1b23-4c56-9d78-90efab12cd34
# 2) server.properties を用いてストレージを初期化
$ KAFKA_HOME/bin/kafka-storage.sh format -t hd9a2a0f-1b23-4c56-9d78-90efab12cd34 -c config/server.propertiesKRaft ではコントロールプレーンとデータプレーンが Kafka 内に収斂する。ZooKeeper の外部依存・運用負担(監視、アップグレード、スケーリング)を避け、メタデータ変更の一貫性と遅延の予測可能性を高める。
比較観点は、メタデータの保存形式、合意アルゴリズム、障害許容、構成・運用のシンプルさ。公式ドキュメントの用語と一致する理解が重要。
| 項目 | ZooKeeper クラスタ | KRaft (Controller Quorum) |
|---|---|---|
| コントロールプレーン | 外部(ZooKeeper) | Kafka 内製(コントローラ) |
| メタデータ形式 | ZNode 階層 | 不変ログ + スナップショット |
| 合意アルゴリズム | Zab | Raft(過半数合意) |
| 依存・運用 | 別クラスタの設計・監視が必要 | Kafka の一体運用で簡素化 |
| 構成の要点 | zookeeper.connect | process.roles, controller.quorum.voters 等 |
| ネットワーク | ZK ポートの開放が必要 | CONTROLLER リスナーで隔離可能 |
Before/After 概念図
設定の対比例
# 旧(ZooKeeper 依存)
# zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
# broker.id=1
# 新(KRaft)
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@node1:9093,2@node2:9093,3@node3:9093
controller.listener.names=CONTROLLER
listeners=PLAINTEXT://node1:9092,CONTROLLER://node1:9093
inter.broker.listener.name=PLAINTEXT
metadata.log.dir=/var/lib/kafka/metadata
log.dirs=/var/lib/kafka/dataトピック作成や ACL 変更などのメタデータ更新は、コントローラ・リーダがメタデータログに追記し、フォロワが複製する。一定間隔または閾値でスナップショットを作成し、リスタートや新規参加ノードの高速同期を実現する。
ブローカはコントローラからメタデータ更新を購読し、インメモリキャッシュを更新する。これにより ZooKeeper のウォッチャに相当するイベント駆動が Kafka 内で完結する。
| 要素 | 役割 | 運用ポイント |
|---|---|---|
| Metadata Record | 単一の状態変更イベント | 順序・冪等適用 |
| Metadata Log | レコードの順序付き永続ログ | 耐障害性・再現性 |
| Snapshot | 状態の圧縮表現 | 復旧時間短縮・世代管理 |
メタデータ変更のフロー
メタデータ専用ディレクトリの指定
# コントローラ側にメタデータログを分離配置
metadata.log.dir=/var/lib/kafka/metadata
# ブローカのデータ(トピックログ)は従来どおり
log.dirs=/var/lib/kafka/data最小の本番向けは 3 ノードのコントローラ・クォーラム。以下はブローカとコントローラを同居させた構成例。ノードごとに node.id とアドレスを変える。
CONTROLLER リスナーは運用上ネットワークで分離し、TLS/認証を適用するのが望ましい。
| プロパティ | 用途 | 例 |
|---|---|---|
| process.roles | 役割指定 | broker,controller |
| node.id | ノード一意 ID | 1 |
| controller.quorum.voters | クォーラム構成 | 1@n1:9093,2@n2:9093,3@n3:9093 |
| controller.listener.names | コントローラ用リスナー名 | CONTROLLER |
| listeners | リスナー定義 | PLAINTEXT://n1:9092,CONTROLLER://n1:9093 |
| inter.broker.listener.name | ブローカ間通信用 | PLAINTEXT |
ポートとリスナーの分離イメージ
n1: PLAINTEXT 9092 <--> clients/brokers
CONTROLLER 9093 <--> controller quorum traffic
n2: PLAINTEXT 9092, CONTROLLER 9093
n3: PLAINTEXT 9092, CONTROLLER 9093server.properties(抜粋: ノード n1)
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@n1:9093,2@n2:9093,3@n3:9093
controller.listener.names=CONTROLLER
listeners=PLAINTEXT://n1:9092,CONTROLLER://n1:9093
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://n1:9092
metadata.log.dir=/var/lib/kafka/metadata
log.dirs=/var/lib/kafka/data新規クラスタは KRaft での構築が簡潔。手順は「設定→ストレージ初期化→起動順序(コントローラ→ブローカ)→検証」。
既存 ZooKeeper クラスタからの移行は、公式手順とサポート対象バージョンを必ず確認する。無停止または低停止を志向する仕組みが段階的に整備されてきたが、バージョン互換や制約は変動し得るため、実環境では検証環境でのリハーサルを推奨。
| ステップ | 目的 | 代表コマンド/観点 |
|---|---|---|
| クラスタ ID 生成 | 一意な識別子付与 | kafka-storage.sh random-uuid |
| ストレージ初期化 | メタデータ領域の準備 | kafka-storage.sh format -t <UUID> -c server.properties |
| 起動順序 | 安定合意の確立 | controllers → brokers |
| 健全性確認 | メタデータ伝搬の確認 | kafka-topics.sh --create / --describe |
新規構築の流れ
検証用コマンド例
# トピック作成
$ KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server n1:9092 --create --topic test --partitions 3 --replication-factor 3
# ブローカ視点のメタデータ確認
$ KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server n1:9092 --describe --topic test可用性は奇数のクォーラム設計が基本。レイテンシと耐障害のバランスで 3 もしくは 5 が一般的。コントローラ専用ノードにすると負荷分離と障害ドメイン分離の利点がある。
セキュリティは CONTROLLER リスナーで TLS/認証を必須化。監視はコントローラのリーダ選出、レプリケーション遅延、スナップショット発生、メタデータ適用の遅延などを可視化する。
| クォーラム台数 | 許容障害数 | 適用例 |
|---|---|---|
| 1 | 0 | 検証のみ(本番非推奨) |
| 3 | 1 | 小規模本番 |
| 5 | 2 | 中規模・高可用性要求 |
過半数の概念(5 台例)
[1][2][3][4][5]
^ ^ ^
3 ノードの賛同(過半数)が必要。2 台障害まで可。CONTROLLER リスナーに TLS を適用する例(概念)
# 実際のキーストア/トラストストア設定は運用基準に合わせる
listeners=SSL://n1:9092,CONTROLLER://n1:9093
controller.listener.names=CONTROLLER
listener.security.protocol.map=SSL:SSL,CONTROLLER:SSL
ssl.keystore.location=/path/keystore.jks
ssl.keystore.password=***
ssl.truststore.location=/path/truststore.jks
ssl.truststore.password=***CCAAK
問題 1
KRaft モードで 3 ノードの同居構成(broker+controller)を正しく形成する最小限の設定として最も適切なのはどれか。
正解: A
KRaft では ZooKeeper を使わず、controller.quorum.voters に id@host:port を列挙し、controller.listener.names に CONTROLLER を指定、listeners に CONTROLLER:// を定義する。node.id は各ノードで一意。zookeeper.connect や broker.id は KRaft では用いない。
KRaft と ZooKeeper を同一クラスタで併用できるか?
できない。KRaft モードでは ZooKeeper を一切使用しない設計であり、混在はサポートされない。新規は KRaft で構築し、既存からの移行は公式手順と対応バージョンに従う。
controller.quorum.voters の台数はどう設計すべきか?
奇数台が原則。小規模は 3 台(1 台障害許容)、高可用性は 5 台(2 台障害許容)。不要に大きくするとレイテンシと運用負荷が増す。
ストレージ初期化を忘れて起動するとどうなる?
クラスタ ID 不一致または未初期化エラーで起動失敗する。kafka-storage.sh で UUID を生成し、全ノードを同一クラスタ ID で format してから起動すること。
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-...