Topic は論理名、Partition は順序付きの不変ログ。スケールと順序保証は Partition が単位になります。
可用性は複製(replication)と ISR に依存。並列度は「Partition 数 ≤ Consumer 並列度」で制限されます。
Kafka の Topic はイベントのカテゴリ名、Partition はその Topic を水平分割した順序付き・不変のログです。各レコードは Partition 内で単調増加する offset を持ち、順序保証の範囲は Partition 内に限られます。
可用性は複製(replication)で確保されます。各 Partition には 1 つの Leader と 0 個以上の Follower があり、Follower は Leader のログを追従します。最新に追従できている集合を ISR(In-Sync Replicas)と呼びます。書き込みの耐久性は acks と min.insync.replicas の組み合わせで制御します(詳細は後述)。
トピックの分散配置と複製(例: partitions=3, RF=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)で強化できます。
コンソールプロデューサでキーを付与して送信
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 数, コンシューマ数) で頭打ちになります。
再均衡(リバランス)はグループのメンバー変動やサブスクリプション変更時に発生し、一時的に処理が止まります。セッションタイムアウトや心拍の調整、安定したデプロイ戦略で過剰な再均衡を避けます。
グループを使って読み取り(複数プロセスで並列化)
# ターミナル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 に抑える代わりにスループットが制限されます。用途に応じたトレードオフを明確化しましょう。
| 設計 | 長所 | 短所 | 主な用途 |
|---|---|---|---|
| 単一パーティション | 全順序が保てる/デバッグ容易 | スループットと並列度が低い(スケールしない) | 厳格な順序が不可欠なキュー/少量トラフィック |
| 少数(2〜6) | 適度な並列化/運用負荷が低い | ピーク時に頭打ちの可能性 | 中規模のイベント処理/段階的拡張の初期値 |
| 多数(10〜50) | 高いスループット/コンシューマを水平スケール | メタデータとファイル数増、再均衡コスト増 | 本番ワークロードのスケールアウト |
| 非常に多数(100+) | 極大スループットと細粒度並列 | 運用が難しい/FD・メモリ・コントローラ負荷懸念 | 大規模マルチテナント/大組織の集中基盤 |
書き込みの耐久性は 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 を目標に監視します。
トピック/プロデューサの耐久性関連設定例
# トピック作成時に 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=5Partition 数は増やせますが減らせません。既存のキーが新しい Partition 数で別の Partition にマッピングされる可能性があるため、増加後は“同一キーが常に同じ Partition”という性質が過去データと跨っては維持されない点に注意します(Partition 内の順序保証という基本は不変)。
保持は retention.ms/retention.bytes、クリーンアップ方針は cleanup.policy=delete/compact で制御します。コンパクションはキーごとに最新値を残す用途に向き、イベントの完全履歴を必要とする場合は delete 方針+十分な保持期間を設定します。再割り当てやメンテ作業ではレプリカの移動が I/O を消費するため、ウィンドウを設けて段階的に行います。
代表的な運用コマンド
# 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.jsonCCDAK
問題 1
高トラフィックな注文イベントを処理する。ユーザーID単位の順序は維持したいが、全体のスループットも引き上げたい。どの設計が最適か?
正解: A
ユーザーIDをキーにすれば同一キーは同一 Partition に入り順序が保たれる。Partition 数を増やせば並列度とスループットを引き上げられる。B は Partition=1 のため並列度が増えず、C はスループットが頭打ち、D は耐久性が大きく低下する。
パーティション数は後から減らせますか?
基本的に減らせません。必要なら新しいトピックを設計し直し、Mirror/ストリーミング処理で移行します。増やすことは可能ですが、キーの Partition マッピングが将来変わる点に留意します。
キーなしで送信した場合の分散はどうなりますか?
クライアント実装に依存します(ラウンドロビンやスティッキー分散など)。試験/設計観点の要点は「順序が重要な単位にはキーを付与し、同一キーを同一 Partition に送る」ことです。
順序保証はどこまで可能ですか?
Kafka が保証するのは Partition 内の順序です。Topic 全体の全順序は原則として提供しません。厳密な全順序が必要な場合は単一 Partition を用いるか、アプリ側で順序制御が必要です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
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-...
Kafka Producer API 基礎: 送信フローと主要設定の意味
CCDAK 対応。Producer の送信フローを起点に、スループット・信頼性・順序性を左右する主要パラメータの意図と実...