web-dev-qa-db-ja.com

分散データベースでの水平および垂直フラグメンテーション

私のアーキテクチャ:

SQL Server Architecture

各サーバーからのデータが他のサーバーに配布されるSQL Serverでデータベースを構築する必要があります。

この種類のアーキテクチャを実現するにはどうすればよいですか?

挿入時と選択時にテーブルの場所の一貫性をどのように維持しますか?

同じコードで両方のサーバーのすべてのデータを選択するにはどうすればよいですか?

どちらのインスタンスも書き込みを受け入れる必要があります。アイデアは、DDBのように動作するようにすることで、1つのサーバーが他のサーバーにデータがあることを認識し、要求することです。

2
Nemesius

両方のサーバーにデータを複製する必要がある場合に採用される一般的な方法は、NEWSEQUENTIALID()を主キー列のデフォルト値として使用することです。

NEWSEQUENTIALID() のMicrosoftドキュメントから:

GUIDこれは、任意の値よりも大きいGUID Windowsの起動以降、指定されたコンピューター上でこの関数によって以前に生成されました。Windowsの再起動後、GUIDは低い範囲から再開できますが、それでもグローバルに一意です。

SQL Serverは idCreateSequential function を使用して、グローバルに一意の識別子を生成します。この機能は、メーカーが割り当てたイーサネットMACアドレスを持つマシンで使用されたときに重複が生成されないことを保証します。ローカルで生成されたMACアドレスを持つ仮想マシンを使用していて、それらのMACアドレスが一意であることが保証されていない場合、値がにならない可能性がありますユニーク。

CREATE TABLEロケーションテーブルのステートメント:

CREATE TABLE dbo.Locations
(
    LocationID uniqueidentifier NOT NULL
        CONSTRAINT Locations_PK
        PRIMARY KEY CLUSTERED
        CONSTRAINT Locations_PK_DF
        DEFAULT NEWSEQUENTIALID()
        ROWGUIDCOL
    , LocationName varchar(48) NOT NULL
) ON [PRIMARY];

場所の値の挿入は次のようになります。

INSERT INTO dbo.Locations (LocationName)
VALUES ('Cydonia')
    , ('Utopia Planitia');

挿入された行は次のようになります。

SELECT l.LocationID
    , l.LocationName
FROM dbo.Locations l;
╔══════════════════════════════════════╦══════════ ═══════╗
║LocationID║LocationName║
╠══════════════════════════ ════════════╬═════════════════╣
║A6044A1D-E286-E911-9C54-005056807260║シドニア║
║A7044A1D-E286-E911-9C54-005056807260║Utopia Planitia║
╚══════════════════════════ ════════════╩═════════════════╝

2台目のサーバーで同じテーブル構造を作成しました。ここでは、そのサーバーに別の行を挿入しています。

INSERT INTO dbo.Locations (LocationName)
VALUES ('Copernicus Crater')
    , ('Mare Imbrium');

SELECT l.LocationID
    , l.LocationName
FROM dbo.Locations l;
╔══════════════════════════════════════╦══════════ ═════════╗
║LocationID║LocationName║
╠════════════════════════ ══════════════╬═══════════════════╣
║A27E42F8-E286-E911-94B4-9CB6D0087DC0 ║コペルニクスクレーター║
║A37E42F8-E286-E911-94B4-9CB6D0087DC0║マーレインブリウム║
╚═════════════════════ ═════════════════╩═══════════════════╝

上記の2つの出力セットからわかるように、各行には一意のLocationID値があります。値はランダムな順序で生成されず、順次生成されます。これは、ページ分割による断片化を制限するため、挿入パフォーマンスにとって重要です。ただし、SQL Serverをホストしているサーバーが再起動されるたびに、これらの順次開始点が変わることに注意してください。

マージレプリケーション は、標準からエンタープライズ(SQL Server Expressではない)までのすべてのバージョンのSQL Serverに含まれる機能で、両方のサーバー間で行を自動的に複製します。 _ [に含まれるROWGUIDCOLプロパティCREATE TABLEステートメントは、マージレプリケーションで使用するLocationID列をマークします。マージレプリケーションのセットアップ方法は、この回答の範囲を超えています。

マージレプリケーションが完了すると、両方のサーバーのdbo.Locations テーブル:

╔══════════════════════════════════════╦══════════ ═════════╗
║LocationID║LocationName║
╠════════════════════════ ══════════════╬═══════════════════╣
║A27E42F8-E286-E911-94B4-9CB6D0087DC0 ║コペルニクスクレーター║
║A37E42F8-E286-E911-94B4-9CB6D0087DC0║マーレインブリウム║
║A6044A1D-E286-E911-9C54-005056807260║シドニア║
 E A7044A1D -E911-9C54-005056807260║ユートピアPlanitia║
╚══════════════════════════════════ ════╩═══════════════════╝
1
Max Vernon