ピア ツー ピア トランザクション レプリケーションを構成する方法 (レプリケーション Transact-SQL プログラミング)

このトピックでは、ストアド プロシージャを使用してピア ツー ピア レプリケーション トポロジを構成および管理する方法について説明します。まず 3 ノード トポロジの作成方法を示し、次に新しいノードを追加して接続する方法を説明します。SQL Server 2005 を実行するノードの追加と、SQL Server 2008 以降のバージョンの SQL Server を実行するノードの追加について、それぞれに手順を示します。ピア ツー ピア レプリケーションにおける競合を検出するためのパラメータについては、ここでは説明しません。競合検出の詳細については、「ピア ツー ピア トランザクション レプリケーションの競合検出を構成する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

トポロジの構成は、一連の標準トランザクション パブリケーションおよびサブスクリプションの構成とよく似ています。注意する点は、ノードの初期化方法と、sp_addsubscription@sync_type パラメータに指定する値です。

  • トポロジの最初のノードには元のパブリケーション データベースを格納するため、スキーマとデータの初期化は不要です。よって、他のノードから最初のノードにデータをレプリケートするサブスクリプションには、値 replication support only を指定します。このオプションを指定すると、レプリケーションに必要なオブジェクトが最初のノードに確実にコピーされます。

  • 最初のノードを構成した後、通常は、最初のノードのバックアップから複数のノードを初期化します。よって、最初のノードから他のノードにデータをレプリケートするサブスクリプションには、値 initialize with backup または replication support only を指定します。システムで処理が実行されていない場合は値 replication support only を使用できますが、アクティブなシステムには値 initialize with backup を使用する必要があります。initialize with backup を指定すると、関連するトランザクションのすべてが、新しいノードに確実にレプリケートされます。

  • ノードを初期化した後、他のノードからデータをレプリケートするサブスクリプションで、ノードの初期化を再度行う必要はありません。よって、値 replication support only または initialize from lsn を指定します。システムで処理が実行されていない場合は値 replication support only を使用できますが、アクティブなシステムには値 initialize from lsn を使用する必要があります。initialize from lsn を指定すると、関連するトランザクションのすべてが、新しいノードに確実にレプリケートされます。

    SQL Server 2005 は、initialize from lsn をサポートしていません。トポロジに SQL Server 2005 ノードが含まれている場合、新しいノードを既存の 1 つのノードに接続できますが、複数のノードに接続するにはシステムを停止する必要があります。システムを停止するときには、パブリッシュされたテーブルの利用をすべてのノードで停止し、各ノードが他のすべてのノードの変更を受け取っていることを確認します。このプロセスについては、このトピックの最後のセクションで詳しく説明します。

手順

アクティブなデータベースのトポロジを構成する場合は、次の手順を使用して、1 つ目と 2 つ目のノード (ノード A およびノード B) を追加します。続いて、ノード C 以降のノードには、その後に示す手順を使用します。後に示す手順では、@sync_type を値 initialize from lsn で使用します。このオプションを使用すると、アクティブなシステム上で、トランザクションを失うことなくトポロジを構成できます。

3 つのノードにピア ツー ピア レプリケーションを設定するには

  1. 各ノードをパブリッシャとして構成し、ローカルまたはリモートのディストリビュータに関連付けます。リモート ディストリビュータを使用する場合は、すべてのノードに対して同一のリモート ディストリビュータを使用しないようにしてください。これは、単一地点障害につながるからです。詳細については、「パブリッシングとディストリビューションを構成する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

  2. ノード A で sp_addpublication を実行します。@enabled_for_p2p に true を、@statusactive を、@allow_initialize_from_backup に true を指定します。パブリケーションにアーティクルを追加するには、sp_addarticle を実行します。

  3. トポロジを構成する前に、各ノードに初期データが存在する必要があります。SQL Server のバックアップと復元の機能を使用して、トポロジの各ノードでパブリケーションのデータを初期化します。バックアップ元は最初に構成されたノード (この場合はノード A) であることが必要です。バックアップは、ノード A のパブリケーションを作成し、ピア ツー ピア レプリケーションを有効化した後に作成する必要があります。ここでは、新規ノードがすべて追加されるまで、どのノードでも処理が行われないことを前提としています。したがって、各ノードの初期化に同一のバックアップを使用できます。

    新規ノードがすべて追加される前にいずれかのノードで処理が行われた場合は、各ノードを追加してノード A と少なくとも 1 回同期した後に、新しいバックアップを作成する必要があります。これにより、ノード A からのバックアップに他のすべてのノードに関するメタデータが含まれるようになります。たとえば、ノード B とノード C を追加する場合に、これらのノードで処理が実行中されているとします。この場合、ノード A からのバックアップでノード B を初期化した後に、ノード B を構成して同期します。次に、ノード A から新しいバックアップを作成し、この新しいバックアップでノード C を初期化した後に、ノード C を構成して同期します。

    データベースのバックアップと復元を行う方法の詳細については、「SQL Server でのデータベースのバックアップおよび復元」を参照してください。

    重要な注意事項重要

    データベースを復元する場合、KEEP_REPLICATION オプション (Transact-SQL) または [レプリケーションの設定を保存する] オプション (SQL Server Management Studio) は指定しないでください。ピア ツー ピア トポロジ構成ウィザードを実行すると、レプリケーションによってデータベースが適切に構成されます。

    バックアップにはデータベース全体が含まれるため、各ピアのデータベースを初期化すると、パブリケーション データベースの完全なコピーが取り込まれます。バックアップには、パブリケーションのアーティクルとして指定されていないテーブルが含まれている場合があります。管理者またはアプリケーションは、バックアップを復元した後に不要なオブジェクトやデータを削除する必要があります。以後の同期では、アーティクルとして指定されたテーブルに適用される場合にのみ、データの変更がレプリケートされます。

  4. ノード A で sp_addsubscription を実行します。@publication にノード A で作成したパブリケーションの名前を、@subscriber にノード B の名前を、@destination_db にノード B の対象データベースの名前を、@sync_typeinitialize with backup を、そして @backupdevicetype パラメータと @backupdevicename パラメータに適切な値を指定します。

  5. ノード A で sp_addsubscription を再度実行します。今度は、@publication にパブリケーションの名前を、@subscriber にノード C の名前を、@destination_db にノード C の対象データベースの名前を、@sync_typeinitialize with backup を、そして @backupdevicetype パラメータと @backupdevicename パラメータに適切な値を指定します。

  6. ノード B で sp_addpublication を実行します。@publication にパブリケーションの名前を、@enabled_for_p2p に true を、@statusactive を、@allow_initialize_from_backup に true を指定します。パブリケーションにアーティクルを追加するには、sp_addarticle を実行します。

  7. ノード B で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード A の名前を、@destination_db にノード A の対象データベースの名前を、@sync_typereplication support only を指定します。

  8. ノード B で sp_addsubscription を再度実行します。今度は、@publication にパブリケーションの名前を、@subscriber にノード C の名前を、@destination_db にノード C の対象データベースの名前を、@sync_typereplication support only を指定します。

  9. ノード C で sp_addpublication を実行します。@publication にパブリケーションの名前を、@enabled_for_p2p に true を、@statusactive を、@allow_initialize_from_backup に true を指定します。パブリケーションにアーティクルを追加するには、sp_addarticle を実行します。

  10. ノード C で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード A の名前を、@destination_db にノード A の対象データベースの名前を、@sync_typereplication support only を指定します。

  11. ノード C で sp_addsubscription を再度実行します。今度は、@publication にパブリケーションの名前を、@subscriber にノード B の名前を、@destination_db にノード B の対象データベースの名前を、@sync_typereplication support only を指定します。

  12. パブリッシュされたテーブルに ID 列がある場合は、復元操作後に、ノード A のテーブルに割り当てた ID 範囲がノード B およびノード C のテーブルでも使用されます。それぞれに異なる範囲が使用されるようにするには、DBCC CHECKIDENT を使用してノード B およびノード C のテーブルを再作成する必要があります。

    ID 範囲を管理する方法の詳細については、「ID 列のレプリケート」の「手動で ID 範囲を管理する場合の範囲の割り当て」を参照してください。

SQL Server 2008 以降のバージョンの SQL Server を実行するノードで構成されているトポロジに、1 つ以上のノードを追加するには、次の手順に従います。

SQL Server 2008 以降のバージョンを実行するノードをトポロジに追加するには

  1. ノード D をパブリッシャとして構成し、ローカルまたはリモートのディストリビュータに関連付けます。

  2. ノード A からノード D にバックアップを復元します。

  3. ノード D で sp_addpublication を実行します。@publication にパブリケーションの名前を、@enabled_for_p2p に true を、@statusactive を、@allow_initialize_from_backup に true を指定します。パブリケーションにアーティクルを追加するには、sp_addarticle を実行します。

  4. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード A の名前を、@destination_db にノード A の対象データベースの名前を、@sync_typereplication support only を指定します。

  5. ノード A で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typeinitialize with backup を、そして @backupdevicetype パラメータと @backupdevicename パラメータに適切な値を指定します。

    ノード D は、ノード A を通して、ノード B とノード C からトランザクションを受信した可能性があります。次のステップで、これらのトランザクションについて考慮します。

  6. ノード D で、MSpeer_lsns テーブルにクエリを実行します。originator 列と originator_lsn 列を使用して、ノード D がノード B から受信した最新のトランザクションのログ シーケンス番号 (LSN) を特定します。

  7. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード B の名前を、@destination_db にノード B の対象データベースの名前を、@sync_typereplication support only を指定します。

  8. ノード B で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typeinitialize from lsn を、そして @subscriptionlsn に取得済みのノード B の LSN を指定します。

  9. ノード D で、MSpeer_lsns テーブルにクエリを実行します。originator 列と originator_lsn 列を使用して、ノード D がノード C から受信した最新のトランザクションの LSN を特定します。

  10. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード C の名前を、@destination_db にノード C の対象データベースの名前を、@sync_typereplication support only を指定します。

  11. ノード C で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typeinitialize from lsn を、そして @subscriptionlsn に取得済みのノード C の LSN を指定します。

  12. パブリッシュされたテーブルに ID 列がある場合は、復元操作後に、ノード A のテーブルに割り当てた ID 範囲がノード D のテーブルでも使用されます。それぞれに異なる範囲が使用されるようにするには、DBCC CHECKIDENT を使用してノード D のテーブルを再作成する必要があります。

    ID 範囲を管理する方法の詳細については、「ID 列のレプリケート」の「手動で ID 範囲を管理する場合の範囲の割り当て」を参照してください。

このトピックで初めに説明したように、SQL Server 2005 ノードを追加する操作と、それより後のバージョンの SQL Server を実行するノードを追加する操作の主な違いは、既存のすべてのノードに新しいノードを接続する場合に、SQL Server 2005 ではシステムの停止が必要になる点です。以下の手順では、既存のトポロジに SQL Server 2005 ノードを追加する方法を段階ごとに示します。

  • 第 1 段階は、手順 1. ~ 5. に当たります。この段階では、ノード A とノード D 間にサブスクリプションを作成することで、ノード D を部分的にトポロジに接続します。これにより、ノード A、ノード B、およびノード C では変更が引き続き行われます。ノード D での変更は、ノード A とノード D 間にサブスクリプションが作成されるとすぐに開始されます。ノード B およびノード C からの変更は、ノード A を通してノード D にレプリケートされます。

  • 第 2 段階は、手順 6. ~ 9. に当たります。この段階では、ノード B とノード D の間、およびノード C とノード D の間にサブスクリプションを作成して、ノード D を完全にトポロジに接続します。この段階では、システムを停止する必要があります。

    第 2 段階は必須ではありませんが、ノード A とノード D 間に単一の接続しかない場合に比べてフォールト トレランスが向上します。

SQL Server 2005 ノードをトポロジに追加するには

  1. ノード D をパブリッシャとして構成し、ローカルまたはリモートのディストリビュータに関連付けます。

  2. ノード A からノード D にバックアップを復元します。

  3. ノード D で sp_addpublication を実行します。@publication にパブリケーションの名前を、@enabled_for_p2p に true を、@statusactive を、@allow_initialize_from_backup に true を指定します。パブリケーションにアーティクルを追加するには、sp_addarticle を実行します。

  4. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード A の名前を、@destination_db にノード A の対象データベースの名前を、@sync_typereplication support only を指定します。

  5. ノード A で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typeinitialize with backup を、そして @backupdevicetype パラメータと @backupdevicename パラメータに適切な値を指定します。

  6. 次の手順に従ってトポロジを停止します。

    1. ピア ツー ピア トポロジ内のすべてのパブリッシュされたテーブルでの処理をすべて停止します。

    2. サーバー Aサーバー Bサーバー C、およびサーバー D のデータベースで sp_requestpeerresponse を実行し、出力パラメータ @request_id を取得します。

    3. 既定では、ディストリビューション エージェントが連続的に実行されるように設定されているため、すべてのノードに自動的にトークンが送信されます。ディストリビューション エージェントが連続モードで実行されていない場合は、エージェントを実行します。詳細については、「レプリケーション エージェント実行可能ファイルの概念」または「レプリケーション エージェントの起動および停止方法 (SQL Server Management Studio)」を参照してください。

    4. 手順 2 で取得した @request_id 値を指定して sp_helppeerresponses を実行します。すべてのノードがピア要求を受信するまで待機します。

    5. 必要に応じて、ノード D で新しい ID 範囲を割り当てます。残りのサブスクリプションを追加することによって完全にトポロジに接続することができます。

  7. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード B の名前を、@destination_db にノード B の対象データベースの名前を、@sync_typereplication support only を指定します。

  8. ノード D で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード C の名前を、@destination_db にノード C の対象データベースの名前を、@sync_typereplication support only を指定します。

  9. ノード B で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typereplication support only を指定します。

  10. ノード C で sp_addsubscription を実行します。@publication にパブリケーションの名前を、@subscriber にノード D の名前を、@destination_db にノード D の対象データベースの名前を、@sync_typereplication support only を指定します。