非常に大規模なエンタープライズレベルのデータベースがあります。私たちのビジネスモデルの一部として、すべてのWebユーザーが毎月同時にWebサーバーにアクセスし、それがSQLボックスに影響を与えています。トラフィックは非常に重く、会社が大きくなるほど大きくなります。sql proc最適化が実行され、ハードウェアはすでに非常に高いレベルに拡張されています。
現在、データベースを分割して、会社の成長と将来の負荷に対応できるようにしています。
どの特定のデータをシャーディングするかを決定しました。これは、高度に利用されているデータベースのサブセットです。
しかし、私の質問は、一般的/普遍的な非分割データに関するものです。このようなデータの例としては、たとえばInventoryテーブルや、おそらくEmployeeテーブル、userテーブルなどがあります。
この共通/普遍的なデータを処理する2つのオプションが表示されます。
1)設計1-共通/汎用データを外部データベースに配置します。すべての書き込みはここで行われます。その後、このデータは各シャードに複製され、各シャードがこのデータを読み取り、t-sql procでこのデータに内部結合することができます。
2)デザイン2-各シャードに、すべての共通/ユニバーサルデータの独自のコピーを提供します。各シャードがこれらのテーブルにローカルに書き込み、SQLマージレプリケーションを利用して、他のすべてのシャードでこのデータを更新/同期します。
設計に関する懸念#1
1)トランザクションの問題:シャードでデータを書き込んだり更新したりしてから、たとえば1つのストアドプロシージャで共通/ユニバーサルテーブルを書き込んだり更新したりする必要がある場合、これを簡単に行うことはできなくなります。現在、データは別個のSQLインスタンスとデータベースに存在しています。これらの書き込みは別のデータベースにあるため、トランザクションにラップできるかどうかを確認するために、MS DTSを使用する必要がある場合があります。ここではパフォーマンスが問題であり、シャーディングされた一般的なデータに書き込むプロシージャの場合、書き換えが発生する可能性があります。
2)参照整合性の喪失。データベース間の参照整合性を行うことはできません。
3)システムの広い領域を再コード化して、共通データを新しいユニバーサルデータベースに書き込み、共通データをシャードから読み取るようにします。
4)。データベーストリップの増加。上記の#1のように、シャーディングされたデータと共通データを更新する必要がある状況に遭遇した場合、データが別のデータベースにあるため、これを達成するために複数のラウンドトリップを実行することになります。ここでは多少のネットワーク遅延が発生しますが、この問題については上記3ほど心配していません。
設計に関する懸念#2
デザイン#2では、各シャードがすべての共通/ユニバーサルデータの独自のインスタンスを取得します。これは、一般的なデータに参加または更新するすべてのコードが、今日と同じように引き続き機能/実行されることを意味します。開発チームが必要とする再コーディング/書き換えはほとんどありません。ただし、この設計はすべてのシャード間でデータの同期を維持するためにマージレプリケーションに完全に依存しています。dbasは非常に熟練しており、マージレプリケーションがこれを処理できない可能性があり、マージレプリケーションが失敗した場合に非常に懸念しています。
デザインオプション#2を使用した人がいるかどうか知りたいです。また、表示されていない3番目または4番目のデザインオプションを見落としているかどうかも知りたいです。
前もって感謝します。