Rack Awareness は、ブローカーとレプリカを物理/論理的に分離(ラック、アベイラビリティゾーン、データセンター)して、単一障害によるサービス停止やデータ喪失の確率を下げるための標準機能です。運用では「すべてのブローカーに正しい rack を設定する」ことと、「レプリケーション設定をラック障害前提で決める」ことが肝になります。
本稿は、公式ドキュメントに基づく安定的な挙動を前提に、ブローカー配置、パーティション配置アルゴリズム、RF と min.insync.replicas の組み合わせ、障害時の動作を整理します。最後に CCAAK 向けの出題ポイントも明確化します。
Kafka の Rack Awareness は、トピック作成時やレプリカ再割り当て時に、可能な限り異なる rack にレプリカを分散させる仕組みです。これにより、ラック全体の障害や計画停止があっても、他ラック上のレプリカでリーダーを維持し、書き込み・読み取りを継続できます。
前提はシンプルで、すべてのブローカーに一貫した rack ラベル(broker.rack)を設定することです。これが欠けると、コントローラはラック情報を利用できず、同一ラック内に複数レプリカが偏るリスクが高まります。
broker.rack は各ブローカーの静的設定です。ラック名や AZ 名はクラスタ内で一貫しており、誤記や重複を避ける必要があります。設定後はローリング再起動で反映します。既存トピックのレプリカ配置は自動では変わらないため、必要に応じて再割り当てを計画します。
検証は、管理 API でブローカー構成を参照する、あるいは新規に作成したテストトピックのレプリカが異なる rack に分散しているかを確認するのが実務的です。
broker.rack の設定例と検証用トピック作成
# 各ブローカー server.properties(一例)
broker.id=1
broker.rack=r1
# 他設定は省略
# Kubernetes 等では環境変数を使ってテンプレート展開する例もある
# KAFKA_BROKER_RACK=r1
# 検証用に RF=3 のトピックを作成
kafka-topics --bootstrap-server <host:port> \
--create --topic rack-test --partitions 3 --replication-factor 3
# 配置の確認(レプリカが複数 rack に分散しているか)
kafka-topics --bootstrap-server <host:port> --describe --topic rack-test
# AdminClient(API)でブローカー構成(broker.rack)を参照しても良いトピック作成時、コントローラは broker.rack を考慮して可能な限りレプリカを異なる rack に配置します。ブローカー間のバランス(パーティション数・レプリカ数)も考慮しつつ、同一 rack への過剰な集中を避けるように割り当てます。
ラック障害時は、ISR に残る別ラック上のレプリカからリーダーを選出します。RF=3、min.insync.replicas=2、acks=all の組み合わせなら、1ラック(=1レプリカ)喪失時も書き込み継続が可能です。
ラック分散の例(RF=3, 3ラック, 6ブローカー)
ラック障害に耐えるには、レプリカを別ラックへ分散させるだけでなく、書き込みクォーラム条件を適切に設定する必要があります。特に RF と min.insync.replicas(minISR)と Producer の acks はセットで考え、障害時の継続可否とデータ安全性のトレードオフを理解しておきます。
一般的に、3ラック構成では RF=3、minISR=2、acks=all を推奨します。これにより1ラック喪失時も書き込みを継続しつつ、unclean リーダー選出を無効にしてデータ損失を防止できます。
| 構成 | ラック障害耐性 | 障害時の書き込み可用性 | 代表的な用途/注意 |
|---|---|---|---|
| broker.rack 未設定 + RF=3 + minISR=2 + acks=all | 理論上は可だが実配置が同一ラック集中の恐れ | 配置次第で不可に転ぶ | まずは全ブローカーの rack 設定を整備することが前提 |
| broker.rack 設定 + RF=3 + minISR=2 + acks=all | 1ラック障害に対応 | 継続可(2レプリカ健在時) | CCAAKでの標準解。unclean leader 選出は無効を推奨 |
| broker.rack 設定 + RF=2 + minISR=2 + acks=all | 1ラック障害に弱い(RF=2は片ラック喪失で不可) | 不可(クォーラム未達) | 低コストだがラック障害要件がある環境では不適 |
| broker.rack 設定 + RF=3 + minISR=1 + acks=1 | レプリカ分散は効くがデータ安全性は弱い | 継続可(ただし整合性リスク) | 低レイテンシ優先の一時用途。重要データには非推奨 |
計画メンテナンスではラック単位の作業を避け、可能ならブローカー単位でローリングを行います。どうしてもラック全停止が必要な場合は、事前に minISR とトラフィックパターンを確認し、必要に応じて一時的なスロットルやプロデューサのバックオフ調整を行います。
レプリカ再割り当て時は、rack を尊重したプランを生成し、リバランスのスロットルを適切に設定します。監視では、パーティションのリーダー分布が特定ラックに偏っていないか、ISR 収縮が連鎖していないかを重点的に確認します。
CCAAK では、rack を使ったレプリカ分散の原理、RF/minISR/acks の相互作用、ラック障害時の書き込み可否、設定の適用順序(全ブローカーに broker.rack を設定)といった実務基本が問われます。以下の観点を押さえておくと取りこぼしを減らせます。
また、クライアントの近接読み取りは別の設定領域であり、Rack Awareness(レプリカ配置)と混同しないことが重要です。
CCAAK
問題 1
3ラック(r1, r2, r3)にブローカーが均等配置された Kafka クラスタで、ラック全体の障害に対しても書き込みを継続しつつデータ損失を避けたい。最も適切な組み合わせはどれか。
正解: A
ラック障害を前提にするには、レプリカがラック間で分散され(全ブローカーに broker.rack を設定)、クォーラム条件として RF=3 と minISR=2 を満たし、acks=all でコミット確認を行う必要がある。unclean リーダー選出は無効化してデータ損失を防ぐ。RF=2 はラック喪失でクォーラム未達、rack 未設定や一部設定は分散が保証されない。
broker.rack を後から変更すると既存トピックのレプリカは自動で移動しますか?
自動では移動しません。新規作成や再割り当て時の配置計算に rack が使われます。既存パーティションをラック分散させたい場合は、再割り当てツールや管理 API を用いて計画的に移動します。
ラック数より RF が大きい場合はどうなりますか?
可能な限り多くのラックに分散しますが、数が足りない分は同一ラック内に複数レプリカが配置されます。完全なラック分離はできないため、要件次第でラックの追加、RF の見直し、あるいは配置方針の調整を検討してください。
コンシューマを同一ラックのレプリカから優先的に読み取りさせられますか?
レプリカ配置の Rack Awareness とは別の領域です。Kafka にはクライアントやブローカー側の設定で近接レプリカからの取得を優先する仕組みがあり、client.rack や関連のレプリカ選択設定を組み合わせます。導入可否や既定値はバージョン差があるため、利用中のバージョンの公式ドキュメントで確認してください。
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-...