web-dev-qa-db-ja.com

トラフィックの多いWebサイトをスケールアウトするにはどうすればよいですか?

容量を処理するために「スケールアウト」する必要のあるWebサイトについて、どのようなベストプラクティスを実行する必要がありますか?人々がクラウドを検討している今、これは特に関連がありますが、ファンダメンタルズを見逃しているかもしれません。

開発レベルのタスクからインフラストラクチャ、管理に至るまで、ベストプラクティスと思われるあらゆることについて聞きたいです。

14

並行処理の設計

つまり、コーディングしているときに、複数のスレッドを実行することを計画します。共有状態を計画します(多くの場合dbのみ)。複数のプロセスを計画します。物流計画を立てます。

これにより、システムを複数のマシンに分散したり、ロードバランシングを使用して複数のプロセスに分散したりできます。これにより、障害が発生した場合に冗長プロセスを実行でき、システムをインプレースで変更する必要がある場合に、すべてのサービスを終了する必要はありません。

16
Fishtoaster

あなたが考えるかもしれないいくつかのこと:

  • データストレージの読み取り側と書き込み側を分離する。
    • CQRS /イベントソーシング
    • CQS
    • メッセージパッシング/アクター
  • 共有プロセスとスレッド状態の回避
    • したがって、ロックを回避する
    • クラス、構造体、その他のデータ型を不変に、つまり構築後に変更しないように作成することで、型システムを通じてこれを回避できます。特に複雑な抽象データ型の場合、驚くほどうまく機能します(jQueryの実装など)。
  • IOでWebサーバースレッドをブロックしない。 ASP.Netを使用している場合APMパターン/タスク並列ライブラリ(TPL)で非同期ページ/アクションを使用します。
  • 状態の負荷をユーザーセッションディクショナリに保存しない
    • これは、IISでスレッドの移行が発生したときに、スレッド間で移動する必要があります。
    • 非インテリジェント/静的リソースがオーバーヘッドを追加する同じアプリケーションフレームワーク(ASP.Netなど)で提供されないように、インテリジェントなルーティングを使用します。たとえば、さまざまなWebサーバーがあるとします。
  • 非同期ワークフローパターンを使用して継続渡しコードを記述する(例:bind(haskell)/callcc/Tasks.ContinueWith/F#'s async)
  • キューイング理論を使用して、ボトルネックが発生する可能性のある場所を計算します
  • プルモデルではなくプッシュベースの更新を使用して、読み取りモデルやその他のアプリケーションの状態を更新します。例えば。 RabbitMQ/nServiceBus経由
  • 機能が最も少ない「httpハンドラ」を使用する
  • 静的ファイルの場合、e-tagとキャッシュの有効期限ポリシーを提供して、Webインフラストラクチャが正常に機能するようにします(例:squidプロキシを使用)
  • (スケーリングの問題を解決し、オンサイトのチュートリアルを取得するために私を雇ってください;))
13
Henrik

シェアナッシングアーキテクチャ

それを念頭に置いて、あなたが思うかもしれないこととは逆に、すぐにスケールアウトソリューションにジャンプしないでください。システム外のオーバーヘッドとシステム内の呼び出しを比較検討する必要があります。たとえば、ローカルコールを行うよりも、ネットワークインターフェースを介してDB接続を行うのに、LOTは長くかかります。スケールアウトに必要な管理、電力、およびチューニングの作業にかかる時間と、真の大規模なシステムの場合の追加の$を予算化します。

いずれにしても、「何も共有しない」アーキテクチャには依然として大きな価値があり、時間の経過時にシステムを階層化およびスケールアウトできます。

4
Jé Queue

安全、高速、信頼性の高いDNS

レジストラのDNSサーバーを使用しているいくつかの大容量Webサイトを見つけましたが、アップタイムやパフォーマンスのためにSLAがありませんでした。さらに、それらのサーバーはインドにあり、レイテンシーだけでDNSスプーファーは、顧客または中間ISPのキャッシュを汚染する可能性があり、これにより、SSLで保護されたトラフィックでさえ、誰にも知られずにリダイレクトされる可能性があります。

DNSの速度は、レコードがキャッシュされる前のサーバーの初期読み込み時間にも影響します。

私はほとんどの顧客にDynDNSまたはNeustarを使用しています。これは、非常に堅実なDNSインフラストラクチャを持っているためです(ただし、それは高価であり、私はこれらの会社に他の提携関係はありません)。

0

複数のホスト名にわたる要求を並列化します

HTTP標準の一部は、WebクライアントがDNSホストごとに最大2つのセッションを要求するというセクションです。 www.domain.comにエイリアスを設定してリクエストの同時実行性を高め、ページの読み込みを高速化するソリューションは次のとおりです。

https://stackoverflow.com/questions/3653609/how-do-i-code-my-asp-net-page-to-parallelize-downloads-across-hostnames

基本的には、ASP.NET HTTPハンドラーを編集して、クライアントを送信するターゲットホストを代替します。各ホストはCNAMEから "www"です。

0

キーは単純になると思います:

簡単なコードを用意してください。それはあなたが見て理解することを意味します。サーバーを拡張して変更するときは、何が起こっているのかを知る必要があります。また、すばやく理解する必要があるコーダーを追加する必要がある場合もあります。明白ではないランダムなコードを呼び出すフックとXMLファイルは非常に悪いです。

次に、問題をテストして見つけることができます。

ここを見てください: http://blog.servint.net/2013/08/27/going-big-how-to-scale-a-website-part-1-infrastructure-that-scales/

私たちは stellarbuildがダウンタイムなしでWebサイトを拡張できるように努めています。 つまり、コードの機能と実行場所を知る必要があります。別のマシンをテストしている場合でも、拡張に時間がかかりすぎることはありません。ほとんどの人は悲しいことに、ほとんど手遅れになったときにはじめます。私の意見では、それを行って初めて最適化できます。

0
msj121