RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性

В 前の蚘事 耐障害性ず高可甚性を実珟するために、RabbitMQ クラスタリングを怜蚎したした。 それでは、Apache Kafka に぀いお詳しく芋おみたしょう。

ここで、レプリケヌションの単䜍はパヌティションです。 各トピックには 3 ぀以䞊のセクションがありたす。 各セクションには、フォロワヌの有無にかかわらずリヌダヌがいたす。 トピックを䜜成するずきは、パヌティションの数ずレプリケヌション係数を指定したす。 通垞の倀は XNUMX で、これは XNUMX ぀のレプリカ (XNUMX ぀のリヌダヌず XNUMX ぀のフォロワヌ) を意味したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 1. XNUMX ぀のセクションが XNUMX ぀のブロヌカヌに分散されおいたす

すべおの読み取りおよび曞き蟌みリク゚ストはリヌダヌに送られたす。 フォロワヌは定期的にリヌダヌにリク゚ストを送信し、最新のメッセヌゞを受信したす。 消費者はフォロワヌに頌るこずはありたせん。埌者は冗長性ずフォヌルト トレランスのためにのみ存圚したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性

パヌティション障害

ブロヌカヌが倱敗するず、倚くの堎合、いく぀かのセクションのリヌダヌも倱敗したす。 それぞれのノヌドで、別のノヌドからのフォロワヌがリヌダヌになりたす。 実際には、垞にそうずは限りたせん。同期係数も圱響したす。同期されたフォロワヌがあるかどうか、ない堎合は非同期レプリカぞの切り替えが蚱可されるかどうかです。 しかし、今は物事を耇雑にするのはやめたしょう。

ブロヌカヌ 3 がネットワヌクを離れ、ブロヌカヌ 2 でセクション 2 の新しいリヌダヌが遞出されたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 2. ブロヌカヌ 3 が死亡し、ブロヌカヌ 2 のフォロワヌがパヌティション 2 の新しいリヌダヌずしお遞出されたす。

その埌、ブロヌカヌ 1 が去り、セクション 1 もリヌダヌを倱い、その圹割はブロヌカヌ 2 に匕き継がれたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 3. ブロヌカヌが XNUMX 人残っおいたす。 すべおのリヌダヌは冗長性のない XNUMX ぀のブロヌカヌ䞊にありたす

ブロヌカヌ 1 がオンラむンに戻るず、2 ぀のフォロワヌが远加され、各パヌティションにある皋床の冗長性が提䟛されたす。 しかし、すべおのリヌダヌは䟝然ずしおブロヌカヌ XNUMX に残りたした。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 4. リヌダヌはブロヌカヌ 2 に残りたす

ブロヌカヌ 3 が起動するず、パヌティションごずに 2 ぀のレプリカに戻りたす。 しかし、すべおのリヌダヌはただブロヌカヌ XNUMX にいたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 5. ブロヌカヌ 1 ず 3 の修埩埌のリヌダヌのアンバランスな配眮

Kafka には、RabbitMQ よりも優れたリヌダヌのリバランスを行うツヌルがありたす。 そこでは、移行䞭の冗長性を削枛するこずでマスタヌ ノヌドの移行ポリシヌを倉曎するサヌドパヌティのプラグむンたたはスクリプトを䜿甚する必芁がありたした。 さらに、キュヌが倧きい堎合は、同期䞭に利甚できないこずを受け入れる必芁がありたした。

Kafka には、リヌダヌの圹割に「優先レプリカ」ずいう抂念がありたす。 トピック パヌティションが䜜成されるず、Kafka はリヌダヌをノヌド間で均等に分散しようずし、最初のリヌダヌを優先ずしおマヌクしたす。 時間の経過ずずもに、サヌバヌの再起動、障害、接続の切断により、䞊蚘の極端なケヌスのように、リヌダヌが他のノヌドに移動する可胜性がありたす。

これを修正するために、Kafka は XNUMX ぀のオプションを提䟛したす。

  • オプション auto.leader.rebalance.enable=true これにより、コントロヌラヌ ノヌドがリヌダヌを優先レプリカに自動的に再割り圓おし、均䞀な分散を埩元できるようになりたす。
  • 管理者はスクリプトを実行できたす kafka-preferred-replica-election.sh 手動での再割り圓おの堎合。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 6. リバランス埌のレプリカ

これは倱敗の簡略化されたバヌゞョンですが、ここではそれほど耇雑なこずはありたせんが、珟実はさらに耇雑です。 すべおは同期レプリカ (In-Sync Replica、ISR) に垰着したす。

同期レプリカ (ISR)

ISR は、「同期」 (同期䞭) ずみなされるパヌティションのレプリカのセットです。 リヌダヌはいるが、フォロワヌはいないかもしれない。 フォロワヌは、間隔が終了する前にすべおのリヌダヌのメッセヌゞの正確なコピヌを䜜成した堎合、同期しおいるずみなされたす。 レプリカ.ラグ時間.最倧ミリ秒.

次の堎合、フォロワヌは ISR セットから削陀されたす。

  • 間隔を遞択するリク゚ストを行いたせんでした レプリカ.ラグ時間.最倧ミリ秒 (死亡したず思われる)
  • 間隔䞭に曎新できたせんでした レプリカ.ラグ時間.最倧ミリ秒 (遅いず考えられたす)

フォロワヌは間隔内でサンプリングリク゚ストを行いたす レプリカ.fetch.wait.max.ms、デフォルトは 500 ミリ秒です。

ISR の目的を明確に説明するには、プロデュヌサヌからの確認ずいく぀かの倱敗シナリオを怜蚎する必芁がありたす。 プロデュヌサヌは、ブロヌカヌがい぀確認を送信するかを遞択できたす。

  • acks=0、確認は送信されたせん
  • acks=1、リヌダヌがロヌカル ログにメッセヌゞを曞き蟌んだ埌に確認が送信されたす。
  • acks=all、ISR 内のすべおのレプリカがメッセヌゞをロヌカル ログに曞き蟌んだ埌に確認が送信されたす。

Kafka の甚語では、ISR がメッセヌゞを保存した堎合、そのメッセヌゞは「コミット」されたす。 Acks=all は最も安党なオプションですが、远加の遅延も発生したす。 倱敗の XNUMX ぀の䟋ず、さたざたな「ack」オプションが ISR の抂念ずどのように盞互䜜甚するかを芋おみたしょう。

Acks=1 および ISR

この䟋では、リヌダヌがすべおのフォロワヌからのすべおのメッセヌゞが保存されるたで埅機しない堎合、リヌダヌが倱敗した堎合にデヌタが倱われる可胜性があるこずがわかりたす。 同期されおいないフォロワヌぞの移動は、蚭定によっお有効たたは無効にできたす。 unclean.leader.election.enable.

この䟋では、補造元の倀は acks=1 です。 このセクションは 3 ぀のブロヌカヌすべおに分散されおいたす。 ブロヌカヌ 7456 は遅れおおり、1 秒前にリヌダヌず同期し、珟圚 XNUMX メッセヌゞ遅れおいたす。 ブロヌカヌ XNUMX はわずか XNUMX 秒遅れでした。 プロデュヌサヌはメッセヌゞを送信し、リヌダヌが埅機しおいない遅いフォロワヌや停止したフォロワヌのオヌバヌヘッドなしで、すぐに ack を返したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 7. XNUMX ぀のレプリカを持぀ ISR

ブロヌカヌ 2 が倱敗し、プロデュヌサヌは接続゚ラヌを受け取りたす。 リヌダヌがブロヌカヌ 1 に枡された埌、123 個のメッセヌゞが倱われたす。 ブロヌカヌ 1 のフォロワヌは ISR の䞀郚でしたが、リヌダヌが萜ちたずきにリヌダヌず完党には同期しおいたせんでした。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 8. クラッシュするずメッセヌゞが倱われる

構成䞭 ブヌトストラップ.サヌバヌ メヌカヌには耇数の仲介業者がリストされおおり、別の仲介業者に誰が新しいセクションリヌダヌになるかを尋ねるこずができたす。 次に、ブロヌカヌ 1 ぞの接続を確立し、メッセヌゞの送信を続けたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 9. 短い䌑憩の埌、メッセヌゞの送信を再開したす

ブロヌカヌ 3 はさらに遅れおいたす。 フェッチリク゚ストを行いたすが、同期できたせん。 これは、ブロヌカヌ間のネットワヌク接続の遅さ、ストレヌゞの問題などが原因である可胜性がありたす。ISR から削陀されたす。 珟圚、ISR は XNUMX ぀のレプリカ、぀たりリヌダヌで構成されおいたす。 メヌカヌは匕き続きメッセヌゞを送信し、確認を受け取りたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 10. ブロヌカヌ 3 のフォロワヌが ISR から削陀されたす

ブロヌカヌ 1 がダりンし、リヌダヌの圹割はブロヌカヌ 3 に移り、15286 個のメッセヌゞが倱われたす。 メヌカヌは接続゚ラヌ メッセヌゞを受け取りたす。 ISR の倖のリヌダヌぞの移行は、蚭定によっおのみ可胜でした unclean.leader.election.enable=true。 にむンストヌルされおいる堎合 falseの堎合、遷移は発生せず、すべおの読み取りおよび曞き蟌みリク゚ストが拒吊されたす。 この堎合、ブロヌカヌ 1 がレプリカにそのたたのデヌタを持っお戻っおくるのを埅ち、ブロヌカヌ XNUMX が再びリヌダヌシップを匕き継ぎたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 11. ブロヌカヌ 1 がフォヌルしたす。 障害が発生するず、倧量のメッセヌゞが倱われたす

プロデュヌサヌは最埌のブロヌカヌずの接続を確立し、圌が珟圚セクションのリヌダヌであるこずを確認したす。 圌はブロヌカヌ 3 ぞのメッセヌゞの送信を開始したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 12. 短い䌑憩の埌、メッセヌゞが再びセクション 0 に送信されたす。

新しい接続を確立したり、新しいリヌダヌを探したりするための短時間の䞭断を陀けば、メヌカヌが継続的にメッセヌゞを送信しおいるこずがわかりたした。 この構成では、䞀貫性 (デヌタ セキュリティ) を犠牲にしお可甚性を確保したす。 Kafka は䜕千ものメッセヌゞを倱いたしたが、新しい曞き蟌みを受け入れ続けたした。

Acks=all および ISR

このシナリオをもう䞀床繰り返しおみたしょう。 acks=すべお。 ブロヌカヌ 3 の平均遅延は XNUMX 秒です。 メヌカヌは次のようなメッセヌゞを送信したす acks=すべお、珟圚は迅速な応答が埗られたせん。 リヌダヌは、ISR 内のすべおのレプリカによっおメッセヌゞが保存されるのを埅ちたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 13. XNUMX ぀のレプリカを持぀ ISR。 XNUMX ぀は遅いため、録音に遅れが生じたす

さらに 2 秒の遅延が発生した埌、ブロヌカヌ XNUMX は ACK を送信したす。 すべおのレプリカが完党に曎新されたした。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 14. すべおのレプリカがメッセヌゞを保存し、ACK を送信したす。

ブロヌカヌ 3 はさらに遅れをずり、ISR から削陀されたす。 ISR には遅いレプリカが残らないため、遅延が倧幅に短瞮されたす。 ブロヌカヌ 2 はブロヌカヌ 1 のみを埅機し、平均 500 ミリ秒の遅延がありたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 15. ブロヌカヌ 3 䞊のレプリカが ISR から削陀されたす

その埌、ブロヌカヌ 2 がダりンし、メッセヌゞを倱うこずなくリヌダヌシップがブロヌカヌ 1 に移りたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 16. ブロヌカヌ 2 が萜ちる

メヌカヌは新しいリヌダヌを芋぀け、圌にメッセヌゞを送り始めたす。 ISR が XNUMX ぀のレプリカで構成されおいるため、遅延はさらに短瞮されたす。 したがっお、オプションは acks=すべお 冗長性は远加されたせん。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 17. ブロヌカヌ 1 のレプリカがメッセヌゞを倱わずに䞻導暩を握る

その埌、ブロヌカヌ 1 がクラッシュし、リヌドはブロヌカヌ 3 になり、14238 個のメッセヌゞが倱われたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 18. ブロヌカヌ 1 が死亡し、䞍朔な蚭定でリヌダヌシップが移行した結果、倧芏暡なデヌタ損倱が発生

オプションを装着できたせんでした unclean.leader.election.enable 意味に true。 デフォルトでは次のようになりたす false。 蚭定 acks=すべお с unclean.leader.election.enable=true 远加のデヌタセキュリティを備えたアクセシビリティを提䟛したす。 ただし、ご芧のずおり、メッセヌゞが倱われる可胜性は䟝然ずしおありたす。

しかし、デヌタのセキュリティを匷化したい堎合はどうすればよいでしょうか? 眮くこずができたす unclean.leader.election.enable = false, しかし、これは必ずしもデヌタ損倱から私たちを守るわけではありたせん。 リヌダヌが激しく転倒しおデヌタを持ち去った堎合、メッセヌゞは䟝然ずしお倱われ、管理者が状況を埩元するたで可甚性も倱われたす。

すべおのメッセヌゞが冗長であるこずを確認し、そうでない堎合は録音を砎棄するこずをお勧めしたす。 したがっお、少なくずもブロヌカヌの芳点からは、デヌタ損倱が発生する可胜性があるのは、XNUMX ぀以䞊の障害が同時に発生した堎合のみです。

Acks=all、min.insync.replicas、ISR

トピック構成あり min.insync.レプリカ デヌタセキュリティのレベルを向䞊させおいたす。 前のシナリオの最埌の郚分をもう䞀床芋おみたしょう。ただし、今回は次のようになりたす。 min.insync.replicas=2.

したがっお、ブロヌカヌ 2 にはレプリカ リヌダヌがあり、ブロヌカヌ 3 のフォロワヌは ISR から削陀されたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 19. XNUMX ぀のレプリカからの ISR

ブロヌカヌ 2 がダりンし、メッセヌゞを倱うこずなくリヌダヌシップがブロヌカヌ 1 に移りたす。 ただし、珟圚、ISR は XNUMX ぀のレプリカのみで構成されおいたす。 これはレコヌドを受信するための最小数を満たしおいないため、ブロヌカヌは曞き蟌み詊行に察しお゚ラヌで応答したす。 レプリカが足りない.

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 20. ISR の数が min.insync.replicas で指定された数より XNUMX ぀少ない

この構成では、䞀貫性のために可甚性が犠牲になりたす。 メッセヌゞを確認する前に、メッセヌゞが少なくずも 5 ぀のレプリカに曞き蟌たれるこずを確認したす。 これにより、メヌカヌはさらに倧きな自信を埗るこずができたす。 ここで、メッセヌゞ損倱が発生する可胜性があるのは、メッセヌゞが远加のフォロワヌにレプリケヌトされるたでの短い間隔で XNUMX ぀のレプリカが同時に倱敗した堎合のみですが、その可胜性は䜎いです。 ただし、非垞に偏執的な堎合は、レプリケヌション係数を XNUMX に蚭定するこずもできたす。 min.insync.レプリカ by 3. ここで蚘録を倱うには、XNUMX 人のブロヌカヌが同時に倒れる必芁がありたす。 もちろん、この信頌性の代償ずしお远加の遅延が発生したす。

デヌタセキュリティのためにアクセシビリティが必芁な堎合

同様に RabbitMQ を䜿甚した堎合、デヌタセキュリティのためにアクセシビリティが必芁な堎合がありたす。 考慮する必芁があるのは次のずおりです。

  • 発行者は単玔に゚ラヌを返し、䞊流のサヌビスたたはナヌザヌに埌で再詊行させるこずはできたすか?
  • 発行者はメッセヌゞをロヌカルたたはデヌタベヌスに保存しお、埌で再詊行できたすか?

答えが「いいえ」の堎合、可甚性を最適化するこずでデヌタのセキュリティが向䞊したす。 蚘録しない代わりに可甚性を遞択するず、倱われるデヌタが少なくなりたす。 したがっお、すべおはバランスを芋぀けるこずになり、決定は特定の状況に䟝存したす。

ISRの意味

ISR スむヌトを䜿甚するず、デヌタ セキュリティず遅延の間の最適なバランスを遞択できたす。 たずえば、倧郚分のレプリカで障害が発生した堎合の可甚性を確保し、埅機時間の芳点から、停止したレプリカや遅いレプリカの圱響を最小限に抑えたす。

私たちは自分たちで意味を遞びたす レプリカ.ラグ時間.最倧ミリ秒 あなたのニヌズに応じお。 本質的に、このパラメヌタは、どのくらいの遅延を蚱容できるかを意味したす。 acks=すべお。 デフォルト倀は XNUMX 秒です。 これが長すぎる堎合は、短瞮できたす。 その埌、フォロワヌの削陀ず远加がより頻繁に行われるため、ISR の倉曎の頻床が増加したす。

RabbitMQ は、単に耇補する必芁があるミラヌのセットです。 ミラヌが遅いず远加の遅延が発生し、デッドミラヌは各ノヌドの可甚性 (ネットティック) をチェックするパケットが応答するたで埅機する可胜性がありたす。 ISR は、これらの遅延の問題を回避する興味深い方法です。 ただし、ISR はリヌダヌたでしか瞮小できないため、冗長性が倱われるリスクがありたす。 このリスクを回避するには、次の蚭定を䜿甚したす。 min.insync.レプリカ.

クラむアント接続保蚌

蚭定で ブヌトストラップ.サヌバヌ プロデュヌサヌずコンシュヌマヌは、クラむアントを接続するために耇数のブロヌカヌを指定できたす。 これは、XNUMX ぀のノヌドがダりンしおも、クラむアントが接続を開くこずができる予備のノヌドがいく぀か残るずいう考えです。 これらは必ずしもセクション リヌダヌである必芁はなく、単に初期負荷の出発点にすぎたせん。 クラむアントは、どのノヌドが読み取り/曞き蟌みパヌティション リヌダヌをホストしおいるかを尋ねるこずができたす。

RabbitMQ では、クラむアントは任意のノヌドに接続でき、内郚ルヌティングによっお芁求が必芁な堎所に送信されたす。 これは、RabbitMQ の前にロヌド バランサヌをむンストヌルできるこずを意味したす。 Kafka では、クラむアントが察応するパヌティション リヌダヌをホストするノヌドに接続する必芁がありたす。 このような状況では、ロヌドバランサヌをむンストヌルするこずはできたせん。 リスト ブヌトストラップ.サヌバヌ 障害埌にクラむアントが正しいノヌドにアクセスしお芋぀けるこずができるこずが重芁です。

Kafka コンセンサス アヌキテクチャ

これたで、クラスタヌがブロヌカヌの厩壊をどのように孊習するのか、たた新しいリヌダヌがどのように遞出されるのかに぀いおは考慮しおいたせんでした。 Kafka がネットワヌク パヌティションでどのように動䜜するかを理解するには、たずコンセンサス アヌキテクチャを理解する必芁がありたす。

各 Kafka クラスタヌは、可甚性よりも䞀貫性を優先しお、システムが特定の状態に぀いお合意に達するこずを可胜にする分散型コンセンサス サヌビスである Zookeeper クラスタヌずずもにデプロむされたす。 読み取りおよび曞き蟌み操䜜を承認するには、Zookeeper ノヌドの倧倚数の同意が必芁です。

Zookeeper はクラスタヌの状態を保存したす。

  • トピック、セクション、構成、珟圚のリヌダヌ レプリカ、優先レプリカのリスト。
  • クラスタヌのメンバヌ。 各ブロヌカヌは Zookeeper クラスタヌに ping を送信したす。 指定された期間内に ping を受信しない堎合、Zookeeper はブロヌカヌを䜿甚䞍可ずしお蚘録したす。
  • コントロヌラヌのメむン ノヌドずスペア ノヌドを遞択したす。

コントロヌラヌ ノヌドは、レプリカ リヌダヌの遞出を担圓する Kafka ブロヌカヌの XNUMX ぀です。 Zookeeper は、クラスタヌのメンバヌシップずトピックの倉曎に関する通知をコントロヌラヌに送信し、コントロヌラヌはこれらの倉曎に応じお動䜜する必芁がありたす。

たずえば、3 個のパヌティションず XNUMX のレプリケヌション係数を持぀新しいトピックを考えおみたしょう。コントロヌラヌは、ブロヌカヌ間でリヌダヌを最適に分散しようずしお、パヌティションごずにリヌダヌを遞択する必芁がありたす。

各セクションコントロヌラヌに぀いお:

  • ISR ずリヌダヌに関する Zookeeper の情報を曎新したす。
  • このパヌティションのレプリカをホストする各ブロヌカヌに LeaderAndISRCommand を送信し、ISR ずリヌダヌに぀いおブロヌカヌに通知したす。

リヌダヌを持぀ブロヌカヌが倒れるず、Zookeeper はコントロヌラヌに通知を送信し、新しいリヌダヌを遞出したす。 ここでも、コントロヌラヌは最初に Zookeeper を曎新し、次に各ブロヌカヌにリヌダヌの倉曎を通知するコマンドを送信したす。

各リヌダヌは ISR を採甚する責任がありたす。 蚭定 レプリカ.ラグ時間.最倧ミリ秒 そこに誰が入るかを決定したす。 ISR が倉曎されるず、リヌダヌは新しい情報を Zookeeper に送信したす。

Zookeeper には倉曎が垞に通知されるため、障害が発生した堎合でも管理は新しいリヌダヌにスムヌズに移行したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 21. カフカのコンセンサス

レプリケヌションプロトコル

レプリケヌションの詳现を理解するこずは、朜圚的なデヌタ損倱シナリオをより深く理解するのに圹立ちたす。

サンプリング ク゚リ、ログ ゚ンド オフセット (LEO) およびハむりォヌタヌ マヌク (HW)

フォロワヌが定期的にリヌダヌにフェッチリク゚ストを送信するず考えたした。 デフォルトの間隔は 500 ミリ秒です。 これは、RabbitMQ ではレプリケヌションがキュヌ ミラヌではなくマスタヌによっお開始されるずいう点で RabbitMQ ずは異なりたす。 マスタヌは倉曎をミラヌにプッシュしたす。

リヌダヌずすべおのフォロワヌは、Log End Offset (LEO) ず Highwater (HW) ラベルを保存したす。 LEO マヌクはロヌカル レプリカ内の最埌のメッセヌゞのオフセットを保存し、HW は最埌のコミットのオフセットを保持したす。 コミット ステヌタスの堎合、メッセヌゞはすべおの ISR レプリカにわたっお保持される必芁があるこずに泚意しおください。 これは、通垞、LEO が HW よりわずかに進んでいるこずを意味したす。

リヌダヌはメッセヌゞを受信するず、それをロヌカルに保存したす。 フォロワヌは自分の LEO を送信するこずでフェッチ芁求を行いたす。 次に、リヌダヌはこの LEO から始たるメッセヌゞのバッチを送信し、珟圚の HW も送信したす。 リヌダヌは、すべおのレプリカが指定されたオフセットにメッセヌゞを栌玍したずいう情報を受け取るず、HW マヌクを移動したす。 リヌダヌのみが HW を移動できるため、すべおのフォロワヌはリク゚ストに察する応答の珟圚の倀を知るこずになりたす。 これは、フォロワヌがメッセヌゞずハヌドりェア知識の䞡方においおリヌダヌに遅れる可胜性があるこずを意味したす。 コンシュヌマは珟圚の HW たでのメッセヌゞのみを受信したす。

「氞続化」ずは、ディスクではなくメモリに曞き蟌たれるこずを意味するこずに泚意しおください。 パフォヌマンスを向䞊させるために、Kafka は特定の間隔でディスクず同期したす。 RabbitMQ にもそのような間隔がありたすが、マスタヌずすべおのミラヌがメッセヌゞをディスクに曞き蟌んだ埌でのみ、パブリッシャヌに確認応答が送信されたす。 Kafka 開発者は、パフォヌマンス䞊の理由から、メッセヌゞがメモリに曞き蟌たれたらすぐに ack を送信するこずにしたした。 Kafka は、冗長性によっお、確認応答されたメッセヌゞがメモリのみに䞀時的に保存されるリスクが盞殺されるず考えおいたす。

リヌダヌの倱敗

リヌダヌが倱われるず、Zookeeper はコントロヌラヌに通知し、コントロヌラヌは新しいリヌダヌ レプリカを遞択したす。 新しいリヌダヌは、LEO に埓っお新しい HW マヌクを蚭定したす。 その埌、フォロワヌは新しいリヌダヌに関する情報を受け取りたす。 Kafka のバヌゞョンに応じお、フォロワヌは XNUMX ぀のシナリオのいずれかを遞択したす。

  1. ロヌカル ログが既知の HW に切り詰められ、このマヌクの埌のメッセヌゞの芁求が新しいリヌダヌに送信されたす。
  2. リヌダヌに、リヌダヌに遞出された時点の HW を怜玢するリク゚ストを送信し、ログをこのオフセットたで切り詰めたす。 その埌、このオフセットから定期的なフェッチ芁求を開始したす。

フォロワヌは、次の理由によりログを切り詰める必芁がある堎合がありたす。

  • リヌダヌが倱敗するず、Zookeeper に登録された ISR セット内の最初のフォロワヌが遞挙に勝ち、リヌダヌになりたす。 ISR のすべおのフォロワヌは、「同期しおいる」ずみなされたすが、元リヌダヌからすべおのメッセヌゞのコピヌを受信しお​​いない可胜性がありたす。 泚目のフォロワヌが最新のコピヌを持っおいない可胜性は十分にありたす。 Kafka は、レプリカ間に盞違がないこずを保蚌したす。 したがっお、䞍䞀臎を避けるために、各フォロワヌはログを、遞挙時の新しいリヌダヌの HW 倀に切り詰める必芁がありたす。 これが蚭定するもう XNUMX ぀の理由です acks=すべお 䞀貫性にずっお非垞に重芁です。
  • メッセヌゞは定期的にディスクに曞き蟌たれたす。 すべおのクラスタヌ ノヌドに同時に障害が発生した堎合、異なるオフセットを持぀レプリカがディスクに保存されたす。 ブロヌカヌがオンラむンに戻ったずき、遞出された新しいリヌダヌは他のリヌダヌよりも先にディスクに保存されおいたため、支持者に埌れをずっおいる可胜性がありたす。

クラスタヌずの再䌚

クラスタヌに再参加するず、レプリカはリヌダヌに障害が発生したずきず同じこずを行いたす。぀たり、リヌダヌのレプリカをチェックし、その HW ぞのログを (遞択時に) 切り捚おたす。 比范するず、RabbitMQ は、再結合されたノヌドをたったく新しいものずしお同様に扱いたす。 どちらの堎合も、ブロヌカヌは既存の状態をすべお砎棄したす。 自動同期を䜿甚する堎合、マスタヌは「党䞖界を埅機させる」方法で、珟圚のすべおのコンテンツを新しいミラヌに耇補する必芁がありたす。 この操䜜䞭、マスタヌは読み取りたたは曞き蟌み操䜜を受け付けたせん。 このアプロヌチでは、倧芏暡なキュヌで問題が発生したす。

Kafka は分散ログであり、䞀般に、デヌタが読み取られた埌にキュヌから削陀される RabbitMQ キュヌよりも倚くのメッセヌゞを保存したす。 アクティブなキュヌは比范的小さいたたでなければなりたせん。 ただし、Kafka は独自の保持ポリシヌを持぀ログであり、数日たたは数週間の期間を蚭定できたす。 キュヌのブロックず完党同期のアプロヌチは、分散ログでは絶察に受け入れられたせん。 代わりに、Kafka フォロワヌは、自分たちのコピヌがリヌダヌよりも先にある堎合、リヌダヌの HW (遞挙時) ぞのログを単玔に切り詰めたす。 より可胜性の高いケヌスずしおは、フォロワヌが遅れおいる堎合、珟圚の LEO からフェッチ リク゚ストを開始するだけです。

新芏たたは再参加したフォロワヌは ISR の倖郚から開始され、コミットには参加したせん。 圌らは単にグルヌプず協力しお、リヌダヌに远い぀いお ISR に入るたでできるだけ早くメッセヌゞを受信したす。 ロックむンはなく、すべおのデヌタを砎棄する必芁もありたせん。

接続の喪倱

Kafka には RabbitMQ よりも倚くのコンポヌネントがあるため、クラスタヌが切断されたずきの動䜜セットがより耇雑になりたす。 ただし、Kafka はもずもずクラスタヌ甚に蚭蚈されおいるため、゜リュヌションは非垞によく考えられおいたす。

以䞋に、接続障害のシナリオをいく぀か瀺したす。

  • シナリオ 1: フォロワヌにはリヌダヌが芋えたせんが、動物園の飌育員は芋えたす。
  • シナリオ 2: リヌダヌにはフォロワヌが衚瀺されたせんが、Zookeeper は衚瀺されたす。
  • シナリオ 3: フォロワヌにはリヌダヌが芋えたすが、動物園の飌育員は芋えたせん。
  • シナリオ 4: リヌダヌにはフォロワヌが芋えたすが、動物園の飌育員は芋えたせん。
  • シナリオ 5: フォロワヌは、他の Kafka ノヌドおよび Zookeeper の䞡方から完党に分離されおいたす。
  • シナリオ 6: リヌダヌは、他の Kafka ノヌドおよび Zookeeper の䞡方から完党に分離されおいたす。
  • シナリオ 7: Kafka コントロヌラヌ ノヌドは別の Kafka ノヌドを認識できたせん。
  • シナリオ 8: Kafka コントロヌラヌは Zookeeper を認識したせん。

各シナリオには独自の動䜜がありたす。

シナリオ 1: フォロワヌにはリヌダヌは芋えたせんが、Zookeeper は芋えおいたす

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 22. シナリオ 1: XNUMX ぀のレプリカの ISR

接続障害により、ブロヌカヌ 3 はブロヌカヌ 1 および 2 から分離されたすが、Zookeeper からは分離されたせん。 ブロヌカヌ 3 はフェッチ リク゚ストを送信できなくなりたす。 時間が経っおから レプリカ.ラグ時間.最倧ミリ秒 これは ISR から削陀され、メッセヌゞのコミットには参加したせん。 接続が回埩するず、フェッチ芁求が再開され、リヌダヌに远い぀いたずきに ISR に参加したす。 Zookeeper は匕き続き ping を受信し、ブロヌカヌが正垞に動䜜しおいるず想定したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 23. シナリオ 1: ブロヌカヌは、replica.lag.time.max.ms 間隔内にフェッチ芁求を受信しなかった堎合、ISR から削陀されたす。

RabbitMQ のようなスプリット ブレむンやノヌドの䞀時停止はありたせん。 代わりに、冗長性が削枛されたす。

シナリオ 2: リヌダヌにはフォロワヌが衚瀺されたせんが、Zookeeper は衚瀺されたす

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 24. シナリオ 2. リヌダヌず XNUMX 人のフォロワヌ

ネットワヌク接続の障害によりリヌダヌずフォロワヌが分離されたすが、ブロヌカヌは匕き続き Zookeeper を認識できたす。 最初のシナリオず同様に、ISR は瞮小したすが、すべおのフォロワヌがフェッチ リク゚ストの送信を停止するため、今回はリヌダヌのみが瞮小したす。 繰り返したすが、論理的な分割はありたせん。 その代わり、接続が埩元されるたで新しいメッセヌゞの冗長性が倱われたす。 Zookeeper は匕き続き ping を受信しお​​おり、ブロヌカヌが生きおいるず信じおいたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 25. シナリオ 2. ISR はリヌダヌのみに瞮小したした

シナリオ 3. フォロワヌにはリヌダヌが芋えたすが、飌育員は芋えたせん

フォロワヌは Zookeeper からは分離されおいたすが、リヌダヌを持぀ブロヌカヌからは分離されおいたせん。 その結果、フォロワヌは匕き続きフェッチ芁求を行い、ISR のメンバヌになりたす。 Zookeeper は ping を受信しなくなり、ブロヌカヌのクラッシュを登録したすが、単なるフォロワヌであるため、回埩埌の圱響はありたせん。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 26. シナリオ 3: フォロワヌがリヌダヌにフェッチ リク゚ストを送信し続ける

シナリオ 4. リヌダヌにはフォロワヌが芋えたすが、Zookeeper は芋えたせん

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 27. シナリオ 4. リヌダヌず XNUMX 人のフォロワヌ

リヌダヌは動物園の飌育員からは離れおいたすが、信者を持぀ブロヌカヌからは離れおいたせん。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 28. シナリオ 4: 飌育員から孀立したリヌダヌ

しばらくするず、Zookeeper はブロヌカヌの障害を登録し、それに぀いおコントロヌラヌに通知したす。 圌は远随者の䞭から新しい指導者を遞ぶだろう。 ただし、元のリヌダヌは匕き続き自分がリヌダヌであるず考え、からの゚ントリヌを匕き続き受け入れたす。 ACK=1。 フォロワヌは圌にフェッチ リク゚ストを送信しなくなったため、圌はフォロワヌが死んだものずみなし、ISR をそれ自䜓に瞮小しようずしたす。 ただし、Zookeeper ずの接続がないため、これを実行するこずはできず、その時点でそれ以䞊の゚ントリの受け入れを拒吊したす。

СППбщеМОя acks=すべお ISR が最初にすべおのレプリカをオンにし、メッセヌゞがレプリカに到達しないため、確認応答は受信されたせん。 元のリヌダヌが ISR からメッセヌゞを削陀しようずしおも、削陀するこずはできず、メッセヌゞの受け入れをたったく停止したす。

クラむアントはすぐにリヌダヌの倉曎に気づき、新しいサヌバヌぞのレコヌドの送信を開始したす。 ネットワヌクが埩元されるず、元のリヌダヌは自分がリヌダヌではなくなったこずを認識し、ログの発散を避けるために新しいリヌダヌが障害時に持っおいた HW 倀にログを切り詰めたす。 その埌、新しいリヌダヌぞのフェッチ リク゚ストの送信が開始されたす。 新しいリヌダヌに耇補されなかった元のリヌダヌのレコヌドはすべお倱われたす。 ぀たり、XNUMX 人のリヌダヌが䜜業しおいた数秒間に元のリヌダヌによっお確認されなかったメッセヌゞは倱われたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 29. シナリオ 4. ネットワヌクが埩元された埌、ブロヌカヌ 1 のリヌダヌがフォロワヌになる

シナリオ 5: フォロワヌは他の Kafka ノヌドおよび Zookeeper の䞡方から完党に分離されおいたす

フォロワヌは、他の Kafka ノヌドず Zookeeper の䞡方から完党に分離されおいたす。 圌はネットワヌクが埩旧するたで ISR から倖し、その埌他の人たちに远い぀きたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 30. シナリオ 5: 孀立したフォロワヌが ISR から削陀される

シナリオ 6: リヌダヌは他の Kafka ノヌドおよび Zookeeper の䞡方から完党に分離されおいたす

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 31. シナリオ 6. リヌダヌず XNUMX 人のフォロワヌ

リヌダヌは、そのフォロワヌである管理者や動物園の飌育員から完党に隔離されおいたす。 短期間ですが、匕き続き゚ントリヌを受け付けたす。 ACK=1.

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 32. シナリオ 6: リヌダヌを他の Kafka および Zookeeper ノヌドから分離する

有効期限を過ぎおもリク゚ストを受信しお​​いない堎合 レプリカ.ラグ時間.最倧ミリ秒、ISR をそれ自䜓に瞮小しようずしたすが、Zookeeper ずの通信がないため瞮小できず、曞き蟌みの受け入れを停止したす。

䞀方、Zookeeper は孀立したブロヌカヌを死亡ずしおマヌクし、コントロヌラヌが新しいリヌダヌを遞出したす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 33. シナリオ 6. XNUMX 人のリヌダヌ

元のリヌダヌは数秒間゚ントリを受け入れるこずができたすが、その埌メッセヌゞの受け入れを停止したす。 クラむアントは 60 秒ごずに最新のメタデヌタで曎新されたす。 圌らはリヌダヌの倉曎を知らされ、新しいリヌダヌに゚ントリヌを送信し始めたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 34. シナリオ 6: メヌカヌが新しいリヌダヌに亀代

接続が倱われるず、元のリヌダヌによっお䜜成された確認枈みの゚ントリはすべお倱われたす。 ネットワヌクが埩元されるず、元のリヌダヌは Zookeeper を通じお、自分がリヌダヌではなくなったこずを発芋したす。 その埌、遞挙時に新しいリヌダヌの HW ぞのログが切り詰められ、フォロワヌずしおリク゚ストの送信が開始されたす。

RabbitMQ ず Kafka: フォヌルト トレランスず高可甚性
米。 35. シナリオ 6: ネットワヌク接続が回埩した埌、元のリヌダヌがフォロワヌになる

この状況では、論理的な分離が短期間発生する可胜性がありたすが、これは次の堎合に限られたす。 ACK=1 О min.insync.レプリカ たた、1. ネットワヌクが埩元された埌、元のリヌダヌが自分がリヌダヌではなくなったこずを認識したずき、たたはすべおのクラむアントがリヌダヌが倉曎されたこずを認識しお新しいリヌダヌぞの曞き蟌みを開始したずきのいずれか早い方で、論理的な分離は自動的に終了したす。 いずれの堎合でも、䞀郚のメッセヌゞは倱われたすが、それは次の堎合に限られたす。 ACK=1.

このシナリオには別の倉圢があり、ネットワヌクが分割される盎前に、フォロワヌが遅れをずり、リヌダヌが ISR を自分だけに圧瞮したした。 その埌、接続が倱われるこずで孀立したす。 新しいリヌダヌが遞出されたすが、元のリヌダヌは匕き続き゚ントリヌを受け入れたす。 acks=すべお、ISRには圌以倖に誰もいないからです。 ネットワヌクが埩旧するず、これらの蚘録は倱われたす。 このオプションを回避する唯䞀の方法は、 min.insync.replicas = 2.

シナリオ 7: Kafka コントロヌラヌ ノヌドが別の Kafka ノヌドを認識できない

䞀般に、Kafka ノヌドずの接続が倱われるず、コントロヌラヌはリヌダヌ倉曎情報をそれに送信できなくなりたす。 最悪の堎合、これはシナリオ 6 のように、短期的な論理的分離に぀ながりたす。倚くの堎合、ブロヌカヌが倱敗した堎合、そのブロヌカヌは単玔にリヌダヌ候補にはなりたせん。

シナリオ 8: Kafka コントロヌラヌが Zookeeper を認識しない

Zookeeper は、障害が発生したコントロヌラヌから ping を受信せず、新しい Kafka ノヌドをコントロヌラヌずしお遞択したす。 元のコントロヌラヌは匕き続きそのように衚瀺できたすが、Zookeeper からの通知を受信しないため、実行するタスクはありたせん。 ネットワヌクが埩元されるず、圌は自分がもはやコントロヌラヌではなく、通垞の Kafka ノヌドになったこずに気づきたす。

シナリオからの結論

フォロワヌの接続が倱われおもメッセヌゞが倱われるのではなく、ネットワヌクが埩旧するたで冗長性が䞀時的に䜎䞋するだけであるこずがわかりたす。 もちろん、XNUMX ぀以䞊のノヌドが倱われた堎合、デヌタ損倱が発生する可胜性がありたす。

接続が倱われたためにリヌダヌが Zookeeper から離れた堎合、Zookeeper からのメッセヌゞが倱われる可胜性がありたす。 ACK=1。 動物園飌育員ずのコミュニケヌション䞍足により、XNUMX 人の指導者の間に䞀時的な論理的亀裂が生じたす。 この問題はパラメヌタによっお解決されたす acks=すべお.

パラメヌタヌ min.insync.レプリカ 6 ぀以䞊のレプリカに分割するこずで、このような短期間のシナリオでは、シナリオ XNUMX のようにメッセヌゞが倱われるこずがないずいう远加の保蚌が提䟛されたす。

倱われたメッセヌゞの抂芁

Kafka でデヌタが倱われる可胜性があるすべおの方法をリストしおみたしょう。

  • メッセヌゞが次を䜿甚しお確認された堎合のリヌダヌの倱敗 ACK=1
  • たずえ acks=すべお
  • を䜿甚しおメッセヌゞが確認された堎合、リヌダヌを Zookeeper から隔離する ACK=1
  • すでにISRグルヌプを自分䞀人にたで瞮小させたリヌダヌを完党に孀立させる。 すべおのメッセヌゞは倱われたす。 acks=すべお。 これは次の堎合にのみ圓おはたりたす min.insync.replicas=1.
  • すべおのパヌティション ノヌドの同時障害。 メッセヌゞはメモリから確認されるため、䞀郚のメッセヌゞはただディスクに曞き蟌たれおいない可胜性がありたす。 サヌバヌを再起動するず、䞀郚のメッセヌゞが倱われる堎合がありたす。

䞍玔なリヌダヌシップの亀代は、それを犁止するか、少なくずも XNUMX 名の冗長性を確保するこずで回避できたす。 最も耐久性のある構成は次の組み合わせです。 acks=すべお О min.insync.レプリカ もっず1。

RabbitMQ ず Kafka の信頌性の盎接比范

信頌性ず高可甚性を確保するために、䞡方のプラットフォヌムにプラむマリおよびセカンダリのレプリケヌション システムが実装されおいたす。 ただし、RabbitMQ にはアキレス腱がありたす。 障害埌に再接続するず、ノヌドはデヌタを砎棄し、同期がブロックされたす。 この二重の打撃により、RabbitMQ における倧芏暡なキュヌの寿呜に疑問が生じたす。 冗長性の䜎䞋たたは長いブロッキング時間のいずれかを受け入れる必芁がありたす。 冗長性を枛らすず、倧量のデヌタ損倱のリスクが高たりたす。 ただし、キュヌが小さい堎合は、冗長性を確保するために、接続詊行を繰り返すこずで短期間 (数秒) の利甚䞍胜に察凊できたす。

カフカにはこの問題はありたせん。 リヌダヌずフォロワヌの間の分岐点からのみデヌタを砎棄したす。 すべおの共有デヌタが保存されたす。 さらに、レプリケヌションによっおシステムがブロックされるこずはありたせん。 新しいフォロワヌが远い぀いおくる間、リヌダヌは投皿を受け入れ続けるため、DevOps の堎合、クラスタヌぞの参加たたは再参加は簡単な䜜業になりたす。 もちろん、レプリケヌション時のネットワヌク垯域幅などの問題はただありたす。 耇数のフォロワヌを同時に远加するず、垯域幅制限が発生する可胜性がありたす。

RabbitMQ は、クラスタヌ内の耇数のサヌバヌに同時に障害が発生した堎合の信頌性の点で Kafka よりも優れおいたす。 すでに述べたように、RabbitMQ は、マスタヌずすべおのミラヌによっおメッセヌゞがディスクに曞き蟌たれた埌でのみ、パブリッシャヌに確認を送信したす。 ただし、これにより次の XNUMX ぀の理由によりレむテンシがさらに増加し​​たす。

  • 数癟ミリ秒ごずに fsync
  • ミラヌの障害は、各ノヌドの可甚性をチェックするパケットの有効期間 (ネット ティック) が経過した埌にのみ気づくこずができたす。 ミラヌが遅くなったり萜ちたりするず、遅延が远加されたす。

Kafka の賭けは、メッセヌゞが耇数のノヌドにたたがっお保存されおいる堎合、メモリに到達するずすぐにメッセヌゞを確認できるずいうこずです。 このため、あらゆる皮類のメッセヌゞ (たずえ acks=すべお, min.insync.replicas=2) 同時故障の堎合。

党䜓的に、Kafka はより優れた゜フトりェア パフォヌマンスを瀺し、クラスタヌ向けにれロから蚭蚈されおいたす。 信頌性を確保するために必芁に応じお、フォロワヌの数を 11 たで増やすこずができたす。 レプリケヌション係数 5 ず同期するレプリカの最小数 min.insync.replicas=3 メッセヌゞの損倱が非垞にたれなむベントになりたす。 むンフラストラクチャがこのレプリケヌション率ず冗長性レベルをサポヌトできる堎合は、このオプションを遞択できたす。

RabbitMQ クラスタリングは、小芏暡なキュヌに適しおいたす。 ただし、トラフィックが倚い堎合は、たずえ小さなキュヌでも急速に増倧する可胜性がありたす。 キュヌが倧きくなるず、可甚性ず信頌性の間で難しい遞択をする必芁がありたす。 RabbitMQ クラスタリングは、RabbitMQ の柔軟性の利点がクラスタリングの欠点を䞊回る、非兞型的な状況に最適です。

倧芏暡なキュヌに察する RabbitMQ の脆匱性に察する XNUMX ぀の解毒策は、キュヌを倚数の小さなキュヌに分割するこずです。 キュヌ党䜓の完党な順序付けを必芁ずせず、関連するメッセヌゞ (特定のクラむアントからのメッセヌゞなど) のみを必芁ずする堎合、たたはたったく順序付けを行わない堎合は、このオプションを䜿甚できたす。私のプロゞェクトを芋おください。 リバランサヌ キュヌを分割したす (プロゞェクトはただ初期段階にありたす)。

最埌に、RabbitMQ ず Kafka の䞡方のクラスタリングずレプリケヌションのメカニズムに倚数のバグがあるこずを忘れないでください。 時間が経぀に぀れお、システムはより成熟し、安定しおきたしたが、メッセヌゞの損倱を 100% 防ぐこずはできたせん。 さらにデヌタセンタヌでは倧芏暡事故が発生

䜕かを芋逃したり、間違いを犯した堎合、たたは点のいずれかに同意できない堎合は、お気軜にコメントを曞くか、私に連絡しおください。

「Kafka ず RabbitMQ のどちらを遞ぶべきですか?」、「どちらのプラットフォヌムが優れおいたすか?」ずよく質問されたす。 実のずころ、それはあなたの状況や珟圚の経隓などによっお倧きく巊右されたす。すべおのナヌスケヌスず考えられる制限に察しお XNUMX ぀のプラットフォヌムを掚奚するのは過床に単玔化しすぎるため、私は意芋を蚀うのを躊躇しおいたす。 このシリヌズの蚘事は、皆さんが自分の意芋を圢成できるように曞きたした。

どちらのシステムもこの分野ではリヌダヌであるず蚀いたいのです。 私はプロゞェクトの経隓から、メッセヌゞの順序の保蚌や信頌性などを重芖する傟向があるため、少し偏芋があるかもしれたせん。

この信頌性ず順序の保蚌が欠けおいる他のテクノロゞヌを芋おから、RabbitMQ ず Kafka を芋お、これら䞡方のシステムの信じられないほどの䟡倀に気づきたした。

出所 habr.com

コメントを远加したす