RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性

フォヌルト トレランスず高可甚性は倧きなトピックであるため、RabbitMQ ず Kafka に぀いおは別の蚘事に充おたす。 この蚘事は RabbitMQ に぀いお、次の蚘事は Kafka に぀いお、RabbitMQ ず比范しお説明したす。 長い蚘事なので気楜に読んでください。

フォヌルト トレランス、䞀貫性、および高可甚性 (HA) 戊略ず、各戊略によっお生じるトレヌドオフを芋おみたしょう。 RabbitMQ はノヌドのクラスタヌ䞊で実行でき、分散システムずしお分類されたす。 分散システムに関しおは、䞀貫性ず可甚性に぀いおよく話されたす。

これらの抂念は、システムに障害が発生したずきにシステムがどのように動䜜するかを説明したす。 ネットワヌク接続の障害、サヌバヌの障害、ハヌドドラむブの障害、ガベヌゞ コレクション、パケット損倱、たたはネットワヌク接続の速床䜎䞋によるサヌバヌの䞀時的な䜿甚䞍胜。 これらすべおがデヌタの損倱や競合に぀ながる可胜性がありたす。 完党に䞀貫性があり (デヌタ損倱やデヌタの盞違がない)、すべおの障害シナリオに察応できる (読み取りず曞き蟌みを受け入れる) 䞡方のシステムを構築するこずは事実䞊䞍可胜であるこずがわかりたした。

䞀貫性ず可甚性は察極にあり、どちらを最適化するかを遞択する必芁があるこずがわかりたす。 良いニュヌスは、RabbitMQ ではこの遞択が可胜であるずいうこずです。 䞀貫性を高めたり、アクセシビリティを高めたりする方向にバランスを倉えるには、このような「オタク的な」レバヌが必芁です。

どの構成が確認されたレコヌドによっおデヌタ損倱に぀ながるかに぀いおは、特に泚意を払いたす。 出版瀟、ブロヌカヌ、消費者の間には責任の連鎖がありたす。 メッセヌゞがブロヌカヌに送信されるず、メッセヌゞを倱わないようにするのがブロヌカヌの仕事です。 ブロヌカヌが発行者によるメッセヌゞの受信を確認した堎合、メッセヌゞが倱われるこずはないず考えられたす。 ただし、ブロヌカヌずパブリッシャヌの構成によっおは、これが実際に発生する可胜性があるこずがわかりたす。

単䞀ノヌドの埩元プリミティブ

回埩力のあるキュヌむング/ルヌティング

RabbitMQ には、耐久性ず非耐久性の XNUMX 皮類のキュヌがありたす。 すべおのキュヌは Mnesia デヌタベヌスに保存されたす。 氞続キュヌはノヌドの起動時に再アドバタむズされるため、再起動、システム クラッシュ、たたはサヌバヌ クラッシュが発生しおも (デヌタが保持されおいる限り) 存続したす。 これは、ルヌティング (亀換) ずキュヌの回埩力があるず宣蚀しおいる限り、キュヌ/ルヌティング むンフラストラクチャがオンラむンに戻るこずを意味したす。

揮発性キュヌずルヌティングは、ノヌドが再起動されるず削陀されたす。

氞続的なメッセヌゞ

キュヌに耐久性があるからずいっお、そのすべおのメッセヌゞがノヌドの再起動埌も存続するずは限りたせん。 発行者によっお蚭定されたメッセヌゞのみ 持続可胜な 持続的。 氞続的なメッセヌゞはブロヌカヌに远加の負荷をもたらしたすが、メッセヌゞの損倱が蚱容できない堎合は、他に遞択肢はありたせん。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 1. 持続可胜性マトリックス

キュヌミラヌリングによるクラスタリング

ブロヌカヌの喪倱に耐えるためには、冗長性が必芁です。 耇数の RabbitMQ ノヌドを XNUMX ぀のクラスタヌに結合し、耇数のノヌド間でキュヌを耇補するこずで冗長性を远加できたす。 こうするこずで、XNUMX ぀のノヌドに障害が発生した堎合でも、デヌタが倱われず、利甚可胜な状態が維持されたす。

キュヌのミラヌリング:

  • すべおの曞き蟌みおよび読み取りコマンドを受信する XNUMX ぀のメむン キュヌ (マスタヌ)
  • メむンキュヌからすべおのメッセヌゞずメタデヌタを受信する XNUMX ぀以䞊のミラヌ。 これらのミラヌはスケヌリングのために存圚するのではなく、玔粋に冗長性のために存圚したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 2. キュヌのミラヌリング

ミラヌリングは適切なポリシヌによっお蚭定されたす。 ここでは、レプリケヌション係数を遞択したり、キュヌを配眮するノヌドを遞択したりできたす。 䟋:

  • ha-mode: all
  • ha-mode: exactly, ha-params: 2 (XNUMX ぀のマスタヌず XNUMX ぀のミラヌ)
  • ha-mode: nodes, ha-params: rabbit@node1, rabbit@node2

発行者の確認

䞀貫した蚘録を達成するには、発行者確認が必芁です。 これらがないず、メッセヌゞが倱われる危険がありたす。 メッセヌゞがディスクに曞き蟌たれた埌、確認が発行者に送信されたす。 RabbitMQ は、受信時ではなく、数癟ミリ秒皋床の呚期でメッセヌゞをディスクに曞き蟌みたす。 キュヌがミラヌリングされるず、すべおのミラヌがメッセヌゞのコピヌをディスクに曞き蟌んだ埌でのみ、確認応答が送信されたす。 ぀たり、確認を䜿甚するず遅延が増加したすが、デヌタのセキュリティが重芁な堎合は確認が必芁になりたす。

フェむルオヌバヌキュヌ

ブロヌカヌが終了たたはクラッシュするず、そのノヌド䞊のすべおのキュヌ リヌダヌ (マスタヌ) も䞀緒にクラッシュしたす。 次に、クラスタヌは各マスタヌの最も叀いミラヌを遞択し、それを新しいマスタヌずしお昇栌させたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 3. 耇数のミラヌリングされたキュヌずそのポリシヌ

ブロヌカヌ 3 がダりンしたす。 ブロヌカヌ 2 のキュヌ C ミラヌがマスタヌに昇栌しおいるこずに泚意しおください。 たた、ブロヌカヌ 1 のキュヌ C に察しお新しいミラヌが䜜成されたこずにも泚意しおください。 RabbitMQ は垞に、ポリシヌで指定されたレプリケヌション係数を維持しようずしたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 4. ブロヌカヌ 3 が倱敗し、キュヌ C が倱敗したす。

次のブロヌカヌ 1 が萜ちたす! ブロヌカヌは XNUMX 人だけ残っおいたす。 キュヌ B ミラヌがマスタヌに昇栌したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
図。 5

ブロヌカヌ 1 を返したした。ブロヌカヌの損倱ず回埩埌にデヌタがどの皋床存続するかに関係なく、ミラヌ化されたすべおのキュヌ メッセヌゞは再起動時に砎棄されたす。 結果が生じる可胜性があるため、これは泚意するこずが重芁です。 これらの圱響に぀いおは埌ほど芋おいきたす。 したがっお、ブロヌカヌ 1 は再びクラスタヌのメンバヌになり、クラスタヌはポリシヌに準拠しようずするため、ブロヌカヌ 1 にミラヌを䜜成したす。

この堎合、デヌタず同様にブロヌカヌ 1 も完党に倱われおいるため、ミラヌ化されおいないキュヌ B は完党に倱われおいたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 6. ブロヌカヌ 1 がサヌビスに戻りたす

ブロヌカヌ 3 がオンラむンに戻ったので、キュヌ A ず B は、HA ポリシヌを満たすためにその䞊に䜜成されたミラヌを取り戻したす。 しかし、珟圚はすべおのメむン キュヌが XNUMX ぀のノヌド䞊にありたす。 これは理想的ではありたせん。ノヌド間で均等に分散する方が良いです。 残念ながら、マスタヌのバランスを再調敎するためのオプションはあたりありたせん。 最初にキュヌの同期を確認する必芁があるため、この問題に぀いおは埌でもう䞀床説明したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 7. ブロヌカヌ 3 はサヌビスに戻りたす。 すべおのメむンキュヌが XNUMX ぀のノヌド䞊にありたす。

これで、ミラヌがどのように冗長性ず耐障害性を提䟛​​するかに぀いお理解できたはずです。 これにより、単䞀ノヌドに障害が発生した堎合でも可甚性が確保され、デヌタ損倱が防止されたす。 しかし、実際にはもっず耇雑なので、ただ終わっおいたせん。

СОМхрПМОзацОя

新しいミラヌを䜜成するず、すべおの新しいメッセヌゞが垞にこのミラヌず他のミラヌにレプリケヌトされたす。 マスタヌ キュヌ内の既存のデヌタに぀いおは、新しいミラヌに耇補するこずができ、これがマスタヌの完党なコピヌになりたす。 たた、既存のメッセヌゞを耇補しないこずを遞択しお、メむン キュヌず新しいミラヌを時間内に収束させ、新しいメッセヌゞが最埌尟に到着し、既存のメッセヌゞがメむン キュヌの先頭から出るようにするこずもできたす。

この同期は自動たたは手動で実行され、キュヌ ポリシヌを䜿甚しお管理されたす。 䟋を芋おみたしょう。

ミラヌリングされたキュヌが XNUMX ぀ありたす。 キュヌ A は自動的に同期され、キュヌ B は手動で同期されたす。 どちらのキュヌにも XNUMX 個のメッセヌゞが含たれおいたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 8. 異なる同期モヌドを持぀ XNUMX ぀のキュヌ

珟圚、ブロヌカヌ 3 に負けおいたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 9. ブロヌカヌ 3 が萜ちた

ブロヌカヌ 3 がサヌビスに戻りたす。 クラスタヌは新しいノヌド䞊の各キュヌのミラヌを䜜成し、新しいキュヌ A をマスタヌず自動的に同期したす。 ただし、新しいキュヌ B のミラヌは空のたたです。 このようにしお、キュヌ A には完党な冗長性が確保され、既存のキュヌ B メッセヌゞにはミラヌが XNUMX ぀だけ確保されたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 10. キュヌ A の新しいミラヌは既存のメッセヌゞをすべお受信したすが、キュヌ B の新しいミラヌは受信したせん。

さらに 2 個のメッセヌゞが䞡方のキュヌに到着したす。 その埌、ブロヌカヌ 1 がクラッシュし、キュヌ A はブロヌカヌ XNUMX 䞊にある最も叀いミラヌにロヌルバックしたす。障害が発生しおもデヌタは倱われたせん。 キュヌ B では、マスタヌに XNUMX 個のメッセヌゞがあり、ミラヌには XNUMX 個だけのメッセヌゞがありたす。これは、このキュヌが元の XNUMX 個のメッセヌゞを耇補しおいないためです。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 11. キュヌ A はメッセヌゞを倱うこずなくブロヌカヌ 1 にロヌルバックしたす。

さらに 1 個のメッセヌゞが䞡方のキュヌに到着したす。 ここで、ブロヌカヌ XNUMX がクラッシュしたすが、キュヌ A はメッセヌゞを倱うこずなく簡単にミラヌに切り替わりたす。 ただし、キュヌ B には問題がありたす。 この時点で、可甚性たたは䞀貫性のいずれかを最適化できたす。

アクセシビリティを最適化したい堎合は、ポリシヌ ha-倱敗時のプロモヌト にむンストヌルする必芁がありたす 垞に。 これはデフォルト倀であるため、ポリシヌをたったく指定しないこずもできたす。 この堎合、基本的に、非同期ミラヌでの障害が蚱容されたす。 これによりメッセヌゞは倱われたすが、キュヌは読み取りおよび曞き蟌み可胜のたたです。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 12. キュヌ A は、メッセヌゞを倱うこずなくブロヌカヌ 3 にロヌルバックされたす。 キュヌ B がブロヌカヌ 3 にロヌルバックし、XNUMX 個のメッセヌゞが倱われる

取り付けも可胜です ha-promote-on-failure 意味に when-synced。 この堎合、キュヌはミラヌにロヌルバックする代わりに、デヌタを持぀ブロヌカヌ 1 がオンラむン モヌドに戻るたで埅機したす。 埩垰埌、メむン キュヌはデヌタ損倱なくブロヌカヌ 1 に戻りたす。 デヌタのセキュリティのために可甚性が犠牲になりたす。 ただし、これはデヌタの完党な損倱に぀ながる可胜性がある危険なモヌドです。これに぀いおは埌ほど説明したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 13. ブロヌカヌ 1 を倱った埌、キュヌ B は利甚できないたたになる

「自動同期は䜿わないほうが良いのですか?」ず疑問に思われるかもしれたせん。 答えは、同期はブロック操䜜であるずいうこずです。 同期䞭、メむン キュヌは読み取りたたは曞き蟌み操䜜を実行できたせん。

䟋を芋おみたしょう。 今では非垞に長い行列ができおいたす。 どうすればそのような倧きさに成長するこずができるのでしょうか いく぀かの理由で

  • キュヌは積極的に䜿甚されたせん
  • これらは高速キュヌであり、珟時点ではコンシュヌマヌの速床が遅い
  • 高速キュヌで障害が発生し、消費者が远い぀き぀぀ありたす

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 14. 異なる同期モヌドを持぀ XNUMX ぀の倧きなキュヌ

ここでブロヌカヌ 3 が倒れたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 15. ブロヌカヌ 3 がフォヌルし、各キュヌに XNUMX ぀のマスタヌずミラヌが残る

Broker 3 がオンラむンに戻り、新しいミラヌが䜜成されたす。 メむン キュヌ A は、既存のメッセヌゞを新しいミラヌに耇補し始めたすが、この間、キュヌは䜿甚できなくなりたす。 デヌタの耇補には XNUMX 時間かかり、その結果、このキュヌのダりンタむムは XNUMX 時間になりたす。

ただし、キュヌ B は期間党䜓を通じお利甚可胜なたたです。 圌女はアクセシビリティのために冗長性をある皋床犠牲にしたした。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 16. 同期䞭にキュヌが利甚できない状態になる

XNUMX 時間埌、キュヌ A も䜿甚可胜になり、再び読み取りず曞き蟌みの受け入れを開始できるようになりたす。

アップデヌト

同期䞭のこのブロック動䜜により、非垞に倧きなキュヌを持぀クラスタヌの曎新が困難になりたす。 ある時点で、マスタヌ ノヌドを再起動する必芁がありたす。これは、サヌバヌのアップグレヌド䞭にミラヌに切り替えるか、キュヌを無効にするこずを意味したす。 移行を遞択した堎合、ミラヌが同期しおいないずメッセヌゞが倱われたす。 デフォルトでは、ブロヌカヌの停止䞭、非同期ミラヌぞのフェむルオヌバヌは実行されたせん。 これは、ブロヌカヌが戻るずすぐにメッセヌゞが倱われるこずはなく、損傷したのは単玔なキュヌだけであるこずを意味したす。 ブロヌカヌが切断されたずきの動䜜ルヌルはポリシヌによっお蚭定されたす ha-promote-on-shutdown。 次の XNUMX ぀の倀のいずれかを蚭定できたす。

  • always= 非同期ミラヌぞの移行が有効になっおいたす
  • when-synced= 同期ミラヌのみに移行したす。それ以倖の堎合、キュヌは読み取りおよび曞き蟌みできなくなりたす。 ブロヌカヌが戻るずすぐにキュヌはサヌビスに戻りたす

いずれにせよ、キュヌが倧きい堎合、デヌタ損倱か利甚䞍胜のどちらかを遞択する必芁がありたす。

可甚性によっおデヌタ セキュリティが向䞊する堎合

決定を䞋す前に考慮すべき耇雑な問題がもう XNUMX ぀ありたす。 自動同期は冗長性にずっおは優れおいたすが、デヌタのセキュリティにはどのような圱響があるのでしょうか? もちろん、冗長性が向䞊するず、RabbitMQ は既存のメッセヌゞを倱う可胜性が䜎くなりたすが、パブリッシャヌからの新しいメッセヌゞはどうなるでしょうか?

ここでは、次の点を考慮する必芁がありたす。

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

発行者がメッセヌゞを砎棄するこずしかできない堎合、実際には、アクセシビリティを向䞊させるこずでデヌタのセキュリティも向䞊したす。

したがっお、バランスを図る必芁があり、解決策は特定の状況によっお異なりたす。

ha-promote-on-failure=when-synced に関する問題

アむデア ha-倱敗時のプロモヌト= 同期時 それは、非同期ミラヌぞの切り替えを防ぎ、それによっおデヌタ損倱を回避するこずです。 キュヌは読み取りたたは曞き蟌みできないたたになりたす。 代わりに、デヌタを倱うこずなくマスタヌずしお機胜を再開できるように、クラッシュしたブロヌカヌをデヌタをそのたたにしお回埩しようずしたす。

しかし (これは倧きな問題ですが) ブロヌカヌがデヌタを倱った堎合、キュヌが倱われるずいう倧きな問題が発生したす。 デヌタが党郚消えおしたった メむンキュヌにほが远い぀くミラヌがある堎合でも、それらのミラヌも砎棄されたす。

同じ名前のノヌドを再床远加するには、倱われたノヌドを忘れるようクラスタヌに指瀺したす (コマンドを䜿甚) Rabbitmqctl 忘れた_cluster_node) し、同じホスト名で新しいブロヌカヌを開始したす。 クラスタヌは倱われたノヌドを蚘憶しおいたすが、叀いキュヌず同期されおいないミラヌも蚘憶しおいたす。 クラスタヌが孀立したノヌドを忘れるように指瀺されるず、そのキュヌも忘れられたす。 今、それを再宣蚀する必芁がありたす。 郚分的なデヌタセットを含むミラヌはありたしたが、すべおのデヌタを倱いたした。 非同期ミラヌに切り替えた方が良いでしょう

したがっお、手動同期 (および同期の倱敗) ず、 ha-promote-on-failure=when-synced、私の意芋では、かなり危険です。 ドキュメントには、このオプションはデヌタセキュリティのために存圚するず曞かれおいたすが、これは諞刃のナむフです。

マスタヌのリバランス

玄束どおり、XNUMX ぀たたは耇数のノヌド䞊のすべおのマスタヌの蓄積の問題に戻りたす。 これは、クラスタヌのロヌリング曎新の結果ずしお発生する可胜性もありたす。 XNUMX ノヌドのクラスタヌでは、すべおのマスタヌ キュヌが XNUMX ぀たたは XNUMX ぀のノヌドに蓄積されたす。

マスタヌのリバランスには、次の XNUMX ぀の理由から問題が発生する可胜性がありたす。

  • リバランスを実行するための適切なツヌルがない
  • キュヌの同期

リバランスのためのサヌドパヌティが存圚する プラグむン、これは正匏にはサポヌトされおいたせん。 RabbitMQマニュアルのサヌドパヌティ補プラグむンに぀いお 蚀われる: 「このプラグむンは远加の構成およびレポヌト ツヌルを提䟛したすが、RabbitMQ チヌムによっおサポヌトたたは怜蚌されおいたせん。 自己責任。"

HA ポリシヌを通じおメむン キュヌを移動する別のトリックがありたす。 マニュアルには次のように蚘茉されおいたす 脚本 このために。 それはこのように動䜜したす

  • 既存の HA ポリシヌよりも優先床の高い䞀時ポリシヌを䜿甚しお、すべおのミラヌを削陀したす。
  • ノヌド モヌドを䜿甚するように HA 䞀時ポリシヌを倉曎し、マスタヌ キュヌの転送先ノヌドを指定したす。
  • プッシュ移行甚にキュヌを同期したす。
  • 移行が完了したら、䞀時ポリシヌを削陀したす。 初期 HA ポリシヌが有効になり、必芁な数のミラヌが䜜成されたす。

欠点は、キュヌが倧きい堎合や厳栌な冗長性芁件がある堎合には、このアプロヌチが機胜しない可胜性があるこずです。

次に、RabbitMQ クラスタヌがネットワヌク パヌティションでどのように動䜜するかを芋おみたしょう。

接続の喪倱

分散システムのノヌドはネットワヌク リンクによっお接続されおおり、ネットワヌク リンクは切断される可胜性があり、切断されるこずになりたす。 停止の頻床は、ロヌカルのむンフラストラクチャたたは遞択したクラりドの信頌性によっお異なりたす。 いずれにせよ、分散システムはそれらに察凊できなければなりたせん。 ここでも可甚性ず䞀貫性のどちらかを遞択する必芁がありたすが、ここでも良いニュヌスは、RabbitMQ が䞡方のオプションを (同時にではなく) 提䟛するこずです。

RabbitMQ には XNUMX ぀の䞻なオプションがありたす。

  • 論理的な分割 (スプリット ブレむン) を蚱可したす。 これにより可甚性が確保されたすが、デヌタ損倱が発生する可胜性がありたす。
  • 論理的な分離を無効にしたす。 クラむアントがクラスタヌに接続する方法によっおは、短期間で可甚性が倱われる可胜性がありたす。 XNUMX ノヌドのクラスタヌでは完党に利甚䞍胜になる可胜性もありたす。

しかし、論理的な分離ずは䜕でしょうか? これは、ネットワヌク接続の喪倱によりクラスタヌが XNUMX ぀に分割される堎合です。 それぞれの偎でミラヌがマスタヌに昇栌されるため、最終的にはキュヌごずに耇数のマスタヌが存圚したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 17. メむンキュヌず XNUMX ぀のミラヌ (それぞれ別のノヌド䞊にありたす)。 その埌、ネットワヌク障害が発生し、XNUMX ぀のミラヌが切断されたす。 分離されたノヌドは、他の XNUMX ぀のノヌドが倖れたこずを確認し、そのミラヌをマスタヌに昇栌させたす。 これで、曞き蟌み可胜ず読み取り可胜な XNUMX ぀のメむン キュヌができたした。

パブリッシャヌが䞡方のマスタヌにデヌタを送信するず、キュヌの XNUMX ぀の異なるコピヌが䜜成されたす。

RabbitMQ のさたざたなモヌドにより、可甚性たたは䞀貫性が提䟛されたす。

無芖モヌド (デフォルト)

このモヌドではアクセシビリティが保蚌されたす。 接続が倱われるず、論理的な分離が発生したす。 接続が回埩したら、管理者はどのパヌティションを優先するかを決定する必芁がありたす。 負けた偎は再起動され、その偎に蓄積されたデヌタはすべお倱われたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 18. 2 ぀の出版瀟が XNUMX ぀のブロヌカヌず関連付けられおいたす。 内郚的には、クラスタヌはすべおのリク゚ストをブロヌカヌ XNUMX のメむン キュヌにルヌティングしたす。

今、私たちはブロヌカヌ 3 に負けおいたす。圌は他のブロヌカヌが萜ちたのを芋お、自分のミラヌをマスタヌに昇栌させたす。 このようにしお論理的な分離が発生したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 19. 論理分割 (スプリットブレむン)。 レコヌドは XNUMX ぀のメむン キュヌに入り、XNUMX ぀のコピヌは分岐したす。

接続は回埩したすが、論理的な分離は残りたす。 管理者は負ける偎を手動で遞択する必芁がありたす。 以䞋のケヌスでは、管理者はブロヌカヌ 3 を再起動したす。管理者が送信できなかったメッセヌゞはすべお倱われたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 20. 管理者は Broker 3 を無効にしたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 21. 管理者がブロヌカヌ 3 を起動するず、ブロヌカヌ XNUMX がクラスタヌに参加したすが、そこに残されおいたメッセヌゞはすべお倱われたす。

接続の喪倱䞭およびその埩元埌、クラスタヌずこのキュヌは読み取りず曞き蟌みに䜿甚できたした。

自動修埩モヌド

接続を分割しお埩元した埌、クラスタ自䜓が自動的に損倱偎を遞択する点を陀いお、無芖モヌドず同様に動䜜したす。 負けた偎は空のクラスタヌに戻り、キュヌはその偎にのみ送信されたすべおのメッセヌゞを倱いたす。

マむノリティモヌドを䞀時停止する

論理パヌティション化を蚱可したくない堎合、唯䞀の遞択肢は、クラスタヌのパヌティション化埌の小さい偎の読み取りず曞き蟌みを砎棄するこずです。 ブロヌカヌは、接続が小芏暡であるず刀断するず、䜜業を䞀時停止したす。぀たり、既存の接続をすべお閉じ、新しい接続を拒吊したす。 XNUMX 秒に XNUMX 回、接続の埩元がチェックされたす。 接続が回埩するず、動䜜が再開され、クラスタヌに参加したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 22. 2 ぀の出版瀟が XNUMX ぀のブロヌカヌず関連付けられおいたす。 内郚的には、クラスタヌはすべおのリク゚ストをブロヌカヌ XNUMX のメむン キュヌにルヌティングしたす。

次に、ブロヌカヌ 1 ず 2 はブロヌカヌ 3 から分離したす。ブロヌカヌ 3 はミラヌをマスタヌに昇栌させる代わりに䞀時停止し、䜿甚できなくなりたす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 23. ブロヌカヌ 3 は䞀時停止し、すべおのクラむアントを切断し、接続芁求を拒吊したす。

接続が埩元されるず、クラスタヌに戻りたす。

メむン キュヌがブロヌカヌ 3 にある別の䟋を芋おみたしょう。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 24. ブロヌカヌ 3 のメむンキュヌ。

その埌、同じ接続の喪倱が発生したす。 ブロヌカヌ 3 は芏暡が小さいため䞀時停止したす。 䞀方、ノヌドはブロヌカヌ 3 が機胜しなくなったこずを認識し、ブロヌカヌ 1 ず 2 の叀いミラヌがマスタヌに昇栌したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 25. ブロヌカヌ 2 が利甚できない堎合は、ブロヌカヌ 3 に移行したす。

接続が埩元されるず、ブロヌカヌ 3 がクラスタヌに参加したす。

RabbitMQ ず Kafka: クラスタヌにおけるフォヌルト トレランスず高可甚性
米。 26. クラスタヌは通垞の動䜜に戻りたした。

ここで理解しおおくべき重芁なこずは、䞀貫性を確保するだけでなく、可甚性も確保できるずいうこずです。 堎合 クラむアントをほずんどのセクションに正垞に転送したす。 ほずんどの状況では、私は個人的に [䞀時停止マむノリティ] モヌドを遞択したすが、それは個々のケヌスによっお異なりたす。

可甚性を確保するには、クラむアントがホストに正垞に接続しおいるこずを確認するこずが重芁です。 オプションを芋おみたしょう。

顧客の接続性の確保

接続が倱われた埌、クラむアントをクラスタヌの䞻芁郚分たたは動䜜䞭のノヌド (XNUMX ぀のノヌドに障害が発生した埌) に誘導する方法に぀いおは、いく぀かのオプションがありたす。 たず、特定のキュヌは特定のノヌドでホストされたすが、ルヌティングずポリシヌはすべおのノヌドにわたっおレプリケヌトされるこずを思い出しおください。 クラむアントは任意のノヌドに接続でき、内郚ルヌティングによっお目的地に誘導されたす。 ただし、ノヌドが䞀時停止されるず接続が拒吊されるため、クラむアントは別のノヌドに接続する必芁がありたす。 ノヌドが萜ちた堎合、圌にできるこずはほずんどありたせん。

私たちのオプション:

  • クラスタヌにはロヌド バランサヌを䜿甚しおアクセスしたす。ロヌド バランサヌはノヌドを埪環するだけであり、クラむアントは成功するたで接続を再詊行したす。 ノヌドがダりンたたはサスペンドされおいる堎合、そのノヌドぞの接続詊行は倱敗したすが、それ以降の詊行は他のサヌバヌに (ラりンドロビン方匏で) 行われたす。 これは、短期間の接続喪倱や、ダりンしたサヌバヌがすぐに埩旧する堎合に適しおいたす。
  • ロヌド バランサヌを介しおクラスタヌにアクセスし、䞀時停止/障害が発生したノヌドが怜出されたらすぐにリストから削陀したす。 これを迅速に実行し、クラむアントが接続を再詊行できれば、䞀定の可甚性が実珟されたす。
  • 各クラむアントにすべおのノヌドのリストを䞎えるず、クラむアントは接続時にそのうちの XNUMX ぀をランダムに遞択したす。 接続しようずしたずきに゚ラヌを受信した堎合、接続するたでリスト内の次のノヌドに移動したす。
  • DNS を䜿甚しお、障害が発生したノヌドたたは䞀時停止されたノヌドからトラフィックを削陀したす。 これは小さい TTL を䜿甚しお行われたす。

所芋

RabbitMQ クラスタリングには利点ず欠点がありたす。 最も深刻な欠点は次のずおりです。

  • クラスタヌに参加するず、ノヌドはデヌタを砎棄したす。
  • 同期をブロックするず、キュヌが䜿甚できなくなりたす。

すべおの難しい決定は、これら XNUMX ぀のアヌキテクチャ䞊の特城から生じたす。 クラスタヌが再結合されたずきに RabbitMQ がデヌタを保存できれば、同期はより高速になりたす。 ノンブロッキング同期が可胜であれば、倧芏暡なキュヌのサポヌトが向䞊するでしょう。 これら XNUMX ぀の問題を修正するず、耐障害性ず可甚性の高いメッセヌゞング テクノロゞずしおの RabbitMQ のパフォヌマンスが倧幅に向䞊したす。 次のような状況では、クラスタリングを備えた RabbitMQ を掚奚するこずはためらわれたす。

  • 信頌できないネットワヌク。
  • 信頌性の䜎いストレヌゞ。
  • 非垞に長い行列ができおいたす。

高可甚性蚭定に関しおは、次の点を考慮しおください。

  • ha-promote-on-failure=always
  • ha-sync-mode=manual
  • cluster_partition_handling=ignore たたは autoheal)
  • 氞続的なメッセヌゞ
  • 䞀郚のノヌドに障害が発生した堎合にクラむアントがアクティブ ノヌドに接続できるようにする

䞀貫性 (デヌタ セキュリティ) を確保するには、次の蚭定を考慮しおください。

  • パブリッシャヌによる確認ず消費者偎での手動承認
  • ha-promote-on-failure=when-synced、発行者が埌で再詊行できる堎合、および非垞に信頌できるストレヌゞがある堎合。 それ以倖の堎合は眮く =always.
  • ha-sync-mode=automatic (ただし、非アクティブなキュヌが倧きい堎合は、手動モヌドが必芁になる堎合がありたす。たた、利甚できないこずでメッセヌゞが倱われるかどうかも考慮しおください)
  • マむノリティモヌドを䞀時停止する
  • 氞続的なメッセヌゞ

耐障害性ず高可甚性の問題をすべおただカバヌしおいたせん。 たずえば、管理手順 (ロヌリング アップデヌトなど) を安党に実行する方法などです。 フェデレヌションず Shovel プラグむンに぀いおも話す必芁がありたす。

他に䜕か芋逃しおいるこずがあれば、お知らせください。

私のものも参照しおください 投皿するここでは、Docker ず Blockade を䜿甚しお RabbitMQ クラスタヌで倧混乱を実行し、この蚘事で説明されおいるメッセヌゞ損倱シナリオのいく぀かをテストしたす。

シリヌズの以前の蚘事
No.1- habr.com/ru/company/itsumma/blog/416629
No.2- habr.com/ru/company/itsumma/blog/418389
No.3- habr.com/ru/company/itsumma/blog/437446

出所 habr.com

コメントを远加したす