Kafka

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

2026-04-19
NicheeLab編集部

Topic は論理名、Partition は順序付きの不変ログ。スケールと順序保証は Partition が単位になります。

可用性は複製(replication)と ISR に依存。並列度は「Partition 数 ≤ Consumer 並列度」で制限されます。

基本: Topic / Partition / Replica / Offset

Kafka の Topic はイベントのカテゴリ名、Partition はその Topic を水平分割した順序付き・不変のログです。各レコードは Partition 内で単調増加する offset を持ち、順序保証の範囲は Partition 内に限られます。

可用性は複製(replication)で確保されます。各 Partition には 1 つの Leader と 0 個以上の Follower があり、Follower は Leader のログを追従します。最新に追従できている集合を ISR(In-Sync Replicas)と呼びます。書き込みの耐久性は acks と min.insync.replicas の組み合わせで制御します(詳細は後述)。

  • Partition は並列処理とスケールの最小単位
  • 順序保証は Partition 内のみ(Topic 全体の全順序は原則なし)
  • オフセットはコンシューマが管理する読み取り位置指標(__consumer_offsets にコミット)
  • 複製係数(replication.factor)は本番では少なくとも 3 を推奨

トピックの分散配置と複製(例: partitions=3, RF=3)

Broker1Broker2Broker3P0 [L]LeaderP1 [L]LeaderP2 [L]LeaderP1 [R]ReplicaP2 [R]ReplicaP0 [R]ReplicaTopic: orders — P0/P1/P2 の Leader(L) と Replica(R) を 3 ブローカーに分散

CLI でトピックを作成/確認(3 パーティション、RF=3)

kafka-topics --bootstrap-server broker1:9092 \
  --create --topic orders --partitions 3 --replication-factor 3

kafka-topics --bootstrap-server broker1:9092 \
  --describe --topic orders

プロデューサ: パーティショニングと順序保証

プロデューサはパーティショナーで送信先 Partition を決定します。キー付きレコードでは、キーのハッシュなどにより同一キーが同一 Partition に送られ、キー単位の順序が保たれます。これが CCDAK で頻出のポイントです。

キーなしレコードの分散方法はクライアント実装に依存します(ラウンドロビンやバッチ効率を高めるスティッキー分散など)。試験/設計の要点は「順序が必要ならキーを使う」ことです。耐久性は acks、重複抑制は idempotent プロデューサ(enable.idempotence=true)で強化できます。

  • 同一キーは同一 Partition → キー単位の順序が保たれる
  • キーなしはクライアントの戦略に依存(ラウンドロビン/スティッキー等)
  • 高信頼: acks=all と適切な min.insync.replicas を併用
  • 重複抑制: enable.idempotence=true(再試行時の二重書き込み抑制)
  • 圧縮(compression.type)で帯域とスループットを改善

コンソールプロデューサでキーを付与して送信

kafka-console-producer --bootstrap-server broker1:9092 \
  --topic orders --property parse.key=true --property key.separator=:
# 入力例(左がキー、右が値)
user-42:{"op":"create","id":1}
user-42:{"op":"update","id":1}
user-7:{"op":"create","id":2}

コンシューマグループと並列度

同一グループ ID のコンシューマは Partition を分担して読みます。1 つの Partition を同時に処理できるのは同一グループ内で 1 コンシューマだけです。したがって、最大並列度は min(Partition 数, コンシューマ数) で頭打ちになります。

再均衡(リバランス)はグループのメンバー変動やサブスクリプション変更時に発生し、一時的に処理が止まります。セッションタイムアウトや心拍の調整、安定したデプロイ戦略で過剰な再均衡を避けます。

  • 最大並列度 = min(Partition 数, グループ内コンシューマ数)
  • 1 Partition は同一グループ内で専有される(同時処理は不可)
  • オフセットは明示コミット(enable.auto.commit=false)で制御性向上
  • auto.offset.reset=earliest/latest は未コミット時の開始位置

グループを使って読み取り(複数プロセスで並列化)

# ターミナル1
kafka-console-consumer --bootstrap-server broker1:9092 \
  --topic orders --group app-readers --from-beginning
# ターミナル2(同一グループ。Partition が分担される)
kafka-console-consumer --bootstrap-server broker1:9092 \
  --topic orders --group app-readers

設計ガイド: パーティション数をどう決めるか

目標スループット、1 Partition あたりが出せる処理量、必要なコンシューマ並列度から見積もります。経験的には「現状需要を満たす数 + 余裕」を用意し、足りなければ増やします(減らすことはできないため初期値は慎重に)。

Partition を増やすほどメタデータ・ファイル数・オープンファイルやネットワークの負荷が増えます。全順序が必要なワークロードでは Partition を 1 に抑える代わりにスループットが制限されます。用途に応じたトレードオフを明確化しましょう。

  • 1 Partition = 1 並列スロット(コンシューマグループ基準)
  • 増やせるが基本的に減らせない(新トピック作成と移行が必要)
  • 多すぎる Partition はブローカー/コントローラの負荷増・運用複雑化
  • 厳格な全順序が必要なら単一 Partition を検討
設計長所短所主な用途
単一パーティション全順序が保てる/デバッグ容易スループットと並列度が低い(スケールしない)厳格な順序が不可欠なキュー/少量トラフィック
少数(2〜6)適度な並列化/運用負荷が低いピーク時に頭打ちの可能性中規模のイベント処理/段階的拡張の初期値
多数(10〜50)高いスループット/コンシューマを水平スケールメタデータとファイル数増、再均衡コスト増本番ワークロードのスケールアウト
非常に多数(100+)極大スループットと細粒度並列運用が難しい/FD・メモリ・コントローラ負荷懸念大規模マルチテナント/大組織の集中基盤

レプリケーションと可用性: acks と min.insync.replicas

書き込みの耐久性は acks 設定で制御します。acks=all は Leader と ISR 上の必要数のレプリカにレコードが複製されてから応答します。min.insync.replicas は“acks=all のとき応答に必要な同期レプリカ数の下限”です。

実務推奨は、重要なトピックで replication.factor=3、min.insync.replicas=2、プロデューサで acks=all。これにより 1 台のブローカー障害下でも書き込みを継続しつつデータ損失リスクを抑えられます。クラスター健全性の指標として Under-Replicated/Offline Partitions は常に 0 を目標に監視します。

  • RF≥3、min.insync.replicas≥2(重要データ)
  • acks=all と組み合わせて耐久性を確保
  • 不潔なリーダー選出(unclean leader election)は本番で無効推奨
  • ISR からの離脱が続く場合はネットワーク/ディスク/負荷を点検

トピック/プロデューサの耐久性関連設定例

# トピック作成時に min.insync.replicas を設定
kafka-topics --bootstrap-server broker1:9092 \
  --create --topic critical-events --partitions 6 --replication-factor 3 \
  --config min.insync.replicas=2

# プロデューサ(プロパティ例)
acks=all
enable.idempotence=true
retries=2147483647
max.in.flight.requests.per.connection=5

運用とチューニング: ライフサイクルと再分散の注意

Partition 数は増やせますが減らせません。既存のキーが新しい Partition 数で別の Partition にマッピングされる可能性があるため、増加後は“同一キーが常に同じ Partition”という性質が過去データと跨っては維持されない点に注意します(Partition 内の順序保証という基本は不変)。

保持は retention.ms/retention.bytes、クリーンアップ方針は cleanup.policy=delete/compact で制御します。コンパクションはキーごとに最新値を残す用途に向き、イベントの完全履歴を必要とする場合は delete 方針+十分な保持期間を設定します。再割り当てやメンテ作業ではレプリカの移動が I/O を消費するため、ウィンドウを設けて段階的に行います。

  • 増やせるが減らせない → 減らしたい場合は新トピック作成+移行
  • 再割当: kafka-reassign-partitions(計画と検証を踏む)
  • 監視: under-replicated partitions、offlinePartitionsCount、コンシューマラグ
  • 保持と圧縮の設定はユースケース(ログ保持 vs. KV 最新化)で分ける

代表的な運用コマンド

# Partition 数の増加
kafka-topics --bootstrap-server broker1:9092 \
  --alter --topic orders --partitions 12

# トピック保持の調整
kafka-configs --bootstrap-server broker1:9092 --entity-type topics \
  --entity-name orders --alter --add-config retention.ms=604800000

# 再割当の開始(例。JSON で計画を指定)
kafka-reassign-partitions --bootstrap-server broker1:9092 \
  --execute --reassignment-json-file plan.json

問題で確認

CCDAK

問題 1

高トラフィックな注文イベントを処理する。ユーザーID単位の順序は維持したいが、全体のスループットも引き上げたい。どの設計が最適か?

  1. パーティション数を増やし、プロデューサはユーザーIDをキーとして送信する。コンシューマは同一グループで水平スケールする。
  2. キーを付けずに送信し、コンシューマ数だけを増やす(パーティションは 1 のまま)。
  3. 全順序を確実にするため、常に単一パーティションで運用する。
  4. プロデューサで acks=0 に設定してスループットを上げる。

正解: A

ユーザーIDをキーにすれば同一キーは同一 Partition に入り順序が保たれる。Partition 数を増やせば並列度とスループットを引き上げられる。B は Partition=1 のため並列度が増えず、C はスループットが頭打ち、D は耐久性が大きく低下する。

よくある質問

パーティション数は後から減らせますか?

基本的に減らせません。必要なら新しいトピックを設計し直し、Mirror/ストリーミング処理で移行します。増やすことは可能ですが、キーの Partition マッピングが将来変わる点に留意します。

キーなしで送信した場合の分散はどうなりますか?

クライアント実装に依存します(ラウンドロビンやスティッキー分散など)。試験/設計観点の要点は「順序が重要な単位にはキーを付与し、同一キーを同一 Partition に送る」ことです。

順序保証はどこまで可能ですか?

Kafka が保証するのは Partition 内の順序です。Topic 全体の全順序は原則として提供しません。厳密な全順序が必要な場合は単一 Partition を用いるか、アプリ側で順序制御が必要です。

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

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

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

NicheeLab編集部

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


関連記事
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

Kafka Producer API 基礎: 送信フローと主要設定の意味

CCDAK 対応。Producer の送信フローを起点に、スループット・信頼性・順序性を左右する主要パラメータの意図と実...

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