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