SQL Server 2019(15.x)CU 13からは、SQL Server Always Onの可用性グループに属するデータベースがピア・ツー・ピアのトランザクションレプリケーショントポロジーに参加できるようになりました。 この記事では、それぞれが異なる可用性グループに属する2つのピアでこのシナリオを設定する方法を説明します。
この例のスクリプトはT-SQLストアドプロシージャを使用しています。
役割と名称
このセクションでは、本記事の複製トポロジーに参加するさまざまな要素の役割と名称について説明します。
Peer1
- Node1:最初の可用性グループのプライマリレプリカ
- Node2:最初の可用性グループ用のセカンダリ レプリカ
- MyAG:最初の可用性グループ名
- MyDBName: Peer1 データベースです。 公開予定のデータベース
- Dist1: リモート配布元
- P2P_MyDBName:出版物名
- MyAGListenerName: 可用性グループ リスナー
Peer2
- Node3:第2の可用性グループ用のプライマリレプリカ
- Node4: 2 番目の可用性グループのセカンダリ レプリカ
- MyAG2: 2 番目の可用性グループ名の可用性グループ名
- MyDBName:公開予定のデータベース
- Dist2:リモートディストリビューター
- P2P_MyDBName:出版物名
- MyAG2ListenerName: 可用性グループ リスナー
前提条件
SQL Serverは物理的または仮想の別々のサーバー上で4台設置され、可用性グループをホストします。 2つの可用性グループにはそれぞれピアデータベースが含まれています。
ディストリビューターデータベースをホストするためのSQL Serverインスタンスを2台用意しました。
すべてのサーバーインスタンスは、サポートされているエディション、つまりエンタープライズエディションまたはデベロッパーエディションが必要です。
すべてのサーバーインスタンスはサポートされているバージョンが必要です。SQL Server 2019(15.x)CU13以降です。
すべてのインスタンス間で十分なネットワーク接続性と帯域幅が必要です。
すべてのSQL ServerインスタンスにSQL Serverのレプリケーションをインストールしてください。
レプリケーションがどのインスタンスにもインストールされているか確認するには、以下のクエリを実行します。
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;Note
配布データベースの単一障害点を避けるために、各ピアごとにリモートディストリビューターを使用します。
デモンストレーションやテスト環境では、配布データベースを単一のインスタンスに設定することができます。
ディストリビューターとリモートパブリッシャー(Peer1)の設定
このセクションでは、可用性グループ内で最初のピア(Peer1)を設定する方法について説明します。
Dist1で配信を設定するには
sp_adddistributorを実行してください。@password =を使って、リモート出版社が配布元に接続するために使うパスワードを指定します。 リモート配信者を設定する際に、各リモート出版社でこのパスワードを使いましょう。USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';ディストリビューター側のディストリビューション データベースを作成します。
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Node1とNode2のリモートパブリッシャーを設定してください。
@security_modeはレプリケーションエージェントが現在のプライマリに接続する方法を決定します。-
1= Windows 認証。 -
0= SQL Server認証。@loginと@passwordが必要です。 指定されたログイン情報とパスワードは、各セカンダリカレプリカで有効でなければなりません。
Note
もし変更されたレプリケーションエージェントがディストリビューター以外のコンピュータ上で動作している場合、プライマリ接続にWindows 認証を使用するには、レプリカホストコンピュータ間の通信にKerberos認証が必要です。 現在のプライマリに接続するためにSQL Serverログインを使う場合、Kerberos認証は必要ありません。
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node1', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1 USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node2', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1-
元のパブリッシャー(Node1)でパブリッシャーを設定してください
リモートディストリビューションの元のパブリッシャー(Node1)を設定してください。 ディストリビューションを設定するためにディストリビュータで
sp_adddistributorを実行したときに使用したものと同じ値を、@passwordに指定してください。EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'データベースでレプリケーションを有効にします。
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
セカンダリプレプリカホストをレプリケーションパブリッシャー(Node2)として設定します
各セカンダリ複製ホスト(Node2)で、最初の可用性グループとして配布を設定します。 ディストリビューションを設定するためにディストリビュータで sp_adddistributor を実行したときに使用したものと同じ値を、@password に指定してください。
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
データベースを可用性グループの一部にし、リスナー(Peer1)を作成します。
意図されたプライマリレプリカ上で、データベースをメンバーデータベースとして利用可能グループを作成します。
可用性グループ用のDNSリスナーを作成します。 レプリケーションエージェントはリスナーを使って現在のプライマリレプリカに接続します。 以下の例は
MyAGListenerNameというリスナーを作成します。ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Note
上記のスクリプトでは、方角括弧(
[ ... ])内の情報は任意です。 TCPポートのデフォルト値以外を指定するために使ってください。 括弧は含めないでください。
元の発行者をAGリスナー名(Peer1)にリダイレクトします。
Peer1 のディストリビューター上で、元のパブリッシャーを AG リスナー名にリダイレクトします。
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node1',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAGListenerName,<port>';
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。 角括弧は含めないでください <>。
元のパブリッシャーであるNode1上でピアツーピアのパブリケーション(Peer1)を作成する
以下のスクリプトはPeer1のパブリケーションを作成します。
EXEC master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node1'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 100
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
ピアツーピア公開を可用性グループ(Peer1)と互換性のあるものにします
元のパブリッシャー(Node1)上で、以下のスクリプトを実行して、パブリケーションを可用性グループと互換性のあるものにします。
USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName'
DECLARE @property sysname = N'redirected_publisher'
DECLARE @value sysname = N'MyAGListenerName,<port>'
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value
GO
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。
上記の手順を完了すると、可用性グループはピアツーピア トポロジに参加する準備が整います。 次のステップでは、ピアツーピア複製トポロジーの第2ピア(Peer2)として別の可用性グループを設定します。
ディストリビューターとリモートパブリッシャー(Peer2)の設定
このセクションでは、別の可用性グループで2番目のピア(Peer2)を設定する方法について説明します。
Dist2で配布を設定するには
sp_adddistributorを実行してください。@password =を使って、リモート出版社が配布元に接続するために使うパスワードを指定します。 リモート配信者を設定する際に、各リモート出版社でこのパスワードを使いましょう。USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Strong password for distributor>';ディストリビューター側のディストリビューション データベースを作成します。
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Node3とNode4のリモートパブリッシャーを設定してください。
@security_modeはレプリケーションエージェントが現在のプライマリに接続する方法を決定します。-
1= Windows 認証。 -
0= SQL Server認証。@loginと@passwordが必要です。 指定されたログイン情報とパスワードは、各セカンダリカレプリカで有効でなければなりません。
Note
もし変更されたレプリケーションエージェントがディストリビューター以外のコンピュータ上で動作している場合、プライマリ接続にWindows 認証を使用するには、レプリカホストコンピュータ間の通信にKerberos認証が必要です。 現在のプライマリに接続するためにSQL Serverログインを使う場合、Kerberos認証は必要ありません。
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node3', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir2', @security_mode = 1 USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node4', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir2', @security_mode = 1-
パブリッシャーの設定(Peer2)
(Node3)でリモート配信を設定してください。 ディストリビューションを設定するためにディストリビュータで
sp_adddistributorを実行したときに使用したものと同じ値を、@passwordに指定してください。EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'データベースでレプリケーションを有効にします。
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
セカンダリレプリカホストをレプリケーションパブリパブリッシャー(Node4)として設定します
各セカンダリ複製ホスト(Node4)で、2つ目の可用性グループとして配布を設定します。 ディストリビューションを設定するためにディストリビュータで sp_adddistributor を実行したときに使用したものと同じ値を、@password に指定してください。
EXEC sys.sp_adddistributor
@distributor = 'Dist2',
@password = '<Password used when running sp_adddistributor on distributor server>'
データベースを可用性グループに組み込み、リスナー(Peer2)を作成しましょう。
意図されたプライマリレプリカ上で、データベースをメンバーデータベースとして利用可能グループを作成します。
可用性グループ用のDNSリスナーを作成します。 レプリケーションエージェントはリスナーを使って現在のプライマリレプリカに接続します。 以下の例は
MyAG2ListenerNameというリスナーを作成します。ALTER AVAILABILITY GROUP 'MyAG2' ADD LISTENER 'MyAG2ListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Note
上記のスクリプトでは、方角括弧(
[ ... ])内の情報は任意です。 TCPポートのデフォルト値以外を指定するために使ってください。 括弧は含めないでください。
元の発行者をAGリスナー名(Peer2)にリダイレクトします。
Peer2 のディストリビューター上で、元のパブリッシャーを AG リスナー名にリダイレクトしてください。
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node3',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAG2ListenerName,<port>';
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。 角括弧は含めないでください <>。
Peer2 ピアツーピア パブリケーションを作成
以下のスクリプトはPeer2のパブリケーションを作成します。
Node3上で以下のコマンドを実行してピアツーピアのパブリケーションを作成します。
EXEC master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO
-- Make sure that the value for @p2p_originator_id is different from Peer1.
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node3'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 1
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
ピアツーピアの公開を可用性グループ(Peer2)と互換性のあるものにします
元のパブリッシャー(Node3)上で、公開を可用性グループと互換性のあるものにするために以下のスクリプトを実行してください:
USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName'
DECLARE @property sysname = N'redirected_publisher'
DECLARE @value sysname = N'MyAG2ListenerName,<port>'
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value
GO
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。
Peer1からPeer2の可用性グループリスナーへのプッシュサブスクリプションを作成します
Peer1から可用性グループのリスナーPeer2へのプッシュサブスクリプションを作成するには、Node1で以下のコマンドを実行します。
ノード1で以下のスクリプトを実行します。 これは Node1 がプライマリレプリカを実行していることを前提としています。
Important
以下のスクリプトは、加入者の可用性グループリスナー名を指定します。
@subscriber = N'MyAGListenerName,<port>'
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。 角括弧は含めないでください <>。
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAG2Listener,<port>'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAG2Listener,<port>'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
Peer2から可用性グループのリスナー(Peer1)へのプッシュサブスクリプションを作成します
Peer2から可用性グループのリスナー(Peer1)へのプッシュサブスクリプションを作成するには、Node3で以下のコマンドを実行します。
Important
以下のスクリプトは、加入者の可用性グループリスナー名を指定します。
@subscriber = N'MyAGListenerName,<port>'
Note
上記のスクリプトでは、この ,<port> は任意です。 これは非デフォルトポートを使用している場合にのみ必要です。 角括弧は含めないでください <>。
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
リンクサーバーの設定
各セカンダリ複製ホストで、データベース出版物のプッシュ加入者がリンクサーバーとして表示されていることを確認してください。
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';