MySQL サーバーと Web サーバーを分離することとその結果

MySQL サーバーと Web サーバーを分離することとその結果

私は Web アプリケーションを持っています。そのためにかなり強力なサーバーを購入しました。サーバーの仕様は次のとおりです: CPU: DUAL E5-2620、RAM: 32 GB DDR3、HDD: 2 x 300GB SAS 10K、ネットワーク: 100mbps/10TB インターネット。

Webサーバー仕様: Apache/nginx/PHP データベース: MySQL

現在、私のユーザー数は日ごとに増加しています。私のサーバーはこのようなプレッシャーに耐えられません。待ち時間も長くなっています。そこで、CPU 負荷のバランスをとるために、MySQL と Web サーバーを 2 つの同一サーバーに分離することを考えました。しかし、MySQL と PHP を分離すると、以下の別の問題が発生することがわかりました。

  • ネットワーク転送を待機しています: テーブルに 500 MB を超えるデータがある場合、次のような MySQL クエリがあります: "SELECT * FROM table"。私の接続速度では、ネットワーク経由でこのようなテーブルを取得するのに数秒かかります。これは 1 人のユーザーと 1 つの接続の場合のみですが、1 人のユーザーからの接続が 10 倍になり、オンライン ユーザーが 100 人を超えます。

上記の例は単なる例ですが、実際のデータでは同時に 100 人のオンライン ユーザーに対して以下の情報が表示されます。

交通量 + ø + 1時間あたり

受け取った+ 14.7 GiB + 201.4 MiB

送信済み+ 429.4 GiB + 5.7 GiB

合計+ 444.2 ギバ + 5.9 ギバ


したがって、私の Web アプリケーションでは分離は不可能なようです。現在、このような大きな問題が発生することなく、これら 2 つのサーバーに負荷を分散するにはどうすればよいか困っています。遅延の問題が発生することなく (少なくとも問題が少なくなる) CPU 負荷を分散する別の方法は何でしょうか?

*****注意: クエリは例です。クエリは十分に最適化されていますが、アプリケーションは非常に複雑なので、データベースとのやり取りが非常に多くなります。ただし、mysql 情報には、まだ 6GiB のデータが転送されていると表示されます。

答え1

ウェブアプリケーションを最適化して、非常に非効率的な SQL クエリを使用しないようにすれば、おそらく両方を同じボックスに戻して、はるかに低い負荷で実行できるでしょう。すべてのユーザーが毎回テーブル全体を読み取る必要はありません。適切なクエリとインデックスは、おそらくここで大きなブーストを提供します。これは、単にハードウェアを追加するよりもはるかに大きな効果です。

それができなくても、現在では少なくとも 10Gb/s のイーサネット アダプターが製造されています。より特殊なタイプではさらに高速です。サーバー間のリンクが高速化すれば役立ちます。ただし、適切な SQL クエリほどではありません。

関連情報