私のアーキテクチャ:
各サーバーからのデータが他のサーバーに配布されるSQL Serverでデータベースを構築する必要があります。
この種類のアーキテクチャを実現するにはどうすればよいですか?
挿入時と選択時にテーブルの場所の一貫性をどのように維持しますか?
同じコードで両方のサーバーのすべてのデータを選択するにはどうすればよいですか?
どちらのインスタンスも書き込みを受け入れる必要があります。アイデアは、DDBのように動作するようにすることで、1つのサーバーが他のサーバーにデータがあることを認識し、要求することです。
両方のサーバーにデータを複製する必要がある場合に採用される一般的な方法は、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║ ╚══════════════════════════════════ ════╩═══════════════════╝