ストレッチクラスタ(Stretched Cluster)は、同一リージョン内の複数AZにブローカやクォーラムノードを分散し、ゾーン障害に耐えるための構成です。Kafkaのレプリケーションやクォーラムの性質上、RTTやISR、ACK設定の理解が欠かせません。
本稿では、マルチAZでの必須設定、失敗しやすいポイント、代替アーキテクチャとの比較をまとめます。CCAAK対策として、試験で問われやすいキーワードも添えています。
ストレッチクラスタは、同一リージョン内の複数AZにブローカとクォーラムノード(ZooKeeperまたはKRaftのコントローラ)を配置し、単一AZ喪失時も書き込み・読み取り継続を狙う構成です。鍵となるのは、レプリケーションファクタ、min.insync.replicas、acks、unclean leader election、そしてクォーラム多数派の維持です。
現実的には、AZ間RTTが数ミリ秒以下(目安として1–2ms級)である同一リージョン内に限定するのが定石です。マルチリージョンへ引き伸ばすと遅延が大きくなり、スループット低下や再選出時間増大、タイムアウト増加を招きます。マルチリージョンは原則として非同期レプリケーション(Cluster LinkingやMirrorMaker 2)の適用領域です。
クォーラムノードは奇数台で多数派を確保する配置が基礎です。ZooKeeperなら3台以上、KRaftならコントローラを3台以上にし、AZをまたがって均等配置します。1AZが失われても過半を維持できることが合格ラインです。
| アーキテクチャ | 可用性(ゾーン障害) | RPO/RTO | レイテンシ/スループット |
|---|---|---|---|
| シングルAZ Kafka | 低い(AZ喪失で停止) | RPO: 不明(停止)、RTO: 長い | 最良(低遅延・高スループット) |
| ストレッチクラスタ(同一リージョンAZ間) | 中〜高(1AZ喪失でも継続。多数派維持が前提) | RPO: 0(acks=all & minISR満たす前提)、RTO: 秒〜分 | 中(クロスAZで遅延増・スループット低下) |
| マルチクラスタ+非同期(Cluster Linking/MM2) | 高(片系停止でももう片系稼働) | RPO: >0(非同期)、RTO: 短い | 各クラスタはローカル低遅延 |
マルチAZに跨るKafkaストレッチクラスタ(概念図)
最小構成例:ラックアウェア設定とトピック作成(例)
# broker(AZごと)
# AZ-A のブローカ
broker.rack=az-a
num.network.threads=3
num.io.threads=8
# AZ-B のブローカ
broker.rack=az-b
# AZ-C のブローカ
broker.rack=az-c
# クラスタ共通の安全側設定
unclean.leader.election.enable=false
min.insync.replicas=2
# KRaftの場合:コントローラは3台(C1,C2,C3)を各AZに1台ずつ
# ZooKeeperの場合:ZKも3台を各AZに分散
# トピック作成:RF=3、minISR=2
kafka-topics.sh --create \
--topic orders \
--partitions 12 \
--replication-factor 3 \
--config min.insync.replicas=2
# プロデューサ(安全側)
acks=all
retries=2147483647
enable.idempotence=true
delivery.timeout.ms=120000
linger.ms=20
batch.size=131072
# コンシューマ(任意:Closest Replicaを使う場合)
# ブローカ側で replica.selector.class=org.apache.kafka.common.replica.RackAwareReplicaSelector
# クライアント側で client.rack=az-a(所属AZを設定)ストレッチクラスタでは、RF=3、min.insync.replicas=2、acks=all が基本線です。これにより、1AZ喪失時もISRに2副本を維持できれば、リーダー交代後も整合性を保った書き込みが継続できます。
unclean.leader.election.enableは必ずfalseにします。ISR外の過去のレプリカをリーダーに選ぶとデータロスが生じ得ます。プロデューサはenable.idempotence=trueと組み合わせ、重複や順序の破壊を避けます。
broker.rackを各AZ名で設定し、トピック作成時にレプリカを別AZへ分散させます。これが崩れると、AZ障害時に複数レプリカを同時に失い、minISRを割って書き込み不可に陥ります。
リーダーの偏りはクロスAZトラフィックと待ち時間を増やします。定期的なPreferred Leader Electionでバランスを取り、プロデューサのホットパーティション化を避けます。
AZ喪失時、クォーラム多数派が維持されていればクラスタは稼働を継続します。失われたAZにリーダーが多い場合、フェイルオーバーに伴い一時的なスループット低下やレイテンシ上昇が発生します。
AZ復旧後は大量の再同期が走ります。運用手順として、レプリケーションスロットルを適用し、業務時間帯の影響を緩和します。完全復旧後、必要に応じてPreferred Leader Electionで平準化します。
クロスAZ通信は待ち時間だけでなく、クラウド課金の観点でもコスト要因です。圧縮(lz4やzstd)と適切なバッチングで往復回数を抑え、リーダーの配置を平準化してAZ間トラフィックの偏りを避けます。
ストレージは一般にJBODでよく、耐久性はレプリケーションに委ねます。セグメントサイズ・ページキャッシュとネットワーク帯域のバランスを取り、復旧時の再同期ウィンドウが過大にならないよう監視します。
試験では、安全側の構成値、ラックアウェア、クォーラム多数派、マルチAZとマルチリージョンの適用境界が頻出です。単一解に見えても、前提(RTT、RPO要件、コスト)が暗に与えられていることがあります。設問の前提を読み落とさないでください。
CCAAK
問題 1
同一リージョン3AZのストレッチクラスタで、ゾーンAが完全喪失した際も書き込みを継続し、データロスを避けたい。適切な組み合わせはどれか。
正解: A
ゾーン喪失時にRPO=0を目指すには、RF=3で各レプリカを別AZに置き、minISR=2とacks=allでコミット前に多数レプリカへ複製を要求し、UNCLEAN選出を禁止するのが定石。BとCはUNCLEAN許可やminISR不足で危険。DはRF=2のため1AZ喪失でminISRを満たせず書き込み不可。
ストレッチクラスタはマルチリージョンでも使えますか?
推奨されません。リージョン間RTTが大きく、選出や複製が不安定になります。マルチリージョンは非同期のCluster LinkingやMirrorMaker 2の適用領域です。
Closest ReplicaでコンシューマがローカルAZから読むには?
ブローカでreplica.selector.classにRackAwareReplicaSelectorを設定し、クライアントでclient.rackに所属AZを設定します。デフォルトではリーダーからのみ読み取りです。
クォーラムノード(ZooKeeper/KRaft)は何台必要ですか?
奇数台(一般に3台)を推奨し、各AZに分散します。1AZ喪失時も多数派を維持できるよう配置してください。
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-...