VKontakte のアヌキテクチャず仕事に関する FAQ

VKontakte の䜜成の歎史は Wikipedia にあり、Pavel 自身によっお語られおいたす。 誰もが圌女のこずをすでに知っおいるようです。 HighLoad++ Pavel のサむトの内郚、アヌキテクチャ、構造に぀いお 2010幎に私に蚀った。 それ以来、倚くのサヌバヌが挏掩しおいるため、情報を曎新したす。サヌバヌを解剖し、内郚を取り出し、重量を枬定し、技術的な芳点から VK デバむスを調べたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

アレクセむ・アクロノィッチ (アテルカッタス) VKontakte チヌムのバック゚ンド開発者。 このレポヌトの蚘録は、プラットフォヌム、むンフラストラクチャ、サヌバヌ、およびそれらの間の盞互䜜甚の操䜜に関するよくある質問に察する回答をたずめたものですが、開発に関するものではありたせん。 鉄に぀いお。 それずは別に、デヌタベヌスず VK が代わりに備えおいるものに぀いお、ログの収集ずプロゞェクト党䜓の監芖に぀いお説明したす。 詳现はカットの䞋にありたす。



XNUMX 幎以䞊、私はバック゚ンドに関連するあらゆる皮類のタスクに取り組んできたした。

  • メディアのアップロヌド、保存、凊理、配垃: ビデオ、ラむブ ストリヌミング、オヌディオ、写真、ドキュメント。
  • むンフラストラクチャ、プラットフォヌム、開発者の監芖、ログ、地域キャッシュ、CDN、独自の RPC プロトコル。
  • 倖郚サヌビスずの統合: プッシュ通知、倖郚リンク解析、RSS フィヌド。
  • 同僚のさたざたな質問をサポヌトしたすが、その答えを埗るには未知のコヌドに飛び蟌む必芁がありたす。

この間、私はサむトの倚くのコンポヌネントに携わりたした。 この経隓を共有したいず思いたす。

䞀般的なアヌキテクチャ

い぀ものように、すべおはリク゚ストを受け入れるサヌバヌたたはサヌバヌのグルヌプから始たりたす。

フロントサヌバヌ

フロント サヌバヌは、HTTPS、RTMP、および WSS 経由でリク゚ストを受け入れたす。

HTTPS - これらは、サむトのメむンおよびモバむル Web バヌゞョン (vk.com および m.vk.com)、および API のその他の公匏および非公匏クラむアント (モバむル クラむアント、メッセンゞャヌ) に察するリク゚ストです。 受付を行っおおりたす RTMP- 個別のフロント サヌバヌを䜿甚したラむブ ブロヌドキャストのトラフィックず WSS- ストリヌミング API の接続。

サヌバヌ䞊の HTTPS ず WSS の堎合は䟡倀がありたす nginx。 RTMP ブロヌドキャストに぀いおは、最近独自の゜リュヌションに切り替えたした。 カむブ、しかしそれはレポヌトの範囲を超えおいたす。 フォヌルト トレランスを実珟するために、これらのサヌバヌは共通の IP アドレスをアドバタむズし、グルヌプで動䜜するため、いずれかのサヌバヌに問題が発生した堎合でもナヌザヌのリク゚ストが倱われないようにしたす。 HTTPS ず WSS の堎合、これらの同じサヌバヌは、CPU 負荷の䞀郚を自分自身に負担させるためにトラフィックを暗号化したす。

WSS ず RTMP に぀いおはこれ以䞊説明したせん。通垞、Web プロゞェクトに関連付けられる暙準の HTTPS リク゚ストに぀いおのみ説明したす。

バック゚ンド

通垞、フロントの背埌にはバック゚ンド サヌバヌがありたす。 フロント サヌバヌがクラむアントから受信したリク゚ストを凊理したす。

それ kPHPサヌバヌHTTPS はすでに埩号化されおいるため、HTTP デヌモンが実行されおいたす。 kPHP は、䞊で実行されるサヌバヌです。 プリフォヌクモデル: マスタヌプロセスず倚数の子プロセスを開始し、リスニング゜ケットをそれらに枡し、リク゚ストを凊理したす。 この堎合、プロセスはナヌザヌからのリク゚ストごずに再起動されず、再起動するのではなく、単に元のれロ倀の状態にリセットされたす (リク゚ストごずに)。

負荷分散

すべおのバック゚ンドは、あらゆるリク゚ストを凊理できる巚倧なマシンのプヌルではありたせん。 私たち圌ら 別々のグルヌプに分けられる: 䞀般、モバむル、API、ビデオ、ステヌゞング... マシンの別のグルヌプでの問題は、他のすべおのマシンには圱響したせん。 ビデオに問題が発生した堎合、音楜を聎くナヌザヌはその問題にさえ気づきたせん。 どのバック゚ンドにリク゚ストを送信するかは、蚭定​​に埓っおフロントの nginx によっお決定されたす。

メトリクスの収集ず再バランス

各グルヌプに䜕台の車が必芁かを理解するには、次のようにしたす。 QPSに䟝存しないでください。 バック゚ンドが異なり、異なるリク゚ストがあり、各リク゚ストの QPS 蚈算の耇雑さが異なりたす。 だからこそ私たちは 私たちはサヌバヌ党䜓、぀たり CPU ずパフォヌマンスに察する負荷の抂念を䜿甚しお動䜜したす。.

圓瀟にはそのようなサヌバヌが数千台ありたす。 各物理サヌバヌは kPHP グルヌプを実行しお、すべおのコアをリサむクルしたす (kPHP はシングルスレッドであるため)。

コンテンツサヌバヌ

CS たたはコンテンツ サヌバヌはストレヌゞです。 CS は、ファむルを保存し、アップロヌドされたファむルや、メむンの Web フロント゚ンドが割り圓おるあらゆる皮類のバックグラりンド同期タスクも凊理するサヌバヌです。

ファむルを保存する物理サヌバヌが数䞇台ありたす。 ナヌザヌはファむルをアップロヌドするのが奜きで、私たちもファむルを保存したり共有したりするのが奜きです。 これらのサヌバヌの䞀郚は、特別な pu/pp サヌバヌによっお閉じられおいたす。

プ/ップ

VK でネットワヌク タブを開くず、pu/pp が衚瀺されたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

pu/ppずは䜕ですか? サヌバヌを次々ず閉じる堎合、閉じられたサヌバヌにファむルをアップロヌドおよびダりンロヌドするには XNUMX ぀のオプションがありたす。 盎接 スルヌ http://cs100500.userapi.com/path たたは 䞭間サヌバヌ経由 - http://pu.vk.com/c100500/path.

Pu は写真アップロヌドの歎史的な名前、pp は写真プロキシです。 ぀たり、XNUMX ぀のサヌバヌは写真のアップロヌド甚であり、もう XNUMX ぀のサヌバヌはアップロヌド甚です。 写真が読み蟌たれるだけでなく、名前も保持されるようになりたした。

これらのサヌバヌ HTTPSセッションを終了するストレヌゞからプロセッサの負荷を軜枛したす。 たた、ナヌザヌ ファむルはこれらのサヌバヌで凊理されるため、これらのマシンに保存される情報の機密性は䜎いほど優れおいたす。 たずえば、HTTPS 暗号化キヌなどです。

これらのマシンは他のマシンによっお閉じられおいるため、それらに「ホワむト」倖郚 IP を付䞎しなくおも枈みたす。 「灰色」を䞎える。 このようにしお、IP プヌルを保存し、倖郚アクセスからマシンを保護するこずが保蚌されたした。単にそこに入る IP が存圚しないだけです。

共有IPを介した埩元力。 フォヌルト トレランスの芳点からは、このスキヌムは同じように機胜したす。耇数の物理サヌバヌが共通の物理 IP を持ち、その前にあるハヌドりェアがリク゚ストの送信先を遞択したす。 他のオプションに぀いおは埌ほど説明したす。

物議を醞しおいる点は、この堎合、 クラむアントが保持する接続が少なくなりたす。 同じホスト (pu.vk.com たたは pp.vk.com) を䜿甚する耇数のマシンに同じ IP がある堎合、クラむアント ブラりザには 2 ぀のホストに察する同時リク゚ストの数に制限がありたす。 しかし、HTTP/XNUMX がナビキタスになった時代には、これはもはやあたり意味がないず思いたす。

このスキヌムの明らかな欠点は、次のこずです。 すべおのトラフィックをポンプする、別のサヌバヌを介しおストレヌゞに移動したす。 マシンを介しおトラフィックをポンプするため、同じスキヌムを䜿甚しおビデオなどの倧量のトラフィックをポンプするこずはただできたせん。 私たちはそれを盎接送信したす - ビデオ専甚の個別のストレヌゞぞの個別の盎接接続。 軜いコンテンツはプロキシ経由で送信したす。

少し前に、プロキシの改良版を入手したした。 ここでは、それらが通垞のものずどのように異なるのか、そしおなぜこれが必芁なのかを説明したす。

日

2017 幎 XNUMX 月、以前に Sun を買収した Oracle は、 膚倧な数のSun埓業員を解雇した。 この時点で䌚瀟は消滅したず蚀えるでしょう。 新しいシステムの名前を遞ぶずき、圓瀟の管理者はこの䌚瀟の蚘憶に敬意を衚するこずを決め、新しいシステムを Sun ず名付けたした。 私たちの間では圌女を単に「倪陜」ず呌んでいたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ppにはいく぀かの問題がありたした。 グルヌプごずに XNUMX ぀の IP - 非効率的なキャッシュ。 耇数の物理サヌバヌが共通の IP アドレスを共有しおいるため、リク゚ストがどのサヌバヌに送信されるかを制埡する方法はありたせん。 したがっお、異なるナヌザヌが同じファむルを取埗する堎合、これらのサヌバヌにキャッシュがある堎合、ファむルは各サヌバヌのキャッシュに保存されたす。 これは非垞に非効率な蚈画ですが、䜕もするこずができたせんでした。

その結果 - コンテンツをシャヌディングするこずはできたせん、このグルヌプに特定のサヌバヌを遞択するこずはできないため、それらは共通の IP を持っおいたす。 たた、いく぀かの内郚的な理由により、 このようなサヌバヌをリヌゞョンにむンストヌルするこずはできたせんでした。 圌らはサンクトペテルブルクにのみ立っおいた。

サンズでは遞抜制床を倉曎したした。 今では、 ゚ニヌキャストルヌティング: 動的ルヌティング、゚ニヌキャスト、セルフチェック デヌモン。 各サヌバヌには独自の個別の IP がありたすが、共通のサブネットがありたす。 XNUMX ぀のサヌバヌに障害が発生した堎合、トラフィックが同じグルヌプの他のサヌバヌに自動的に分散されるように、すべおが構成されおいたす。 特定のサヌバヌを遞択できるようになりたした。 冗長なキャッシュはありたせん、信頌性には圱響したせんでした。

䜓重サポヌト。 珟圚では、必芁に応じおさたざたな出力の機械を蚭眮する䜙裕があり、たた、䞀時的な問題が発生した堎合には、皌働䞭の「倪陜」の重さを倉曎しお負荷を軜枛し、倪陜が「䌑んで」再び働き始めるようにするこずもできたす。

コンテンツIDによるシャヌディング。 シャヌディングに関する面癜い点は、通垞、異なるナヌザヌが同じ「倪陜」を通じお同じファむルにアクセスし、共通のキャッシュを持おるようにコンテンツをシャヌディングするこずです。

このたび「Clover」アプリをリリヌスしたした。 これは生攟送でのオンラむン クむズで、ホストが質問し、ナヌザヌはオプションを遞択しおリアルタむムで回答したす。 アプリにはナヌザヌがチャットできるチャットがありたす。 ブロヌドキャストに同時に接続できたす 100䞇人以䞊。 圌らは党員、参加者党員に送信されるメッセヌゞを曞き、アバタヌがメッセヌゞず䞀緒にやっお来たす。 100 回の「倪陜」に XNUMX 䞇人が XNUMX ぀のアバタヌを求めおやっお来るず、雲に隠れおしたうこずもありたす。

同じファむルに察するリク゚ストのバヌストに耐えるために、特定の皮類のコンテンツに察しおは、その地域で利甚可胜なすべおの「倪陜」にファむルを分散させる愚かな蚈画を有効にしおいたす。

内偎からの倪陜

nginx 䞊のリバヌス プロキシ、RAM たたは高速 Optane/NVMe ディスクのいずれかにキャッシュしたす。 䟋 http://sun4-2.userapi.com/c100500/path — 100500 番目の地域、XNUMX 番目のサヌバヌ グルヌプにある「倪陜」ぞのリンク。 物理的にサヌバヌ XNUMX にあるパス ファむルを閉じたす。

キャッシュ

アヌキテクチャスキヌムにもう XNUMX ぀のノヌド、぀たりキャッシュ環境を远加したす。

VKontakte のアヌキテクチャず仕事に関する FAQ

以䞋はレむアりト図です 地域キャッシュ、20個ほどありたす。 これらは、キャッシュず「サン」が配眮され、それ自䜓を介しおトラフィックをキャッシュできる堎所です。

VKontakte のアヌキテクチャず仕事に関する FAQ

これはマルチメディア コンテンツのキャッシュです。ここにはナヌザヌ デヌタは保存されず、音楜、ビデオ、写真のみが保存されたす。

ナヌザヌの地域を特定するために、 リヌゞョンで発衚された BGP ネットワヌク プレフィックスを収集したす。 フォヌルバックの堎合、プレフィックスで IP が芋぀からなかった堎合は、geoip デヌタベヌスも解析する必芁がありたす。 ナヌザヌのIPによっお地域を決定したす。 コヌドでは、ナヌザヌの XNUMX ぀以䞊の地域、぀たりナヌザヌが地理的に最も近い地点を調べるこずができたす。

それはどのように動䜜したすか

ファむルの人気を地域ごずにカりントしたす。 ナヌザヌがいる地域キャッシュの番号ずファむル識別子があり、このペアを取埗しお、ダりンロヌドごずに評䟡を増分したす。

同時に、デヌモン (リヌゞョン内のサヌビス) が時々 API にやっお来お、こう蚀いたす。 」 API は評䟡別に分類された倚数のファむルを配信し、デヌモンはそれらをダりンロヌドしおリヌゞョンに取り蟌み、そこからファむルを配信したす。 これが、キャッシュからの pu/pp ず Sun の根本的な違いです。キャッシュにファむルが存圚しない堎合でも、キャッシュはすぐにファむルを自分自身に枡し、キャッシュは最初にファむルを自分自身にダりンロヌドしおから、そのファむルを返し始めたす。

この堎合、次のようになりたす。 ナヌザヌに近いコンテンツ そしおネットワヌク負荷を分散したす。 たずえば、モスクワ キャッシュからのみ、ピヌク時に 1 Tbit/s 以䞊を配垃したす。

しかし、問題もありたす - キャッシュサヌバヌはゎムではありたせん。 非垞に人気のあるコンテンツの堎合、別のサヌバヌを蚭眮するのに十分なネットワヌクがない堎合がありたす。 圓瀟のキャッシュ サヌバヌは 40  50 Gbit/s ですが、そのようなチャネルを完党に詰たらせるコンテンツがありたす。 私たちは、この地域で人気のあるファむルの耇数のコピヌのストレヌゞの実装に向けお取り組んでいたす。 幎末たでに実装できるこずを願っおいたす。

䞀般的なアヌキテクチャを芋おいきたした。

  • リク゚ストを受け入れるフロントサヌバヌ。
  • リク゚ストを凊理するバック゚ンド。
  • XNUMX 皮類のプロキシによっお閉じられるストレヌゞ。
  • 地域キャッシュ。

この図には䜕が欠けおいたすか? もちろん、デヌタを保存するデヌタベヌスです。

デヌタベヌスたたぱンゞン

䞀般に受け入れられおいる意味でのデヌタベヌスが実際には存圚しないため、私たちはそれらをデヌタベヌスではなく゚ンゞンず呌びたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

これは必芁な手段です。。 これは、VK の人気が爆発的に高たった 2008 幎から 2009 幎に、プロゞェクトが完党に MySQL ず Memcache 䞊で動䜜し、問題が発生したために起こりたした。 MySQL は頻繁にクラッシュしおファむルが砎損し、その埌回埩できなくなり、Memcache のパフォヌマンスが埐々に䜎䞋しお再起動する必芁がありたした。

人気が高たっおいるプロゞェクトには、デヌタを砎損する氞続ストレヌゞず、速床を䜎䞋させるキャッシュが存圚しおいたこずが刀明したした。 このような状況では、成長するプロゞェクトを開発するこずは困難です。 このプロゞェクトが焊点を圓おおいた重芁なこずを自分たちの自転車に曞き換えおみるこずにしたした。

解決策は成功したした。 圓時は他のスケヌリング方法が存圚しおいなかったので、これを行う機䌚があったず同時に、非垞に必芁でした。 デヌタベヌスはそれほど倚くはなく、NoSQL もただ存圚せず、MySQL、Memcache、PostrgreSQL しかありたせんでした。それだけでした。

ナニバヌサル操䜜。 開発は C 開発者のチヌムによっお䞻導され、すべおが䞀貫した方法で行われたした。 ゚ンゞンに関係なく、それらはすべおほが同じファむル圢匏でディスクに曞き蟌たれ、同じ起動パラメヌタを持ち、同じ方法で信号を凊理し、゚ッゞの状況や問題が発生した堎合にほが同じように動䜜したした。 ゚ンゞンの成長に䌎い、管理者はシステムを操䜜するのが䟿利になりたした。管理する必芁のある動物園がなくなり、新しいサヌドパヌティ デヌタベヌスごずに操䜜方法を再孊習する必芁があるため、迅速か぀䟿利にデヌタベヌスを増やすこずが可胜になりたした。圌らの番号。

゚ンゞンの皮類

チヌムはかなりの数の゚ンゞンを䜜成したした。 以䞋にそれらのほんの䞀郚を瀺したす: 友人、ヒント、画像、ipdb、手玙、リスト、ログ、memcached、meowdb、ニュヌス、ノストラダムス、写真、プレむリスト、pmemcached、サンドボックス、怜玢、ストレヌゞ、いいね、タスクなど。

特定のデヌタ構造を必芁ずするタスクや、特殊なリク゚ストを凊理するタスクごずに、C チヌムは新しい゚ンゞンを䜜成したす。 なぜだめですか。

独立した゚ンゞンを搭茉しおいたす memcached、通垞のものず䌌おいたすが、たくさんの特兞があり、速床が䜎䞋するこずはありたせん。 ClickHouse ではありたせんが、これも機胜したす。 別途賌入可胜 pmemcached - です 氞続的なmemcachedさらに、再起動時にデヌタが倱われないように、RAM に収たるよりもディスクにデヌタを保存するこずもできたす。 個々のタスクにはさたざたな゚ンゞンがありたす: キュヌ、リスト、セットなど、プロゞェクトに必芁なものすべおです。

クラスタヌ

コヌドの芳点から芋るず、゚ンゞンやデヌタベヌスをプロセス、゚ンティティ、たたはむンスタンスずしお考える必芁はありたせん。 このコヌドは、特にクラスタヌや゚ンゞンのグルヌプで動䜜したす。 クラスタヌごずに XNUMX ぀のタむプ。 memcached クラスタヌがあるずしたす。これは単なるマシンのグルヌプです。

コヌドはサヌバヌの物理的な堎所、サむズ、数を知る必芁はたったくありたせん。 圌は特定の識別子を䜿甚しおクラスタヌにアクセスしたす。

これを機胜させるには、コヌドず゚ンゞンの間に゚ンティティをもう XNUMX ぀远加する必芁がありたす。 代理.

RPC プロキシ

プロキシ 連絡バス、サむトのほが党䜓がこの䞊で実行されたす。 同時に、私たちは サヌビス怜出がありたせん — 代わりに、このプロキシの構成があり、このプロキシは、すべおのクラスタヌずこのクラスタヌのすべおのシャヌドの堎所を認識しおいたす。 これは管理者が行うこずです。

プログラマヌは、どこにどれくらいの費甚がかかるかなどたったく気にせず、ただクラスタヌにアクセスするだけです。 これにより、倚くのこずが可胜になりたす。 リク゚ストを受信するず、プロキシはどこにあるかを認識しおリク゚ストをリダむレクトしたす。これはプロキシ自身が決定したす。

VKontakte のアヌキテクチャず仕事に関する FAQ

この堎合、プロキシはサヌビス障害に察する保護点ずなりたす。 䞀郚の゚ンゞンが遅くなったりクラッシュしたりするず、プロキシはこれを理解し、クラむアント偎に応じお応答したす。 これにより、タむムアりトを削陀できたす。コヌドぱンゞンの応答を埅機したせんが、゚ンゞンが機胜しおおらず、䜕らかの方法で別の動䜜をする必芁があるこずを理解したす。 デヌタベヌスが垞に機胜するずは限らないずいう事実に備えお、コヌドを準備する必芁がありたす。

具䜓的な実装

堎合によっおは、゚ンゞンずしお䜕らかの非暙準的な゜リュヌションが必芁になるこずがありたす。 同時に、゚ンゞン専甚に䜜成された既補の rpc プロキシを䜿甚せず、タスク甚に別のプロキシを䜜成するこずが決定されたした。

MySQL にはただあちこちにありたすが、db-proxy を䜿甚し、ClickHouse には - 子猫の家.

倧䜓こんな感じで動䜜したす。 特定のサヌバヌがあり、kPHP、Go、Python、぀たり RPC プロトコルを䜿甚できるあらゆるコヌドを実行したす。 コヌドは RPC プロキシ䞊でロヌカルに実行されたす。コヌドが配眮されおいる各サヌバヌは独自のロヌカル プロキシを実行したす。 芁求に応じお、代理人はどこに行くべきかを理解したす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ある゚ンゞンが別の゚ンゞンにアクセスしたい堎合、それが隣接゚ンゞンであっおも、隣接゚ンゞンが別のデヌタ センタヌに存圚する可胜性があるため、プロキシを経由したす。 ゚ンゞンは、それ自䜓以倖の堎所を知るこずに䟝存すべきではありたせん。これが私たちの暙準゜リュヌションです。 しかし、もちろん䟋倖もありたす:)

すべおの゚ンゞンが動䜜する TL スキヌムの䟋。

memcache.not_found                                = memcache.Value;
memcache.strvalue	value:string flags:int = memcache.Value;
memcache.addOrIncr key:string flags:int delay:int value:long = memcache.Value;

tasks.task
    fields_mask:#
    flags:int
    tag:%(Vector int)
    data:string
    id:fields_mask.0?long
    retries:fields_mask.1?int
    scheduled_time:fields_mask.2?int
    deadline:fields_mask.3?int
    = tasks.Task;
 
tasks.addTask type_name:string queue_id:%(Vector int) task:%tasks.Task = Long;

これはバむナリ プロトコルであり、これに最も近いものは次のずおりです。 プロトブフ。 スキヌマは、オプションのフィヌルド、耇合型 (組み蟌みスカラヌの拡匵)、およびク゚リを事前に蚘述したす。 すべおはこのプロトコルに埓っお動䜜したす。

RPC over TL over TCP/UDP
UDP?

TL スキヌム䞊で実行される゚ンゞン リク゚ストを実行するための RPC プロトコルがありたす。 これはすべお TCP/UDP 接続経由で機胜したす。 TCP は理解できたすが、なぜ頻繁に UDP が必芁になるのでしょうか?

UDP が圹立ちたす サヌバヌ間の膚倧な数の接続の問題を回避する。 各サヌバヌに RPC プロキシがあり、䞀般に任意の゚ンゞンに接続できる堎合、サヌバヌごずに数䞇の TCP 接続が存圚したす。 負荷はありたすが、圹に立ちたせん。 UDP の堎合、この問題は存圚したせん。

冗長な TCP ハンドシェむクなし。 これは兞型的な問題です。新しい゚ンゞンたたは新しいサヌバヌが起動されるず、䞀床に倚数の TCP 接続が確立されたす。 UDP ペむロヌドなどの小芏暡で軜量なリク゚ストの堎合、コヌドず゚ンゞン間のすべおの通信は XNUMX ぀の UDP パケット: XNUMX 機は䞀方向に飛行し、XNUMX 機目は別の方向に飛行したす。 XNUMX 埀埩で、コヌドはハンドシェむクなしで゚ンゞンから応答を受け取りたした。

はい、すべおうたくいきたす パケット損倱の割合が非垞に小さい。 このプロトコルは再送信ずタむムアりトをサポヌトしおいたすが、倧量に倱われるずほが TCP を取埗するこずになり、有益ではありたせん。 私たちは UDP を海を越えお掚進するわけではありたせん。

圓瀟にはそのようなサヌバヌが䜕千台もあり、スキヌムは同じです。゚ンゞンのパックが各物理サヌバヌにむンストヌルされたす。 これらはブロックするこずなくできるだけ早く実行できるようにほずんどがシングルスレッドであり、シングルスレッド ゜リュヌションずしおシャヌド化されおいたす。 同時に、これらの゚ンゞンほど信頌できるものはなく、氞続的なデヌタ ストレヌゞには现心の泚意が払われおいたす。

氞続的なデヌタストレヌゞ

゚ンゞンはバむナリログを曞き蟌みたす。 バむナリログは、状態たたはデヌタの倉曎に関するむベントが末尟に远加されるファむルです。 ゜リュヌションによっおは、バむナリ ログ、バむナリ ログなど、呌び方が異なりたす。 WAL, AOF, しかし原理は同じです。

再起動時に゚ンゞンが䜕幎にもわたっおバむナリ党䜓を再読み取りするのを防ぐために、゚ンゞンは次のように曞き蟌みたす。 スナップショット - 珟圚の状態。 必芁に応じお、最初にバむナリログから読み取り、次にバむナリログからの読み取りを終了したす。 すべおのバむナリログは、TL スキヌムに埓っお同じバむナリ圢匏で曞き蟌たれるため、管理者はツヌルを䜿甚しおバむナリログを同等に管理できたす。 スナップショットなどは必芁ありたせん。 スナップショットが int であるこず、゚ンゞンの魔法であるこず、および誰にずっおも重芁ではない本䜓を瀺す䞀般的なヘッダヌがありたす。 これは、スナップショットを蚘録した゚ンゞンに問題がありたす。

動䜜原理を簡単に説明したす。 ゚ンゞンが動䜜するサヌバヌがありたす。 圌は曞き蟌み甚に新しい空のバむナリログを開き、それに倉曎を加えるむベントを曞き蟌みたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ある時点で、圌は自分でスナップショットを撮るこずを決定するか、信号を受信したす。 サヌバヌは新しいファむルを䜜成し、ファむルの状態党䜓をそのファむルに曞き蟌み、珟圚のバむナリ ログ サむズ (オフセット) をファむルの末尟に远加しお、さらに曞き蟌みを続けたす。 新しいバむナリログは䜜成されたせん。

VKontakte のアヌキテクチャず仕事に関する FAQ

ある時点で、゚ンゞンが再起動するず、ディスク䞊にバむナリログずスナップショットの䞡方が䜜成されたす。 ゚ンゞンはスナップショット党䜓を読み取り、特定の時点でその状態を匕き䞊げたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

スナップショットの䜜成時の䜍眮ずバむナリログのサむズを読み取りたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

バむナリログの末尟を読んで珟圚の状態を取埗し、さらにむベントの曞き蟌みを続けたす。 これは単玔なスキヌムであり、すべおの゚ンゞンはこれに埓っお動䜜したす。

デヌタ耇補

その結果、圓瀟のデヌタレプリケヌションは ステヌトメントベヌスの — binlog にはペヌゞ倉曎を曞きたせんが、぀たり 倉曎リク゚スト。 ネットワヌク経由で送信されるものず非垞に䌌おいたすが、わずかに倉曎されおいるだけです。

同じスキヌムはレプリケヌションだけでなく、 バックアップを䜜成するには。 バむナリログに曞き蟌む曞き蟌みマスタヌずいう゚ンゞンがありたす。 管理者がセットアップした他の堎所では、このバむナリログがコピヌされ、それだけでバックアップが䜜成されたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

必芁に応じお リヌディングレプリカCPU の読み取り負荷を軜枛するために、読み取り゚ンゞンが起動されるだけで、バむナリの末尟を読み取り、これらのコマンドをロヌカルで実行したす。

ここでの遅れは非垞に小さく、レプリカがマスタヌからどれだけ遅れおいるかを知るこずができたす。

RPC プロキシでのデヌタ シャヌディング

シャヌディングはどのように機胜したすか? プロキシはどのクラスタヌ シャヌドに送信するかをどのように理解するのでしょうか? コヌドには「15 個のシャヌドを送っおください!」ずは曞かれおいたせん。 - いいえ、これはプロキシによっお行われたす。

最も単玔なスキヌムは firstint です — リク゚ストの最初の番号。

get(photo100_500) => 100 % N.

これは単玔な memcached テキスト プロトコルの䟋ですが、もちろん、ク゚リは耇雑で構造化される可胜性がありたす。 この䟋では、ク゚リの最初の数倀を取埗し、クラスタヌ サむズで割った残りを取埗したす。

これは、単䞀゚ンティティのデヌタ局所性が必芁な堎合に䟿利です。 100 がナヌザヌたたはグルヌプ ID で、耇雑なク゚リのために XNUMX ぀の゚ンティティのすべおのデヌタを XNUMX ぀のシャヌド䞊に眮きたいずしたす。

リク゚ストがクラスタヌ党䜓にどのように分散されるかを気にしない堎合は、別のオプションがありたす。 シャヌド党䜓をハッシュする.

hash(photo100_500) => 3539886280 % N

ハッシュ、陀算の䜙り、シャヌド番号も取埗したす。

これらのオプションは䞡方ずも、クラスタヌのサむズを増やすずきに分割するか、耇数倍にするずいう事実を芚悟しおいる堎合にのみ機胜したす。 たずえば、16 個のシャヌドがありたしたが、十分ではないので、もっず欲しい堎合は、ダりンタむムなしで安党に 32 個を取埗できたす。 倍数ではなく増やしたい堎合は、損倱なくすべおを正確に分割するこずができないため、ダりンタむムが発生したす。 これらのオプションは䟿利ですが、垞に圹立぀わけではありたせん。

任意の数のサヌバヌを远加たたは削陀する必芁がある堎合は、次を䜿甚したす。 Ketama のようなリング䞊の䞀貫したハッシュ。 しかし同時に、デヌタの局所性が完党に倱われたす。各郚分が独自の小さな応答を返すようにリク゚ストをクラスタヌにマヌゞし、その応答をプロキシにマヌゞする必芁がありたす。

超具䜓的な芁望もありたす。 次のようになりたす。RPC プロキシがリク゚ストを受信し、どのクラスタヌに移動するかを決定し、シャヌドを決定したす。 次に、曞き蟌みマスタヌが存圚するか、クラスタヌにレプリカがサポヌトされおいる堎合は、オンデマンドでレプリカに送信したす。 プロキシがこれらすべおを行いたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ログ

私たちはいく぀かの方法でログを曞き蟌みたす。 最も明癜で単玔なものは、 ログをmemcacheに曞き蟌む.

ring-buffer: prefix.idx = line

キヌのプレフィックス、぀たりログの名前、行があり、このログのサむズ、぀たり行数がありたす。 0 から行数から 1 を匕いた倀たでの乱数を取埗したす。memcache のキヌは、この乱数ず連結されたプレフィックスです。 ログ行ず珟圚の時刻を倀に保存したす。

ログの読み蟌みが必芁な堎合に実斜したす。 マルチゲット すべおのキヌを時間順に䞊べ替えお、リアルタむムで運甚ログを取埗したす。 このスキヌムは、実皌働環境で䜕かをリアルタむムで、䜕も壊さず、他のマシンぞのトラフィックを停止したり蚱可したりするこずなくデバッグする必芁がある堎合に䜿甚されたすが、このログは長く保存されたせん。

ログを確実に保管するための゚ンゞンがありたす ログ゚ンゞン。 これがたさにこれが䜜成され、膚倧な数のクラスタヌで広く䜿甚されおいる理由です。 私が知っおいる最倧のクラスタヌには、600 TB の圧瞮されたログが保存されおいたす。

゚ンゞンは非垞に叀く、すでに 6  7 幎前のクラスタヌもありたす。 それには解決しようずしおいる問題があり、たずえば、ログを保存するために ClickHouse を積極的に䜿甚し始めたした。

ClickHouse でのログの収集

この図は、私たちがどのように゚ンゞンに入るのかを瀺しおいたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

RPC を介しおロヌカルで RPC プロキシに送信されるコヌドがあり、゚ンゞンのどこに送信するかを認識したす。 ClickHouse にログを曞き蟌みたい堎合は、このスキヌムの XNUMX ぀の郚分を倉曎する必芁がありたす。

  • 䞀郚の゚ンゞンを ClickHouse に眮き換えたす。
  • ClickHouse にアクセスできない RPC プロキシを、RPC 経由でアクセスできる゜リュヌションに眮き換えたす。

゚ンゞンはシンプルです。ClickHouse を䜿甚しおサヌバヌたたはサヌバヌのクラスタヌに眮き換えたす。

そしお、ClickHouseに行くために、私たちはそうしたした 子猫ハりス。 KittenHouse から ClickHouse に盎接移動するず、察応できたせん。 リク゚ストがなくおも、膚倧な数のマシンの HTTP 接続が加算されたす。 スキヌムが機胜するには、ClickHouse を備えたサヌバヌ䞊で ロヌカル リバヌス プロキシが起動される、必芁な接続量に耐えられるように曞かれおいたす。 たた、比范的確実にデヌタを内郚にバッファリングするこずもできたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

堎合によっおは、nginx などの非暙準゜リュヌションに RPC スキヌムを実装したくない堎合がありたす。 したがっお、KittenHouse には UDP 経由でログを受信する機胜がありたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ログの送信者ず受信者が同じマシン䞊で䜜業しおいる堎合、ロヌカル ホスト内で UDP パケットが倱われる可胜性は非垞に䜎くなりたす。 サヌドパヌティ ゜リュヌションで RPC を実装する必芁性ず信頌性の間の劥協策ずしお、単玔に UDP 送信を䜿甚したす。 この蚈画に぀いおは埌ほど説明したす。

監芖

ログには XNUMX 皮類ありたす。管理者がサヌバヌ䞊で収集したログず、開発者がコヌドから曞き蟌んだログです。 これらは、次の XNUMX 皮類のメトリクスに察応したす。 システムず補品.

システムメトリクス

すべおのサヌバヌで動䜜したす ネットデヌタ、統蚈を収集しお送信したす。 グラファむトカヌボン。 したがっお、ストレヌゞ システムずしおは、たずえば Whisper ではなく、ClickHouse が䜿甚されたす。 必芁に応じお、ClickHouse から盎接読み取るこずも、次を䜿甚するこずもできたす。 グラファナ メトリクス、グラフ、レポヌト甚。 開発者ずしお、私たちは Netdata ず Grafana に十分にアクセスできたす。

補品の指暙

䟿宜䞊、いろいろなこずを曞きたした。 たずえば、Counts や UniqueCounts の倀を統蚈に曞き蟌んで、どこかに送信できる䞀連の通垞の関数がありたす。

statlogsCountEvent   ( ‘stat_name’,            $key1, $key2, 
)
statlogsUniqueCount ( ‘stat_name’, $uid,    $key1, $key2, 
)
statlogsValuetEvent  ( ‘stat_name’, $value, $key1, $key2, 
)

$stats = statlogsStatData($params)

その埌、䞊べ替えフィルタヌずグルヌプ化フィルタヌを䜿甚しお、グラフの構築、りォッチドッグの構成など、統蚈から必芁なこずをすべお実行できるようになりたす。

ずおも曞きたす 倚くの指暙 むベントの数は 600 日あたり 1 億から XNUMX 兆です。 しかし、私たちはそれらを保持したいず考えおいたす 少なくずも数幎は指暙の傟向を理解するため。 これらをすべおたずめるのは倧きな問題であり、ただ解決されおいたせん。 ここ数幎の成果をお話したす。

これらのメトリクスを曞き蟌む関数がありたす ロヌカルのメモリキャッシュぞ゚ントリヌ数を枛らすため。 短期間にロヌカルで起動される 統蚈デヌモン すべおの蚘録を収集したす。 次に、デヌモンはメトリクスを XNUMX ぀のサヌバヌ局にマヌゞしたす。 ログコレクタヌ、背埌の局が死なないように、倚数のマシンからの統蚈を集玄したす。

VKontakte のアヌキテクチャず仕事に関する FAQ

必芁に応じお、ログコレクタヌに盎接曞き蟌むこずができたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

ただし、stas-daemom をバむパスしおコヌドからコレクタヌに盎接曞き蟌むこずは、コレクタヌの負荷が増加するため、スケヌラビリティに乏しい゜リュヌションです。 この解決策は、䜕らかの理由でマシン䞊で memcache stats-daemon を起動できない堎合、たたはクラッシュしお盎接実行した堎合にのみ適しおいたす。

次に、ログコレクタヌが統蚈をマヌゞしたす。 ニャヌDB - これは私たちのデヌタベヌスであり、メトリクスも保存できたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

次に、コヌドからバむナリの「SQL に近い」遞択を行うこずができたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

実隓

2018 幎の倏に瀟内ハッカ゜ンを開催し、図の赀い郚分を ClickHouse のメトリクスを保存できるものに眮き換えおみるずいうアむデアが生たれたした。 ClickHouse にログがありたす - 詊しおみおはいかがでしょうか?

VKontakte のアヌキテクチャず仕事に関する FAQ

KittenHouse を通じおログを曞き蟌むスキヌムがありたした。

VKontakte のアヌキテクチャず仕事に関する FAQ

我々は決めたした 別の「*House」を図に远加したすこれは、コヌドが UDP 経由でメトリクスを曞き蟌むずきの圢匏でメトリクスを正確に受け取りたす。 次に、この *House はそれらを䞞倪のようなむンサヌトに倉換し、KittenHouse はそれを理解したす。 圌はこれらのログを ClickHouse に完党に送信でき、ClickHouse はそれらを読み取るこずができるはずです。

VKontakte のアヌキテクチャず仕事に関する FAQ

memcache、stats-daemon、logs-collectors デヌタベヌスを䜿甚したスキヌムは、これに眮き換えられたす。

VKontakte のアヌキテクチャず仕事に関する FAQ

memcache、stats-daemon、logs-collectors デヌタベヌスを䜿甚したスキヌムは、これに眮き換えられたす。

  • ここには、StatsHouse でロヌカルに曞かれたコヌドからのディスパッチがありたす。
  • StatsHouse は、すでに SQL 挿入に倉換されおいる UDP メトリクスをバッチで KittenHouse に曞き蟌みたす。
  • KittenHouse はそれらを ClickHouse に送りたす。
  • それらを読み取りたい堎合は、StatsHouse をバむパスしお、通垞の SQL を䜿甚しお ClickHouse から盎接読み取りたす。

ただですか 実隓、しかし、結果は気に入っおいたす。 この制床の問題点が解決すれば、おそらく完党に切り替えるこずになるでしょう。 個人的にはそう願っおいたす。

スキヌム 鉄分を節玄しない。 必芁なサヌバヌは少なくお枈み、ロヌカルの統蚈デヌモンやログコレクタヌは必芁ありたせんが、ClickHouse には珟圚のスキヌムよりも倧きなサヌバヌが必芁です。 必芁なサヌバヌの数は少なくなりたすが、より高䟡でより匷力なものでなければなりたせん.

展開する

たず、PHP のデプロむメントを芋おみたしょう。 私たちはで開発しおいたす git 䜿甚 GitLab О TeamCity 展開甚に。 開発ブランチはマスタヌ ブランチにマヌゞされ、テスト甚のマスタヌからステヌゞングにマヌゞされ、ステヌゞングから実皌働にマヌゞされたす。

デプロむメントの前に、珟圚の運甚ブランチず以前の運甚ブランチが取埗され、それらの差分ファむルの倉曎 (䜜成、削陀、倉曎) が考慮されたす。 この倉曎は特別なコピヌファスト ゚ンゞンのバむナリログに蚘録され、サヌバヌ フリヌト党䜓に倉曎を迅速に耇補できたす。 ここで䜿甚しおいるのは盎接コピヌするわけではありたせんが、 ゎシップのレプリケヌションXNUMX ぀のサヌバヌが倉曎を最も近いサヌバヌに送信するずき、そのサヌバヌの倉曎をそのサヌバヌの近隣に送信するずきなどです。 これにより、フリヌト党䜓でコヌドを数十秒単䜍で曎新できるようになりたす。 倉曎がロヌカル レプリカに到達するず、これらのパッチがロヌカル レプリカに適甚されたす。 ロヌカルファむルシステム。 ロヌルバックも同じスキヌムに埓っお実行されたす。

私たちは kPHP も頻繁に導入しおおり、独自の開発も行っおいたす。 git 䞊の図によるず。 これから HTTPサヌバヌバむナリ堎合、差分を生成できたせん。リリヌス バむナリの重さは数癟 MB です。 したがっお、ここには別のオプションがありたす - バヌゞョンは次のように曞き蟌たれたす ビンログコピヌファスト。 ビルドするたびに増加し、ロヌルバック䞭にも増加したす。 バヌゞョン サヌバヌに耇補される。 ロヌカルのコピヌファストは、新しいバヌゞョンがバむナリログに入ったこずを確認し、同じゎシップレプリケヌションによっお、マスタヌサヌバヌを疲れさせるこずなく、ネットワヌク党䜓に負荷を慎重に分散しながら、バむナリの最新バヌゞョンを自分たちで取埗したす。 次に続くこず 優雅な再起動 新しいバヌゞョン甚。

私たちの゚ンゞンも本質的にバむナリですが、スキヌムは非垞に䌌おいたす。

  • gitマスタヌブランチ;
  • バむナリ入力 debファむル;
  • バヌゞョンは binlog copyfast に曞き蟌たれたす。
  • サヌバヌにレプリケヌトされたす。
  • サヌバヌは新しい .dep を取り出したす。
  • dpkg-i;
  • 新しいバヌゞョンぞの正垞な再起動。

違いは、バむナリがアヌカむブにパッケヌゞ化されおいるこずです。 debファむルそしお、それらを汲み出すずき、 dpkg-i システム䞊に配眮されたす。 kPHP はバむナリずしおデプロむされ、゚ンゞンは dpkg ずしおデプロむされるのはなぜですか? それはそのように起こりたした。 動䜜したすので、觊らないでください。

䟿利なリンク

Alexey Akulovich は、プログラム委員䌚の䞀員ずしお、 PHP ロシア 17 月 XNUMX 日に開催されるこのむベントは、PHP 開発者にずっおは近幎最倧のむベントずなるでしょう。 芋おください、私たちが持っおいる玠晎らしい PC は䜕ですか スピヌカヌ (そのうちの XNUMX 人は PHP コアを開発しおいたす!) - PHP を曞くなら欠かせないもののようです。

出所 habr.com

コメントを远加したす