Kafka のブローカーは CPU、メモリ(JVM ヒープと OS ページキャッシュ)、ディスク、ネットワークのバランスで性能が決まります。特定の数値に依存するより、ワークロード(メッセージサイズ、圧縮、レプリケーション、消費者数、コンパクション有無)から資源の主要ボトルネックを見極める方が安定したサイジングにつながります。
本稿は CCAAK(Confluent の管理者系資格)で頻出の基本概念(ページキャッシュ重視、順次 I/O、acks/min.insync.replicas、パーティションと並列度など)に沿って、設計・検証までの手順を端的にまとめます。
まず「どれだけのバイト/秒を入出力するか」を決めます。プロデューサの入力スループットを B_in(MB/s)、レプリケーション係数を RF、同時に追随するコンシューマグループ数を CG とすると、ネットワーク入方向は概ね B_in、ブローカー間レプリケーションの出方向は B_in × (RF − 1)、クライアント向け出方向は B_in × CG です。ディスクは基本的に順次書き込みで、OS ページキャッシュが吸収するため、入出力が即座にランダム I/O になるわけではありません(コンパクションや再読み取りが多いとディスク負荷は増えます)。
サイジングは「どの資源が先に飽和するか」を見ます。圧縮や TLS を多用すれば CPU 側が先に詰まりやすく、コンパクションや多読取であればディスク帯域とページキャッシュが効いてきます。CCAAK では、Kafka が OS ページキャッシュを前提にログを順次書き込みする点、およびレプリケーションがネットワークとディスク負荷を増幅する点がよく問われます。
以下の比較表は代表的なワークロードと主ボトルネックの対応を示します。実際には計測で補正してください。
| ワークロード | 主ボトルネック | 推奨 CPU 方針 | 推奨メモリ方針 |
|---|---|---|---|
| 低レイテンシ書き込み主体(大きめバッチ) | ネットワーク入出と順次書き込み | 適度なコア数+NIC キューに見合うスレッド | ページキャッシュ重視(ヒープは中庸) |
| 圧縮/TLS 多用(小さめメッセージ) | CPU(圧縮・暗号化) | より多くの vCPU、LZ4/Snappy 優先設定 | GC 安定のため余裕を確保 |
| ログコンパクション多用 | ディスク帯域・IOPS、バックグラウンドクリーナ | 中〜高(クリーナの圧縮負荷) | ページキャッシュを厚めに |
| 多コンシューマグループで高読取 | 外向きネットワークとページキャッシュ | 中程度(デシリアライズ負荷) | ページキャッシュ重視 |
概算式: ブローカー台数の初期見積もり
入力スループット B_in_MBps
レプリケーション係数 RF
同時追随コンシューマグループ数 CG
1 ブローカーあたり許容入方向帯域 C_in_MBps
1 ブローカーあたり許容出方向帯域 C_out_MBps
1 ブローカーあたり許容ディスク帯域 C_disk_MBps
ネットワーク入方向負荷 ≈ B_in_MBps
ネットワーク出方向負荷 ≈ B_in_MBps × (RF - 1 + CG)
ディスク書き込み負荷 ≈ B_in_MBps × RF (順次 I/O 前提/コンパクション等で上振れ)
必要ブローカー数 N は各資源で計算し最大値を採用:
N_in = ceil( B_in_MBps / C_in_MBps )
N_out = ceil( B_in_MBps × (RF - 1 + CG) / C_out_MBps )
N_disk= ceil( B_in_MBps × RF / C_disk_MBps )
N = max(N_in, N_out, N_disk) × 余裕係数(例: 1.3〜1.5)
注: 実測で C_* を更新し反復。CPU は主に圧縮・暗号化・シリアライズ/デシリアライズ・リクエスト処理で消費されます。トピックの compression.type=producer を使うと、ブローカーは受信した圧縮バッチを基本的に再圧縮せずに保持でき、CPU 負荷を抑えられます(互換性のためのダウンコンバージョンが必要な場合は再圧縮が発生し得ます)。
スレッド構成は num.network.threads、num.io.threads、num.replica.fetchers などで調整できますが、CPU コア数や NIC/Disk の並列度に見合わないスレッド過多はコンテキストスイッチ増大を招き逆効果です。圧縮を重くするほど CPU ボトルネックになりやすいので、LZ4/Snappy など低オーバーヘッドのコーデックを優先し、必要に応じてパーティション数で並列度を上げるのが安全です。
Kafka はログデータ本体を JVM ヒープに保持せず、OS ページキャッシュを積極活用してディスク I/O を平滑化します。JVM ヒープはメタデータ、コントロールパス、ネットワークバッファなどに使われ、過大にすると GC ポーズが伸び、過小だとメタデータやバッファ不足が顕在化します。従ってヒープは中庸に、残りをページキャッシュに回すのが原則です。
ページキャッシュが厚いほど、追随するコンシューマの読み取りがディスクに落ちにくくなり低レイテンシを保ちやすくなります。コンパクションや再スキャンが多いワークロードでは、さらにメモリ(ページキャッシュ)を厚く取る価値があります。
ブローカーのデータパスとメモリの役割
Kafka のログは基本的に順次書き込みで、OS ページキャッシュから非同期フラッシュされます。複数ディスクを持つ場合は log.dirs にマウント毎のディレクトリを列挙し、JBOD 的に使うのが一般的です。レプリケーションが耐障害性を担うため、単一ブローカー内での RAID 冗長は必須ではありません。I/O 一貫性よりも順次書き込み帯域を重視します。
ログセグメントサイズ(log.segment.bytes)や保持ポリシー(retention.ms/bytes)はディスク使用量とクリーナ作業量に直接効きます。コンパクションを多用する場合は高速 SSD/NVMe と十分な帯域、log.cleaner.threads の適切値が必要です。
レプリケーション係数 RF を上げると、書き込みあたりのネットワーク出力(フォロワー向け)とディスク書き込みが増えます。可用性を高める構成(acks=all と min.insync.replicas の併用)は、同時に容量とスループットのコストを引き上げます。試験では acks=all と min.insync.replicas の関係、ISR が縮小した場合の書けない条件などが頻出です。
ラックアウェア配置を有効化すると、同一ラック障害に対する耐性が高まりますが、ブローカー間トラフィックがラックを横断する前提になるため、ネットワークの東西帯域にも気を配ります。
計画は「仮説 → 検証 → 補正」を前提にします。平均値だけでなくピークとパケット分布(メッセージサイズ、バッチング有無)を集め、RF や CG を含む拡張後トラフィックを見積もってから、少数ノードで負荷試験を行い、1 ブローカーの実測限界(C_in、C_out、C_disk)を得ます。これを元に必要台数を再計算し、20〜40% 程度の余裕を確保します。
運用では BytesInPerSec/BytesOutPerSec、RequestHandlerAvgIdlePercent、NetworkProcessorAvgIdlePercent、UnderReplicatedPartitions、IsrShrinksPerSec、LogFlush/Fetch/Produce 関連のレイテンシ、ディスク使用率・I/O 待ち、GC 指標などを監視し、早期にボトルネックを特定・増設判断ができるようにします。
CCAAK
問題 1
Kafka ブローカーのディスク設計として最も適切な説明はどれか。前提: レプリケーションを利用し高い可用性を確保したい。
正解: A
公式ドキュメントの設計原則では、Kafka は順次 I/O と OS ページキャッシュを前提とし、耐障害性はレプリケーションで担保するのが基本。JBOD 運用(複数 log.dirs を別物理ディスクに割当)が一般的で、RF を上げるとネットワーク/ディスク負荷は線形に増える。
平均値とピーク、どちらを基準にサイジングすべきですか?
台数見積もりはピークに基づき、さらに余裕(将来成長・メンテナンス・障害時の一時的偏り)を乗せます。平均で見積もるとスパイクで飽和しやすく、レイテンシや ISR 低下を招きます。
JBOD と RAID はどちらが推奨ですか?
レプリケーションを前提とする Kafka では、単一ブローカー内の RAID 冗長よりも JBOD(複数の独立ディスクを log.dirs に割当)が一般的です。目的は順次書き込み帯域の確保であり、耐障害性は RF と ISR、ラックアウェアで担保します。
ヒープサイズの目安はありますか?
ヒープは GC 安定性を最優先に中庸なサイズに留め、残りを OS ページキャッシュへ回します。ヒープを過大化してもログ本体はヒープに載らず、かえって GC ポーズが悪化する恐れがあります。
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-...