皆さんこんにちは。前回では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と呼ばれ、以下のような役割を果たします。
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が高スケーラビリティを維持し続けられる理由と、メッセージ保存性が保障される理由についてのお話でした。今回から細かい話となり、難しくなってしまいましたが最後までお読みいただきありがとうございました!!