2011-08-09 7 views
1

私は、各クライアント(小規模の組織)に対して、他のクライアントのレコードに問い合わせることができない(そしてすべきではない)ウェブアプリケーションを開発しています。 。データベースシャーディングの設定 - データベース間クエリなし

単一のデータベースにデータを保持することは簡単で、スケーラビリティの問題が発生するまで、更新とメンテナンスは簡単です。しかし今、私はそのアプリケーションを将来的に証明したいと思っています。各クライアントのデータが独立したデータベースに格納されている場合は、各クライアントのパフォーマンスが向上し、拡張性が向上します。 1つのスキーマを複数のデータベースに分割しているわけではないので、データベース「シャーディング」と同等かどうかはわかりません。基本的には、すべてのデータベースに単一のスキーマが複製されています(CDにソフトウェアを出荷する日には、それぞれ独自のデータベースがあります)。

私はこれを少し読んだので、一般的な考え方があります。しかし、私は頭にたくさんの質問があります。私は、このプロセスがどれほど透明であるかを正確にはわかりません。あるいは、私が変更を展開したいときはいつでも、何百ものスキーマを更新するメンテナンスの悪夢に遭遇します。

本当に、私は単純な "完全な"例(うまくいけばspring/javaを使用しています)を探しています。私は、単一のデータソースを開始する単一のアプリケーション・サーバーを持つことができます想像

  1. は、のは、データベースへのユーザーIDをマッピングする単一のテーブルでのMySQLインスタンスをしましょう。すべての要求(クエリ)の場合

    • ユーザーID
    • データベース/シャード-ID

    、データベースキャッシュを無視して、それがユーザーのためのシャードIDをルックアップする必要がありますか?または、これは最初にセッションごとに1回行うことができ、ターゲットデータベースと直接話すことができますか? (あなたがサーバーサイドのものと強くないと言うことができるかもしれないので)。

  2. 誰かが、これがSpringでどのように結ばれる可能性があるかについての高レベルの概観を与えることができますか?現在、私のアーキテクチャは非常にシンプルです。私はjdbctemplateを使って簡単なSpringコンポーネントDAOを持っています。 DAOのデータソースが挿入されます(datasourceはapplicationContext.xmlで設定されます)。 DAOは私のサービスクラスにautowiredされています。かなり標準的なもの。

  3. 前の手順を実行して、スキーマを変更する必要があるとしましょう。スキーマの変更を一度適用し、他の100のデータベースに伝播させるために使用できる管理ツールはありますか?

私はMySQLを使用しています。私は "MySQL Proxy"が1と2の問題を解決できるかもしれないと信じています。私はそれが自分のソリューションをロールバックする必要がありますので、スキーマの更新を管理することができないと思います。

ありがとうございます!

答えて

0

私はそれを使用しないので、私は春と話すことができません。

Java EEハットを使用している場合は、単にJNDIデータソースを使用し、クライアントごとに1つずつ作成し、クライアント名またはクライアントを区別するために使用している識別子。

今、私はそれが春でできると確信しています、私はあなたにどのように伝えることができません。

一般的なデータベース接続プールの実装では、多くの接続で「100データベース」をどの程度うまく扱うことができるかは、別の質問です(数百のオープン接続ソケットが考えられます)。私はそれをしていない、どちらにも話すことができません。

その後、各プールが別のデータベースを指しているので、基本的にすべて完了しています。各プールには独自の設定があるので、DBを別のホストなどに移動することができます。

これはテストで失敗したときまでの問題で初めての問題ですが、失敗点はDBプールの実装または関連する。他のすべては、一般的なDBサーバーのものとJavaです。

-1

シャーディング/マルチテナントのような状況です。メンテナンスの悪夢があり、コードを書く必要があります。あなたが使用できるサードパーティがあります - ScaleBase(開示:私はそこで働いています)は、アプリケーションに対して透過的な方法で、あなたが記述したものを正確に行います。

0

私は春を知っていません。 しかし、データベースシャーディングのために、私は高いスケーラビリティ

New Relic Architecture - Collecting 20+ Billion Metrics a Day

にあなたがこの記事を見てお勧めそれは素敵なシャーディング戦略とどのように負荷が変動した場合、それは助けを語ります。またのコメントのセクションを参照して、シャーディングの詳細を説明します。

1

私はアイデアが

  1. あなたは基本的には、接続プールのプールだろうとあなたはシャードIDでデータ・ソースをルックアップでしょうShardDataSourceManagerを実装するだろうということです私の会社では春とシャーディングを使用しています。
  2. 独自のTransactionalアノテーションを定義し、それにメソッドに注釈を付ける
  3. メソッドおよび一部のコンテキスト情報の注釈を読み込むインターセプタをDAOレイヤーに書き込む必要があります。コンテキスト情報から、シャードIDを検索して データソースを検索し、ローカルのスレッドに挿入します。
  4. data-sourceを検索するときのdao層は、ローカルのスレッドを調べてjdbcテンプレートを作成し、その上でクエリを実行します。
0

DDALを使用すると、DALのさまざまなデータベースにアクセスすることができ、Springのデータソースとトランザクション管理に依存しません。そしてそれを使用する方法を示すデモプロジェクトがあります:https://github.com/hellojavaer/ddal-demos。試してみることができます。

関連する問題