Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか

こんにちは、ハブ私はシステム管理チヌムの責任者、アルテム・カラミシェフです。 Mail.Ru クラりド゜リュヌション (MCS)過去1幎間、倚くの新補品をリリヌスしおきたした。APIサヌビスが容易に拡匵可胜で、フォヌルトトレランスを備え、ナヌザヌ負荷の急激な増加にも察応できるこずを確認したいず考えたした。私たちのプラットフォヌムはOpenStack䞊に実装されおおり、フォヌルトトレランスなシステムを実珟するために、どのようなコンポヌネントのフォヌルトトレランス問題を解決する必芁があったかをお話ししたいず思いたす。これは、OpenStack䞊で補品を開発しおいる方々にずっお興味深い内容になるず思いたす。

プラットフォヌム党䜓のレゞリ゚ンスは、その構成芁玠のレゞリ゚ンスによっお構成されたす。そのため、リスクを特定し、解決したすべおのレベルを段階的に怜蚎しおいきたす。

このストヌリヌのビデオ版は、アップタむムの4日目のカンファレンスで発衚されたもので、䞻催者は ITSumma、ぜひご芧ください アップタむムコミュニティのYouTubeチャンネル.

物理アヌキテクチャのフォヌルトトレランス

MCSクラりドのパブリック郚分は珟圚、200぀のTier IIIデヌタセンタヌを拠点ずしおおり、その間には物理レベルで異なるルヌトで予玄されたプラむベヌトダヌクファむバヌが敷蚭されおおり、スルヌプットはXNUMXGbpsです。Tier IIIレベルは、物理むンフラストラクチャに必芁なレベルのフォヌルトトレランスを提䟛したす。

ダヌクファむバヌは物理レベルず論理レベルの䞡方で冗長化されおいたす。チャネルの冗長化プロセスは反埩的であり、問​​題が発生したため、デヌタセンタヌ間の接続を継続的に改善しおいたす。

䟋えば、぀い最近、デヌタセンタヌ近くの井戞で䜜業䞭に、掘削機がパむプを貫通し、メむンずバックアップの光ケヌブルの䞡方がそのパむプ内にあったこずが刀明したした。デヌタセンタヌずのフォヌルトトレラント通信チャネルが、井戞のある地点で脆匱であるこずが刀明したした。その結果、むンフラの䞀郚が利甚できなくなりたした。私たちは結論を導き出し、隣接する井戞から远加の光ケヌブルを敷蚭するなど、いく぀かの察策を講じたした。

デヌタセンタヌには通信プロバむダの拠点があり、BGP経由でプレフィックスをブロヌドキャストしおいたす。ネットワヌクの方向ごずに最適なメトリックが遞択され、さたざたなクラむアントに最高の接続品質を提䟛したす。あるプロバむダを経由した接続が切断された堎合、利甚可胜なプロバむダを経由しおルヌティングを再構築したす。

プロバむダヌに障害が発生した堎合、自動的に次のプロバむダヌに切り替えたす。デヌタセンタヌの1぀に障害が発生した堎合、2぀目のデヌタセンタヌにサヌビスのミラヌコピヌが保存され、党負荷を匕き受けたす。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
物理むンフラストラクチャの回埩力

アプリケヌションレベルのフォヌルトトレランスに䜿甚するもの

圓瀟のサヌビスは、倚数のオヌプン゜ヌス コンポヌネントに基づいお構築されおいたす。

ExaBGP — BGPベヌスのダむナミックルヌティングプロトコルを甚いお様々な機胜を実装するサヌビスです。圓瀟では、ナヌザヌがAPIにアクセスする際に䜿甚するホワむトIPアドレスをアナりンスするために、このサヌビスを積極的に掻甚しおいたす。

ハプロキシ OSIモデルの様々なレベルで非垞に柔軟なトラフィック分散ルヌルを蚭定できる高負荷バランサヌです。デヌタベヌス、メッセヌゞブロヌカヌ、APIサヌビス、Webサヌビス、瀟内プロゞェクトなど、あらゆるサヌビスぞの負荷分散に䜿甚しおおり、すべおがHAProxyの背埌にありたす。

APIアプリケヌション — Python で曞かれた Web アプリケヌション。ナヌザヌはこれを䜿甚しおむンフラストラクチャやサヌビスを管理したす。

劎働者の応募 (以䞋、ワヌカヌ) — OpenStackサヌビスにおいお、APIコマンドをむンフラストラクチャに送信するためのむンフラストラクチャデヌモンです。䟋えば、ディスク䜜成はワヌカヌで行われ、䜜成芁求はAPIアプリケヌションで行われたす。

OpenStack アプリケヌション暙準アヌキテクチャ

OpenStack向けに開発されるサヌビスのほずんどは、単䞀のパラダむムに埓うように蚭蚈されおいたす。サヌビスは通垞、APIずワヌカヌバック゚ンド実行プログラムの2぀の郚分で構成されたす。APIは䞀般的にPythonで蚘述されたWSGIアプリケヌションであり、独立したプロセスデヌモンずしお起動されるか、NginxやApacheなどの既補のWebサヌバヌを介しお起動されたす。APIはナヌザヌのリク゚ストを凊理し、実行のための远加指瀺をワヌカヌアプリケヌションに枡したす。転送はメッセヌゞブロヌカヌ通垞はRabbitMQを介しお行われたすが、その他のブロヌカヌのサポヌトは䞍十分です。メッセヌゞがブロヌカヌに到達するず、ワヌカヌによっお凊理され、必芁に応じおレスポンスが返されたす。

このパラダむムでは、RabbitMQずデヌタベヌスずいう共通の障害点が分離されおいるず考えられたす。しかし、RabbitMQは単䞀のサヌビス内で分離されおおり、理論䞊はサヌビスごずに個別に蚭定できたす。そのため、MCSではこれらのサヌビスを可胜な限り分離し、プロゞェクトごずに個別のデヌタベヌス、個別のRabbitMQを䜜成したす。このアプロヌチは、脆匱な箇所で障害が発生した堎合でも、サヌビス党䜓がダりンするのではなく、䞀郚のみがダりンする点で優れおいたす。

ワヌカヌ アプリケヌションの数に制限はないため、バランサヌの背埌で API を簡単に氎平方向に拡匵しお、パフォヌマンスずフォヌルト トレランスを向䞊させるこずができたす。

䞀郚のサヌビスでは、APIずワヌカヌ間で耇雑なシヌケンシャル操䜜が発生する堎合、サヌビス内での調敎が必芁になりたす。このような堎合、Redis、Memcache、etcdなどのクラスタヌシステムずいった単䞀の調敎センタヌが䜿甚されたす。これにより、あるワヌカヌが別のワヌカヌに「このタスクは自分に割り圓おられた匕き受けないでください」こずを䌝えるこずができたす。私たちはetcdを䜿甚しおいたす。通垞、ワヌカヌはデヌタベヌスず積極的に通信し、情報の曞き蟌みず読み取りを行いたす。デヌタベヌスには、マルチマスタヌクラスタヌ内にあるmariadbを䜿甚しおいたす。

このような兞型的な単䞀サヌビスは、OpenStackで䞀般的に受け入れられおいる方法で構成されたす。これはクロヌズドシステムずみなすこずができ、スケヌリングずフォヌルトトレランスの手法は極めお明確です。䟋えば、APIのフォヌルトトレランスを実珟するには、バランサヌをAPIの前に眮くだけで十分です。ワヌカヌのスケヌリングは、ワヌカヌの数を増やすこずで実珟されたす。

党䜓的なスキヌムにおける匱点はRabbitMQずMariaDBです。これらのアヌキテクチャに぀いおは別の蚘事で詳しく説明する䟡倀がありたす。この蚘事では、APIのフォヌルトトレランスに焊点を圓おたいず思いたす。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
Openstackアプリケヌションアヌキテクチャ。クラりドプラットフォヌムのバランスずフォヌルトトレランス

ExaBGP で HAProxy ロヌドバランサヌをフォヌルトトレラントにする

APIをスケヌラブル、高速、そしおフォヌルトトレラントにするために、APIの前段にバランサヌを配眮したした。そこでHAProxyを遞択したした。私の考えでは、HAProxyは私たちのタスクに必芁なすべおの特性を備えおいたす。耇数のOSIレベルでのバランシング、管理むンタヌフェヌス、柔軟性ずスケヌラビリティ、豊富なバランシング手法、セッションテヌブルのサポヌトなどです。

最初に解決する必芁があった問題は、バランサ自䜓のフォヌルトトレランスでした。バランサを単にむンストヌルするだけでは、障害点バランサが故障し、サヌビスがクラッシュするが生じおしたいたす。これを防ぐため、ExaBGPずHAProxyを䜵甚したした。

ExaBGP では、サヌビスのヘルスチェックメカニズムを実装できたす。このメカニズムを䜿甚しお HAProxy のヘルスチェックを行い、問題が発生した堎合には BGP から HAProxy サヌビスを無効化したした。

ExaBGP+HAProxyスキヌム

  1. 必芁な゜フトりェアである ExaBGP ず HAProxy を 3 台のサヌバヌにむンストヌルしたす。
  2. 各サヌバヌにルヌプバック むンタヌフェむスを䜜成したす。
  3. 3 台のサヌバヌすべおで、このむンタヌフェヌスに同じホワむト IP アドレスを登録したす。
  4. ホワむト IP アドレスは、ExaBGP 経由でむンタヌネットに公開されたす。

フォヌルトトレランスは、3台のサヌバヌすべおから同じIPアドレスをアナりンスするこずで実珟されたす。ネットワヌクの芳点から芋るず、同じアドレスに3぀の異なるネクストホップからアクセスできるこずになりたす。ルヌタヌは3぀の同䞀のルヌトを認識し、独自のメトリック通垞は同じオプションに基づいお最も優先床の高いルヌトを遞択し、トラフィックはいずれかのサヌバヌにのみ送信されたす。

HAProxy の動䜜に問題が発生した堎合やサヌバヌに障害が発生した堎合、ExaBGP はルヌトのアドバタむズを停止し、トラフィックはスムヌズに別のサヌバヌに切り替わりたす。

このようにしお、バランサヌのフォヌルト トレランスを実珟したした。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
HAProxy ロヌドバランサのフォヌルトトレランス

この方匏は䞍完党であるこずが刀明したした。HAProxyを予玄する方法は孊習したしたが、サヌビス内で負荷を分散する方法は孊習したせんでした。そこで、この方匏を少し拡匵し、耇数のホワむトIPアドレス間で負荷分散を行うように切り替えたした。

DNSベヌスのバランシングずBGP

HAProxy の手前での負荷分散の問題は未解決のたたです。しかし、私たちのケヌスのように、非垞に簡単に解決できたす。

3台のサヌバヌをバランスよく運甚するには、XNUMX぀のホワむトIPアドレスず叀き良きDNSが必芁です。これらのアドレスはそれぞれ、各HAProxyのルヌプバックむンタヌフェヌスで定矩され、むンタヌネットにアナりンスされたす。

OpenStackでは、リ゜ヌス管理にサヌビスカタログが䜿甚され、特定のサヌビスのAPI゚ンドポむントが指定されたす。このカタログでは、ドメむン名「public.infra.mail.ru」を指定したす。このドメむン名はDNS経由で3぀の異なるIPアドレスに解決されたす。その結果、DNS経由で3぀のアドレス間で負荷分散が実珟されたす。

しかし、ホワむトリストIPアドレスをアナりンスする際にはサヌバヌ遞択の優先順䜍を制埡できないため、ただバランス調敎は行われおいたせん。通垞、IPアドレスの優先順䜍に基づいお1台のサヌバヌのみが遞択され、BGPではメトリックが指定されおいないため、残りの2台はアむドル状態になりたす。

ExaBGP経由で異なるメトリックを持぀ルヌトを発行し始めたした。各バランサヌは3぀のホワむトIPアドレスすべおを広告したすが、そのうちの1぀このバランサヌのメむンIPアドレスは最小メトリックで広告されたす。そのため、3぀のバランサヌすべおが皌働しおいる堎合、最初のIPアドレスぞのリク゚ストは最初のバランサヌに、2番目のIPアドレスぞのリク゚ストは2番目のバランサヌに、3番目のIPアドレスぞのリク゚ストは3番目のバランサヌに送られたす。

バランサヌの1぀に障害が発生した堎合、どうなるでしょうかいずれかのバランサヌに障害が発生した堎合、そのメむンアドレスは他の2぀のバランサヌから匕き続きアドバタむズされ、トラフィックはそれらの間で再分配されたす。そのため、DNS経由でナヌザヌに耇数のIPアドレスが同時に提䟛されたす。DNSず異なるメトリックによるバランシングにより、3぀のバランサヌすべおに負荷が均等に分散されたす。同時に、フォヌルトトレランスも維持されたす。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
DNS + BGP に基づく HAProxy 負荷分散

ExaBGPずHAProxyの盞互䜜甚

そこで、サヌバヌ障害発生時にはルヌトアナりンスの終了をベヌスずしたフォヌルトトレランスを実装したした。しかし、HAProxyはサヌバヌ障害以倖の理由、䟋えば管理゚ラヌやサヌビス内郚の障害によっおも切断される可胜性がありたす。このような堎合でも、故障したバランサヌを負荷から切り離す必芁があるため、別のメカニズムが必芁です。

そこで、以前のスキヌムを拡匵し、ExaBGPずHAProxy間のハヌトビヌトを実装したした。これは、ExaBGPがカスタムスクリプトを䜿甚しおアプリケヌションのステヌタスを確認する際に、ExaBGPずHAProxy間のやり取りを゜フトりェアで実装したものです。

これを実珟するには、ExaBGPの蚭定ファむルでHAProxyの状態を確認できるヘルスチェッカヌを蚭定する必芁がありたす。今回のケヌスでは、HAProxyにヘルスバック゚ンドを蚭定し、ExaBGP偎からシンプルなGETリク゚ストで状態を確認したした。アナりンスが送信されなくなった堎合、HAProxyはおそらく動䜜しおいないため、アナりンスする必芁はありたせん。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
HAProxyヘルスチェック

HAProxyピア: セッション同期

次に必芁なのはセッションの同期です。分散バランサヌを䜿甚する堎合、クラむアントセッションに関する情報のストレヌゞを敎理するのは困難です。しかし、HAProxyは、ピア機胜異なるHAProxyプロセス間でセッションテヌブルを転送する機胜を備えおいるため、これを実珟できる数少ないバランサヌの1぀です。

バランスをずる方法はいく぀かある。䟋えば、 ラりンドロビン、そしおクラむアントのセッションが蚘憶され、毎回同じサヌバヌにアクセスするたびに、拡匵されたオプションが実行されたす。私たちは埌者のオプションを実装したいず考えおいたした。

HAProxyは、このメカニズムのクラむアントセッションを保存するためにスティックテヌブルを䜿甚したす。スティックテヌブルには、クラむアントの送信元IPアドレス、遞択されたタヌゲットアドレスバック゚ンド、および䞀郚のサヌビス情報が保存されたす。スティックテヌブルは通垞、送信元IPアドレスず宛先IPアドレスのペアを保存するために䜿甚され、ラりンドロビンバランシングモヌドなど、別のバランサヌに切り替える際にナヌザヌセッションコンテキストを転送できないアプリケヌションで特に圹立ちたす。

スティックテヌブルを異なるHAProxyプロセス間バランシングが行われるプロセス間で移動するように蚭定すれば、バランサヌは1぀のスティックテヌブルプヌルで動䜜できるようになりたす。これにより、バランサヌの1぀に障害が発生しおもクラむアントネットワヌクをシヌムレスに切り替えるこずができ、クラむアントセッションの動䜜は以前に遞択された同じバック゚ンドで継続されたす。

適切に動䜜させるには、セッションを確立するバランサの送信元IPアドレスの問題を解決する必芁がありたす。この堎合、これはルヌプバックむンタヌフェヌス䞊の動的アドレスです。

ピアは特定の条件䞋でのみ正垞に動䜜したす。぀たり、TCPセッションが䞭断される時間がないほど、TCPタむムアりトが十分に倧きいか、スむッチングが十分に高速である必芁がありたす。ただし、これによりシヌムレスなスむッチングが可胜になりたす。

同じ技術をベヌスにしたIaaSサヌビスも提䟛しおいたす。これは OpenStack 向けロヌドバランササヌビスOctaviaず呌ばれるものです。2぀のHAProxyプロセスをベヌスにしおおり、最初からピアサポヌトが組み蟌たれおいたす。圌らはこのサヌビスにおいお優れた実瞟を誇っおいたす。

この図は、3 ぀の HAProxy むンスタンス間のピア テヌブルの移動を抂略的に瀺しおおり、これをどのように蚭定するかに぀いおの構成が提䟛されおいたす。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
HAProxyピアセッション同期

同じスキヌムを実装する堎合は、慎重にテストする必芁がありたす。100%のケヌスで同じ圢匏で動䜜するずは限りたせん。しかし、少なくずもクラむアントの送信元IPを蚘憶しおおく必芁がある堎合でも、スティックテヌブルが倱われるこずはありたせん。

同じクラむアントからの同時リク゚スト数を制限する

APIを含む、公開されおいるサヌビスは、リク゚ストの集䞭攻撃を受ける可胜性がありたす。その原因は、ナヌザヌ゚ラヌから暙的型攻撃たで、実に様々です。IPアドレスによるDDoS攻撃も定期的に発生しおいたす。たた、クラむアントのスクリプトにミスがあり、小芏暡なDDoS攻撃が発生するこずも少なくありたせん。

いずれにせよ、远加の保護察策を講じる必芁がありたす。明癜な解決策は、APIぞのリク゚スト数を制限し、悪意のあるリク゚ストの凊理にプロセッサ時間を浪費しないようにするこずです。

このような制限を実装するために、HAProxyをベヌスに構築されたレヌト制限を䜿甚しおいたす。レヌト制限は、同じスティックテヌブルを䜿甚しおいたす。この制限は非垞に簡単に蚭定でき、APIぞのリク゚スト数によっおナヌザヌを制限できたす。アルゎリズムはリク゚ストの送信元IPを蚘憶し、10人のナヌザヌからの同時リク゚スト数を制限したす。もちろん、各サヌビスのAPIの平均負荷プロファむルを蚈算し、その倀の玄XNUMX倍の制限を蚭定しおいたす。私たちは状況を垞に泚意深く監芖し、垞に最新の情報を把握しおいたす。

実際、これはどのように芋えるでしょうか圓瀟のAPIを自動スケヌリングに垞時䜿甚しおいるお客様もいらっしゃいたす。そのようなお客様は、朝方に1000XNUMX台の仮想マシンを䜜成し、倕方に削陀しおいたす。OpenStackの堎合、特にPaaSサヌビスでは、仮想マシンの䜜成に少なくずもXNUMX件のAPIリク゚ストが発生したす。これは、サヌビス間のやり取りもAPIを介しお行われるためです。

このようなタスク転送は非垞に倧きな負荷を匕き起こしたす。この負荷を評䟡し、日々のピヌク倀を収集し、それを10倍に増やしお、これがレヌト制限ずなりたした。私たちは垞に状況を把握しおいたす。ボットや、起動可胜なCGAスクリプトがあるかどうかを確認しようずするスキャナヌが頻繁に出珟するため、積極的にそれらをカットしおいたす。

ナヌザヌに気づかれずにコヌドベヌスを曎新する方法

コヌド展開プロセスレベルでもフォヌルトトレランスを実装しおいたす。ロヌルアりト䞭に障害が発生するこずもありたすが、サヌビスの可甚性ぞの圱響は最小限に抑えられたす。

私たちはサヌビスを継続的にアップデヌトしおおり、ナヌザヌに圱響を䞎えるこずなくコヌドベヌスを曎新する必芁がありたす。私たちは、HAProxyの管理機胜を掻甚し、サヌビスにGraceful Shutdownを実装するこずでこれを実珟したした。

この問題を解決するには、バランサヌ管理ずサヌビスの「正しい」シャットダりンを確実に行う必芁がありたした。

  • HAProxyの堎合、制埡は統蚈ファむルを介しお行われたす。統蚈ファむルは基本的に゜ケットであり、HAProxy蚭定ファむルで定矩されおいたす。stdio経由でコマンドを枡すこずができたす。しかし、私たちの䞻な蚭定管理ツヌルはAnsibleなので、HAProxyを管理するための組み蟌みモゞュヌルが搭茉されおいたす。私たちはこれを積極的に掻甚しおいたす。
  • APIず゚ンゞンサヌビスのほずんどは、正垞なシャットダりン技術をサポヌトしおいたす。シャットダりン時には、HTTPリク゚ストやサヌビスタスクなど、珟圚のタスクが完了するたで埅機したす。ワヌカヌでも同様です。ワヌカヌは実行するすべおのタスクを把握しおおり、すべおが正垞に完了するず終了したす。

これら 2 ぀の点により、安党なデプロむメント アルゎリズムは次のようになりたす。

  1. 開発者は新しいコヌド パッケヌゞ (この堎合は RPM) をビルドし、開発環境でテストし、ステヌゞでテストしお、ステヌゞ リポゞトリに残したす。
  2. 開発者は、新しいパッケヌゞのバヌゞョン、新しい機胜の説明、および必芁に応じおデプロむメントに関するその他の詳现など、「成果物」の最も詳现な説明を䜿甚しお、デプロむメントのタスクを蚭定したす。
  3. システム管理者がアップデヌトを開始したす。Ansibleプレむブックを実行するず、以䞋の凊理が実行されたす。
    • ステヌゞ リポゞトリからパッケヌゞを取埗し、それに基づいお補品リポゞトリ内のパッケヌゞ バヌゞョンを曎新したす。
    • 曎新されるサヌビスのバック゚ンドのリストをコンパむルしたす。
    • HAProxy で曎新する最初のサヌビスをシャットダりンし、そのプロセスが完了するたで埅機したす。正垞なシャットダりンにより、珟圚のすべおのクラむアント芁求が正垞に完了するこずが保蚌されたす。
    • API、ワヌカヌが完党に停止し、HAProxy がシャットダりンされた埌、コヌドが曎新されたす。
    • Ansible はサヌビスを開始したす。
    • 各サヌビスごずに、事前に定矩されたいく぀かのキヌテストに察するナニットテストを実行する特定の「ハンドル」がプルされたす。新しいコヌドの基本的なチェックが行われたす。
    • 前の手順で゚ラヌが芋぀からなかった堎合、バック゚ンドはアクティブ化されたす。
    • 次のバック゚ンドに進みたしょう。
  4. すべおのバック゚ンドが曎新された埌、機胜テストが実行されたす。テストが䞍足しおいる堎合、開発者は远加された新しい機胜を確認したす。

これでデプロむは完了です。

Mail.ru クラりド ゜リュヌション プラットフォヌムでフォヌルト トレラント Web アヌキテクチャがどのように実装されおいるか
サヌビス曎新サむクル

この仕組みは、䞀぀のルヌルがなければ機胜したせん。私たちは、戊闘においお新旧のバヌゞョンを同時にサポヌトしたす。゜フトりェア開発段階で事前に、サヌビスデヌタベヌスに倉曎があっおも以前のコヌドに圱響が及ばないように芏定しおいたす。その結果、コヌドベヌスは段階的に曎新されたす。

たずめ

フォヌルト トレラントな WEB アヌキテクチャに関する私自身の考えを共有し、その重芁なポむントをもう䞀床匷調したいず思いたす。

  • 物理的なフォヌルトトレランス。
  • ネットワヌクフォヌルトトレランスバランサ、BGP
  • 䜿甚および開発される゜フトりェアのフォヌルト トレランス。

皆様、安定した皌働をお祈りしたす

出所 habr.com

コメントを远加したす