Kafka

Kafkaキャパシティプランニング実践ガイド: パーティション・ブローカー・保管容量をどう決めるか

2026-04-19
NicheeLab編集部

Kafkaはスケールアウトに強い一方、パーティション数・ブローカー台数・ストレージ容量の初期設計を外すと、後追いの再割当てや費用超過が発生します。本稿は、公式ドキュメントの安定概念に基づき、試験(CCAAK)で問われやすい要点と、現場で通用する見積り手順をまとめました。

キーワードは3つです。並列度(パーティション)、耐障害性(レプリケーション/ブローカー)、保持(容量)。この3点をワークロードから逆算するのが最短経路です。

1. 前提整理: ワークロードとSLAを数値化する

キャパシティ計画は、入力レート、メッセージサイズ、保持期間、可用性/遅延SLAを数値で固めるところから始まります。特に平均とピークを分け、ピーク係数(例: p95/p99)を明示します。

Kafkaはバッチ効率でスループットが伸びるため、プロデューサのbatch.sizeやlinger.ms、コンシューマのfetch設定の目標値も併せて前提化しておくと、パーティション数の算出が安定します。

  • 平均/ピークIngress (MB/s) と平均メッセージサイズ (bytes)
  • トピックごとの保持方針: retention.ms / retention.bytes と cleanup.policy(delete/compact)
  • 可用性目標とRPO/RTOに応じた replication.factor および min.insync.replicas
  • 読み取りパターン: コンシューマグループ数、同時サブスクライバ数、トラフィックの比率(書き:読み)
  • 運用余裕(ヘッドルーム)比率: 一般に20〜30%を初期ガードに設定

ワークロード前提のテンプレート例

# 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

2. パーティション設計: 並列度とスループットを一致させる

スループットは基本的にパーティション数に比例して伸びます。1パーティションは順序保証のため単一リーダーへの直列書き込みであり、ハードウェアとバッチ設定次第で処理可能な上限が出ます。まずは小さく負荷試験を行い、1パーティションあたり実効スループット(Tp)を把握し、必要パーティション数を逆算します。

キー分布が偏るとホットパーティションが発生し、計画どおりに伸びません。可能ならキー空間にシャーディング要素を足す、またはStickyPartitionerの特性とバッチサイズを調整してバランスさせます。

  • 必要パーティション数 ≈ ceil(ピークIngress / 実効Tp/partition)
  • コンシューマ並列度は「グループあたり最大=パーティション数」。読取並列要件からも下限を決める
  • 最初はやや多めに作り、将来の拡張余地を確保。後から増やすと再バランスのコストが発生
  • Segmentサイズやインデックスはパーティション数に比例してメモリ/FDを消費するため、ブローカーのメモリと併せて上限を意識

パーティション数のラフ算出式と例

# 実測に基づく計算を推奨
# 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

3. ブローカー台数: 可用性と配置の原則

レプリケーション係数RFは可用性の基礎です。各パーティションはRF個のレプリカを持ち、そのうちリーダー+ISR(min.insync.replicas以上)が書き込みの前提になります。一般的な可用性要件ではRF=3, min.insync.replicas=2が出発点です。

ブローカー台数は最低でもRF以上、障害ドメイン(ラック/アベイラビリティゾーン)ごとにレプリカを分散できる数を確保します。追加で、1ブローカーあたりの許容パーティション総数とディスク帯域/CPUの上限を超えないように、台数を決めます。

  • 最少ブローカー数 ≥ RF。ラックアウェア配置を使う場合はラック数もRF以上が望ましい
  • min.insync.replicas = RF - 1 を目安にし、acks=all と組み合わせて耐障害性と一貫性を両立
  • 1ブローカーのパーティション上限はハードウェア依存。数千単位でGC/メタデータ負荷が増えるため、運用実績に基づき上限を設定
  • コントローラ負荷と再割り当て時間を短くするため、空き余力を20〜30%確保
戦略主要設定主な用途容量見積りのポイント
時間ベース削除retention.ms, cleanup.policy=deleteログを一定期間保持容量=平均Ingress×保持時間×RF+ヘッドルーム
サイズベース削除retention.bytes, cleanup.policy=delete容量上限重視の運用容量=指定サイズ×RF+ヘッドルーム。古いデータから削除
ログ圧縮(コンパクション)cleanup.policy=compact(,delete)キー最新値を維持するストリームテーブル容量はユニークキー総サイズ+コンパクション間のデルタ分を見積もる

RF=3のクラスター配置イメージ(ラックアウェア)

Producersacks=allRack A / Broker1P0[L] P1[F] P2[F]Rack B / Broker2P0[F] P1[L] P2[F]Rack C / Broker3P0[F] P1[F] P2[L]ConsumersL=Leader, F=Follower, ISR>=2 (min.insync.replicas=2)

ラック識別とトピック作成例

# 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

4. ストレージ容量: 保持ポリシーからの逆算

容量見積りは、圧縮前/後の実効Ingress、保持期間、RFを掛け合わせ、インデックスやセグメントのオーバーヘッド、さらに運用ヘッドルームを加えます。公式の保持動作はretention.ms/retention.bytesおよびcleanup.policy(delete/compact)で制御されます。

ログ圧縮を使う場合は、ユニークキーの総サイズと更新頻度を中心に見積もり、deleteも併用するなら二段構えで上限を管理します。

  • 基本式: 容量(単一レプリカ) ≈ 実効Ingress(MB/s) × 保持秒 × 圧縮係数
  • クラスター必要容量 ≈ 単一レプリカ容量 × RF × (1 + ヘッドルーム)
  • オーバーヘッド: インデックス/タイムインデックス、セグメント切替余白。安全側で+10〜20%を見込む
  • ディスクは余裕を確保し、ログクリーナやコンパクタが詰まらないようIOPS/帯域を評価

計算例(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 台数)に割り付け、将来増設余地を残す

5. ネットワーク/ディスク帯域: 複製と消費を含めた予算化

クラスターIngressはプロデューサ→リーダーへの書き込みです。さらに、RF>1ではフォロワーがリーダーから複製フェッチを行います。理想的には、総受信は約「クライアントIngress × RF」に近づきます(重複ACKやメタデータ通信は小さめ)。Egressはコンシューマ数と読み取りパターンに比例します。

ディスクはシーケンシャル書き込みに強いHDDでも高スループットを出せますが、混在ワークロード(読み書き/圧縮/コンパクション)ではSSDのほうがジッタが少なく、レイテンシSLAを守りやすいです。

  • NIC予算: 受信 ≈ Ingress×RF、送信 ≈ Ingress×(RF-1) + 総Egress(概算)
  • ディスク予算: 書き込みはIngress、読み出しはEgressと複製/コンパクションが重なるピークで評価
  • バッチ・圧縮(LZ4/ZSTD)はNIC/ディスクの効率改善に寄与。ただしCPU使用率とトレードオフ
  • プロデューサacks=all + min.insync.replicasは待ちが増えうるため、遅延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ポート以上を推奨

6. 運用余裕とスケール戦略: 安全マージンと再割り当て

キャパシティは静的ではありません。トピックやトラフィックの成長を見込み、常に20〜30%の余力を維持し、しきい値に近づいたらブローカーやディスクを追加します。追加後はパーティション再割り当てで均衡させます。

再割り当てはネットワーク/ディスクに負荷をかけます。メンテナンスウィンドウ、スロットリング、優先リーダー選出の活用で影響を抑えます。

  • 再割り当て時はクォータ(replication.throttled.rate)で帯域制御
  • 優先リーダー選出でリーダーを計画的に分散
  • メトリクス監視: パーティション/ブローカー数、ディスク使用率、ISRの安定性、リクエスト遅延
  • 段階的スケール: まずディスク増設、次にブローカー追加と再割り当て

再割り当てと優先リーダー選出の例

# 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台のブローカー障害時に新規書き込みを継続するには、どの条件が必要か?

  1. 障害が同一パーティションのISR外で発生し、残るISRが2以上を維持していること
  2. RF=3なので常に2台故障まで書き込み可能
  3. acks=allなのでブローカー障害の影響を受けない
  4. min.insync.replicasを1に下げれば、どの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で古いセグメントの上限管理を組み合わせると安定します。

後からパーティションを増やすと何が起こりますか?

新規パーティションには既存キーの順序保証は及びません(キー未指定でラウンドロビン/スティッキー配分の場合)。また、データ再配置やリーダー選出に伴う瞬間的なレイテンシ上昇がありえます。将来増を見込み、初期から少し多めに割り当てるのが無難です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Kafka

Kafka Topic と Partition の基礎: 分散とスケーラビリティの要

CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...

Kafka

CCDAK 試験ガイド:出題範囲・配点・申込み・対策

Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...

Kafka

Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点

CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...

Kafka

Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性

レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...

Kafka

Kafka の Offset とコミット: ポジション管理と at-least-once の基礎

CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...

Kafkaの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.