私は、各クライアント(小規模の組織)に対して、他のクライアントのレコードに問い合わせることができない(そしてすべきではない)ウェブアプリケーションを開発しています。 。データベースシャーディングの設定 - データベース間クエリなし
単一のデータベースにデータを保持することは簡単で、スケーラビリティの問題が発生するまで、更新とメンテナンスは簡単です。しかし今、私はそのアプリケーションを将来的に証明したいと思っています。各クライアントのデータが独立したデータベースに格納されている場合は、各クライアントのパフォーマンスが向上し、拡張性が向上します。 1つのスキーマを複数のデータベースに分割しているわけではないので、データベース「シャーディング」と同等かどうかはわかりません。基本的には、すべてのデータベースに単一のスキーマが複製されています(CDにソフトウェアを出荷する日には、それぞれ独自のデータベースがあります)。
私はこれを少し読んだので、一般的な考え方があります。しかし、私は頭にたくさんの質問があります。私は、このプロセスがどれほど透明であるかを正確にはわかりません。あるいは、私が変更を展開したいときはいつでも、何百ものスキーマを更新するメンテナンスの悪夢に遭遇します。
本当に、私は単純な "完全な"例(うまくいけばspring/javaを使用しています)を探しています。私は、単一のデータソースを開始する単一のアプリケーション・サーバーを持つことができます想像
は、のは、データベースへのユーザーIDをマッピングする単一のテーブルでのMySQLインスタンスをしましょう。すべての要求(クエリ)の場合
- ユーザーID
- データベース/シャード-ID
、データベースキャッシュを無視して、それがユーザーのためのシャードIDをルックアップする必要がありますか?または、これは最初にセッションごとに1回行うことができ、ターゲットデータベースと直接話すことができますか? (あなたがサーバーサイドのものと強くないと言うことができるかもしれないので)。
誰かが、これがSpringでどのように結ばれる可能性があるかについての高レベルの概観を与えることができますか?現在、私のアーキテクチャは非常にシンプルです。私はjdbctemplateを使って簡単なSpringコンポーネントDAOを持っています。 DAOのデータソースが挿入されます(datasourceはapplicationContext.xmlで設定されます)。 DAOは私のサービスクラスにautowiredされています。かなり標準的なもの。
前の手順を実行して、スキーマを変更する必要があるとしましょう。スキーマの変更を一度適用し、他の100のデータベースに伝播させるために使用できる管理ツールはありますか?
私はMySQLを使用しています。私は "MySQL Proxy"が1と2の問題を解決できるかもしれないと信じています。私はそれが自分のソリューションをロールバックする必要がありますので、スキーマの更新を管理することができないと思います。
ありがとうございます!