皆さんこんにちは。エンジニアの南です。
「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個あたりのタスクが軽減され、結果的に高スループットの維持につながります。
Replica
Partitionの中にさらに複数存在しているのがReplicaです(緑、青楕円)。Kafkaでは、Brokerが複数構成されておりKafka内でのサーバとしての役割を果たします。Replicaが全てのBrokerにまたがっていることで、Brokerのどれかが故障したとしても、残りのBrokerに存在するReplicaからメッセージを読みだすことができます(耐障害性)。
また、Partition内のReplicaのうち、青楕円のものはLeader Replicaと呼ばれ、以下のような役割を果たします。
- ProducerとConsumerとの送受信を行う
- Partition内の他のReplica(Follow Replica)に自身の持つデータをコピーして送信する
- 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が高スケーラビリティを維持し続けられる理由と、メッセージ保存性が保障される理由についてのお話でした。
最後までお読みいただきありがとうございました。