■ はじめに
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間は順序は保証されていない
* 各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(オフセット)
* パーティション内のメッセージの位置(オフセット)を表す => 特定のパーティションの各メッセージには一意のオフセットがあり、 パーティション内のコンシューマーの位置を特定して、 消費したレコード数を追跡するのに役立つ
内部オフセットトピック:__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
Confluent ~ Local環境構築 ~
https://dk521123.hatenablog.com/entry/2024/05/10/000325
Confluent ~ REST API ~
https://dk521123.hatenablog.com/entry/2024/05/09/144826
Confluent ~ Confluent CLI ~
https://dk521123.hatenablog.com/entry/2024/05/12/000159
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
Scala ~ Apache Kafka / Producer ~
https://dk521123.hatenablog.com/entry/2023/04/27/235703
Scala ~ Apache Kafka / Consumer ~
https://dk521123.hatenablog.com/entry/2023/04/28/014737