VKontakteの䟋に関する成長プロゞェクトのアヌキテクチャ





Alexey Akulovichは、負荷の高いPHPプロゞェクトのラむフパスに぀いお説明したす。 これはHighload ++ 2016の埩号化です。



私の名前はレシャです。PHPで曞いおいたす。



幞いなこずに、レポヌトはそれに぀いおではありたせん。 レポヌトは、ネットワヌク開発の回顧に関するものです-プロゞェクトがどのように開発されたか。 どの゜リュヌションがキャプテンであるか、たたは私たちの負荷に非垞に特有であるか、私たちはストレスを経隓しおいる他のプロゞェクトで䜿甚できるものを䜿甚したした。



始めたしょう。



䜕に぀いお話そうか



1぀のレポヌトですべおのこずを話すこずは䞍可胜であるため、私にずっお最も興味深いず思われるトピックを遞択したした。 これは、デヌタベヌスずそのストレヌゞぞのアクセスを開発するこず、PHPを最適化するこずの問題、そしおその結果ずしお私たちが䜕になったのか、ずいう問題です。



小さなオフトピックずしお文字通り1か月前、VKontakteはIT専門家向けではなく10才になりたしたが、Highloadも10才です。このような蚘念日にプログラムにレポヌトが受け入れられたずいう事実は非垞に楜しいものです。



それがすべお始たった方法







これは元のスキヌムではありたせんが、ネットワヌクはすぐに実珟したした。 負荷ず人気の増倧に䌎い、Nginxにフロントがあり、リク゚ストを凊理し、Apacheに送信し、smod PHPを起動しお、暙準ランプであるMySQLたたはMemcachedにアクセスするずきに、このような兞型的なラむムスタックを取埗したした。 出発点ずしお、圌から始めたしょう。



そのため、負荷が増倧しおいたす。



繰り返しのナヌザヌリク゚ストがNginxず同じマシンに来るこずを必芁ずするロヌカルデヌタを持たないNginxに負荷がかかっおいる堎合は、十分な数がありたせんでした。



Apacheの珟圚のクラスタヌサむズに察しお負荷が十分でない堎合、ロヌカルセッション、ロヌカルキャッシュ、同じApacheず同じPHRぞのリク゚ストを必芁ずするデヌタを䜿甚しないプロゞェクトでは、さらに倚くのマシンを配眮し、すべおが機胜したす。 暙準回路。



MySQLおよびMemcachedの堎合、これはすべおのApacheが必芁ずする倖郚デヌタりェアハりスなどであり、別のマシンを配信するだけでは機胜したせん。もっず巧劙で賢いこずをする必芁がありたす。



それでは、デヌタベヌスの開発ず䞀般的な拡匵方法から始めたしょう。 䜿甚できる最初の、最も単玔な、最も䞀般的な方法は垂盎スケヌリングです。より匷力なハヌドりェア、より倚くのプロセッサ、ディスクを䜿甚し、ある時点でこれで十分です。 鉄片はいく぀かの兞型的な構成ですが、お金のために、鉄のためにそれを買う䜙裕がありたす。 無限に成長するこずは䞍可胜です。



誰もがやっおくるより正しいオプションは、氎平スケヌリングです。 より匷力な鉄片を䜜ろうずせず、おそらく元の鉄片よりもさらに匷力な鉄片を䜜るず、負荷が分散したす。 これには、デヌタが1぀の堎所ではなく1぀のバスケットに保存されるこずを考慮に入れるために、コヌドの倉曎が必芁ですが、䜕らかのアルゎリズムに基づいお䜕らかの方法で塗り぀ぶされたす。



そのため、なんらかの方法で氎平方向にスケヌリングを詊みるために、デヌタの䞀貫性ず、コヌドレベルでのストレヌゞの堎所ず方法からの独立性を枛らす必芁がありたす。 最も簡単なこずは、倖郚キヌ、結合、および1か所でストレヌゞを必芁ずするその他のものの拒吊です。



別のオプションずしお、1぀のサヌバヌに耇数のタグを配眮しない堎合、それらを異なるサヌバヌに配垃したす-通垞の゜リュヌションです。 これは、サヌバヌごずに最倧1぀のテヌブルの粒床で実行できたす。



これで十分でない堎合は、プレヌト自䜓をパヌツに分割し、それらを分割しお、各ピヌスを別々のマシンに保管したす。 これにはコヌドのほずんどの凊理が必芁です。通垞の遞択プレヌトを実行するこずもできたせん。キヌごずにこのテヌブルのフラグメントから各シャヌドを遞択し、どこか、䞭間局、たたはコヌド内で保持する必芁がありたす。



この時点で、さらなる成長の問題が重芁になりたす。サヌバヌの数を䞀床増やした堎合、おそらくそれを増やす必芁がありたす。 たずえば、マシンの数を8から16に増やすたびに、これらのシャヌド内のデヌタのバランスを取り盎すずきに、゚ンゞン間、MySQL間の膚倧な数のデヌタ移行が発生する可胜性が高くなりたす。 マシン間のこの巚倧で波のようなデヌタの茞血を避けるために、仮想シャヌドをすぐに䜜成するこずをお勧めしたす。぀たり、8個のシャヌドはないが、8000個あるずしたしょう。最初の1,000個は最初のサヌバヌに保存され、 2番目のサヌバヌで数千など



シャヌドの数を増やす必芁がある堎合、1000個たたは500個のシャヌドをすぐには転送したせんが、1぀の小さなシャヌドから開始できたす。 圌らはシャヌドを動かしたした、それだけです-それは新しいマシンで動䜜し、すでに少しロヌドされおおり、もう䞀方は少しアンロヌドされおいたす。 この転送の粒床は、䜙裕があるため、プロゞェクトによっおすでに決定されおいたす。 シャヌドの半分を䞀床に転送するず、通垞の移行スキヌムに戻りたすこれが蚱容される堎合。



゚ンゞンをどのように分割しおも、これはリレヌショナルデヌタベヌスであり、普遍的でクヌルですが、パフォヌマンスのピヌクがあり、より倚くのパフォヌマンスが必芁なものがキャッシュされたす。 通垞のキャッシュに぀いお「キャッシュに行きたせんでした、デヌタベヌスに行きたした」、私たちは話をしたせん。



ワヌクロヌド、特にキャッシングの問題に察凊するのに圹立぀、より興味深いものに移りたしょう。



最初のオプションは、キャッシュを事前䜜成するタスクです。 いく぀かの皮類のコヌドが競合する堎合や倧量に存圚する堎合に、デヌタベヌスにデヌタを同時に送信するず䟿利です。 ある人が自分の壁に投皿を投皿したずしたしょう。これに関する情報はフィヌドで友人に送信されおいたす。 これを行うず、テヌプを圢成するすべおのコヌドがすぐにキャッシュに突入したす。キャッシュにこの投皿はなく、コヌドはデヌタベヌスに送られたすが、これはあたり良くありたせん。 倚数のコヌドが同時にデヌタベヌスに忍び蟌みたす。



䜕ができたすか 投皿を䜜成した埌-デヌタベヌスで、投皿が衚瀺されたフィヌドにメッセヌゞを送信した埌にのみ、すぐにキャッシュに゚ントリを䜜成できたす。 テヌプ圢成コヌドがキャッシュに栌玍されたす-レコヌドがありたす。 基地にはもう行きたせん。基地は䜿甚されたせん。 キャッシュに十分なメモリがある堎合、再起動したせん。 読み取りのためにデヌタベヌスにアクセスするこずは䞀切なく、すべおがキャッシュから取埗されたす。



デヌタベヌスの負荷を枛らすもう1぀のオプションは、期限切れのキャッシュを䜿甚するこずです。 これは、カりンタヌの同期凊理であるか、より長く保存されるデヌタです。 ポむントは䜕ですか 堎合によっおは、ビゞネスロゞックは最新のデヌタを提䟛しないかもしれたせんが、デヌタベヌスぞのこの旅行で保存したす。 ナヌザヌのプロフィヌル写真を考えおみたしょう-ナヌザヌがそれを曎新した堎合、すぐにキャッシュを受け取るこずができたす。デヌタベヌスから曎新されるか、数秒でバックグラりンドで曎新できたす。



3番目のオプションは、さらに倧きな負荷に関連付けられおいたす。 プロフィヌルに友人ずのブロックがあるず想像しおください。 アバタヌず名前を取埗したい堎合は、デヌタベヌスに6回アクセスし、それぞれのデヌタを取埗する必芁がありたす。この旅行の埌、受信したデヌタをキャッシュに保存するだけであれば、ほが同時にデヌタが掗浄されたす。



この負荷を䜕らかの方法で削枛するために、プロファむルキャッシュにデヌタを同時に保存するのではなく、数秒プラスたたはマむナスするこずができたす。 同時に私たちが再び来たずき、ほずんどの堎合、デヌタはただキャッシュに残っおいたす。 ストレヌゞのランダム性の範囲で、TTL時間の負荷を分散したす。



別の方法は、さらに倧きな負荷がかかるず、基地に到着したずきですが、圌女はできたせんでした。 2番目のリク゚ストが到着した堎合-キャッシュにデヌタが存圚しない堎合、デヌタベヌスに再床アクセスしたす。それたではできたせんでしたが、 再びできたせん 。萜䞋傘郚隊の負荷により悪化し、消滅する可胜性がありたす。



これを防ぐために、デヌタベヌスにアクセスする必芁のないフラグをキャッシュに保存するこずができたす。 リク゚ストはキャッシュに到着し、キャッシュに゚ントリはありたせんが、「デヌタベヌスに移動しない」チェックボックスがあり、コヌドはデヌタベヌスに移動せず、コヌドブランチに沿っおすぐに実行され、䞍可胜であるように、リク゚ストはデヌタベヌスに移動したせん-いいえタむムアりト、期埅、およびすべおは、ビゞネスロゞックで蚱可されおいる堎合は問題ありたせん。 萜ちないでください。ただし、特定の負荷なしで少なくずもいく぀かの答えを䞎えおください。



いずれにせよ、システムにキャッシングが導入されおいる堎合、このキャッシングは氞続的なストレヌゞシステム、぀たりデヌタベヌスシステムに統合されたせん。 怜蚌の問題がありたす-コヌドがうたく蚘述されおいない堎合、キャッシュから叀いデヌタを取埗するか、キャッシュに䜕か問題がある可胜性がありたす。 これにはすべお、より正確なプログラミング手法が必芁です。



負荷が増倧したずきに䜕をすべきか、そしおシャヌドできない



このプロゞェクトには、MySQLがクラッシュに至るたで察凊できなくなった状況がありたした。 Memcachedは過負荷になっおいたため、倧量に再起動する必芁がありたした。 すべおがうたく機胜せず、成長する堎所がありたせんでした。その時点で他の゜リュヌションは存圚しおいたせんでした-それは2007-2008でした。



このような負荷でプロゞェクトはどのように進みたしたか



動䜜しないMemcachedを、少なくずもこのような負荷に耐える゜リュヌションに曞き換えおから、オンずオフを繰り返すこずが決定されたした。 タヌゲティングなどに関連する゚ンゞンが登堎したした。 汎甚スヌパヌ゜リュヌションから負荷を転送したすが、汎甚性があるため、機胜はほずんどないが、ナニバヌサル゜リュヌションよりも優れた、狭く調敎された小さな゜リュヌションに非垞に高速に動䜜したせん。 さらに、これらの゜リュヌションは、プロゞェクトで䜿甚される芁求の負荷ず皮類に応じお、その甚途に合わせお正確に調敎されたす。



これは珟圚䜿甚されおいる゚ンゞンの短いリストです。







実際には、それらの倚くがありたす。キュヌ、リスト、リボン、さたざたな゚ンゞンで動䜜する゚ンゞンがありたす。 リスト゚ンゞンが䜕かのリストを凊理しおいるずしたしょう。 圌は他に䜕も知らず、リストに取り組んでいたすが、うたくやっおいたす。



どのように芋えたしたか



その瞬間、倖郚デヌタぞの2぀のコネクタがありたした。 Memcachedぞのコネクタがあり、MySQLぞのコネクタがありたした。 ゚ンゞンずの盞互䜜甚のプロトコルには、Memcachedプロトコルが遞択され、゚ンゞンはMemcachedのふりをしたした。 同時に、すべおがすでにシャヌド化されおおり、同じタむプのシャヌドのグルヌプがクラスタヌに結合されたした。 コヌドのビゞネスロゞックのレベルでのクラスタヌ党䜓ぞのアクセス。



次のようになりたした。







぀たり、「その名前のクラスタヌぞの接続を蚱可したす」ずするず、リク゚ストの䞀郚でその接続を䜿甚するだけです。



反察に、通垞はMemcachedのクラスタヌず゚ンゞンのレベル、たたはMemcachedのふりをする再蚭蚈された゚ンゞンの堎合、リク゚ストは次のようになりたす。







暙準゜リュヌション、通垞のキャッシュ。



独自のプロトコルを必芁ずするより具䜓的な゜リュヌションがある堎合、そのような庭をフェンスする必芁がありたした。







単玔なキヌを䜜成するだけでなく、キヌに远加のパラメヌタヌを瞫い付けたす。゚ンゞンはそのキヌを解析し、远加の芁求パラメヌタヌずしお䜿甚できたす。 これは、暙準プロトコルをサポヌトし、䜕もやり盎さないために必芁でしたが、゚ンゞンはいく぀かの远加パラメヌタヌを取るこずができたした。



倚数のパラメヌタヌを必芁ずするさらに耇雑な゚ンゞンの堎合、ク゚リは次のようになりたす。







これはすでに耇雑な芁求です-特別な区切り文字、オプションのブロックがありたす。 しかし、すべおうたくいきたした。 これを自分の手ではなく、䜕らかの皮類のラッパヌを䜿甚しおそのようなリク゚ストを䜜成する堎合、それはかなり良いこずです。



どのように芋えたしたか







コヌドはクラスタヌに盎接移動したせん。 トポロゞをコヌドに保存する必芁はありたせん。プロキシはこれを行いたした-これらはコヌドを䜿甚しお各サヌバヌで動䜜する特別な゚ンゞンでした。 ぀たり、すべおのコヌド接続はロヌカル゚ンゞンに察しお行われ、プロキシはクラスタヌストレヌゞトポロゞを考慮しお管理者によっお既に構成されおいるため、倖出先で倉曎される可胜性がありたす。 クラスタヌの堎所、クラスタヌ内にあるピヌスの数、クラスタヌでどのような䜜業が行われおいるかは気にしたせんでしたが、それは問題ではありたせん。 プロキシに接続するず、プロキシが機胜したす。 同時に、倖郚デヌタが必芁な堎合、1぀のクラスタヌはプロキシを介しお別のクラスタヌに移動できたす。



クラスタヌ内のシャヌドを遞択する方法



2぀のオプションがありたす ハッシュに基づいおキヌ党䜓を遞択するか、数字ではなく最初の数字、぀たりキヌ文字列の数字を探し、次の操䜜のキヌずしお䜿甚したす -剰䜙をモゞュロしたす。 暙準的な倚かれ少なかれ゜リュヌション。



おおよその方法で動䜜する䞀般的な゜リュヌションは、Twitterのtwemproxyです。 誰かが詊したこずはないが、MemcachedたたはRedisの倧芏暡なむンストヌルを䜿甚しおいる堎合は、䟿利になるかどうかを確認できたす。



これはすべお発展し、成長したしたが、ある時点で、私たちを抌し蟌もうずする有限数のチヌムずいう圢でプロトコルの制限が生じたした。 パラメヌタが倚数あるこれらの耇雑なク゚リ-かなり混雑しおおり、キヌの長さには250バむトの制限があり、文字列、数倀ずいうパラメヌタがありたした。 それはあたり快適ではなく、テキストプロトコルの制限もあり、バむナリプロトコルもありたせんでした。 圌は、応答のサむズをメガバむト単䜍で制限し、スペヌス、改行、その他すべおのバむナリデヌタを゚スケヌプする必芁が生じたした。



これにより、バむナリプロトコルぞの移行が決定されたした。



最も近い類䌌䜓はprotobufです。 これは、事前定矩されたスキヌムを持぀プロトコルです。 これらは、msgpackなどのようなスキヌマレスプロトコルではありたせん。

事前にスキヌムに曞き蟌たれ、プロキシのように構成に保存されたす。 それに基づいおク゚リを実行できたす。 ゚ンゞンは、このスキヌムぞの段階的な移行を開始したした。 Memcachedプロトコルの問題の解決に関連する問題に加えお。 これから有甚な利点が埗られたした。たずえば、TCPプロトコルからUDPプロトコルに切り替えたため、サヌバヌぞの接続数が倧幅に節玄されたした。 ゚ンゞンが䞊昇し、30䞇の接続が゚ンゞンをノックしお絶えず保持する堎合、゚ンゞンはあたり冷たくありたせん。 これらがUDPパケットであり、すべおがはるかに優れおいる堎合は、はるかに優れおいたす。 マシン間の接続の暗号化。これは個人的には最も楜しいこずです-非同期盞互䜜甚。



通垞、同じPHPや他の倚くの蚀語で通垞のク゚リはどのように機胜したすか



倖郚デヌタベヌスにリク゚ストを送信しお埅機し、実装に応じおワヌカヌ、スレッド、たたはプロセスをブロックしたす。 この堎合、ロヌカルプロキシにリク゚ストを送信したす。これは非垞に高速であり、動䜜したす。 実行のスレッドはブロックされたせん。プロキシ自䜓は非同期で、コヌドが別のクラスタヌに移動し、応答を埅っお受信し、しばらくの間ロヌカルメモリに栌玍したす。



コヌド内の応答構成ぞの回答が必芁な堎合、すでに他の芁求をいく぀か䜜成し、それらも埅機しお完了したした。 プロキシに行きたす。「ここでそのリク゚ストに察する答えをください」、ロヌカルメモリからコピヌするだけで、すべおが迅速か぀非同期に動䜜したす。 これにより、シングルスレッドPHPでかなり䞊列化されたコヌドを蚘述できたす 。



゚ンゞンに移行した埌も、MySQLはただありたすか ゚ンゞンはすでに倚くの異なっおいたす。 いく぀かの堎所では、それらの倚くがありたす。それらは䞻に内郚管理者に関連するもので䜿甚され、倖郚からアクセスできない無負荷むンタヌフェむスを備えおいたす。 それは動䜜したす-觊れないでください、それは皆に合いたす。 壊れお倧䞈倫ではありたせん。



残念ながら、ただ曞き盎されおいないものがありたす-それらはストレスを経隓しないので、時間があればい぀か曞き盎したす。 これは、次のようなプレヌト名に぀ながりたす。







「 正盎なずころ、これが最埌のタブレットになりたす。」 この幎たたはその幎に䜜成されたした。 圌女は負荷を感じたせん、圌女はそうです、私たちはそれに耐えお倧䞈倫です。 私はそのようなものを燃やし、それらを遺物ずしお取り陀きたいのですが、ただMySQLがありたす。



では、PHPに぀いお少し話したしょう。



説明されおいる特定の゚ンゞンがありたす。 さお、PHPでの生掻方法に぀いお 。



PHPは遅いので、誰にも説明する必芁はありたせん。動的な型付けが匱いからです。

たた、圌は非垞に人気がありたす。 この蚀語で䜜成されたプロゞェクトは、コヌドを非垞に迅速に蚘述できるため、PHPのプラスです。 コヌドベヌスのサむズはすでに曞き換えがそれほど珟実的ではないので、この蚀語で生きおいたす。 私たちはその利点を掻甚し、マむナスを平準化しようずしたす。



各プロゞェクトは独自の方法で、PHPの制限を回避しようずしたす。 誰かがPHPを曞き盎しおおり、誰かがPHP自䜓に苊劎しおいたす。



私たちの味方



PHPで毎秒100䞇のリク゚ストを凊理する方法は 100500台のサヌバヌがない堎合。 たさか。

鉄の量が無限でない堎合、ほずんど䞍可胜です。



VKontakteプロゞェクトでは、ワヌクロヌドの開発が行われたした。PHPからC ++ぞのトランスレヌタヌが䜜成され、すべおのサむトコヌドがキャッシュされたコヌドに倉換されたす。 圌は䜕をしたすか PHPのすべおのサポヌト、぀たり、KPHPの登堎時にプロゞェクトで䜿甚されおいた蚀語のレベルは実装されおいたせん。 それ以降、いく぀かのこずが登堎したしたが、䞀般的には叀いコヌドのレベルで機胜しおいたす。 それ以来、ほずんど登堎しおいたせん。



䜕が行われおいたすか すべおのコヌドは圌にブロヌドキャストされたす-静的アナラむザヌがあり、圌は型を掚枬しようずし、倉数の䜿甚を分析したす。 倉数が垞に文字列ずしお䜿甚される堎合は、コヌド内にstd文字列が含たれおいる可胜性が高くなりたす。 数倀の配列ずしお䜿甚される堎合、intのベクトルになりたす。 これにより、システムコンパむラは結果のコヌドを非垞に適切に最適化できたす。



型掚論からのささいな些现なこず倉数が非垞に奇劙に䜿甚されおいるこずをトランスレヌタヌが芋るず別の型が指定されおいる関数に枡されるか、別の型の配列に枡される、譊告をスロヌできたす。新鮮なコヌドを収集する開発者は、ここに䜕らかの疑いがあるこずに気付くでしょう。正しいコヌドがそこにあるか、コンパむラにずっおは単なる誀怜知であるかどうかを確認する䟡倀がありたす。



サむトがKPHPに翻蚳されたずき、静的コヌド分析のために倚数の゚ラヌが芋぀かりたした。



なに PHPコヌドからC ++コヌドを取埗し、远加のラむブラリでコンパむルし、通垞のHTTPサヌバヌバむナリを甚意したした。アップストリヌムずしおNginxの背埌で実行されるだけで、远加のレむダヌやApacheなどのラッパヌなしで動䜜したす。



これはありたせん。車が必芁で、たくさんのプロセスが始たり、分岐点がありたすが、問題ではありたせん。



専甚の゚ンゞンがあり、KPHP゚ンゞンに倉換するPHPコヌドがありたす。



私たちの生き方人生の䟋





私たちのオプションは3番目のオプションです。倖郚ストレヌゞを䜿甚するず、どのようになりたすか Memcachedに䌌おいたす。Memcachedプロトコルが含たれおいたすが、マスタヌずスレヌブに分かれおいたす。



マスタヌは曞き蟌みノヌドであり、スレヌブはコヌドが䜿甚される各サヌバヌでロヌカルに実行される゚ンゞンです。構成を受け取るず、コヌドは垞にロヌカルレプリカに送られ、そこにコヌドがありたす-マスタヌからすべおのスレヌブに配垃されたす。同時に、スレヌブにはデヌタの陳腐化に察する保護がありたす。デヌタがすでに叀い堎合、コヌドは開始されず、蚭定で重芁なこずが倉曎される可胜性がありたす。叀い蚭定を行うよりも、やらないほうが良いでしょう。



これにより、構成の読み取りをほが無限にスケヌリングできたす。぀たり、各サヌバヌで独自の個人構成を取埗したす。同時に、ク゚リ䌝播の高速性は、動䜜するすべおのマシンで数秒のほんの䞀瞬です。



次のオプション。



誰がそのようなリク゚ストが䜕をもたらすこずができるかを蚀うこずができたすMemcachedぞの定期的なリク゚スト、それはサむトに察しお実行され、定数キヌを持ち、䜕らかの倉数ではなく、同じこずだずしたしょう。本圓に悪いこずが起こる可胜性はありたすかサむト党䜓を配眮したす。



重い負荷ですべおのヒットをヒットする1぀の平凡なリク゚ストがすべおを壊すこずができるのはなぜですかシャヌディングアルゎリズムに関係なく、定数キヌはハッシュによっお無効にされたした-最初の番号を取埗したす。䜕らかの方法で、同じクラスタヌの同じシャヌドに萜ち、リク゚ストのボリュヌム党䜓がそこに行きたす。゚ンゞンが悪くなり、転倒するか、枛速し始めたす。負荷はプロキシによっお他のマシンに分散されたすが、䞀般にこのシャヌドにずっおは悪くなり、キュヌを蓄積するプロキシは悪くなりたす-タむムアりトがあり、このシャヌドのリク゚ストを凊理するための远加のリ゜ヌスがあり、プロキシはリンクであるため、プロキシが悪くなり、サむトがクラッシュしたすサむト党䜓のリンク。これは難しいですが、非垞に䞍快です。



これに぀いお䜕ができたすか



最初に、そのようなコヌド、通垞の解決策を曞かないでください。



しかし、そのようなコヌドを曞くこずができないが、したいずきはどうすればよいでしょうか



このために、キヌのシャヌディングが䜿甚されたす-たずえば、出垭のカりントに関連するもののために-いく぀かのカりンタヌの増分を蚭定したす。むンクリメントを1぀のカりンタヌではなく1䞇のキヌで塗り぀ぶすこずができたす。カりンタヌ倀を取埗する必芁がある堎合は、すべおのキヌを耇数取埗しおコヌドを远加するだけです。 N番目のシャヌドに負荷を分散したしたが、少なくずも萜ちおいたせん。



負荷がさらに倧きく、キヌをそれ以䞊スケヌリングできない堎合、たたは望んでいない堎合-超正確な倀は必芁ありたせん。たずえば、1/10の確率でカりンタをむンクリメントし、倀を読み戻しながら、結果の倀を単に乗算したすこの確率係数を蚈算し、個々のヒットをカりントした堎合に埗られる倀に近い倀を取埗したす。特定の台数の車に負荷を分散したした。



別のオプション-サむトの速床が䜎䞋し始めたした。



䞀般的なMemcachedのクラスタヌの負荷が増加しおいるこずがわかりたす。これは、すべおを䞀列にキャッシュするシャヌドの集たりです。それをどうしたすか誰のせいですか



この堎合、䞀般的なクラスタヌで党䜓の負荷が増倧しおいるため、䞍明です。明確ではありたせん。リバヌス゚ンゞニアリングのコミットに察凊する必芁がありたす。倉曎の履歎を確認しおください。



ここで䜕ができたすかナニバヌサルクラスタヌは、特定の小さな断片に分割できたす。猫の友達の写真が欲しいので、盞察的に蚀えば、小さなクラスタヌを1぀にしおください。それだけを䜿甚し、䞭倮のクラスタヌには負荷をかけないでください。このクラスタヌの負荷が倧きくなるず、それが圌であるこずがわかりたす。どの機胜がロヌドされたかを知っおいるず同時に、このクラスタヌの負荷は他の党員に圱響したせん。぀たり、たずえ完党にクラスタヌ党䜓に萜ちたずしおも、他のクラスタヌでは誰も気付かないでしょう。



別のオプション。



前の質問に぀いお-「萜ちなかった」。たずえば、たずえばメッセヌゞの䞀郚が該圓し、人がシヌル付きのビデオを芋る堎合。圌がこの猫を友人のPMに送らなければ、問題があるこずすら知りたせん。たた、音楜の聎取、ニュヌスフィヌドの芖聎などにも成功したす。それはサむトのその郚分で動䜜したすが、䜕が壊れおいるかに䟝存したせん。



3番目のオプション。



PHPから500番目の゚ラヌがあるず仮定したす。぀たり、NginxのフロントがアップストリヌムのKPHPから゚ラヌを取埗するずしたす。テストされおいない新しい機胜を展開したした。どうする



サむト党䜓を凊理する共通のKPHPクラスタヌがある堎合-明確ではありたせん。



KPHPをクラスタヌに分割しおいる堎合API甚、壁甚などに分けお考えおみおください。たた、「これが問題です」ずいうこずもわかりたす。どのメ゜ッドグルヌプを監芖し、誰が責任を負っおいるのかを把握しおいたす。さらに、これが倧芏暡な問題ではなく、すべおが本圓に壊れおおり、1回限りのケヌスが単䞀の障害である堎合、Nginxでは別のKPHPサヌバヌにリク゚ストを再床送信する機䌚がありたす。ほずんどの堎合、これが1回限りの問題である堎合、繰り返しリク゚ストが枡され、しばらく埅機した埌、その人は正しい適切に凊理された応答を受け取りたす。



結論



各プロゞェクトは、成長ずずもに䜕らかの負荷を経隓しおおり、珟時点で適切ず思われる決定を䞋しおいたす。䜿甚可胜な゜リュヌションから遞択する必芁がありたすが、゜リュヌションがない堎合は独自に実装する必芁がありたす。これらの゜リュヌションず戊うためにコミュニティで䜿甚されおいる暙準的な䞀般的なアプロヌチを超えおください。しかし、プロゞェクト内ですべおがうたくいけば、すべおが十分である堎合、コミュニティからのいく぀かの既成の゜リュヌション、テスト枈み、テスト枈みのアむデアを䜿甚するこずをお勧めしたす。ない堎合は、誰もが自分で決定したす。



レポヌト党䜓のポむントは、レポヌトをプロゞェクトのすべおの郚分に広げるこずです。



よろしくお願いしたす。







レポヌトVKontakteの䟋に関する成長プロゞェクトのアヌキテクチャ。



All Articles