web-dev-qa-db-ja.com

最も一般的なWebサイトのスケーラビリティの落とし穴

私たちは、高いユーザー数と一般的に多くの使用を達成することを望んでいるウェブサイト/ウェブアプリケーションを設計しています。具体的には、プログラミング/スクリプト言語としてPHPを使用し、リレーショナルDBに必要なMySQLを出発点として使用する予定です。NoSQLデータベースを使用するかどうかはまだわかりません。

これに関連して、スケーラビリティを念頭に置いて設計したいと考えています。 Webサイトの最も一般的なスケーラビリティの落とし穴は何ですか?システムを簡単にスケーラブルにするために考慮する必要のある重要な領域は何ですか?

8
Shade

それに加えて、非常に一般的なことを1つ追加します-間違った場所での最適化PHP構文構成体のナノ秒の違いについて議論している記事はたくさんありますが、アプリケーションのキャッシングインフラストラクチャを適切に設計する方法についてはそれほど触れていません。すでに述べたように、テストしてください。ただし、ただテストしてください-プロファイルと何を見つけてください正確に遅いです-それはCPUバウンドですか?I/Oバウンドですか?メモリバウンドですか?それはあなたをダウンさせるデータベースクエリですか、それはファイルを読んでいますか?計算?それを排除するか、やり直してより高速に動作するか?など「高速なのでNoSQLを使用しましょう」から始めないでください。「これをやりたいのですが、ボトルネックは何ですか?どのように排除するか」から始めてください。 ?100人のユーザーがいる場合、どのように動作しますか? "ワークロードとアプリについて詳しく知らなければ、具体的なことを言うのは難しいですが、キャッシュできるものと、ファイルシステム/データベースなどのアクセスを減らす方法を考えることから始めます。特に変更(これらはキャッシュも無効にするため)。

11
StasM

最も一般的なスケーラビリティの落とし穴は、早い段階で負荷テストを実行しないことです。開発の早い段階で予想される負荷に匹敵するものをシミュレートするテストを設定すると、スケーラビリティに対する技術的またはアーキテクチャ上の障害を、修正するのに費用がかかりすぎる前に検出して修正できます。

6

PHPを使用したスケーリングの良い例: TumblrFlickrNetlog

スケーラビリティに関する一般的なアドバイス:

  • 複雑にしないでおく!
    派手なベンダー固有のソリューションを過剰に設計したり、購入したりしないでください。
  • シェアードナッシングアーキテクチャ
    状態をデータベースに保持し、アプリケーションサーバーから切り離します(サーバー上のセッションデータも避けてください)。これにより、必要に応じて簡単にアプリサーバーを追加できます。
  • フロントエンド(静的ファイル)キャッシュに焦点を当てる
    リバースプロキシを使用し、後でCDNで使用します。アプリサーバーからサービスを受ける必要がないものはすべて、そのサーバーへの負荷が少なくなります。
  • 実際のシステムを測定する
    監視を組み込んで、ボトルネックがどこにあるかを把握します。成長曲線に基づいて将来の負荷を予測できることを確認してください。
  • DB設計に注意する
    クエリを調整し、memcachedを使用してクエリをまったく行わないようにし、1つのDBインスタンスの空き容量がなくなったときにインスタンス間でデータをシャーディングします(これを事前に確認します)。

いくつかの落とし穴:

  • NoSQLとSQLは真っ赤なニシンです。
    すべての大物はSQLデータベースでコアを実行しています。理にかなっていることが確実な場合はNoSQLを使用しますが、スケーリングの問題が解決されると想定して使用しないでください。そうではありません。
  • ORMに注意してください。
    これらはアプリサーバー上で状態が多く(シェアードナッシングアーキテクチャと矛盾します)、SQLクエリを調整する方法だけでなく、SQLクエリに加えてORMを調整する方法を理解する必要があります(言い換えれば、パフォーマンスが重要でない場合にのみ、物事を単純化します)。代わりに、手動で設計されたクエリとmemcachedの自由な使用を優先します。
  • サーバー上の重いテンプレート/ルーティングシステム。サーバースタックは意図的に軽量にしてください。
  • 行ごとのコードパフォーマンスについて心配する必要はありません。
    いつでもアクセスしてホットスポットを修正できます(xdebugまたは同様のプロファイリングツールを使用)。スケーラブルなアーキテクチャを持つことは、コードのパフォーマンスよりもはるかに重要なので、それに応じて頭脳を投資してください。
5
Joeri Sebrechts

スケーラビリティの問題があるかどうかを確認する唯一の実際の方法は、それをテストすることです。そのため、早期にテストし、頻繁にテストします Michael Borgwardtによる

それ以外に、システムがスケーリングしない一般的な理由は、リソースの競合です。そしてそれは通常、データベースに表示されます-同時に読み書きしようとします。したがって、読み取り(クエリ)側を書き込み(コマンド)側から切断する CQRSアプローチ の使用を検討することをお勧めします。

1
Peter K.

すべてをシャーディングする準備をしてください。複数のホストに分割できる場合は、拡張可能な何かを構築するのに非常に近いです。

また、100万人のユーザーの場合に合わせて設計し、スケールダウンします。 1,000ユーザー向けに設計してスケールアップしないでください。

正直なところPHPそしてMySQLはこれを行うための私の選択ではありません。MySQLでシャーディングされたデータを実行しようとすると、首の痛みになります。

1
Zachary K