Apache kafkaとは何ぞや ~Kafka内部編~

皆さんこんにちは。エンジニアの南です。

「Apache Kafkaとは何ぞや」のブログではApache Kafkaについて簡単な概要とユースケースや構成について話しました。Apache Kafkaの機能、特徴についておさらいすると以下のようになります。

  • 機能
    • Producerからメッセージを受け取る
    • Consumerからメッセージ要求があればメッセージを渡す(非同期通信)
  • 特長
    • 受け取るメッセージ量が増えても、高スケーラビリティによりメッセージのスループットを維持し続けられることが可能
    • 耐障害性がある

しかし、特に特長においてはなぜ高スケーラビリティなのか?であったり、なぜ耐障害性を持つのか?などについて、まだまだ疑問点が多く残っていると思います。ここではKafkaのアーキテクチャを知ることで、これらの疑問点を解決していきたいと思います。

内部 ~Topic、Partition、Replica~

Topic

Kafkaに送られるデータは、送信者が数多く存在する以上それだけ多くの種類のデータが存在するということになります。Consumerは多くのデータの中から探し出して取得しなければなりません。

ここで登場するのがTopicです。Topicはメッセージを種類分だけ存在し、Consumer側がどんなデータが欲しいのかを探し出すのに役立ちます。またProducer側では、どのTopicに送信するのかを決定しておく必要があります。図では、見やすくするためBrokerは一つだけですが、実際は耐障害性のために複数使われています。耐障害性に関してはReplicaの部分で触れていきたいと思います。

Partition

Topicを枝豆のさやだとすれば、Partitionは枝豆です。例えのとおりTopicの中には複数個のPartitionが存在します。複数存在していることで、Producerからの受信やConsumerへの配信などを分散して行うことができます。こうすることでPartition1個あたりのタスクが軽減され、結果的に高スループットの維持につながります。

同じTopicへのメッセージを複数Partitionに分散して送信、受信している

Replica

Partitionの中にさらに複数存在しているのがReplicaです(緑、青楕円)。Kafkaでは、Brokerが複数構成されておりKafka内でのサーバとしての役割を果たします。Replicaが全てのBrokerにまたがっていることで、Brokerのどれかが故障したとしても、残りのBrokerに存在するReplicaからメッセージを読みだすことができます(耐障害性)。

ProducerからLeader Replicaに渡し、Follow Replicaへ渡している

また、Partition内のReplicaのうち、青楕円のものはLeader Replicaと呼ばれ、以下のような役割を果たします。

  1. ProducerとConsumerとの送受信を行う
  2. Partition内の他のReplica(Follow Replica)に自身の持つデータをコピーして送信する
  3. Leader Replicaが故障した場合、残りのFollow RepicaのいずれかがLeaderとなる

2では、Leader Replicaと同じデータを持ったFollow ReplicaのことをIn-Sync Replica(ISR)といいます。

In-Sync Replica(ISR)

Leader ReplicaとLeader Replicaの内容を複製したFollow Replicaのことを指します。ISRであればLeader Replicaの内容を同期しているということになります。Leader Replicaを持つBrokerが故障しても、ISRから読みだせるようになり、耐障害性を担保します。

最小ISR数

最小ISR数とは、Producerがメッセージを書き込むのに必要なISRの数のことでこの値は自由に設定することができます。メッセージを書き込む際、その時点でのISR数が最小ISR数以上であればメッセージ書き込みが可能となります。ISR数が多いほど障害時に復旧データ先が多くなるということなので、最小ISR数の値は大きめに設定するとメッセージ消失のリスクも減らすことにつながります。

まとめ

Kafkaが高スケーラビリティを維持し続けられる理由と、メッセージ保存性が保障される理由についてのお話でした。

最後までお読みいただきありがとうございました。