データベースレプリケーションは、プライマリサーバーからセカンダリサーバーにデータを配布するテクノロジです。レプリケーションは、マスターデータベースが1つまたは複数のスレーブサーバーにデータを配布するマスタースレーブの概念で機能します。レプリケーションは、同じサーバー上の複数のSQL Serverインスタンス間で設定することも、同じまたは地理的に離れたデータセンター内の複数のデータベースサーバー間で設定することもできます。
SQLServerレプリケーションを使用する主な利点は2つあります。
- レプリケーションを使用すると、レポートの目的で使用できるほぼリアルタイムのデータを取得できます。たとえば、あるサーバーでの書き込み集約型のOLTP負荷と別のサーバーでの読み取り集約型の負荷を分離する場合、両方のサーバーでデータの同期を維持するようにレプリケーションを設定できます。
- 2番目の利点は、特定の時間に実行されるようにレプリケーションをスケジュールできることです。たとえば、レポートサーバーに完了日のデータを含める場合は、それに応じてレプリケーションスナップショットをスケジュールできます。現在のデータを処理するために追加のロジックを作成する必要はありません。
レプリケーションには多くの柔軟性があります。レプリケーションを使用すると、行を除外したり、任意のテーブルのデータのサブセットをレプリケートしたりできます。複製されたデータを変更することも、更新と挿入のみを複製して削除を無視することもできます。 Oracleなどの別のデータベースシステムからデータを複製することもできます。
レプリケーションのコンポーネント
SQLServerレプリケーションには7つのコアコンポーネントがあります。リストは次のとおりです。
- 発行者。
- ディストリビューター。
- サブスクライバー。
- 記事。
- 出版物。
- サブスクリプションをプッシュします。
- プルサブスクリプション。
詳細は次のとおりです。
記事
アーティクルは、SQLテーブルなどのデータベースオブジェクト、またはストアドプロシージャです。前述したように、レプリケーションを使用すると、データをフィルタリングしたり、選択したテーブル列をレプリケートしたりできるため、テーブルの列または行は記事と見なされます。
出版物
記事は、出版物の一部になるまで複製できません。 Publicationは、Articles/Databaseオブジェクトのグループです。また、SQLServerによって複製されるデータセットも表します。
発行者
Publisherには、公開する必要のあるデータを含むマスターデータベースが含まれています。すべての加入者にどのデータを配布するかを決定します。
ディストリビューター
ディストリビューターは、パブリッシャーとサブスクライバーの間の架け橋です。 Distributerは、公開されたすべてのデータを収集し、すべてのサブスクライバーに送信するまでそれを保持します。これは、パブリッシャーとサブスクライバーの間の架け橋です。複数のパブリッシャーとサブスクライバーの概念をサポートします。別のSQLインスタンスまたは別のサーバーでディストリビューターを構成する必要はありません。構成しない場合、発行者はディストリビューターとして機能できます。大規模なレプリケーションを行っている組織は、別のシステムでディストリビューターを構成できます。
サブスクライバー
サブスクライバーは、データまたは複製されたパブリケーションが送信される送信元または宛先の終わりです。レプリケーションでは、パブリッシャーは1つで、複数のサブスクライバーを持つことができます。
プッシュサブスクリプション
プッシュサブスクリプションでは、パブリッシャーはサブスクライバーにデータを更新します。プッシュサブスクリプションでは、サブスクライバーはパッシブです。出版社は、すべての購読者に記事または出版物を送信します。組織の要件に基づいて、レプリケーションウィザードの作成時に、画面で使用するサブスクリプションを選択できます。トランザクションレプリケーションとピアツーピアレプリケーションは、プッシュサブスクリプションを使用して、データのリアルタイムの可用性を維持します。
プルサブスクリプション
プルサブスクリプションでは、すべてのサブスクライバーがパブリッシャーに新しいデータまたは更新されたデータを要求します。プルサブスクリプションでは、サブスクライバーに必要なデータまたはデータ変更を制御できます。変更したデータをすぐに必要としない場合に便利です。
レプリケーションタイプ
SQL Serverは、次の3つのレプリケーションタイプをサポートしています。
- トランザクションレプリケーション。
- スナップショットレプリケーション。
- レプリケーションをマージします。
トランザクションレプリケーション
トランザクションレプリケーション、スキーマの変更、パブリッシャーデータベースで発生したデータ変更は、サブスクライバーデータベースにレプリケートされます。パブリッシャーデータベースで更新、削除、または挿入操作が発生するたびに、変更が追跡され、それらの変更がサブスクライバーデータベースに送信されます。トランザクションレプリケーションは、ネットワークを介して限られた量のデータのみを送信します。さらに、変更はほぼリアルタイムであるため、DRサイトのセットアップに使用したり、レポート操作のスケールアウトに使用したりできます。トランザクションレプリケーションは、次の状況に最適です。
- パブリッシャーで行われた変更をサブスクライバーにすぐに適用するシステムをセットアップする場合。
- パブリッシャーには、INSERT、UPDATES、およびDELETESがあります。
- 異種レプリケーションの意味を設定する場合は、Oracleなどの非SQLServerデータベースのパブリッシャーまたはサブスクライバー。
パブリッシャーデータベースに変更が加えられると、変更はパブリッシャーデータベースのログファイルに記録されます。ディストリビューター/パブリッシャーサイト、2つのジョブが作成されます。
- スナップショットエージェント :スナップショットエージェントジョブは、スキーマのスナップショット、複製または公開するオブジェクトのデータを生成します。スナップショットのファイルは、パブリッシャーサーバーまたはネットワーク上の場所に保存できます。レプリケーションを初めて開始すると、スナップショットが作成され、すべてのサブスクライバーに適用されます。スナップショットエージェントは、手動でトリガーされるか、特定の時間に実行するようにスケジュールされるまで、アイドル状態のままです。
- ログリーダーエージェント :ログリーダーエージェントジョブは継続的に実行されます。パブリッシャーデータベースのトランザクションログから発生した変更(INSERT、UPDATES、およびDELETES)を読み取り、配布エージェントに送信します。
- 配布エージェント :ログリーダーエージェントから変更が取得されると、配布エージェントはすべての変更をサブスクライバーに送信します。
トランザクションレプリケーションを構成すると、次のアクティビティが実行されます
- パブリケーションデータとデータベースオブジェクトの最初のスナップショットと、サブスクライバーに適用されたスナップショットを取得することから開始します。
- ログリーダーエージェントは、パブリッシャーのT-Logを継続的に監視し、変更が発生した場合は、ディストリビューターまたはサブスクライバーに直接送信します。
次の画像は、トランザクションレプリケーションがどのように機能するかを表しています。
利点:
- トランザクションレプリケーションは、スタンバイSQLサーバーとして使用することも、負荷分散またはレポートシステムとOLTPシステムの分離に使用することもできます。
- パブリッシャーサーバーは、低遅延でサブスクライバーサーバーにデータを複製します。
- トランザクションレプリケーションを使用すると、オブジェクトレベルのレプリケーションを実装できます。
- 保護するデータが少なく、迅速なデータ回復計画が必要な場合は、トランザクションレプリケーションを適用できます。
短所:
- レプリケーションが確立されると、パブリッシャーでのスキーマの変更はサブスクライバーサーバーには適用されません。新しいスナップショットを生成してサブスクライバーに適用することにより、これらの変更を手動で行う必要があります。
- サーバーを変更する場合は、レプリケーションを再構成する必要があります。
- トランザクションレプリケーションをDRセットアップとして使用する場合は、手動でフェイルオーバーする必要があります。
スナップショットレプリケーション
スナップショットレプリケーションは、定義されたスケジュールでパブリケーションの完全な画像/スナップショットを生成し、サブスクライバーにスナップショットファイルを送信します。スナップショットレプリケーションが発生すると、宛先データは新しいスナップショットに置き換えられます。スナップショットレプリケーションは、データの揮発性が低い場合に最適なオプションです。たとえば、City、Zipcode、Pincodeなどのマスターテーブルは、スナップショットレプリケーションの最適な候補です。
スナップショットレプリケーションの構成中に、次の重要なコンポーネントが定義されます。
- スナップショットエージェント :パブリケーションで定義されたスキーマとデータの完全なイメージを作成し、ディストリビューターに送信します。スナップショットエージェントは、手動でトリガーされるか、特定の時間に実行するようにスケジュールされるまで、アイドル状態のままです。
- ディストリビューターエージェント :スナップショットファイルをサブスクライバーに送信し、既存のものを置き換えることでスキーマとデータを適用します。
スナップショットレプリケーションは、次のアクティビティを実行します。
- 定義されたスケジュールで、スナップショットエージェントは公開するスキーマとデータに共有ロックを設定します。
- ディストリビューター側にコピーされた公開データのスナップショット全体。スナップショットエージェントは3つのファイルを作成します
- 公開されたデータの作成されたデータベーススキーマへのファイル。
- SQLテーブル内のデータをエクスポートするためのBCPファイル
- インデックスデータをエクスポートするためのインデックスファイル。
- ファイルが作成されると、スナップショットエージェントは公開されたデータとデータの共有ロックを解放します。
- ディストリビューターエージェントは、スナップショットエージェントによって作成されたファイルを使用して、サブスクライバースキーマとデータを開始および置換します。
次の画像は、スナップショットレプリケーションがどのように機能するかを示しています。
利点
- スナップショットレプリケーションの設定は非常に簡単です。データが頻繁に変更されない場合は、スナップショットレプリケーションが非常に適したオプションです。
- データを送信するタイミングを制御できます。たとえば、大量のデータがあるが、トラフィックが少ないときにデータを複製できるよりも頻繁に変更されないマスターテーブル。
短所
- スナップショットエージェントによって生成されたスナップショットには、変更および変更されていない公開データが含まれているため、ネットワーク経由で送信されるスナップショットは遅延を引き起こし、他の操作に影響を与える可能性があります。
- データが増えると、スナップショットのサイズが大きくなり、スナップショットを作成してサブスクライバーに配布するのに時間がかかります。
マージレプリケーション
マージレプリケーションは、複数のサーバーで変更を管理する必要があり、これらの変更を統合する必要がある場合に使用できます。
マージレプリケーションを構成すると、次のコンポーネントが作成されます。
- スナップショットエージェント :スナップショットエージェントは、パブリケーションデータとデータベースオブジェクトの最初のスナップショットを生成します。スナップショットが作成されると、すべてのサブスクライバーに配布されます。
- マージエージェント :マージエージェントは、パブリッシャーとサブスクライバーの間の競合を解決する責任があります。競合は、競合解決を使用するマージエージェントを介して解決されます。競合解決の構成方法に応じて、競合はマージエージェントによって解決されます。
マージレプリケーションを構成すると、次のアクティビティが実行されます。
- パブリケーションデータとデータベースオブジェクトのスナップショット、およびサブスクライバーに適用されたスナップショットを取得することから開始します。
- マージレプリケーションを構成しているときに、パブリッシャーとサブスクライバーにトリガーが作成されます。トリガーは、パブリッシャーとサブスクライバーのその後の変更とテーブルの変更を追跡する責任があります。
- パブリッシャーとサブスクライバーがネットワークに接続すると、データ行の変更とスキーマの変更が相互に同期されます。パブリッシャーとサブスクライバーの変更をマージしている間、マージエージェントは、マージエージェントで定義された条件に基づいて競合を解決します。
マージレプリケーションはサーバーからクライアントへの環境で使用され、サブスクライバーがパブリッシャーからデータを取得し、オフラインで変更を加えてから、パブリッシャーや他のサブスクライバーと変更を同期する必要がある状況に最適です。
同じ行が異なるパブリッシャーとサブスクライバーによって変更される実際的な状況が存在する可能性があります。その時点で、Mergeエージェントは定義されている競合解決を確認し、それに応じて変更を加えます。
SQL Serverは、公開されたテーブルの各行に対してグローバル一意識別子を使用して列を一意に識別します。テーブルにすでに一意の識別子列がある場合、SQLServerは自動的にその列を使用します。それ以外の場合は、テーブルにrowguid列を追加し、その列に基づいてインデックスを作成します。
トリガーは、パブリッシャーとサブスクライバーの両方の公開されたテーブルに作成されます。これらは、行または列の変更に基づいて変更を追跡するために使用されます。
次の画像は、マージレプリケーションがどのように機能するかを示しています。
利点:
- これは、複数のサーバーデータの変更を統合するための唯一の方法です。
短所:
- 両端を複製して同期するには、かなりの時間がかかります。
- 多くの関係者を同期させる必要があるため、一貫性が低くなります。
- 同じ行が複数のサブスクライバーとパブリッシャーで影響を受ける場合、レプリケーションのマージ中に競合が発生する可能性があります。競合解決を使用して修正できますが、レプリケーションのセットアップがより複雑になります。
レプリケーション構成を確認するためのT-SQLコード
マシンの2つのインスタンスでスナップショットレプリケーションとトランザクションレプリケーションを構成しました。 SQL動的管理(DMV)を使用して、レプリケーションの構成を確認できます。レプリケーションの構成を確認するには、T-SQLコードを使用できます。スクリプトコードは次のように入力されます:
- サブスクライバーデータベース名。
- 発行者名。
- サブスクリプションタイプ。
- パブリッシャーデータベース。
- レプリケーションエージェント名。
以下はスクリプトです:
SELECT DistributionAgent.subscriber_db [Subscriber DB], DistributionAgent.publication [PUB Name], RIGHT(LEFT(DistributionAgent.NAME, Len(DistributionAgent.NAME) - ( Len( DistributionAgent.id) + 1 )), Len(LEFT( DistributionAgent.NAME, Len(DistributionAgent.NAME) - ( Len( DistributionAgent.id) + 1 ))) - ( 10 + Len(DistributionAgent.publisher_db) + ( CASE WHEN DistributionAgent.publisher_db = 'ALL' THEN 1 ELSE Len( DistributionAgent.publication) + 2 END ) )) [SUBSCRIBER], ( CASE WHEN DistributionAgent.subscription_type = '0' THEN 'Push' WHEN DistributionAgent.subscription_type = '1' THEN 'Pull' WHEN DistributionAgent.subscription_type = '2' THEN 'Anonymous' ELSE Cast(DistributionAgent.subscription_type AS VARCHAR) END ) [Subscrition Type], DistributionAgent.publisher_db + ' - ' + Cast(DistributionAgent.publisher_database_id AS VARCHAR) [Publisher Database], DistributionAgent.NAME [Pub - DB - Publication - SUB - AgentID] FROM distribution.dbo.msdistribution_agents DistributionAgent WHERE DistributionAgent.subscriber_db <> 'virtual'
出力は次のとおりです。
概要
この記事では、次のことを説明しました:
- レプリケーションとそのコンポーネントの基本と利点。
- トランザクションレプリケーション。
- スナップショットレプリケーション。
- レプリケーションをマージします。