web-dev-qa-db-ja.com

データベースから作業をどのようにオフロードしますか?

少なくともWeb開発分野では、Webサーバーは至る所にありますが、ほとんどのデータベースサーバーに支えられていません。 Webサーバーは要求にヒットすると、データベースに対して大きなクエリを実行し、サーバーに大きな負荷をかけます。 Webサーバーは拡張が非常に簡単ですが、dbサーバーは(少なくとも私が知っている限りでは)非常に難しく、貴重なリソースになります。

ここでデータベースから負荷を取り除くためのいくつかの回答から聞いた1つの方法は、作業をWebサーバーにオフロードすることです。簡単です、これで内部的に大量のトラフィックが WebサーバーがSELECT TOP 3000を実行しようとする (おそらくそれ自体で結果を処理するため)になることに気づくまで、それでもまだ物事が遅くなります。

データベースの負荷を軽減する他の方法は何ですか?

7
TheLQ

標準オプションのリストは次のとおりです。

  1. データベースへのアクセスを最適化して、必要なことだけを効率的に実行します。優れたDBAは、ここで多くのことを支援できます。これは、ほとんどの企業が行う基本的なステップです。

  2. Memcachedなどを使用して、データベースからデータをキャッシュします。これは通常、アプリケーション層で行われ、非常に効果的です。事実上すべての有能なWebサイトがこれを行う必要があります。

  3. さらに野心的に、データベースの読み取り専用コピーを維持し、可能な場合はそこに直接クエリを送信します。データベース側では、必要なテクノロジーは「レプリケーション」と呼ばれ、読み取り専用コピーは、多くの場合、メインデータベースからのフェイルオーバーのバックアップでもあります。 1時間に100万の動的ページを実行している場合、これを行っている、または考えたことがある可能性があります。

  4. データベース用に本当に高価なハードウェアを購入します。 Paypalが4年前の時点でこれを行っていたのを知っており、それらのアーキテクチャの変更は困難だったので、おそらくまだそうであると思います。

  5. データの範囲を指定して、データベースを複数の断片に分割します。これは、アプリケーション設計への非常に煩わしい変更です。これを行う会社の有名な例はeBayです。

  6. 複数のマシンに拡張できるデータベースを使用してみてください。 Oracle RAC はクラスターにスケーリングしますが、データを広く分散させることはできません。 Microsoftの SQL AzureFathomDB など、配布がより簡単になるはずのその他の製品が存在します。私はそれらの製品を使用したことがなく、どれだけうまく機能するかわかりません。私は何もないよりはましだと思いますが、それらが水平方向にうまくスケーリングすることは疑わしいと思います。

  7. リレーショナルデータベースは通常、 [〜#〜] acid [〜#〜] の保証を提供しようとします。しかし [〜#〜] cap [〜#〜] の定理により、分散システムで特にデータの結合などを許可します。したがって、人々は多くの NoSQLの代替 を考え出しました。これは、弱い保証を明示的に提供し、完全に分散されたスケーラビリティの見返りとして問題のある操作を回避します。スケーラブルなNoSQLデータストアを使用する有名な企業の例として、Google、Facebook、Twitterがあります。

10
btilly

問題の90%は、データベースクエリを最適化し、サーバーを正しく構成することです。適切なインデックスがあること、クエリが行スキャンを実行していないことなどを確認してください。データベースが提供するプロファイラーツールを使用してください。これがサーバーにどれほど影響を与えるかは驚くべきことです。多くの企業は、負荷を軽減するための追加のインデックスがいくつか必要なだけの場合に、新しいデータベースサーバーを急いで購入します。

クエリ自体をできる限り最適化し、dbサーバーが引き続き過負荷になったら、データベースレプリケーションを使用してワークロードを分散します。単一の過労データベースサーバーの代わりに、2つ以上に分割し、他のサーバーはマスターを複製します。次に、大量の読み取り専用クエリ(レポートなど)をレプリケートされたデータベースに対して機能させ、単純なクエリと挿入/更新の場合にのみマスターデータベースにヒットします。

6
GrandmasterB

データベースのワークロードをどのように削減しますか?

  • ビジネスレイヤーがデータベースに対して冗長な呼び出しを行わないように、Webサーバーにデータをキャッシュします。 [これには、HibernateのようなORMフレームワークが役立ちます。]

簡単です。WebサーバーがSELECT TOP 3000を実行しようとすると(おそらくそれ自体で結果を処理するため)、内部で大量のトラフィックが発生することに気づくまでは、まだ遅くなります。

  • 重い計算と集計を行う必要があると予想されるジョブをスケジュールし、その結果をアプリケーションキャッシュ(すべてのリクエストにアクセス可能)に保存します。
5
Jim G.

ここでデータベースから負荷を取り除くためのいくつかの回答から聞いた1つの方法は、作業をWebサーバーにオフロードすることです。簡単です。WebサーバーがSELECT TOP 3000を実行しようとすると(おそらくそれ自体で結果を処理するため)、内部で大量のトラフィックが発生することに気づくまでは、まだ遅くなります。

あなたはこれを文字通り少なすぎると思うかもしれません。 Webサーバーにデータベースと同じ計算を実行させることではありません。ほとんどのアプリケーションでは、データベースからの結果セットだけでなく、実際に結果セットが使用されるすべての最終結果をキャッシュする機会があります(通常、ページにコンテンツを生成するため)。

例として、データベースからのクエリに比較的コストがかかるブログの「最も人気のあるブログ投稿」リストがあるとします。キャッシングなしでは、ブログが突然大量のトラフィックを獲得した場合、ブログアプリケーションはデータベースに繰り返しクエリを実行し、ページの読み込みごとに「最も人気のある投稿」リストを生成し、読み込みが失敗します。ここで、人気のある投稿のリストを15分間メモリにキャッシュするとします。この方法では、1時間に100万ヒットが発生しても、データベースはそのクエリを4回だけ実行します。

これを行うことで、最も人気のあるブログ投稿リストが最大15分間古くなる代わりに、データベースへの負荷が大幅に減少します(そしてスケーラビリティが向上します)。

2
Ken Liu

免責事項:私はWebサーバー、DBクエリなどの専門家ではありません(私の分野ではありません):)

そうは言っても、Node.jsでこの presentation でデモされたコンセプトが本当に気に入りました。

関連記事

0
Reno