Kafkaの基本概念まとめ
Kafkaは、大規模サービスにおいてメッセージの分散処理と非同期処理のために使用される分散イベントストリーミングプラットフォームです。
ここで、イベントストリーミングプラットフォームとはデータ(イベント)を持続的に発生、保存、処理できるパイプラインを構築することを意味し、Kafkaはこの全ての過程をリアルタイムで処理します。
Kafkaの全体構造
Kafkaは主に以下の3つの構成要素から成り立っています。
- Producer (プロデューサー): メッセージをKafkaへ送信する主体
- Broker (ブローカー): メッセージを保存・管理するサーバー
- Consumer (コンシューマー): Kafkaからメッセージを読み込む主体
主要な構成要素の説明
Kafkaクラスター
- 複数のBrokerで構成されるメッセージ保存場所
- データを分散保存し、冗長化(二重化)および障害復旧を担当します。
- Producerから受信したデータを保存・保持し、Consumerへデータを配信する中核的な役割を果たします。
ZooKeeperクラスター
- Kafkaクラスターのメタデータおよび状態管理を担当します。
- ブローカーの登録、リーダー選出など、クラスター管理機能を行います。
- ただし、Kafkaバージョン2.8.0以降では、KRaft (Kafka Raft) モードを通じてZooKeeperなしでKafka自身がクラスターメタデータ管理を行えるようになり、ZooKeeperへの依存なしで運用が可能になりました。
Producer
- Kafkaクラスターにメッセージを送信します。
- 特定のTopicへメッセージを送信するように設定します。
Consumer
- Kafkaクラスターからメッセージを読み込みます。
- 特定のTopicを購読してデータを取得します。
Topic & Partition
Topic
- メッセージを論理的に区別する単位。(例:注文用トピック、通知用トピックなど)
- ProducerとConsumerはTopic単位でデータのやり取りを行います。
Partition (パーティション)
- Topicの物理的な単位です。
- メッセージは追記専用 (append-only) 方式で保存されます。
- 各メッセージはOffset番号で識別されます。
- Consumerは指定されたOffsetから順番にメッセージを読み込みます。
- メッセージは指定された保持期間(Retention Policy)の間保持されるか、ログコンパクション設定に従って保持されます。(設定された期間やサイズを超えると削除されます。)この長い保持期間のおかげで、Consumerに障害が発生しても復旧後にデータを損失なく再処理できます。
Producer → Partition 分配方式
- Keyに基づく分配: 同じKey値を持つメッセージは、同じパーティションに保存 → メッセージの順序保証
- Round Robin(ラウンドロビン): 順序通りにパーティションに均等に分配します。ProducerがKeyを指定しなかった場合、ラウンドロビン方式でメッセージがパーティションに順番に分配されます。
Consumer Groupと並列処理
- Consumer Groupは複数のConsumerで構成されます。
- 1つのパーティションは、Consumer Group内の1つのConsumerのみが読み込むことができます。
- 同じパーティション内では、Consumer Group内の1つのConsumerが順序通りにメッセージを読み込むため、順序が保証されます。
- Consumerを追加することで並列処理が可能になり、スループットの拡張が容易になります。
性能関連の特徴
OS Page Cacheの活用
- ファイル I/O をメモリーキャッシュで処理 → ディスクアクセスを最小限に抑え、高性能を実現
Zero Copy
- BrokerがデータをOSカーネルを迂回してメモリーから直接ネットワークへ転送します (CPU負荷の削減)。
- Non-Zero-Copy : ディスク → OSカーネル → アプリケーション → OSカーネル → ネットワーク
- 4回の物理的なコピーが発生します。
- OSカーネル → アプリケーション → OSカーネルの段階でCPUがデータコピーに関与するため、CPUリソースが浪費され、負荷が増大します。
- Zero-Copy: ディスク → OSカーネル → ネットワーク
- 2回の物理的なコピーが発生します。
- この過程は主に DMA (Direct Memory Access) が担当するため、CPUの関与を最小限に抑えます。
- OSカーネル迂回とは?
- アプリケーションプロセスがデータを直接読み書きする必要がないため、データがカーネル領域からユーザー領域へ移動し、再びカーネル領域へ戻るという非効率なプロセスを省略することを意味します。
- Non-Zero-Copy : ディスク → OSカーネル → アプリケーション → OSカーネル → ネットワーク
Batch転送
- Producerは複数のメッセージをまとめて転送できます。
- Consumerも複数のメッセージをまとめて取得できます。
- 個別に処理するよりも遥かに高いスループットを発揮します。
スケールアウトの容易さ
- Broker/Partitionの追加により、処理量を増やすことができます。
- Consumerが遅い場合は、Consumerインスタンスを追加することで対応できます。
- このようにスケールアウトが容易なため、スループットの増大に比較的容易に対応できます。
Replica (複製構造)
Replica: パーティションの複製
Leader : Producer、Consumerがアクセスする主となるパーティション
Follower : Leaderのデータを複製し、バックアップとして維持します。
- 複製数を増やすと、障害発生時にも安全に復旧可能です。
- Leader Brokerに障害が発生した場合、Followerの1つが自動的に昇格してLeaderになります。
用語解説
冗長化 (二重化)
- 説明: システムの安定性と可用性を高めるため、中核となる構成要素を2つ以上に複製して準備しておく方式。
- 目的: 片方に障害が発生しても、すぐに複製された他方がその役割を自動で引き継ぎ、システムが停止することなくサービスを継続できるように保証します。
ラウンドロビン
- 説明: 複数の対象(サーバー、パーティションなど)にリクエストや作業を順番に、巡回しながら均等に分配する方式。
- 目的: 特定の対象に作業が集中するのを防ぎ、負荷を均等に分散させることで、システム全体の公平性と効率性を高めます。
OSカーネル
- 説明: コンピューターの中央制御室の役割を果たす、OSの中核部分。
- 役割: ハードウェア(CPU、メモリー、ディスク、ネットワーク)を直接管理し、ユーザーアプリケーションがハードウェアを利用できるようにアクセスを仲介し、必須サービスを提供します。カーネルはカーネル領域という保護されたメモリー空間で実行され、アプリケーションが実行されるユーザー領域とは分離されています。
