Kafkaはスケールアウトに強い一方、パーティション数・ブローカー台数・ストレージ容量の初期設計を外すと、後追いの再割当てや費用超過が発生します。本稿は、公式ドキュメントの安定概念に基づき、試験(CCAAK)で問われやすい要点と、現場で通用する見積り手順をまとめました。
キーワードは3つです。並列度(パーティション)、耐障害性(レプリケーション/ブローカー)、保持(容量)。この3点をワークロードから逆算するのが最短経路です。
キャパシティ計画は、入力レート、メッセージサイズ、保持期間、可用性/遅延SLAを数値で固めるところから始まります。特に平均とピークを分け、ピーク係数(例: p95/p99)を明示します。
Kafkaはバッチ効率でスループットが伸びるため、プロデューサのbatch.sizeやlinger.ms、コンシューマのfetch設定の目標値も併せて前提化しておくと、パーティション数の算出が安定します。
ワークロード前提のテンプレート例
# unit: MB/s unless noted
workload:
topic: orders
ingress_avg: 50
ingress_peak: 120
msg_size_bytes_avg: 1024
consumers_groups: 3
retention_ms: 604800000 # 7 days
cleanup_policy: delete
availability:
replication_factor: 3
min_insync_replicas: 2
headroom: 0.25 # 25% extraスループットは基本的にパーティション数に比例して伸びます。1パーティションは順序保証のため単一リーダーへの直列書き込みであり、ハードウェアとバッチ設定次第で処理可能な上限が出ます。まずは小さく負荷試験を行い、1パーティションあたり実効スループット(Tp)を把握し、必要パーティション数を逆算します。
キー分布が偏るとホットパーティションが発生し、計画どおりに伸びません。可能ならキー空間にシャーディング要素を足す、またはStickyPartitionerの特性とバッチサイズを調整してバランスさせます。
パーティション数のラフ算出式と例
# 実測に基づく計算を推奨
# Tp_per_partition_MBps: 1パーティションの実効MB/s(負荷試験で取得)
# required_partitions = ceil(peak_ingress_MBps / Tp_per_partition_MBps)
peak_ingress_MBps=120
Tp_per_partition_MBps=8
required_partitions=$(( (peak_ingress_MBps + Tp_per_partition_MBps - 1) / Tp_per_partition_MBps ))
echo ${required_partitions} # => 15 (例)
# 作成例(RF=3, min.insync.replicas=2)
# kafka-topics.sh --create --topic orders --partitions 16 --replication-factor 3 \
# --config min.insync.replicas=2レプリケーション係数RFは可用性の基礎です。各パーティションはRF個のレプリカを持ち、そのうちリーダー+ISR(min.insync.replicas以上)が書き込みの前提になります。一般的な可用性要件ではRF=3, min.insync.replicas=2が出発点です。
ブローカー台数は最低でもRF以上、障害ドメイン(ラック/アベイラビリティゾーン)ごとにレプリカを分散できる数を確保します。追加で、1ブローカーあたりの許容パーティション総数とディスク帯域/CPUの上限を超えないように、台数を決めます。
| 戦略 | 主要設定 | 主な用途 | 容量見積りのポイント |
|---|---|---|---|
| 時間ベース削除 | retention.ms, cleanup.policy=delete | ログを一定期間保持 | 容量=平均Ingress×保持時間×RF+ヘッドルーム |
| サイズベース削除 | retention.bytes, cleanup.policy=delete | 容量上限重視の運用 | 容量=指定サイズ×RF+ヘッドルーム。古いデータから削除 |
| ログ圧縮(コンパクション) | cleanup.policy=compact(,delete) | キー最新値を維持するストリームテーブル | 容量はユニークキー総サイズ+コンパクション間のデルタ分を見積もる |
RF=3のクラスター配置イメージ(ラックアウェア)
ラック識別とトピック作成例
# server.properties(各ブローカー)
# broker.rack=rack-a|rack-b|rack-c
# 新規トピック(RF=3, min.insync.replicas=2)
# kafka-topics.sh --create --topic orders --partitions 18 --replication-factor 3 \
# --config min.insync.replicas=2容量見積りは、圧縮前/後の実効Ingress、保持期間、RFを掛け合わせ、インデックスやセグメントのオーバーヘッド、さらに運用ヘッドルームを加えます。公式の保持動作はretention.ms/retention.bytesおよびcleanup.policy(delete/compact)で制御されます。
ログ圧縮を使う場合は、ユニークキーの総サイズと更新頻度を中心に見積もり、deleteも併用するなら二段構えで上限を管理します。
計算例(delete保持, RF=3, 7日, ヘッドルーム25%)
# 前提
# 実効Ingress = 50 MB/s(圧縮後)
# 保持 = 7日 = 604800 秒
# RF = 3, ヘッドルーム = 25%
# オーバーヘッド係数 = 1.1 (インデックス等)
echo "scale=2; 50*604800*1.1*3*1.25/1024/1024" | bc
# => 約 120.4 TB (クラスター総容量の目安)
# 実機ではディスク単位(例 4TB x 台数)に割り付け、将来増設余地を残すクラスターIngressはプロデューサ→リーダーへの書き込みです。さらに、RF>1ではフォロワーがリーダーから複製フェッチを行います。理想的には、総受信は約「クライアントIngress × RF」に近づきます(重複ACKやメタデータ通信は小さめ)。Egressはコンシューマ数と読み取りパターンに比例します。
ディスクはシーケンシャル書き込みに強いHDDでも高スループットを出せますが、混在ワークロード(読み書き/圧縮/コンパクション)ではSSDのほうがジッタが少なく、レイテンシSLAを守りやすいです。
ネットワーク概算フォーミュラ
# 例: Ingress=120 MB/s, RF=3, 総Egress=240 MB/s(複数グループ合算)
# 受信Rx ≈ 120 * 3 = 360 MB/s
# 送信Tx ≈ 120 * (3-1) + 240 = 480 MB/s
# 10GbE(実効~1,200 MB/s)なら1本で足りるが、冗長/将来増分を見て2ポート以上を推奨キャパシティは静的ではありません。トピックやトラフィックの成長を見込み、常に20〜30%の余力を維持し、しきい値に近づいたらブローカーやディスクを追加します。追加後はパーティション再割り当てで均衡させます。
再割り当てはネットワーク/ディスクに負荷をかけます。メンテナンスウィンドウ、スロットリング、優先リーダー選出の活用で影響を抑えます。
再割り当てと優先リーダー選出の例
# reassignment.json(例)
# {"version":1, "partitions":[{"topic":"orders","partition":0,"replicas":[1,2,3]}]}
# 実行
# kafka-reassign-partitions.sh --bootstrap-server <broker> --reassignment-json-file reassignment.json --execute
# 帯域スロットルを適用する場合は broker/topic 設定で replication.throttled.* を活用
# 優先リーダー選出
# kafka-preferred-replica-election.sh --bootstrap-server <broker>CCAAK
問題 1
CCAAKの観点で、トピックordersに対しRF=3, min.insync.replicas=2, プロデューサacks=allを設定している。2台のブローカー障害時に新規書き込みを継続するには、どの条件が必要か?
正解: A
書き込み成立にはacks=all時、ISR数がmin.insync.replicas以上である必要があります。RF=3, min.insync.replicas=2なら、2台同時障害が発生すると通常ISR<2に落ち、書き込みは拒否されます。例外的に故障がISR外(たとえば追従遅延でISRにいないレプリカ)で起きてISRが2以上を維持できる場合のみ継続可能です。BやCは誤りで、Dは可用性向上の代わりに一貫性保証を下げるため設計意図と異なります。
1ブローカーあたりのパーティション数はどの程度が安全ですか?
ハードウェアとKafkaバージョン、GC方式に依存します。一般に数千を超えるとメタデータ処理やGC、クリーンアップで負荷が跳ねやすくなるため、負荷試験のうえ上限を定め、20〜30%の余力を残してください。コントローラの安定性と再割り当て時間も評価対象です。
retention.msとretention.bytesはどちらを使うべきですか?
SLAが期間中心ならretention.ms、コスト上限が厳しいならretention.bytesを軸にし、足りないほうを補助的に使います。compactionを併用する場合は、ユニークキーサイズを基準に、deleteで古いセグメントの上限管理を組み合わせると安定します。
後からパーティションを増やすと何が起こりますか?
新規パーティションには既存キーの順序保証は及びません(キー未指定でラウンドロビン/スティッキー配分の場合)。また、データ再配置やリーダー選出に伴う瞬間的なレイテンシ上昇がありえます。将来増を見込み、初期から少し多めに割り当てるのが無難です。
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-...