技術メモ

技術メモ

ラフなメモ

Apache Kafka の基本

Kafka の基本

メッセージ送受信の基本

  • 主要な要素は以下

f:id:tutuz:20190316152331p:plain

Broker

  • データの受信・配信するサービス

Message

  • Kafka 内で扱うデータの最小単位。Kafkaが中継するログの 1 行 1 行が該当する。Message には Key と Value をもたせることができる

Producer

  • データの送信元

Consumer

  • Broker から Message を取得するアプリケーション

Topic

  • Message を種別ごとに監視するためのストレージ。Broker 上に配置される。Producer や Consumer は Topic を指定して Message の送受信を行う
    • これによって単一の Kafka クラスタで他種類の Message を中継することができる

システム構成

コンポーネントを動作させるために必要なシステム構成は以下

f:id:tutuz:20190316152408p:plain

ZooKeeper

  • Broker の分散処理の管理ツール
  • 分散メッセージングにおけるメタ情報を管理している

分散メッセージングのための仕組み

Partition

  • Broker 上のデータの読み書きは Partition 単位で分割されている
  • ある Topic は複数の Partition で構成されていて、それぞれの Partition は Broker クラスタに分散して配置されている
  • Producer からの Message 受信、Consumer への配信を分散して行うことができる
  • 各 Partition を Broker にどのように配置しているかの情報は Broker 側で保持される

Consumer Group

  • 複数の Consumer が同一の Topic を取得しつつ、複数 Partition から Message を取得する仕組み
  • 複数の Consumer は所属する Consumer Group を識別して、読み込む Partition 振り分けやリトライの制御をする

Offset

  • 各 Partition で受信した Message には連番が付与される
  • Parition 単位でメッセージの位置を示すのが Offset の役割
  • Consumer が取得するメッセージの範囲やリトライを制御するために使われる
Offsetの種類 説明
Log-End-Offset Partition のデータの末尾を示す
Cirremt Offset Consumer がどこまで Message を読んだかを示す
Commit Offset Consumer がどこまで Commit したかを示す
High Watermark レプリケーションが完了している Offset

Message の送受信動作

Producer の Message 送信

  • 送信時にある程度の Message を Producer 上のメモリ上に蓄えておき、まとめて Kafka クラスタへ送信することができる。
  • 送信のトリガーとなる閾値に関してはバッチサイズまたは指定待ち時間で制御する
  • まとめて送信することでスループットの向上に寄与する可能性がある

Consumer の Message 取得

  • 対象の Topic および Partition から Current Offset で示される位置にある最後に取得した Message から Broker で保持する最新の Message までまとめてリクエスト・取得をする
  • ある程度まとめて Message を送信・受信することでスループットの向上が考えられるがレイテンシは増加する
  • バッチ処理の間隔については、スループットとレイテンシのトレードオフを考慮した設計が必要

Consumer のロールバック

後ほど記載する

Message 送信のパーティショニング

以下のロジックで決まる

  • Message の Key のハッシュ値を用いた送信

    • Message の Key によって送信先の Partition が決まる
    • 同一の Key を持つ Message は同一の ID をもつ Partition へ送信される
    • 送信される Key に偏りがある場合、ある Partition へ Message が偏る
  • ラウンドロビンによる送信

  • Key, Value を用いたユーザ独自実装

データの堅牢性を高めるレプリケーションの仕組み

  • Kafka クラスタのサーバ障害で受信 Message をロストしないためにレプリケーションの仕組みを備えている
  • Broker に Topic を構成する Partition および Replica が配置される
  • Topic 単位でレプリカ数を決めることができる
  • Replica のうち、一つは Leader でその他は Follower と呼ばれる
    • Follower は Leader からメッセージを継続的に取得して複製を保つように動作する
  • Producer/Consumer とのデータのやり取りは Leader が実施する

Producer の Message 到達保証レベルの調整

  • Producer の Message 送信時の Ack をどのタイミングで送信するかを制御する
    • Ack を返すタイミングは性能と耐障害性に大きく影響する
Ack設定 説明
0 Producer が Message を送信時、Ack を待たずに次の Message を送信する
1 Leader の Replica に書き込まれたら Ack を返す
all すべての In Sync Replica 数まで書き込まれたら Ack を返す
  • 「書き込まれた」というのはメモリ上のバッファに書き込まれた場合のことであって、ディスクに flush するタイミングではない
    • ディスクへ flush するのを制御するのは別の機構がある

参考書籍