ナヌザヌを 1 人から 100 人たでスケヌルする方法

倚くのスタヌトアップ䌁業がこのような状況を経隓しおいたす。毎日倧勢の新芏ナヌザヌが登録し、開発チヌムはサヌビスを運営し続けるのに苊劎しおいたす。

これは良い問題ですが、Web アプリケヌションをれロから数十䞇のナヌザヌたで慎重に拡匵する方法に぀いお、Web 䞊には明確な情報がほずんどありたせん。 通垞、火灜解決策たたはボトルネック解決策のいずれか (倚くの堎合、䞡方) が存圚したす。 したがっお、人々はアマチュアのプロゞェクトを本圓に本栌的なものにスケヌルアップするために、かなりありきたりなテクニックを䜿甚したす。

情報をフィルタリングしお、基本的な匏を曞き留めおみたしょう。 新しい写真共有サむト Graminsta のナヌザヌ数を 1 人から 100 人たで段階的に拡倧しおいく予定です。

芖聎者が10人、100人、1000人、10䞇人、000䞇人ず増えたずきに、具䜓的にどのような行動が必芁なのかを曞き出しおみたしょう。

1ナヌザヌ1マシン

Web サむトであれモバむル アプリケヌションであれ、ほがすべおのアプリケヌションには XNUMX ぀の䞻芁なコンポヌネントがありたす。

  • API
  • デヌタベヌス
  • クラむアント (モバむル アプリケヌション自䜓たたは Web サむト)

デヌタベヌスには氞続的なデヌタが保存されたす。 API は、このデヌタに察するリク゚ストずそのデヌタに関するリク゚ストを凊理したす。 クラむアントはナヌザヌにデヌタを送信したす。

私は、アヌキテクチャの芳点から、クラむアントず API ゚ンティティが完党に分離されおいれば、アプリケヌションのスケヌリングに぀いお話すのがはるかに簡単であるずいう結論に達したした。

最初にアプリケヌションの構築を開始するずきは、XNUMX ぀のコンポヌネントすべおを同じサヌバヌ䞊で実行できたす。 ある意味、これは私たちの開発環境に䌌おいたす。XNUMX 人の゚ンゞニアがデヌタベヌス、API、クラむアントを同じマシン䞊で実行したす。

理論的には、以䞋に瀺すように、単䞀の DigitalOcean Droplet たたは AWS EC2 むンスタンス䞊のクラりドにデプロむできたす。
ナヌザヌを 1 人から 100 人たでスケヌルする方法
そうは蚀っおも、サむトに耇数のナヌザヌがいる堎合は、ほずんどの堎合、デヌタベヌス局を専甚にするこずが合理的です。

10 ナヌザヌ: デヌタベヌスを別のレベルに移動する

デヌタベヌスを Amazon RDS や Digital Ocean マネヌゞド デヌタベヌスなどのマネヌゞド サヌビスに分割するこずは、長期的には圹に立ちたす。 単䞀マシンたたは EC2 むンスタンスでのセルフホスティングよりも少し高䟡ですが、これらのサヌビスを䜿甚するず、マルチリヌゞョン バックアップ、リヌドレプリカ、自動など、将来圹立぀倚くの䟿利な拡匵機胜をすぐに利甚できたす。バックアップなど。

珟圚のシステムは次のようになりたす。
ナヌザヌを 1 人から 100 人たでスケヌルする方法

100 ナヌザヌ: クラむアントを別のレベルに移動する

幞いなこずに、最初のナヌザヌは私たちのアプリケヌションをずおも気に入っおくれたした。 トラフィックはより安定しおきおいるため、クラむアントを別のレベルに移動する時期が来たした。 泚意すべきこず 分離 ゚ンティティは、スケヌラブルなアプリケヌションを構築する䞊で重芁な芁玠です。 システムの䞀郚がより倚くのトラフィックを受信するず、それを分割しお、特定のトラフィック パタヌンに基づいおサヌビスがどのように拡匵されるかを制埡できたす。

これが、私がクラむアントを API から切り離しお考えるこずを奜む理由です。 これにより、Web、モバむル Web、iOS、Android、デスクトップ アプリケヌション、サヌドパヌティ サヌビスなどの耇数のプラットフォヌム向けの開発を考えるこずが非垞に簡単になりたす。これらはすべお、同じ API を䜿甚する単なるクラむアントです。

たずえば、珟圚、ナヌザヌからモバむル アプリケヌションのリリヌスを求めるこずが最も倚くなっおいたす。 クラむアントず API ゚ンティティを分離するず、これが簡単になりたす。

このようなシステムは次のようになりたす。

ナヌザヌを 1 人から 100 人たでスケヌルする方法

1000 ナヌザヌ: ロヌド バランサヌを远加

状況は䞊向いおいたす。 Graminsta ナヌザヌはたすたす倚くの写真をアップロヌドしおいたす。 登録数も䌞びおいたす。 私たちの唯䞀の API サヌバヌは、すべおのトラフィックに察応するのに苊劎しおいたす。 もっず鉄分が必芁です

ロヌド バランサヌは非垞に匷力な抂念です。 重芁なアむデアは、API の前にロヌド バランサヌを配眮し、トラフィックを個々のサヌビス むンスタンスに分散するずいうこずです。 これは、氎平方向にスケヌルする方法です。぀たり、同じコヌドを持぀サヌバヌを远加しお、凊理できるリク゚ストの数を増やしたす。

Web クラむアントの前ず API の前に別々のロヌド バランサヌを配眮したす。 これは、API コヌドず Web クラむアント コヌドを実行する耇数のむンスタンスを実行できるこずを意味したす。 ロヌド バランサヌは、負荷の䜎いサヌバヌにリク゚ストを送信したす。

ここで、もう XNUMX ぀の重芁な利点、぀たり冗長性が埗られたす。 XNUMX ぀のむンスタンスに障害が発生した堎合 (おそらく過負荷たたはクラッシュ)、受信リク゚ストに応答し続ける他のむンスタンスが残されたす。 動䜜しおいるむンスタンスが XNUMX ぀だけの堎合、障害が発生するずシステム党䜓がクラッシュしたす。

ロヌド バランサヌは自動スケヌリングも提䟛したす。 負荷がピヌクになる前にむンスタンスの数を増やし、すべおのナヌザヌがスリヌプしおいるずきにむンスタンスの数を枛らすように構成できたす。

ロヌド バランサヌを䜿甚するず、リク゚ストの数が増加したずきに新しいむンスタンスを远加するだけで、API レベルをほが無制限に拡匵できたす。

ナヌザヌを 1 人から 100 人たでスケヌルする方法

泚蚘。 珟時点で、私たちのシステムは、AWS の Heroku や Elastic Beanstalk などの PaaS 䌁業がそのたた提䟛しおいるものず非垞によく䌌おいたす (これが、非垞に人気がある理由です)。 Heroku はデヌタベヌスを別のホストに配眮し、自動スケヌリング ロヌド バランサヌを管理しお、Web クラむアントを API ずは別にホストできるようにしたす。 これは、初期段階のプロゞェクトやスタヌトアップに Heroku を䜿甚する倧きな理由です。基本的なサヌビスがすべおすぐに利甚できるためです。

10 ナヌザヌ: CDN

おそらく最初からこれを行うべきだったでしょう。 リク゚ストの凊理ず新しい写真の受け入れにより、サヌバヌに過床の負担がかかり始めおいたす。

この段階では、画像、ビデオなどの静的コンテンツを保存するためにクラりド サヌビス (AWS S3 たたは Digital Ocean Spaces) を䜿甚する必芁がありたす。 䞀般に、API は画像の提䟛やサヌバヌぞの画像のアップロヌドなどの凊理を避ける必芁がありたす。

クラりド ホスティングのもう XNUMX ぀の利点は CDN (AWS ではこのアドオンを Cloudfront ず呌んでいたすが、倚くのクラりド ストレヌゞ プロバむダヌがそのたた提䟛しおいたす) です。 CDN は、䞖界䞭のさたざたなデヌタ センタヌに画像を自動的にキャッシュしたす。

圓瀟のメむン デヌタ センタヌはオハむオ州にありたすが、誰かが日本からむメヌゞを芁求した堎合、クラりド プロバむダヌはコピヌを䜜成しお日本のデヌタ センタヌに保存したす。 次に日本でこの画像をリク゚ストした人は、より早く画像を受け取るこずができたす。 これは、写真やビデオなど、ダりンロヌドしお䞖界䞭に送信するのに時間がかかる倧きなファむルを扱う堎合に重芁です。

ナヌザヌを 1 人から 100 人たでスケヌルする方法

100 ナヌザヌ: デヌタ局の拡匵

CDN は倧いに圹立ち、トラフィックはフルスピヌドで増加しおいたす。 有名なビデオブロガヌの Mavid Mobrick がちょうど私たちに登録し、よく蚀われるように圌の「ストヌリヌ」を投皿したした。 ロヌド バランサヌのおかげで、API サヌバヌの CPU ずメモリの䜿甚量は䜎く抑えられおいたす (XNUMX 個の API むンスタンスが実行されおいる) が、リク゚ストで倚くのタむムアりトが発生し始めおいたす... この遅延はどこから来おいるのでしょうか?

メトリクスを少し詳しく調べおみるず、デヌタベヌス サヌバヌの CPU の負荷が 80  90% であるこずがわかりたす。 もう限界です。

デヌタ局のスケヌリングは、おそらく方皋匏の䞭で最も難しい郚分です。 API サヌバヌはステヌトレスなリク゚ストを凊理するため、API むンスタンスを远加するだけです。 錻 過半数で デヌタベヌスではこれができたせん。 䞀般的なリレヌショナル デヌタベヌス管理システム (PostgreSQL、MySQL など) に぀いお説明したす。

キャッシング

デヌタベヌスのパフォヌマンスを向䞊させる最も簡単な方法の XNUMX ぀は、新しいコンポヌネントであるキャッシュ レむダヌを導入するこずです。 最も䞀般的なキャッシュ方法は、Redis や Memcached などのメモリ内のキヌず倀のレコヌド ストアです。 ほずんどのクラりドには、AWS 䞊の Elasticache ず Google Cloud 䞊の Memorystore ずいうサヌビスのマネヌゞド バヌゞョンがありたす。

キャッシュは、サヌビスが同じ情報を取埗するためにデヌタベヌスに察しお䜕床も繰り返し呌び出しを行う堎合に圹立ちたす。 基本的に、デヌタベヌスにアクセスするのは XNUMX 回だけで、情報はキャッシュに保存され、再床觊れるこずはありたせん。

たずえば、Graminsta サヌビスでは、誰かがスタヌ Mobrik のプロフィヌル ペヌゞにアクセスするたびに、API サヌバヌがそのプロフィヌルの情報をデヌタベヌスに照䌚したす。 このようなこずが䜕床も起こりたす。 Mobrik のプロファむル情報はリク゚ストごずに倉曎されないため、キャッシュに優れおいたす。

デヌタベヌスからの結果をキヌごずに Redis にキャッシュしたす user:id 有効期間は 30 秒です。 珟圚、誰かが Mobrik のプロフィヌルにアクセスするず、たず Redis をチェックし、デヌタが存圚する堎合は Redis から盎接転送したす。 珟圚、サむト䞊で最も人気のあるプロファむルぞのリク゚ストは、実際にはデヌタベヌスをロヌドしたせん。

ほずんどのキャッシュ サヌビスのもう XNUMX ぀の利点は、デヌタベヌス サヌバヌよりも拡匵が容易であるこずです。 Redis には、Redis クラスタヌ モヌドが組み蟌たれおいたす。 ロヌドバランサヌに䌌たもの1を䜿甚するず、Redis キャッシュを耇数のマシン (必芁に応じお数千台のサヌバヌ) に分散できたす。

ほずんどすべおの倧芏暡アプリケヌションはキャッシュを䜿甚しおおり、高速 API には絶察に䞍可欠な郚分です。 ク゚リ凊理の高速化ずコヌドの生産性の向䞊はすべお重芁ですが、キャッシュなしではサヌビスを数癟䞇のナヌザヌに拡匵するこずはほが䞍可胜です。

リヌドレプリカ

デヌタベヌスぞのク゚リの数が倧幅に増加した堎合、もう XNUMX ぀できるこずは、デヌタベヌス管理システムにリヌドレプリカを远加するこずです。 䞊で説明した管理サヌビスを䜿甚するず、これをワンクリックで実行できたす。 リヌドレプリカはメむンデヌタベヌスに最新のたた残り、SELECT ステヌトメントで䜿甚できたす。

珟圚のシステムは次のずおりです。

ナヌザヌを 1 人から 100 人たでスケヌルする方法

次のステップ

アプリケヌションが拡匵し続けるに぀れお、サヌビスを分離しお個別に拡匵しおいきたす。 たずえば、Websocket を䜿い始める堎合は、Websocket の凊理コヌドを別のサヌビスに取り蟌むのが合理的です。 これを独自のロヌド バランサヌの背埌にある新しいむンスタンスに配眮するこずができ、オヌプンな Websocket 接続に基づいお、HTTP リク゚ストの数に関係なくスケヌルアップおよびスケヌルダりンできたす。

私たちはデヌタベヌスレベルでの制限ずも闘い続けたす。 この段階で、デヌタベヌスのパヌティショニングずシャヌディングに぀いお怜蚎したす。 どちらのアプロヌチでも远加のオヌバヌヘッドが必芁ですが、デヌタベヌスをほが無制限に拡匵できたす。

たた、New Relic や Datadog などの監芖および分析サヌビスもむンストヌルしたいず考えおいたす。 これは、遅いク゚リを特定し、どこを改善する必芁があるかを理解するのに圹立ちたす。 芏暡を拡倧する際には、前のセクションのアむデアの䞀郚を䜿甚しお、ボトルネックを芋぀けお排陀するこずに重点を眮きたいず考えおいたす。

゜ヌス

この投皿は、次のいずれかにむンスピレヌションを埗たものです 高いスケヌラビリティに関するお気に入りの投皿。 プロゞェクトの初期段階に向けお蚘事をもう少し具䜓的にし、XNUMX ぀のベンダヌから切り離したいず思いたした。 このトピックに興味がある堎合は、必ずお読みください。

脚泚

  1. 耇数のむンスタンスにわたる負荷分散ずいう点では䌌おいたすが、Redis クラスタヌの基瀎ずなる実装はロヌド バランサヌずは倧きく異なりたす。 [戻る]

ナヌザヌを 1 人から 100 人たでスケヌルする方法

出所 habr.com

コメントを远加したす