web-dev-qa-db-ja.com

スケーラビリティ:データベーステーブルの分割は、異なるレプリケートされたSQLサーバーでどのように機能しますか?

データベースのデータを異なるサーバーに分割する際の一般的な概念について詳しく知りたいのですが。たとえば、大規模なテーブルを持つSQL Serverデータベースがあるとします。 1台のサーバーがこのテーブルのデータ量を処理できないと仮定します。そのテーブルを分解して、同じデータベース(複製)を持つ異なるサーバー間でその内容を分割したいと思います。

ここで、これらのサーバーのいずれかに単一のSQL(ADO)接続があり、この特定のテーブルからレコードを選択することを選択したとします。データは別々のサーバー上の別々のデータベースにあるため、さまざまなサーバーすべてからレコードを収集して1つに結合する必要があります。

これに対応する標準的な方法があると確信しています。SQLServerへの直接接続以外のルートに進んでもかまいません(とにかく自分のHTTP Server APIでラップするつもりです)まだSQLを使用します実際のエンジンとしてのサーバー。最も標準的な方法は何ですか?どこで詳細を知ることができますか?

4
Jerry Dodge

最終的にあなたが探しているのは、データベースサーバーインスタンス間でレプリケートされる非常に大きなテーブルとデータセットを処理するためにSQL Serverを利用できるさまざまな方法の説明だと思います。この問題には複数のアプローチがあり、どれも特効薬ではありませんが、それぞれの基本を理解することは、正しいアーキテクチャを選択するための良い方法です。

シャーディング

データベースシャーディングは、膨大なデータセットを取得し、それをいくつかの異なるファイルグループに分割する方法です。これらの個別のファイルグループは、すべて単一のサーバー、複数のサーバー、またはRAIDベースの ストレージエリアネットワーク を使用して保存できます。

ここで重要なのは、物理IOパフォーマンスは、シャーディングされていないデータセット内の膨大なファイルグループからではなく、少数の物理ファイルグループからのみレコードにアクセスする場合に大幅に向上することです。

SQL Serverには、これをすぐに実行できる安価で簡単な方法がありません。また、他の主要なデータベースプロバイダーでこれを行う簡単で安価な方法も知りません。シャードについて話し始めると、完全に別のボールゲームをプレイすることになります。

分散パーティションビュー

これらにより、パーティション化戦略に基づいて必要なレコードのみをフェッチするように、適切にパーティション化されたデータセットにアクセスできます。良い情報があります MSDNでこれについてSQL Serverについて

アクティブクラスタリング

クラスタリングの概念は、複数のSQL Serverインスタンスをノードとして取得し、それらを単一のデータベースで連携させ、データを破壊または損傷しない方法で異なるファイルグループのパーティションが読み書きされるように同期させることです。大規模にスケールアップする方法で。

ピアツーピアレプリケーション

この設定では、すべてのデータベースサーバーに独自のインスタンスがあり、それぞれがスキーマの独自の小さな領域にのみ影響を与えるように構成する必要があります。それらの間でデータが古くなっていることが多く、外部プロセスを介して同期する必要があり、スキーマの変更を実装するのが非常に難しい場合があります。これは、アプリケーションでこれを処理するための理想的な方法ではありません。

分散パーティションや非常にスケーラブルなアクティブクラスタリングを購入する余裕はありません。

大規模にスケーラブルなソリューションのために、ライセンスやハードウェアを100万ドル以上購入する必要はありませんか?常にクラウドがあります。 Azureおよびその他のSQL Server PaaS(サービスとしてのプラットフォーム)ソリューションプロバイダーは、大規模な先行投資なしで必要なスケーラビリティを提供できます。通常、これが最も簡単な方法です。

6
maple_shaft

これはあなたのオプションをカバーすると思います: https://stackoverflow.com/questions/7926773/how-to-implement-distributed-database-in-sql-server-2008-r2

これはCassandraが作成された理由でもありますが、SQLに関してはあまり役に立ちません。

2
penguinpete