2009-09-21 9 views
24

私は、同様のデータを中心としたWebアプリケーションのグループの開発と維持を担当しています。私が当時決定したアーキテクチャは、各アプリケーションが独自のデータベースとWebルートアプリケーションを持つということでした。各アプリケーションは、独自のデータベースへの接続プールと共有データ(ログインなど)用の中央データベースを保持します。接続プールの戦略:Good、Bad、またはUgly?

非常に多くの異なる接続プールを持つことができないため、異なるアプリケーションのすべてが単一の中央データベースを使用するようにデータベースをリファクタリングする必要があり、システムに固有の変更がそのデータベースから反映され、Tomcatで動かされる単一のプールを使用する必要がある。彼は、接続プールを維持するためにネットワークを行き来する多くの "メタデータ"が存在すると主張しています。

私の理解では、プールの数がないことを異なるプール間で必要な数だけ接続を使用するための適切なチューニングと(低容量アプリが少ないの接続を取得し、大量のアプリなど、より多くを得る)ということですコネクションの数と比較して、またはそれ以上の形式では、3つの10のコネクションを維持するために必要なオーバーヘッドの差は、1つのコネクションの1つのコネクションと比較して無視できる。

当初1-APP-1 - データベース設計にシステムを破るの背後にある理由は、おそらくアプリケーションの間で、必要に応じて、各システムは、スキーマに変更を加えることができることの違いがあるように予定されているということでした。同様に、システムデータが他のアプリに流出する可能性もなくなりました。

は、残念ながら難しい決断をする会社で強いリーダーシップがありません。私の同僚は漠然とした心配だけをバックアップしていますが、複数の小さなデータベース/接続と1つの大きなデータベース/接続プールの影響を理解しておきたいと思います。

+0

私はあなたの同僚に同意しません。 Webアプリケーションがn個ある場合は、同じデータベースサーバーを使用していてもn個のプールを使用します。これにより、問題の分離、チューニングオプションの改善、より良いアイソレーション(1つのWebアプリケーションがすべての接続を食い止める場合、他のものが影響を受ける理由など)などが得られます。 。これはIMOだけではありません。 –

答えて

10

オリジナルのデザインは健全な原則に基づいています。あなたのケースを助けるならば、この戦略はhorizontal partitioning or shardingとして知られています。それは提供しています。

1)スケーラビリティの向上を - 必要であれば、各シャードは、別々のハードウェア上で生きることができるので。単一シャードの障害が他の破片

3)より大きいパフォーマンスに影響を与えないため - -

2)大可用性は、テーブルが検索されるので、より少ない行および高速検索を生じ、したがってより小さなインデックスを有します。

あなたの同僚の提案は、障害のセットアップの単一のポイントに移動できます。

サイズ10の3つの接続プールとサイズ30の1つの接続プールに関するご質問は、この議論を解決する最善の方法はベンチマークです。それぞれの方法でアプリケーションを設定し、ab(Apache Benchmark)でいくつかのストレステストを行い、どちらの方が優れているかを確認してください。私は大きな違いはないと思うが、それを証明するためにベンチマークを行う。

+0

ありがとう!私は残念なことにDBAではありませんが、実際にはこの設定がシャーディング戦略であったことは私にはありませんでした。 残念ながら、MySQLがシャード環境として自動的に動作するようにする魔法がない限り、異なるデータベースはビジネス上の違いとして機能し、適切なベンチマークに問題があります。また、ベンチマークを実行する時間を与える可能性のある権限もありません。 :\ – Drew

2

優秀な質問です。どちらの方法が良いか分かりませんが、可能な限り少ない痛みで戦略を切り替えることができるようにコードを設計することを検討しましたか?軽量のデータベース・プロキシ・オブジェクトを使用して、上位レベルのコードからこの設計上の決定をマスクすることができます。念のため。

+0

可能かもしれません。私は残念ながらDBAではありません。私はMySQLにシャーディングのネイティブ処理があることを知っていますが、それについてはあまりよく分かりません。これをプログラマチックにやろうとしたら、弁別子列とそのすべての楽しみを追加する必要があります。幸いにも、特定のテーブルだけが必要になります。実際のパフォーマンスの問題が頭の中で後れを取っているなら、頭の後ろにそれを残しておきます。 – Drew

1

データベース - 及びオーバーヘッドごと、10の接続30の接続および3つのプールと1つのプールは、主負荷は両方の場合で同じであると仮定すると同じです。

アプリケーションごと、全てのデータが非常に急激であってもよいアプリケーションごとのアクセスポイントを有する対単一の点(例えば、サービス層)を経由有する差。パフォーマンスと実装/保守の容易さの両方の点で(分散キャッシュを使用することを考慮するなど)

+0

分散キャッシュは、私が考慮しなかった点です。しかし、現時点ではすべてのパーシスタンスコードが各Webアプリに含まれている単一のライブラリに抽象化されており、Webアプリごとに実行される設定のみが残っています。しかし、この永続性コード(JDBC上に構築された)をより完全なORMに置き換えることが、常に意図されていました。 ORMは多くのデータを非常にうまく収めています。時間の問題は、私たちが行かなくてもそれを使うことができないようにしました。 – Drew

4

1つのデータベースと2つの接続プール(それぞれ5つの接続)がある場合、データベースへの接続は10です。それぞれ2つの接続を持つ5つの接続プールがある場合、データベースへの接続は10です。最後に、データベースへの10の接続があります。データベースには、プールが存在することは認識されておらず、認識もありません。

プールとDBの間で交換されるメタデータは、各接続で発生します。接続が開始されたとき、接続が切断されたときなど接続が10つの場合、このトラフィックは10回発生します(プールの寿命中はすべて最低限の状態であるとみなされます)。これは、1つのプールか10のプールのいずれであっても発生します。

"1 DB per app"では、DBごとにデータベースの別のインスタンスと話していない場合、基本的には問題ありません。

5つのデータベースをホストするDBサーバーがあり、各データベース(たとえば、2接続)に接続している場合、単一のデータベースをホストしている同じDBより多くのオーバーヘッドとメモリが消費されます。しかし、そのオーバーヘッドは最高でも限界であり、GBサイズのデータ​​バッファを備えた現代のマシンではまったく重要ではありません。特定のポイントを超えて、データベースに関するすべての問題は、ディスクからRAMへのデータ・ページのマッピングおよびコピー、そしてまた戻ってくることです。

DB全体で重複したテーブルが重複していた場合は、無駄になる可能性があります。

最後に、「データベース」という単語を使用すると、サーバーがテーブルを結合するために使用する論理エンティティを意味します。たとえば、Oracleは実際にはサーバーごとに1つの「データベース」を持ち、「スキーマ」に分割されています。 PostgresにはいくつかのDBがあり、それぞれにスキーマを持たせることができます。しかし、いずれの場合でも、現代のサーバーはすべて、使用できるデータの論理的境界を持っています。ここでは「データベース」という言葉を使っています。

すべてのアプリケーション用にDBサーバーの1つのインスタンスを使用している限り、接続プールなどは大きな問題ではありません。サーバーはすべてのメモリと必要に応じてクライアント間でリソースを共有できます。

+0

私たちは、それぞれのアプリケーションのデータを1つの "データベース"(私たちは同じ方法で使用しています)で、別の中央データベースが共有データを格納している間に、Mysqlを実行する単一のDBサーバーを打っています。あなたのアカウントで、私の理解は正しいです。 :) – Drew

0

まあ、優れた質問が、それはいくつかのデータ・ベース(A)アプローチまたはビッグ1(B)を使用して議論することは容易ではありません。

  1. それは、データベース自体に依存します。 Oracle、たとえばLOG(したがってLOCK)戦略に関してSybase ASEとは異なる動作をします。多くの並列書き込みがあり、DBが悲観的なロック戦略(Sybase)を使用している場合は、ロック競合率を低く抑えるために、いくつかの異なる小さなデータベースを使用する方が良いかもしれません。
  2. 小さなデータベースのテーブルスペースが複数のディスクに分散していない場合は、(バッファ/キャッシュ)メモリを1つだけ使用するために1つの大きなデータベースを使用するほうが良いでしょう。私はこれがまれであると思います。
  3. (A)を使用すると、パフォーマンス以外の理由でスケールが改善されます。必要に応じて、他のデータベースに触れることなく、別の(新しい/より高速な)ハードウェア上にホットスポットデータベースを移動することができます。私の以前の会社では、このアプローチは、バリアント(B)(新しいライセンスなし)より常に安いものでした。

私は個人的には理由3(A)を好む。

+0

私たちは主にオープンソースのショップであり、データベースのためにInnoDBでMySQLを使用しています。あなたの答えは変わりますか? – Drew

0

デザイン、アーキテクチャー、プラン、そして素晴らしいアイデアは、一般的な意味や単純な数学がない場合には短くなります。 5つの接続を持つ10のプールが50の接続を持つ1つのプールと同じでない理由の簡単な数学は次のとおりです。 各プールは最小&最大接続数で構成されています。常時接続を開いたり閉じたりしているため、このプールが誤って設定されていることが多い場合は、通常、(99%の時間)分の数値の50%(5分の場合は2-3)を使用します高価な)...だから私たちは5分の接続でそれぞれ10のプールを開きます。= 50のオープンな接続は... 50のTCP接続を意味します。それらの上に50個のJDBC接続があります(JDBC接続をデバッグしてください。両方の方法でどのくらいの量のメタデータが流れているのか驚かれるでしょう...) プールが1つあれば最小から30までのシンプルな機能を提供します。これは、エクストラをより効率的にバランスさせることができるからです。私はあなたには分かりませんが、私にとってはこれはたくさんあります... 悪魔は細部にあります - それぞれのプールに残している2-3の接続は、いつも開いたり閉じたりしないようにしています。 .. 10のプール管理のオーバーヘッドに行きたいとは思わないでください。(私は10のプールを毎回違うものにしたいと思いませんか? これは私の場合は、diffサービス(REST/SOAP/WS/JSON - あなたの毒を選ぶ)を提供する単一のアプリケーション(サービス層の誰ですか?)でDB(データソース)を " JDBC、TCPなどについて知っていることもあります。ああ、待っているGoogleが持っている - GAE ...

+0

幸いにも、アプリケーションサーバー(この例ではTomcat)は接続プールを維持し、チューニングコントロールを提供します。 また、私はあなたの数学に従いません。すべてのプールが正しく調整されていると仮定して、50%を使用している場合、10個のプールに50個のオープンな接続が必要なのはなぜですか?それは20-30だけ必要でしょうか? – Drew