それは大きな質問です:)私たちは大きくないLAMPを備えたWebサイト、LVS負荷分散を備えた5つのWebサーバー、レプリケーションと読み取りと書き込みの分離を備えた3つのMySQLサーバーを実行しており、キャッシュと一部のフルテキスト検索にMemcachedを使用していますツール。今のところトラフィックが少ないため、これまでのところうまく機能しています。
しかし、ユーザーが急速に成長している場合、ニーズを満たすためにアーキテクチャを拡張する必要があります。おそらく、分散ファイルシステムとデータベース(および並列コンピューティング?)が導入され、クラスタリングとメンテナンスのためのいくつかの手法(GearmanやPshellなど)も導入されるでしょう。
私が通り抜けることができるネット上のいくつかの記事があります。しかし、私はこの問題に実行可能かつ効率的に準備するためにいくつかの実践的な経験が本当に必要です。
Webアプリケーションとそれをサポートするインフラストラクチャをスケーリングする方法はたくさんあります。 Cal Hendersonは、「スケーラブルなWebサイトの構築」というテーマで優れた本を書きました。それはFlickrでの彼の経験に基づいていました。ゆっくりと成長しない限り、他の多くの人が見たのと同じ種類の成長の問題に遭遇します。スケーリングは、他の多くの主題と同様に、目的地ではなく旅です。
最初のステップは、すべてを繰り返し可能、測定可能、および管理可能にすることです。繰り返し可能とは、FAIやキックスタートなどのツールを使用してOSをインストールし、puppetやcfengineなどのツールを使用してベースOSがインストールされたらマシンを構成することを意味します。測定可能とは、サボテン、コオロギ、神経節などを使用して、クラスターの現在のパフォーマンスを監視することを意味します。負荷平均などだけでなく、ページのレンダリングやリクエストの処理にかかる時間を測定します。これらはどちらも開始時には重要ではないように見えますが、システムが負荷からフォールオーバーする前に通知する必要があり、一度に10台または100台のマシンを簡単に追加できます。推測ではなくデータに基づいて成長計画を立てます。
管理可能とは、できるだけ多くの構成を自動的に生成してテストできるようにツールを配置することを意味します。あなたが持っているものから始めて、それを成長させてください。マシン情報をデータベースに保存している場合は、すばらしいです。そうでない場合は、おそらくエクスポートできるスプレッドシートがあります。まだ行っていない場合は、構成をある種のソース管理に入れます。データベースから構成を自動的に作成することで、より少ないストレスで成長することができます。サーバーで稼働する前にテストすることで、タイプミスやその他のエラーが原因でサービスが開始されないようにすることができます。
水平法は、物事を適切に繰り返すことができることを前提としています。アプリケーションについて考えてください。どの領域を分割するのが理にかなっていますか?多くのマシンで並行して処理できる領域は何ですか?レイテンシーはアプリケーションに影響しますか?接続制限やその他のボトルネックに遭遇する可能性はどのくらいありますか? Webサーバーに、メール配信、データベース、またはその他の雑用も処理するように依頼していますか?
私は何百ものWebサーバーがある環境で働いてきました。負荷の種類によって、物事は異なる方法で分割されるはずです。めったに変更されないデータファイルの大規模なコレクションがある場合、アクティブに変更される「もの」からそれらを分割すると、静的データと動的データの両方を提供するための余裕が増える可能性があります。さまざまなツールがさまざまな負荷に対してより適切に機能します。 ApacheとLighttpdはいくつかの点でうまく機能し、Nginxは他の点でうまく機能します。
プロキシとキャッシュを見てください。ユーザーとアプリケーションの間、およびアプリケーションの一部の間の両方。すでにmemcacheを使用しているとのことですが、これは役に立ちます。アプリケーショントラフィックによっては、ロードバランサーとWebサーバーの間にperlbalやpoundなどのリバースプロキシを配置することが理にかなっている場合があります。
ある時点で、MySQLマスター<->(N *スレーブ)レプリケーションが追いついておらず、データベースをパーティション分割する必要があることに気付く場合があります。データベースのパーティション分割には、データ管理の別のレイヤーの設定が含まれる場合があります。多くの人が、この管理にmemcacheを備えた別のデータベースを使用しています。私が働いていたある場所では、ほとんどのデータにマスター<->マスター複製ペアを使用し、データへのポインターに10個の読み取りスレーブを持つ別のペアを使用しました。
これは、何百台ものマシンがあるサイトでの作業で遭遇したいくつかの問題の非常に簡単な説明です。数台のマシンから数百台のマシンに成長することに終わりはありません。同じことが数千人への成長にも当てはまると確信しています。
最近出てきたこのトピックについての良い文献がたくさんあります。 高スケーラビリティ から開始します。そこから最高のものの多くが好まれます。 Digg's Tech Blog を見て、私たちのやり方についての洞察を得ることができます。また、SAGEのようなリソースに連絡することもできます-SAGEリストの人々は素晴らしいリソースです。
ほとんどのWebアプリケーションのユーザーベースが大幅に増加しているため、開発者はDBの前でmemcacheを使用する必要があります。データを計算してキャッシュに保存する必要があります。これにより、ユーザーの要求に応じてデータをページに提供するのにかかる時間を短縮できます。