Share via


Konfigurieren eines Peers als Teil der Verfügbarkeitsgruppe

Beginnend mit SQL Server 2019 (15.x) CU 13 kann eine Datenbank, die zu einer SQL Server AlwaysOn-Verfügbarkeitsgruppe gehört, als Peer in einer Peer-to-Peer-Transaktionsreplikationstopologie teilnehmen. In diesem Artikel wird das Konfigurieren dieses Szenarios erläutert.

Die Skripts in diesem Beispiel verwenden in T-SQL gespeicherte Prozeduren.

Rollen und Namen

In diesem Abschnitt werden die Rollen und Namen der verschiedenen Elemente beschrieben, die an der Replikationstopologie für diesen Artikel teilnehmen.

Peer1

  • Node1: Replikat 1 in der Verfügbarkeitsgruppe MyAG
  • Node2: Replikat 2 in der Verfügbarkeitsgruppe MyAG
  • MyAG: Der Name der Verfügbarkeitsgruppe, die Sie auf Node1 undNode2 erstellen
  • MyAGListenerName: Name des Verfügbarkeitsgruppenlisteners
  • Dist1: Der Name der Remoteverteilerinstanz
  • MyDBName: Name der Datenbank
  • P2P_MyDBName: Veröffentlichungsname

Peer2

  • Node3: Ein eigenständiger Server, der eine Standardinstanz von SQL Server hostet
  • Dist2: Der Name der Remoteverteilerinstanz
  • MyDBName: Name der Datenbank
  • P2P_MyDBName: Veröffentlichungsname

Voraussetzungen

  • Zwei Instanzen von SQL Server auf separaten physischen oder virtuellen Servern, um die Verfügbarkeitsgruppen zu hosten. Die Verfügbarkeitsgruppe enthält eine Peerdatenbank.

  • Eine Instanz von SQL Server hostet eine andere Peerdatenbank

  • Zwei Instanzen von SQL Server, um die Verteilerdatenbanken zu hosten

  • Alle Serverinstanzen erfordern eine unterstützte Edition: Enterprise Edition oder Developer Edition.

  • Für alle Serverinstanzen ist eine unterstützte Version erforderlich – SQL Server 2019 (15.x) CU13 oder höher.

  • Ausreichende Netzwerkkonnektivität und Bandbreite zwischen allen Instanzen.

  • Installieren der SQL Server-Replikation auf allen SQL Server-Instanzen.

    Führen Sie die folgende Abfrage aus, um zu sehen, ob die Replikation auf einer beliebigen Instanz installiert ist:

    USE master;   
    GO   
    DECLARE @installed int;   
    EXEC @installed = sys.sp_MS_replication_installed;   
    SELECT @installed; 
    

    Hinweis

    Um einen Single Point of Failure für die Verteilungsdatenbank zu vermeiden, verwenden Sie für jeden Peer einen Remoteverteiler.

    Zur Demonstration oder Testumgebung können Sie die Verteilungsdatenbanken auf einer einzelnen Instanz konfigurieren.

Konfigurieren des Verteilers und des Remoteverlegers (Peer1)

  1. Führen Sie sp_adddistributor aus, um die Verteilung auf Dist1 zu konfigurieren. Verwenden Sie @password =, um ein Kennwort anzugeben, das der Remoteverleger zum Herstellen einer Verbindung mit dem Verteiler verwendet. Verwenden Sie dieses Kennwort bei jedem Remoteverleger, wenn Sie den Remoteverteiler konfigurieren.

    USE master;  
    GO  
    EXEC sys.sp_adddistributor  
     @distributor = 'Dist1',  
     @password = '<Strong password for distributor>';  
    
  2. Erstellen Sie die Verteilungsdatenbank beim Verteiler.

    USE master;
    GO  
    EXEC sys.sp_adddistributiondb  
     @database = 'distribution',  
     @security_mode = 1;  
    
  3. Konfigurieren Sie den Remoteveleger für Node1 und Node2.

    Der @security_mode bestimmt wie Replikations-Agents eine Verbindung mit dem aktuellen primären Server herstellen.

    • 1 = Windows-Authentifizierung
    • 0 = SQL Server-Authentifizierung Erfordert @login und @password. Der ausgewählte Anmeldename und das Kennwort müssen bei jedem sekundären Replikat gültig sein.

    Hinweis

    Wenn geänderte Replikations-Agents auf einem anderen Computer als dem Verteiler ausgeführt werden, dann ist bei Verwendung der Windows-Authentifizierung zum Herstellen einer Verbindung zum primären Replikat die Kerberos-Authentifizierung für die Kommunikation zwischen den Replikathostcomputern erforderlich. Bei Verwendung einer SQL Server-Anmeldung zum Herstellen einer Verbindung mit dem aktuellen primären Replikat ist keine Kerberos-Authentifizierung erforderlich.

    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
    

Konfigurieren des Verlegers beim ursprünglichen Verleger (Node1)

  1. Konfigurieren Sie den ursprünglichen Verleger für die Remoteverteilung (Node1). Geben Sie den Wert für @password an, der verwendet wurde, als sp_adddistributor beim Verteiler ausgeführt wurde, um die Verteilung einzurichten.

    exec sys.sp_adddistributor  
    @distributor = 'Dist1',  
    @password = '<Password used when running sp_adddistributor on distributor server>' 
    
  2. Aktivieren Sie die Datenbank für die Replikation.

    USE master;  
    GO  
    EXEC sys.sp_replicationdboption  
     @dbname = 'MyDBName',  
     @optname = 'publish',  
     @value = 'true';  
    

Konfigurieren des sekundären Replikathosts als Replikationsverleger (Node2)

Konfigurieren Sie die Verteilung auf jedem sekundären Replikathost. Geben Sie den Wert für @password an, der verwendet wurde, als sp_adddistributor beim Verteiler ausgeführt wurde, um die Verteilung einzurichten.

EXEC sys.sp_adddistributor  
   @distributor = 'Dist1',  
   @password = '<Password used when running sp_adddistributor on distributor server>' 

Integrieren Sie die Datenbank in die Verfügbarkeitsgruppe, und erstellen Sie den Listener (Peer1).

  1. Erstellen Sie auf dem vorgesehenen primären Replikat die Verfügbarkeitsgruppe mit der Datenbank als Mitgliedsdatenbank.

  2. Erstellen Sie für die Verfügbarkeitsgruppe einen DNS-Listener. Der Replikations-Agent stellt mithilfe des Listeners eine Verbindung mit dem aktuellen primären Replikat her. Im folgenden Beispiel wird ein Listener namens MyAGListername erstellt:

    ALTER AVAILABILITY GROUP 'MyAG'
    ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));   
    

    Hinweis

    Im obigen Skript sind Informationen in eckigen Klammern ([ ... ]) optional. Verwenden Sie die spitzen Klammern, um einen nicht standardmäßigen Wert für den TCP-Port anzugeben. Geben Sie die Klammern nicht mit an.

Umleiten des ursprünglichen Verlegers zum Namen des Verfügbarkeitsgruppenlisteners (Peer1)

Leiten Sie auf dem Verteiler für Peer1den ursprünglichen Verleger an den Namen des Verfügbarkeitsgruppenlisteners um.

USE distribution;   
GO   
EXEC sys.sp_redirect_publisher    
@original_publisher = 'Node1',   
@publisher_db = 'MyDBName',   
@redirected_publisher = 'MyAGListenerName,<port>';   

Hinweis

Im obigen Skript ist ,<port> optional. Dies ist nur erforderlich, wenn Sie nicht standardmäßige Ports verwenden. Verwenden Sie keine spitzen Klammern <>.

Erstellen einer Peer-zu-Peer-Veröffentlichung (Peer1) auf dem ursprünglichen Verleger: Node1

Das folgende Skript erstellt die Veröffentlichung für 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  

Kompatibilität von Peer-zu-Peer-Veröffentlichung mit Verfügbarkeitsgruppe (Peer1)

Führen Sie auf dem ursprünglichen Verleger (Node1) das folgende Skript aus, um die Veröffentlichung mit der Verfügbarkeitsgruppe kompatibel zu machen:

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 

Hinweis

Im obigen Skript ist ,<port> optional. Dies ist nur erforderlich, wenn Sie nicht standardmäßige Ports verwenden. Verwenden Sie keine spitzen Klammern <>.

Nachdem Sie die oben genannten Schritte abgeschlossen haben, ist die Verfügbarkeitsgruppe für die Teilnahme an der Peer-zu-Peer-Topologie vorbereitet. In den nächsten Schritten wird eine eigenständige Instanz von SQL Server (Peer2) für die Teilnahme konfiguriert.

Konfigurieren des Verteilers und des Remoteverlegers (Peer2)

  1. Konfigurieren Sie Verteilung beim Verteiler.

    USE master;   
    GO   
    EXEC sys.sp_adddistributor   
     @distributor = 'Dist2',   
     @password = '**Strong password for distributor**';   
    
  2. Erstellen Sie die Verteilungsdatenbank beim Verteiler.

    USE master;   
    GO   
    EXEC sys.sp_adddistributiondb   
     @database = 'distribution',   
     @security_mode = 1;     
    
  3. Konfigurieren Sie Node3 als Remoteverleger auf Verteiler Dist2.

    USE master;   
    GO   
    EXEC sys.sp_adddistpublisher   
     @publisher = 'Node3',   
     @distribution_db = 'distribution',   
     @working_directory = '\\MyReplShare\WorkingDir2',   
     @security_mode = 1 
    

Konfigurieren Sie den Verleger (Peer2)

  1. Konfigurieren Sie die Remoteverteilung auf Node3.

    exec sys.sp_adddistributor  
    @distributor = 'Dist2',  
    @password = '<Password used when running sp_adddistributor on distributor server>' 
    
  2. Aktivieren Sie auf Node3 die Datenbank für die Replikation.

USE master;  
GO  
EXEC sys.sp_replicationdboption  
    @dbname = 'MyDBName',  
    @optname = 'publish',  
    @value = 'true';  

Erstellen einer Peer-zu-Peer-Veröffentlichung (Peer2)

Führen Sie auf Node3 den folgenden Befehl aus, um die Peer-zu-Peer-Veröffentlichung zu erstellen.

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

-- Note – 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

Erstellen eines Pushabonnements von Peer1 zu Peer2

In diesem Schritt wird ein Pushabonnement von der Verfügbarkeitsgruppe zur eigenständigen Instanz von SQL Server erstellt.

Führen Sie das folgende Skript auf Node1 aus. Dabei wird davon ausgegangen, dass auf Node1 das primäre Replikat ausgeführt wird.

EXEC [MyDBName].dbo.sp_addsubscription 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'Node3'
 , @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'Node3'
 , @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

Erstellen eines Pushabonnements von Peer2 an den Verfügbarkeitsgruppenlistener.

Führen Sie den folgenden Befehl auf Node3 aus, um ein Pushabonnement von Peer2 an den Verfügbarkeitsgruppenlistener zu erstellen.

Wichtig

Das folgende Skript gibt den Namen des Verfügbarkeitsgruppenlisteners für den*die Abonnenten*innen an.

@subscriber = N'MyAGListenerName,<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

Konfigurieren des Verbindungsservers

Stellen Sie bei jedem sekundären Replikathost sicher, dass die Pushabonnenten der Datenbankveröffentlichungen als Verbindungsserver angezeigt werden.

EXEC sys.sp_addlinkedserver   
    @server = 'MySubscriber';

Nächste Schritte

Konfigurieren der Peer-zu-Peer-Veröffentlichungsdatenbank als Teil der Verfügbarkeitsgruppen