【Kafka】Apache Kafka ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/04/23/235534
https://dk521123.hatenablog.com/entry/2023/04/24/153846
https://dk521123.hatenablog.com/entry/2023/04/26/103421

の続き。

今回は、Apache Kafkaの基本となる構成要素などについて扱う。

目次

【1】メッセージ
【2】システム構成
 1)Producer (Publisher)
 2)Broker
 3)Consumer (Subscriber)
 補足1:Apache zookeeper
 補足2:メッセージモデル
【3】論理構造
 1)Topic
 2)Partition
 3)Replica
 補足1:Offset(オフセット)
【4】Kafka API
 1)Producer API
 2)Consumer API
 3)Connect API
 4)Streams API (Kafka Streams)
 5)Admin API

【1】メッセージ

* Kafka に送受信されるデータの基本単位
* 「イベント」、「レコード」と呼ぶ場合もある

ヘッダー(Header)

* イベントのメタデータや補足情報を格納

キー(Key)

* イベント格納先の振り分けや集約に使用されるデータ
* キーを設定しないことも可能

タイムスタンプ(Timestamp)

* イベント作成時の時刻

値(Value

* イベントで処理したいデータ本体
* 形式は様々(文字列、JSONなど)

【2】システム構成

* 大きく分けて、以下の3通りで構成。

[Producer(Publisher)]<=>[Broker]<=>[Consumer(Subscriber)]

1)Producer (Publisher)

* データをBrokerに対して、送信する側のアプリケーション

https://tech-lab.sios.jp/archives/32041
https://tech-lab.sios.jp/archives/32130

2)Broker

* Kafkaクラスタを構成するサーバ
 =>逆の言い方をすると Brokerが1台~複数で構成されたものを
 「Kafkaクラスタ」と呼ぶ
* Zookeeper と連携(後述「補足1:Apache zookeeper」を参照)

3)Consumer (Subscriber)

* データをBrokerに対して、受信する側のアプリケーション
 => 詳細は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/10/17/235420

補足1:Apache zookeeper

* Kafkaのメタデータ(※1)を保持する
* Zookeeper もクラスタ(複数)で構成

※1:Zookeeperで管理しているメタデータの内容

* Topicの一覧
* Topic の設定値
* Partition の状態
* Broker の一覧
* Broker のACL(Access Control List)の設定値

補足2:メッセージモデル

主なメッセージモデルは以下の通り
~~~~~
[1] キューイングモデル (待ち行列モデル)
[2] Pub/Subメッセージングモデル
~~~~~

Kafka は、この2つの特徴を併せ持っている
 => ただ、「[2] Pub/Subメッセージングモデル」がメイン

【3】論理構造

1)Topic
2)Partition
3)Replica

1)Topic(トピック)

* Kafkaのメッセージの送受信先
 => Kafkaクラスタ上に作られるメッセージの論理的な入れ物
 => Topic 名は、一意で区別される
 => Topicに送信されたメッセージは1つ以上のPartitionに分割されて保存

2)Partition(パーティション

* 分散処理のために、Topicを分割したもの
* 各Partitionにメッセージを均等にする

Partitionの特徴

[1] 同一Partitionでは、イベントの順序が送信順であることが保証されている
[2] レプリケーションの冗長化(じょうちょうか)

[1] 同一Partitionでは、イベントの順序が送信順であることが保証されている

* 例:Partition-2のOffset=12, Offset=13の配信タイムスタンプは前者が先
 => ただし、Topic間のPartition間は順序は保証されていない

[2] レプリケーション冗長化(じょうちょうか)

* 各Partitionのメッセージは、複数のBrokerにコピーされる
* 一つのPartitionにつき、レプリカ内で書き込み可能なPartition
 (このPartitionを「Leader Replica」と呼ぶ)はひとつだけ
* 「Leader Replica」のBrokerに障害が発生した場合、
 別のBrokerにある「Follower Replica」が「Leader Replica」として昇格する

3)Replica

* 耐障害のために作られる各Patitionの複製

[1] Leader Replica

* Product/Consumerと直接やりとりするデータ

[2] Follower Replica

* 「Leader Replica」と常に同期をとっている耐障害に備えているデータ
 => サーバに障害が起きた際に、そのサーバに保持されていた「Leader Replica」の
  代わりになるように控えている

補足1:Offset(オフセット)

* パーティション内のメッセージの位置(オフセット)を表す
 => 特定のパーティションの各メッセージには一意のオフセットがあり、
  パーティション内のコンシューマーの位置を特定して、
  消費したレコード数を追跡するのに役立つ

https://access.redhat.com/documentation/ja-jp/red_hat_amq/7.6/html/amq_streams_on_openshift_overview/kafka-concepts_str

内部オフセットトピック:__consumer_offsets

* コンシューマーグループをもとに、
 コミットされたオフセット、最後のオフセットと次のオフセットの位置
 に関する情報が保存されている

【4】Kafka API

1)Producer API

* Topic にメッセージを送信するためのAPI

2)Consumer API

* Topic からメッセージを受信するためのAPI

3)Connect API

* DB、TwitterなどのデータシステムとKafka間で
 継続的にメッセージを送受信するためのAPI
* 詳細は、以下の関連記事を参照のこと

Apache Kafka ~ Kafka Connect ~
https://dk521123.hatenablog.com/entry/2023/04/29/185133
Apache Kafka ~ Kafka Connect / PostgreSQL
https://dk521123.hatenablog.com/entry/2023/05/02/233806

4)Streams API (Kafka Streams)

* Kafkaから読み取ったストリームデータを
 リアルタイムに処理するためのAPI

5)Admin API

* Kafkaクラスタの管理目的に使用されるAPI
 => 例えば、Topic, ACI, その他Brokerに関わる設定操作

関連記事

Apache Kafka ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/04/26/103421
Apache Kafka ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/23/235534
Apache Kafka ~ 環境構築 / Docker compose編 ~
https://dk521123.hatenablog.com/entry/2023/04/24/153846
Docker compose で Kafka構築時に Topic を作るには
https://dk521123.hatenablog.com/entry/2023/07/22/145643
Apache Kafka ~ Remote debug ~
https://dk521123.hatenablog.com/entry/2023/10/23/125909
Apache Kafka ~ Kafkaコマンド ~
https://dk521123.hatenablog.com/entry/2023/05/16/000000
Apache Kafka ~ Consumer ~
https://dk521123.hatenablog.com/entry/2023/10/17/235420
Apache Kafka ~ Strimzi ~
https://dk521123.hatenablog.com/entry/2023/05/08/000133
Apache Kafka ~ Web UI / Kafdrop編 ~
https://dk521123.hatenablog.com/entry/2023/07/30/174239
Apache Kafka ~ Web UI / kafka-ui編 ~
https://dk521123.hatenablog.com/entry/2023/07/31/000152
Apache Kafka ~ 設定値 ~
https://dk521123.hatenablog.com/entry/2023/05/28/151212
Kafka Connect ~ 環境構築 / Docker compose編 ~
https://dk521123.hatenablog.com/entry/2023/08/11/220921
Kafka Connect ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/04/29/185133
Kafka Connect ~ 基本編 / PostgreSQL
https://dk521123.hatenablog.com/entry/2023/05/02/233806
Kafka Connect ~ Connector 構成プロパティ ~
https://dk521123.hatenablog.com/entry/2023/06/02/011131
Kafka Connect ~ Rest API
https://dk521123.hatenablog.com/entry/2023/05/31/000000
Kafka Connect ~ DB/Schema切替 ~
https://dk521123.hatenablog.com/entry/2023/10/26/235951
Kafka Connect での デバッグ方法
https://dk521123.hatenablog.com/entry/2023/08/15/215636
Apache Kafka ~ Remote debug ~
https://dk521123.hatenablog.com/entry/2023/10/23/125909
kafka-python ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/10/24/000309
Apache Flink ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/03/01/235100
Amazon MSK ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/04/21/000000
Amazon MSK ~ 基本編 / Connector ~
https://dk521123.hatenablog.com/entry/2023/05/20/003516
Amazon MSK ~ AWS CLI
https://dk521123.hatenablog.com/entry/2023/06/03/003941
ローカル環境のKafkaでのトラブルシュート
https://dk521123.hatenablog.com/entry/2023/10/19/210341
Terraform ~ AWS MSK ~
https://dk521123.hatenablog.com/entry/2023/05/14/122215
Terraform ~ AWS MSK Connect ~
https://dk521123.hatenablog.com/entry/2023/05/25/000000
ScalaApache Kafka / Producer ~
https://dk521123.hatenablog.com/entry/2023/04/27/235703
ScalaApache Kafka / Consumer ~
https://dk521123.hatenablog.com/entry/2023/04/28/014737