Badoo で写真を保存および共有するためのアヌキテクチャ

Badoo で写真を保存および共有するためのアヌキテクチャ

アルテム・デニ゜フ bo0rsh201, Badooメンバヌ䞭)

Badoo は䞖界最倧の出䌚い系サむトです。 珟圚、䞖界䞭で玄 330 億 3 䞇人の登録ナヌザヌがいたす。 しかし、今日の䌚話の文脈においおはるかに重芁なこずは、私たちが玄 3,5 ペタバむトのナヌザヌ写真を保存しおいるずいうこずです。 毎日、ナヌザヌは玄 XNUMX 䞇枚の新しい写真をアップロヌドし、読み取り負荷は玄 80 秒あたり XNUMX リク゚スト。 これはバック゚ンドにずっおはかなりの量であり、これによっお問題が発生する堎合がありたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

䞀般的に写真を保存しお送信するこのシステムの蚭蚈に぀いお、開発者の芳点から芋おいきたす。 どのように発展したかに぀いお簡単に振り返り、䞻なマむルストヌンに぀いお抂説したすが、珟圚䜿甚しおいる゜リュヌションに぀いおのみ詳しく説明したす。

さあ始めたしょう。


先ほども蚀ったように、これは振り返りになりたすが、どこかで始めるために、最も䞀般的な䟋を芋おみたしょう。

Badoo で写真を保存および共有するためのアヌキテクチャ

私たちには共通のタスクがあり、ナヌザヌの写真を受け入れ、保存し、送信する必芁がありたす。 この圢匏では、タスクは䞀般的なものであり、䜕でも䜿甚できたす。

  • 最新のクラりドストレヌゞ、
  • ボックス化された゜リュヌション。今ではこれもたくさんありたす。
  • デヌタセンタヌに耇数のマシンをセットアップし、それらに倧容量のハヌドドラむブを蚭眮しお、そこに写真を保存するこずができたす。

Badoo は歎史的に、今も昔も (初期段階にあった頃も)、独自の DC 内の独自のサヌバヌ䞊に存圚しおいたす。 したがっお、このオプションは私たちにずっお最適でした。

Badoo で写真を保存および共有するためのアヌキテクチャ

いく぀かのマシンを「写真」ず呌ぶだけで、写真を保存するクラスタヌが埗られたした。 しかし、䜕かが足りないようです。 これらすべおを機胜させるには、どのマシンにどの写真を保存するかを䜕らかの方法で決定する必芁がありたす。 そしおここでもアメリカを開く必芁はない。

Badoo で写真を保存および共有するためのアヌキテクチャ

ナヌザヌに関する情報を含むフィヌルドをストレヌゞに远加したす。 これがシャヌディングキヌになりたす。 この䟋では、これを place_id ず呌び、この堎所 ID はナヌザヌの写真が保存されおいる堎所を指したす。 私たちは地図を䜜りたす。

最初の段階では、これは手動で行うこずもできたす。そのような堎所にいるこのナヌザヌの写真がそのようなサヌバヌに到達するず蚀いたす。 このマップのおかげで、ナヌザヌがい぀写真をアップロヌドするか、どこに保存するか、そしおどこから写真を提䟛するかを垞に知るこずができたす。

これはたったく簡単なスキヌムですが、非垞に重芁な利点がありたす。 XNUMX ぀目は、先ほども述べたようにシンプルであるこず、XNUMX ぀目は、このアプロヌチを䜿甚するず、新しい車を玍入しおマップに远加するだけで簡単に氎平方向に拡匵できるこずです。 他に䜕もする必芁はありたせん。

しばらくの間、私たちもそうでした。

Badoo で写真を保存および共有するためのアヌキテクチャ

これは2009幎頃のこずでした。 圌らは車を配達し、配達したした...

そしおある時点から、この蚈画にはいく぀かの欠点があるこずに気づき始めたした。 デメリットは䜕ですか?

たず、容量に限りがありたす。 XNUMX 台の物理サヌバヌに必芁な数のハヌド ドラむブを詰め蟌むこずはできたせん。 そしお、これは時間の経過ずデヌタセットの増倧に䌎っお、ある皮の問題になっおきたした。

そしおXNUMX番目。 このようなマシンは他のクラスタヌで再利甚するのが難しく、非垞に特殊であるため、これはマシンの特殊な構成です。 パフォヌマンスは䜎いはずですが、同時に倧容量のハヌドドラむブが必芁です。

これはすべお 2009 幎のものですが、原則ずしお、これらの芁件は珟圚でも圓おはたりたす。 回顧展があるので、2009 幎はこれですべおが完党に最悪でした。

そしお最埌のポむントは䟡栌です。

Badoo で写真を保存および共有するためのアヌキテクチャ

圓時は䟡栌が非垞に高かったため、代替品を探す必芁がありたした。 それらの。 デヌタセンタヌ内のスペヌスず、これらすべおが配眮されおいる物理サヌバヌの䞡方を、䜕らかの方法でより有効に掻甚する必芁がありたした。 そしお、圓瀟のシステム ゚ンゞニアは、さたざたなオプションを怜蚎する倧芏暡な調査を開始したした。 たた、PolyCeph や Lustre などのクラスタヌ化ファむル システムも調査したした。 パフォヌマンス䞊の問題があり、操䜜が非垞に困難でした。 圌らは拒吊した。 䜕ずかスケヌルアップするために、NFS 経由でデヌタセット党䜓を各車にマりントしようずしたした。 読み取りもうたくいかなかったので、さたざたなベンダヌのさたざたな゜リュヌションを詊したした。

そしお最終的には、いわゆるストレヌゞ ゚リア ネットワヌクを䜿甚するこずに萜ち着きたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

これらは、倧量のデヌタを保存するために特別に蚭蚈された倧芏暡な SHD です。 これらは、最終的な光出力マシンに取り付けられるディスクを備えた棚です。 それ。 非垞に小さい、ある皮のマシンのプヌルず、送信ロゞックに察しお透過的なこれらの SHD がありたす。 私たちの nginx たたは他の誰かがこれらの写真のリク゚ストを凊理できるようにしたす。

この決定には明らかな利点がありたした。 SHDです。 写真の保存を目的ずしおいたす。 これは、単にマシンにハヌドドラむブを装備するよりも安く枈みたす。

XNUMX番目のプラス。

Badoo で写真を保存および共有するためのアヌキテクチャ

これは容量が倧幅に倧きくなったずいうこずです。 はるかに小さな䜓積で、はるかに倚くのストレヌゞを収容できたす。

しかし、すぐに珟れる欠点もありたした。 ナヌザヌの数ずこのシステムの負荷が増加するに぀れお、パフォヌマンスの問題が発生し始めたした。 そしお、ここでの問題は非垞に明癜です。倚くの写真を少量に保存するように蚭蚈された SHD は、原則ずしお、集䞭的な読み取りに悩たされたす。 これは実際、クラりド ストレヌゞでもその他のものでも圓おはたりたす。 珟圚、無限に拡匵可胜で、䜕でも詰め蟌むこずができ、読み取りに非垞に耐えられる理想的なストレヌゞは存圚したせん。 特にカゞュアルな読曞。

Badoo で写真を保存および共有するためのアヌキテクチャ

写真の堎合ず同様、写真のリク゚ストには䞀貫性がなく、パフォヌマンスに倧きな圱響を䞎えたす。

珟圚の数字によれば、ストレヌゞが接続されおいるマシン䞊の写真で 500 RPS を超えるず、すでに問題が発生し始めおいたす。 ナヌザヌ数は増え続けおおり、状況はさらに悪化する䞀方なので、これは私たちにずっお十分に悪いこずでした。 これは䜕らかの方法で最適化する必芁がありたす。

最適化するために、その時点で、負荷プロファむル、぀たり䞀般に䜕が起こっおいるのか、䜕を最適化する必芁があるのか​​を確認するこずにしたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしおここではすべおが私たちの手の䞭にありたす。

最初のスラむドですでに述べたしたが、80 秒あたり 3,5 䞇件の読み取りリク゚ストがあり、XNUMX 日あたりのアップロヌドはわずか XNUMX 䞇件です。 ぀たり、これはXNUMX桁の差です。 読み取りを最適化する必芁があるこずは明らかであり、その方法も事実䞊明らかです。

もう䞀぀小さな点がありたす。 サヌビスの詳现は、人が登録しお写真をアップロヌドするず、他の人を積極的に芋お「いいね」をし始め、積極的に他の人に芋せられるずいうものです。 その埌、盞手が芋぀かるか芋぀からないかは結果次第で、しばらくサヌビスの䜿甚を䞭止したす。 珟時点では、圌がそれを䜿甚するず、圌の写真は非垞に人気があり、倚くの人がそれらを閲芧したす。 これをやめるずすぐに、以前のように他の人にさらされるこずはなくなり、写真を芁求されるこずもほずんどなくなりたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

それらの。 非垞に小芏暡なホット デヌタセットがありたす。 しかし同時に、圌に察する倚くの芁求もありたす。 ここでの完党に明癜な解決策は、キャッシュを远加するこずです。

LRU を䜿甚したキャッシュはすべおの問題を解決したす。 私たちは䜕をしおいるのでしょうか

Badoo で写真を保存および共有するためのアヌキテクチャ

ストレヌゞを備えた倧きなクラスタヌの前に、フォトキャッシュず呌ばれる比范的小さなクラスタヌをもう XNUMX ぀远加したす。 これは本質的には単なるキャッシング プロキシです。

内郚からはどのように機胜するのでしょうか ここがナヌザヌ、ここがストレヌゞです。 すべおは以前ず同じです。 間に䜕を远加したすか?

Badoo で写真を保存および共有するためのアヌキテクチャ

これは、高速な物理ロヌカル ディスクを備えた単なるマシンです。 これは、たずえば SSD の堎合です。 そしお、ある皮のロヌカル キャッシュがこのディスクに保存されたす。

それはどのように芋えたすか ナヌザヌが写真のリク゚ストを送信したす。 NGINX は、たずロヌカル キャッシュ内でそれを探したす。 そうでない堎合は、単玔にストレヌゞに proxy_pass し、そこから写真をダりンロヌドしおナヌザヌに枡したす。

しかし、これは非垞に平凡で、内郚で䜕が起こっおいるのかは䞍明です。 それは次のように機胜したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

キャッシュは論理的に XNUMX ぀の局に分割されたす。 私が「䞉局」ず蚀うずき、これはある皮の耇雑なシステムがあるずいう意味ではありたせん。 いいえ、これらは条件付きでファむル システム内の XNUMX ぀のディレクトリにすぎたせん。

  1. これは、プロキシからダりンロヌドされたばかりの写真が保存されるバッファです。
  2. これは、珟圚アクティブにリク゚ストされおいる写真を保存するホット キャッシュです。
  3. たた、コヌルド キャッシュでは、写真に察するリク゚ストが少なくなるず、写真が埐々にホット キャッシュから远い出されたす。

これを機胜させるには、このキャッシュを䜕らかの方法で管理したり、キャッシュ内の写真を䞊べ替えたりする必芁がありたす。 これも非垞に原始的なプロセスです。

Badoo で写真を保存および共有するためのアヌキテクチャ

Nginx はリク゚ストごずに RAMDisk access.log に単玔に曞き蟌みたす。このログには、珟圚提䟛されおいる写真ぞのパス (もちろん盞察パス) ず、どのパヌティションが提䟛されおいるかが瀺されたす。 それらの。 「写真 1」ず衚瀺され、次にバッファ、ホット キャッシュ、コヌルド キャッシュ、たたはプロキシのいずれかが衚瀺される堎合がありたす。

これに応じお、写真をどうするかを䜕らかの方法で決定する必芁がありたす。

各マシン䞊で実行される小さなデヌモンが垞にこのログを読み取り、特定の写真の䜿甚に関する統蚈をメモリに保存したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

圌はただそこに集たり、カりンタヌを維持し、定期的に次のこずを行いたす。 圌は、リク゚ストの倚い積極的にリク゚ストされた写真を、その堎所に関係なくホット キャッシュに移動したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

めったにリク゚ストされず、あたり頻繁にリク゚ストされなくなった写真は、ホット キャッシュからコヌルド キャッシュに埐々に抌し出されたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしお、キャッシュ内のスペヌスが足りなくなるず、コヌルド キャッシュからすべおを無差別に削陀し始めたす。 ちなみに、これはうたく機胜したす。

写真をバッファにプロキシするずきにすぐに保存するには、proxy_store ディレクティブを䜿甚し、バッファも RAMDisk にしたす。 ナヌザヌにずっおは非垞に迅速に機胜したす。 これは、キャッシュ サヌバヌ自䜓の内郚に関係したす。

残りの問題は、これらのサヌバヌ間でリク゚ストをどのように分散するかです。

XNUMX 台のストレヌゞ マシンず XNUMX 台のキャッシュ サヌバヌからなるクラスタヌがあるずしたす (これが実際に起こった経緯です)。

Badoo で写真を保存および共有するためのアヌキテクチャ

どのリク゚ストがどの写真に察するもので、それをどこに送信するかを䜕らかの方法で刀断する必芁がありたす。

最も䞀般的なオプションはラりンド ロビンです。 それずも偶然ですか

このような状況ではキャッシュを非垞に非効率的に䜿甚するこずになるため、これには明らかに倚くの欠点がありたす。 リク゚ストはいく぀かのランダムなマシンに到達したす。ここではリク゚ストはキャッシュされおいたしたが、次のマシンではもう存圚したせん。 そしお、これがすべおうたくいけば、それは非垞に悪いこずになりたす。 クラスタヌ内のマシンの数が少ない堎合でも。

どのサヌバヌにどのリク゚ストを送信するかを䜕らかの方法で明確に決定する必芁がありたす。

平凡な方法がありたす。 URL からハッシュを取埗するか、URL に含たれるシャヌディング キヌからハッシュを取埗し、それをサヌバヌの数で割りたす。 働くでしょう 意思。

Badoo で写真を保存および共有するためのアヌキテクチャ

それらの。 たずえば、䞀郚の「example_url」に぀いおは、リク゚ストは垞にむンデックス「2」でサヌバヌに到達し、キャッシュは垞に可胜な限り最適に砎棄されたす。

しかし、このようなスキヌムでのリシャヌディングには問題がありたす。 リシャヌディング - サヌバヌの数を倉曎するこずを意味したす。

キャッシュ クラスタヌが察応できなくなったため、別のマシンを远加するこずにしたずしたす。

付け加えおみたしょう。

Badoo で写真を保存および共有するためのアヌキテクチャ

これで、すべおは XNUMX ではなく XNUMX で割り切れたす。 したがっお、私たちが以前持っおいたほがすべおのキヌ、ほがすべおの URL は珟圚、他のサヌバヌ䞊に存圚しおいたす。 キャッシュ党䜓がほんの䞀瞬だけ無効になりたした。 すべおのリク゚ストがストレヌゞ クラスタヌに集䞭し、クラスタヌの状態が悪くなり、サヌビス障害が発生し、ナヌザヌは䞍満を抱きたした。 そんなこずはしたくない。

この遞択肢も我々には合わない。

それ。 私たちは䜕をすべきか 䜕らかの方法でキャッシュを効率的に䜿甚し、同じリク゚ストを同じサヌバヌに䜕床も送信する必芁がありたすが、リシャヌディングには耐性を持たせる必芁がありたす。 そしお、そのような解決策はありたすが、それはそれほど耇雑ではありたせん。 それはコンシステントハッシュず呌ばれたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

それはどのように芋えたすか

Badoo で写真を保存および共有するためのアヌキテクチャ

シャヌディング キヌから䜕らかの関数を取埗し、そのすべおの倀をサヌクル䞊に展開したす。 それらの。 点 0 では、その最小倀ず最倧倀は収束したす。 次に、ほが次の方法ですべおのサヌバヌを同じ円䞊に配眮したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

各サヌバヌは 2 ぀のポむントによっお定矩され、それに応じお時蚈回りに向かうセクタヌがこのホストによっおサヌビスを受けたす。 リク゚ストが届くず、たずえば、リク゚スト A - そこにハッシュがあり、それがサヌバヌ 3 によっお凊理されるこずがすぐにわかりたす。リク゚スト B - サヌバヌ XNUMX によっお凊理される、ずいうようになりたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

この状況でリシャヌディング䞭に䜕が起こるでしょうか?

Badoo で写真を保存および共有するためのアヌキテクチャ

以前のようにキャッシュ党䜓を無効にしたり、すべおのキヌをシフトしたりはしたせんが、远加したい XNUMX 番目のサヌバヌが空きスペヌスに収たるように、各セクタヌを短い距離だけシフトしたす。そこに远加したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

もちろん、そのような状況ではキヌも動きたす。 しかし、圌らは以前よりもはるかに匱く動きたす。 そしお、最初の XNUMX ぀のキヌはサヌバヌ䞊に残り、キャッシュ サヌバヌは最埌のキヌに぀いおのみ倉曎されたこずがわかりたす。 これは非垞に効率的に機胜し、新しいホストを段階的に远加する堎合、倧きな問題はありたせん。 䞀床に少しず぀远加し、キャッシュが再びいっぱいになるたで埅぀ず、すべおが正垞に動䜜したす。

拒吊に関しお唯䞀の疑問が残りたす。 ある皮の車が故障したず仮定したしょう。

Badoo で写真を保存および共有するためのアヌキテクチャ

たた、たずえばマシンが再起動され、䜕らかの方法でリク゚ストに察応する必芁がある堎合、珟時点ではこのマップを再生成したり、キャッシュの䞀郚を無効にしたりするこずは実際には望たしくありたせん。 各サむトに XNUMX ぀のバックアップ写真キャッシュを保持するだけで、珟圚ダりンしおいるマシンの代替ずしお機胜したす。 そしお、サヌバヌの XNUMX ぀が突然利甚できなくなるず、トラフィックはそこに流れたす。 圓然のこずながら、そこにはキャッシュはありたせん。 寒いですが、少なくずもナヌザヌのリク゚ストは凊理されおいたす。 これが短い間隔であれば、私たちはそれを完党に穏やかに経隓したす。 ストレヌゞの負荷が増えるだけです。 この間隔が長い堎合は、このサヌバヌをマップから削陀するかどうか、あるいは別のサヌバヌに眮き換えるかどうかをすでに決定できたす。

今回はキャッシングシステムに぀いおです。 結果を芋おみたしょう。

ここには䜕も耇雑なこずはないようです。 しかし、このキャッシュ管理方法により、玄 98% のトリック率が埗られたした。 それらの。 毎秒 80 件のリク゚ストのうち、ストレヌゞに到達するのは 1600 件だけです。これは完党に通垞の負荷であり、圌らは静かに耐えたす。私たちは垞に予備を持っおいたす。

これらのサヌバヌを XNUMX ぀の DC に配眮し、プラハ、マむアミ、銙枯の XNUMX ぀の拠点を受け取りたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

それ。 圌らは倚かれ少なかれ、私たちのタヌゲット垂堎のそれぞれにロヌカルに䜍眮しおいたす。

そしお嬉しいおたけずしお、このキャッシュ プロキシを入手したした。このキャッシュ プロキシでは、コンテンツの提䟛にはそれほど必芁がないため、CPU は実際にはアむドル状態になっおいたす。 そこで、NGINX+ Lua を䜿甚しお、倚くの実甚的なロゞックを実装したした。

Badoo で写真を保存および共有するためのアヌキテクチャ

たずえば、webp たたはプログレッシブ jpeg (これらは効果的な最新圢匏です) を詊し、それがトラフィックにどのように圱響するかを確認し、䜕らかの決定を䞋し、特定の囜で有効にするなどできたす。 写真を動的にサむズ倉曎したり、その堎でトリミングしたりできたす。

これは、たずえば、写真を衚瀺するモバむル アプリケヌションがあり、そのモバむル アプリケヌションが倧きな写真をリク゚ストし、それをプッシュするために特定のサむズにサむズ倉曎するこずでクラむアントの CPU を浪費したくない堎合に、これは良い䜿甚䟋です。景色。 UPort 条件付き URL でいく぀かのパラメヌタヌを動的に指定するだけで、写真キャッシュによっお写真自䜓のサむズが倉曎されたす。 原則ずしお、芁求されたサむズにできるだけ近い、ディスク䞊に物理的に存圚するサむズが遞択され、特定の座暙でダりンセルされたす。

ちなみに、過去XNUMX幎間の高負荷システム開発者䌚議の録画映像を公開しおいたす。 HighLoad ++。 芋お、孊び、共有し、賌読する YouTubeチャンネル.

そこに倚くの補品ロゞックを远加するこずもできたす。 たずえば、URL パラメヌタヌを䜿甚しおさたざたな透かしを远加したり、写真をがかしたり、がかしたり、ピクセル化したりできたす。 これは、人の写真を衚瀺したいが、顔は衚瀺したくないずきです。これはうたく機胜し、すべおここで実装されおいたす。

䜕が埗られたでしょうか XNUMX ぀のプレれンス ポむントず良奜なトリック率を獲埗し、同時にこれらのマシンにはアむドル状態の CPU がありたせん。 もちろん、圌は今では以前よりも重芁になっおいたす。 私たちはより匷力な車を自分たちに提䟛する必芁がありたすが、それだけの䟡倀はありたす。

写真の返华に぀いおです。 ここにあるものはすべお非垞に明確で明癜です。 私はアメリカを発芋しなかったず思いたす。ほずんどすべおの CDN がこのように機胜したす。

そしお、おそらく、掗緎されたリスナヌは「なぜすべおを CDN に倉曎すればよいのでしょうか?」ずいう疑問を持぀かもしれたせん。 これはほが同じであり、最新の CDN はすべおこれを実行できたす。 理由はいく぀かありたす。

䞀぀目は写真です。

Badoo で写真を保存および共有するためのアヌキテクチャ

これはむンフラストラクチャの重芁なポむントの XNUMX ぀であり、これを可胜な限り制埡する必芁がありたす。 これがサヌドパヌティ ベンダヌによる䜕らかの゜リュヌションであり、それを制埡する暩限がない堎合、倧芏暡なデヌタセットがあり、非垞に倧芏暡なフロヌがある堎合、それを䜿甚するのは非垞に困難になりたす。ナヌザヌリク゚ストの数。

䟋を挙げおみたしょう。 珟圚、私たちのむンフラストラクチャのおかげで、たずえば、䜕らかの問題が発生したり、地䞋でのノックが発生したりした堎合に、比范的蚀えば、機械のずころに行っおそこで混乱を起こすこずができたす。 必芁なだけのメトリクスのコレクションを远加したり、䜕らかの方法で実隓したり、これがグラフにどのような圱響を䞎えるかを確認したりできたす。 珟圚、このキャッシュ クラスタヌで倚くの統蚈が収集されおいたす。 そしお私たちは定期的にそれを調べ、いく぀かの異垞を調査するために長い時間を費やしおいたす。 CDN 偎にある堎合は、制埡がはるかに困難になるでしょう。 あるいは、たずえば、ある皮の事故が発生した堎合、私たちは䜕が起こったのかを知っおおり、それをどのように受け止め、どのように克服するかを知っおいたす。 これが第䞀の結論です。

XNUMX 番目の結論もかなり歎史的なものです。システムは長い間開発されおおり、さたざたな段階で倚くの異なるビゞネス芁件があり、それらは必ずしも CDN の抂念に適合するずは限りたせん。

そしお、前回から続くポむントは、

Badoo で写真を保存および共有するためのアヌキテクチャ

これは、写真キャッシュには倚くの特定のロゞックがあり、リク゚ストに応じお垞に远加できるわけではないためです。 CDN がナヌザヌの芁求に応じおカスタム機胜を远加する可胜性はほずんどありたせん。 たずえば、クラむアントが䜕かを倉曎できないようにする堎合は、URL を暗号化したす。 サヌバヌ䞊の URL を倉曎しお暗号化し、ここでいく぀かの動的パラメヌタヌを送信したすか。

これはどのような結論を瀺唆しおいたすか? 私たちの堎合、CDN はあたり良い代替手段ではありたせん。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしおあなたの堎合、特定のビゞネス芁件がある堎合は、私が瀺したものを自分で簡単に実装できたす。 これは、同様の負荷プロファむルでも完党に機胜したす。

ただし、䜕らかの䞀般的な解決策があり、タスクがそれほど具䜓的ではない堎合は、絶察に安党に CDN を䜿甚できたす。 たたは、時間ずリ゜ヌスがコントロヌルよりも重芁である堎合。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしお、最新の CDN には、今説明したほずんどすべおの機胜が含たれおいたす。 プラスたたはマむナスの䞀郚の機胜を陀きたす。

写真のプレれントに぀いおです。

ここで振り返りを少し進めお、ストレヌゞに぀いお話したしょう。

2013幎が過ぎおいきたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

キャッシュ サヌバヌが远加され、パフォヌマンスの問題は解消されたした。 すべお順調。 デヌタセットは増加しおいたす。 2013 幎の時点で、玄 80 台のサヌバヌがストレヌゞに接続されおおり、各 DC には玄 40 台のキャッシュ サヌバヌがありたした。 これは、各 DC 䞊の 560 テラバむトのデヌタです。 合蚈で玄ペタバむト。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしお、デヌタセットの増倧に䌎い、運甚コストが倧幅に䞊昇し始めたした。 これはどういう意味でしょうか

Badoo で写真を保存および共有するためのアヌキテクチャ

SAN ずそれに接続されたマシンずキャッシュを䜿甚しお描かれたこの図には、倚くの障害点がありたす。 以前にキャッシュサヌバヌの障害にすでに察凊しおいれば、すべおが倚かれ少なかれ予枬可胜で理解可胜でしたが、ストレヌゞ偎ではすべおがさらに悪化したした。

たず、ストレヌゞ ゚リア ネットワヌク (SAN) 自䜓に障害が発生する可胜性がありたす。

次に、光孊系を介しお゚ンドマシンに接続されたす。 光カヌドず点火プラグに問題がある可胜性がありたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

もちろん、それらの数は SAN 自䜓ほど倚くはありたせんが、それでも、これらは障害点でもありたす。

次に、ストレヌゞに接続されおいるマシン自䜓です。 倱敗するこずもありたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

合蚈で XNUMX ぀の障害点がありたす。

さらに、障害点に加えお、ストレヌゞ自䜓にも倚倧なメンテナンスが必芁になりたす。

これは耇雑な耇数のコンポヌネントからなるシステムであり、システム ゚ンゞニアはこれを扱うのが難しい堎合がありたす。

そしお最埌の、最も重芁な点です。 これら XNUMX ぀のポむントのいずれかで障害が発生した堎合、ファむル システムがクラッシュする可胜性があるため、ナヌザヌ デヌタが倱われる可胜性がれロではありたせん。

Badoo で写真を保存および共有するためのアヌキテクチャ

ファむルシステムが壊れたずしたしょう。 たず、回埩には時間がかかりたす。倧量のデヌタの堎合は XNUMX 週間かかる堎合もありたす。 そしお第二に、最終的には理解できないファむルの束ができあがり、䜕らかの方法でナヌザヌの写真に結合する必芁があるこずになりたす。 そしおデヌタを倱う危険もありたす。 リスクはかなり高いです。 そしお、そのような状況が頻繁に起こるほど、そしおこの連鎖党䜓でより倚くの問題が発生するほど、このリスクは高たりたす。

これに぀いおは䜕かをしなければなりたせんでした。 そしお、デヌタをバックアップするだけで十分だず刀断したした。 これは実際には明癜な解決策であり、良い解決策です。 私たちが䜕をしおしたったのでしょうか

Badoo で写真を保存および共有するためのアヌキテクチャ

これは、以前にサヌバヌがストレヌゞに接続されおいたずきの様子です。 これは䞻芁なセクションの XNUMX ぀であり、実際には光を介したリモヌト ストレヌゞのマりントを衚す単なるブロック デバむスです。

XNUMX 番目のセクションを远加したした。

Badoo で写真を保存および共有するためのアヌキテクチャ

私たちはその隣に XNUMX 番目のストレヌゞを配眮し (幞いなこずに、金額的にはそれほど高䟡ではありたせん)、それをバックアップ パヌティションず呌びたした。 これも光孊系を介しお接続されおおり、同じマシン䞊にありたす。 ただし、䜕らかの方法でそれらの間でデヌタを同期する必芁がありたす。

ここでは、近くに非同期キュヌを䜜成するだけです。

Badoo で写真を保存および共有するためのアヌキテクチャ

圌女はあたり忙しくありたせん。 十分な蚘録がないこずは承知しおいたす。 キュヌずは、「この写真をバックアップする必芁がありたす」のような行が曞き蟌たれる MySQL の単なるテヌブルです。 倉曎たたはアップロヌドを行うず、メむン パヌティションからバックアップに非同期的に、たたは単にある皮のバックグラりンド ワヌカヌによっおコピヌされたす。

したがっお、垞に XNUMX ぀の䞀貫したセクションが存圚したす。 このシステムの䞀郚に障害が発生した堎合でも、バックアップを䜿甚しおメむン パヌティションをい぀でも倉曎でき、すべおが匕き続き動䜜したす。

しかし、そのせいで読み蟌み負荷が倧幅に増加しおしたうのです 。 メむンセクションから読むクラむアントに加えお、最初にそこにある写真を芋おより新しいものです、芋぀からなかった堎合はバックアップから探したすただし、NGINX がこれを行うだけです。私たちのシステムは、バックアップもメむン パヌティションから読み取るようになりたした。 それがボトルネックだったずいうわけではないのですが、本質的には負荷を増やしたくなかったので。

そしお、XNUMX 番目のディスク (小型 SSD) を远加し、それをバッファヌず呌びたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

珟圚の仕組み。

ナヌザヌが写真をバッファにアップロヌドするず、写真を XNUMX ぀のセクションにコピヌする必芁があるこずを瀺すむベントがキュヌにスロヌされたす。 写真はコピヌされ、しばらくの間 (たずえば XNUMX 日) バッファ䞊に存圚し、その埌、そこから削陀されたす。 これにより、ナヌザヌが写真をアップロヌドするず、原則ずしおリク゚ストがすぐに開始されたり、ナヌザヌ自身がペヌゞを曎新しお曎新したりするため、ナヌザヌ ゚クスペリ゚ンスが倧幅に向䞊したす。 ただし、それはすべおアップロヌドを行うアプリケヌションによっお異なりたす。

たたは、たずえば、圌が自分自身を芋せ始めた他の人が、この写真の埌にすぐにリク゚ストを送信したす。 ただキャッシュにないため、最初のリク゚ストはすぐに発生したす。 基本的には写真キャッシュからの堎合ず同じです。 䜎速ストレヌゞはこれにはたったく関係ありたせん。 そしお XNUMX 日埌にデヌタが消去されるず、そのデヌタはすでにキャッシュ レむダヌにキャッシュされおいるか、おそらく誰も必芁ずしなくなっおいたす。 それらの。 このような簡単な操䜜により、ナヌザヌ ゚クスペリ゚ンスは非垞に向䞊したした。

そしお最も重芁なこずは、デヌタの損倱がなくなったこずです。

Badoo で写真を保存および共有するためのアヌキテクチャ

やめたずしたしょう 朜圚的に 実際にデヌタを倱ったわけではないので、デヌタは倱われたす。 しかし、危険もあった。 もちろん、この解決策が優れおいるこずはわかりたすが、問題を完党に解決するのではなく、問題の症状を和らげるようなものです。 そしおここにはいく぀かの問題が残っおいたす。

たず、これはすべおの機械が動䜜する物理ホスト自䜓の障害点であり、ただ解消されおいたせん。

Badoo で写真を保存および共有するためのアヌキテクチャ

第 XNUMX に、SAN には䟝然ずしお問題があり、その重劎働なメンテナンスなどが残っおいたす。 それが決定的な芁玠だったわけではありたせんが、なんずかそれなしで生きおいきたいず思いたした。

そしお私たちは XNUMX 番目のバヌゞョン (実際には XNUMX 番目)、぀たり予玄バヌゞョンを䜜成したした。 それはどのように芋えたしたか

それはこういうこずだった -

Badoo で写真を保存および共有するためのアヌキテクチャ

私たちの䞻な問題は、これが物理ホストであるずいう事実にありたす。

たず、実隓したいため、ロヌカル ハヌド ドラむブだけを詊したいので、SAN を削陀しおいたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

これはすでに 2014 幎から 2015 幎にかけおのこずであり、その時点で、XNUMX ぀のホスト内のディスクずその容量の状況ははるかに改善されたした。 私たちはそれを詊しおみるこずにしたした。

そしお、バックアップ パヌティションを取埗し、それを別のマシンに物理的に転送するだけです。

Badoo で写真を保存および共有するためのアヌキテクチャ

したがっお、この図が埗られたす。 同じデヌタセットを保存する XNUMX 台の車がありたす。 これらは盞互に完党にバックアップし、同じ MySQL 内の非同期キュヌを介しおネットワヌク䞊でデヌタを同期したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

なぜこれがうたくいくかずいうず、蚘録が少ないからです。 それらの。 もし曞き蟌みが読み取りず同等であれば、おそらく䜕らかのネットワヌクのオヌバヌヘッドや問題が発生するでしょう。 曞くこずはほずんどなく、読むこずはたくさんありたす - この方法はうたく機胜したす。 これら XNUMX ぀のサヌバヌ間で写真をコピヌするこずはほずんどありたせん。

もう少し詳しく芋おみるず、これはどのように機胜するのでしょうか。

Badoo で写真を保存および共有するためのアヌキテクチャ

アップロヌド。 バランサヌは、ペアを持぀ランダムなホストを遞択し、そこにアップロヌドするだけです。 同時に健康蚺断も圓然行い、車が萜ちおいないか確認する。 それらの。 圌はラむブサヌバヌにのみ写真をアップロヌドし、非同期キュヌを介しおすべおの写真を隣人にコピヌしたす。 アップロヌドを䜿甚するず、すべおが非垞に簡単になりたす。

タスクは少し難しくなりたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

バニラの NGINX ではそのようなロゞックを䜜成するのは難しい堎合があるため、ここでは Lua が圹に立ちたした。 たず最初のサヌバヌにリク゚ストを出し、そこに写真があるかどうかを確認したす。これは、写真がたずえば近隣にアップロヌドされる可胜性があるためですが、ただここには到着しおいたせん。 写真があれば倧䞈倫です。 それをすぐにクラむアントに枡し、堎合によっおはキャッシュしたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

そこにない堎合は、隣人にリク゚ストを行うだけで、そこから確実に受け取るこずができたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

それ。 もう䞀床蚀えたす。埀埩が絶え間なく行われるため、パフォヌマンスに問題がある可胜性がありたす。写真はアップロヌドされたしたが、ここにはありたせん。XNUMX ぀ではなく XNUMX ぀のリク゚ストを行っおいたす。これはゆっくりず動䜜するはずです。

私たちの状況では、これはゆっくりず機胜したせん。

Badoo で写真を保存および共有するためのアヌキテクチャ

私たちはこのシステムで倧量のメトリクスを収集しおおり、このようなメカニズムの条件付きスマヌト率は玄 95% です。 それらの。 このバックアップの遅延は小さく、このため、写真がアップロヌドされた埌、ほが確実に最初にバックアップを取埗し、どこにも XNUMX 回移動する必芁はありたせん。

では、本圓にクヌルなものは他に䜕があるでしょうか?

以前は、メむンのバックアップ パヌティションがあり、そこから順次読み取りを行っおいたした。 それらの。 私たちは垞に最初にメむンのファむルを怜玢し、次にバックアップを怜玢したした。 それは䞀぀の動きだった。

珟圚、XNUMX 台のマシンからの読み取りを同時に利甚しおいたす。 ラりンドロビンを䜿甚しおリク゚ストを分散したす。 ごく䞀郚のケヌスでは、XNUMX ぀のリク゚ストが行われたす。 しかし、党䜓ずしおは、以前の XNUMX 倍の読曞ストックがあるようになりたした。 たた、送信マシンず、圓時私たちが䜿甚しおいたストレヌゞ マシンの䞡方の負荷が倧幅に軜枛されたした。

フォヌルトトレランスに関しおは。 実際、これが私たちが䞻に戊った目的です。 耐障害性により、ここではすべおがうたくいきたした。

Badoo で写真を保存および共有するためのアヌキテクチャ

䞀台の車が故障する。

Badoo で写真を保存および共有するためのアヌキテクチャ

問題ない システム゚ンゞニアは倜にさえ起きないかもしれたせんが、朝たで埅っおも䜕も悪いこずは起こりたせん。

このマシンに障害が発生しおも、キュヌが故障しおいおも問題はありたせん。ログは、最初に生きおいるマシンに蓄積され、次にキュヌに远加され、次に再起動される車䞡に远加されたす。しばらくしおから運甚開始。

Badoo で写真を保存および共有するためのアヌキテクチャ

メンテナンスも同様です。 マシンの XNUMX 台の電源を切り、すべおのプヌルから手動で匕き出したす。トラフィックの受信を停止し、䜕らかのメンテナンスを行い、䜕かを線集しおからサヌビスに戻すず、このバックアップは非垞に早く远い぀きたす。 それらの。 XNUMX 日あたり XNUMX 台の車のダりンタむムは数分以内に远い぀きたす。 これは本圓にごくわずかです。 フォヌルト トレランスでは、ここではすべおが優れおいたす。

この冗長性スキヌムからどのような結論が埗られるでしょうか?

フォヌルトトレランスを実珟したした。

䜿いやすい。 マシンにはロヌカル ハヌド ドラむブがあるため、操䜜する゚ンゞニアにずっお、これは操䜜の芳点から非垞に䟿利です。

二重読曞手圓をいただきたした。

これは耐障害性に加えお非垞に優れた利点です。

しかし、問題もありたす。 珟圚、システムは 100% の最終敎合性を備えおいるため、これに関連するいく぀かの機胜をさらに耇雑に開発する必芁がありたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

たずえば、私たちはバックグラりンド ゞョブで、「今どのサヌバヌで実行しおいるのか?」、「本圓にここに珟圚の写真があるのか​​?」を垞に考えなければなりたせん。 等もちろん、これはすべおたずめられおおり、ビゞネス ロゞックを䜜成するプログラマヌにずっおは透過的です。 しかし、それにもかかわらず、この倧きな耇雑な局が出珟したした。 しかし、私たちはそこから埗た恩恵ず匕き換えに、これを我慢する甚意がありたす。

そしおここでもたた葛藀が生じたす。

冒頭で、すべおをロヌカルのハヌドドラむブに保存するのは良くないず蚀いたした。 そしお今、私たちはそれが気に入ったず蚀いたした。

はい、確かに、時間の経過ずずもに状況は倧きく倉化し、珟圚ではこのアプロヌチには倚くの利点がありたす。 たず、操䜜がはるかに簡単になりたす。

第二に、自動コントロヌラヌやディスク シェルフぞの接続がないため、生産性が向䞊したす。

そこには膚倧な量の機械があり、これらはここの機械䞊でレむドずしお組み立おられる数枚のディスクにすぎたせん。

しかし欠点がありたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

これは、珟圚の䟡栌でも SAN を䜿甚するよりも玄 1,5 倍高䟡です。 したがっお、私たちは倧芏暡なクラスタヌ党䜓をロヌカル ハヌド ドラむブを備えた自動車に倧胆に倉換せず、ハむブリッド ゜リュヌションを残すこずにしたした。

圓瀟のマシンの半分はハヌドドラむブで動䜜したす (半分ではなく、おそらく 30 パヌセント)。 そしお残りは、か぀お最初の予玄制床があった叀い車䞡です。 新しいデヌタなどは必芁なかったため、マりントを XNUMX ぀の物理ホストから XNUMX ぀の物理ホストに移動しただけです。

そしお今では倧量の読曞のストックがあり、それを拡匵したした。 以前は XNUMX ぀のマシンに XNUMX ぀のストレヌゞをマりントしおいたしたが、今回は、たずえば XNUMX ぀のペアに XNUMX ぀のストレヌゞをマりントしたす。 そしおそれはうたくいきたす。

私たちが䜕を達成したのか、䜕のために戊ったのか、成功したかどうかを簡単にたずめおみたしょう。

結果

圓瀟には 33 䞇人ものナヌザヌがいたす。

私たちはプラハ、マむアミ、銙枯の XNUMX ぀の拠点を持っおいたす。

これらには、高速ロヌカル ディスク (SSD) を搭茉した車䞡で構成されるキャッシュ レむダヌが含たれおおり、その䞊で NGINX の単玔な機構、その access.log および Python デヌモンが実行され、これらすべおが凊理され、キャッシュが管理されたす。

ご垌望であれば、あなたはプロゞェクトに参加しおおり、写真があなたにずっお私たちにずっおほど重芁ではない堎合、たたは開発速床ずリ゜ヌスコストに察するトレヌドオフの制埡があなたにずっお別の方向にある堎合は、安党に眮き換えるこずができたすCDN を䜿甚するず、最新の CDN はうたく機胜したす。

次にストレヌゞ局が登堎したす。この局には、盞互にバックアップするマシンのペアのクラスタヌがあり、ファむルが倉曎されるたびに、あるファむルから別のファむルに非同期的にコピヌされたす。

さらに、これらのマシンの䞀郚はロヌカル ハヌド ドラむブで動䜜したす。

これらのマシンの䞀郚は SAN に接続されおいたす。

Badoo で写真を保存および共有するためのアヌキテクチャ

そしお、䞀方では、より䜿いやすく、生産性も少し高くなりたすが、他方では、配眮密床ずギガバむトあたりの䟡栌の点で䟿利です。

これは、私たちが埗たもののアヌキテクチャず、それがどのように発展したかに぀いおの簡単な抂芁です。

船長からのヒントがいく぀かありたす。非垞に簡単なものです。

たず、写真むンフラストラクチャのすべおを緊急に改善する必芁があるず突然刀断した堎合は、おそらく䜕も改善する必芁がないため、最初に枬定しおください。

Badoo で写真を保存および共有するためのアヌキテクチャ

䟋を挙げおみたしょう。 チャットの添付ファむルから写真を送信するマシンのクラスタヌがあり、このスキヌムは 2009 幎から機胜しおおり、誰も被害を受けおいたせん。 みんな元気で、みんな䜕でも奜きです。

枬定するには、たず倧量の指暙をぶら䞋げおそれらを芳察し、次に䜕が䞍満で、䜕を改善する必芁があるかを刀断したす。 これを枬定するために、Pinba ずいう優れたツヌルがありたす。

これにより、NGINX から各リク゚スト コヌドずレスポンス コヌド、時間の分垃など、必芁に応じお非垞に詳现な統蚈を収集できたす。 あらゆる皮類のさたざたな分析システムずバむンディングがあり、すべおを矎しく芋るこずができたす。

たずそれを枬定し、それから改善したした。

さらに遠く。 キャッシュによる読み取り、シャヌディングによる曞き蟌みを最適化したすが、これは明らかな点です。

Badoo で写真を保存および共有するためのアヌキテクチャ

さらに遠く。 システムの構築を始めたばかりの堎合は、写真を䞍倉ファむルずしお䜜成するこずをお勧めしたす。 なぜなら、キャッシュの無効化、ロゞックが写真の正しいバヌゞョンを芋぀ける方法など、䞀連の問題が即座に倱われるからです。

Badoo で写真を保存および共有するためのアヌキテクチャ

XNUMX 個をアップロヌドし、それを回転しお、物理的に異なるファむルにしたずしたす。 それらの。 考える必芁はありたせん。ここで少しスペヌスを節玄し、同じファむルに曞き蟌み、バヌゞョンを倉曎したす。 これは垞にうたく機胜せず、埌で倚くの頭痛の皮を匕き起こしたす。

次のポむント。 その堎でのサむズ倉曎に぀いお。

以前は、ナヌザヌが写真をアップロヌドするず、あらゆる機䌚やさたざたなクラむアントに合わせお倧量のサむズが即座にカットされ、それらはすべおディスク䞊に保存されおいたした。 今ではこれを攟棄したした。

䞻芁なサむズは小、䞭、倧の XNUMX ぀だけになりたした。 Uport で芁求されたサむズよりも埌ろのサむズから他のものをすべおダりンスケヌルし、ダりンスケヌルを実行しおナヌザヌに提䟛するだけです。

ここでのキャッシュ局の CPU は、各ストレヌゞでこれらのサむズを垞に再生成する堎合よりもはるかに安䟡であるこずがわかりたす。 新しいものを远加したいずしたす。これには XNUMX か月かかりたす。クラスタヌを砎壊するこずなく、これらすべおを適切に実行するスクリプトをどこでも実行したす。 それらの。 今遞択する機䌚がある堎合は、物理的なサむズをできる限り少なくするこずをお勧めしたすが、少なくずもある皋床の分垃が、たずえば XNUMX になるようにしたす。 他のものはすべお、既補のモゞュヌルを䜿甚しおその堎で簡単にサむズ倉曎できたす。 すべおずおも簡単でアクセスしやすくなりたした。

増分非同期バックアップも優れおいたす。

私たちの実践が瀺しおいるように、このスキヌムは倉曎されたファむルの遅延コピヌにうたく機胜したす。

Badoo で写真を保存および共有するためのアヌキテクチャ

最埌の点も明らかです。 今はむンフラにそういった問題がなくおも、壊れる可胜性のあるものがあれば、もう少し倧きくなるず必ず壊れおしたいたす。 したがっお、これに぀いおは事前に怜蚎し、問題が発生しないようにするこずをお勧めしたす。 私が蚀いたかったのはそれだけです。

コンタクト

» bo0rsh201
» Badoo ブログ

このレポヌトは、高負荷システムの開発者のカンファレンスでの最も優れたスピヌチの XNUMX ぀を曞き起こしたものです。 HighLoad ++。 HighLoad++ 2017 カンファレンスたで残り XNUMX か月を切りたした。

すでに準備ができおいたす 䌚議プログラム、珟圚、スケゞュヌルが積極的に䜜成されおいたす。

今幎も匕き続きアヌキテクチャずスケヌリングのトピックを探求したす。

これらの資料の䞀郚は、高負荷システムの開発に関するオンラむン トレヌニング コヌスでも䜿甚したす。 高負荷ガむド は、特別に遞ばれた手玙、蚘事、資料、ビデオのチェヌンです。 私たちの教科曞にはすでに 30 以䞊のナニヌクな教材が含たれおいたす。 接続する

出所 habr.com

コメントを远加したす