Einen Peer als Teil einer Verfügbarkeitsgruppe konfigurieren

Ab SQL Server 2019 (15.x) CU 13 kann eine Datenbank, die zu einer SQL Server Always On-Verfügbarkeitsgruppe gehört, als Peer an einer Peer-to-Peer-Topologie für die Transaktionsreplikation 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 und Node2 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 Peer-Datenbank.

  • 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 Sie die SQL Server-Replikation auf allen Instanzen von SQL Server.

    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 einzelnen Ausfallpunkt für die Verteilungsdatenbank zu vermeiden, verwenden Sie für jeden Peer einen entfernten Verteiler.

    Für eine Demonstrations- oder Testumgebung können Sie die Verteilungsdatenbanken auf einer einzigen 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 Node1 und Node2 als Remote-Publisher.

    Der @security_mode bestimmt, wie Replikationsagenten eine Verbindung zum 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 modifizierte Replikationsagenten auf einem anderen Computer als dem Distributor laufen, benötigt die Windows-Authentifizierung für die Verbindung zum Primäranbieter eine Kerberos-Authentifizierung für die Kommunikation zwischen den Replik-Hostcomputern. Verwenden Sie einen SQL Server-Login für die Verbindung zum aktuellen primären Konto, das erfordert keine Kerberos-Authentifizierung.

    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. Gib denselben Wert für @password an wie den Wert, den du beim Distributor sp_adddistributor verwendest, um die Distribution 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 vorherigen Skript sind Informationen in eckigen Klammern ([ ... ]) optional. Verwenden Sie es, um einen Nicht-Standardwert für den TCP-Port anzugeben. Füge die Klammern nicht hinzu.

Leiten Sie den ursprünglichen Herausgeber zum AG-Listenernamen (Peer1) um.

Leiten Sie auf dem Distributor für Peer1 den ursprünglichen Publisher auf den Namen des AG-Listeners um.

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

Hinweis

Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Fügen Sie die spitzen Klammern <> nicht ein.

Peer-to-Peer-Veröffentlichung (Peer1) auf dem ursprünglichen Publisher erstellen - 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  

Peer-to-Peer-Veröffentlichung mit der Verfügbarkeitsgruppe (Peer1) kompatibel machen

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 vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Fügen Sie die spitzen Klammern <> nicht ein.

Nachdem Sie die vorherigen Schritte abgeschlossen haben, ist die Verfügbarkeitsgruppe bereit, an der Peer-to-Peer-Topologie teilzunehmen. 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 die Distribution am 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 entfernten Publisher auf dem Distributor 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 Sie eine Peer-to-Peer-Veröffentlichung (Peer2)

Auf Node3 führen Sie folgenden Befehl aus, um die Peer-to-Peer-Publikation 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

-- 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. Dieser Schritt setzt voraus, dass Knoten1 die primäre Replik ausführt.

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 Sie ein Pushabonnement 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ügbarkeitsgruppen-Listeners für den Abonnenten 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

An jedem sekundären Replika-Host stellen Sie sicher, dass die Push-Abonnenten der Publikationen als verknüpfte Server erscheinen.

EXEC sys.sp_addlinkedserver   
    @server = 'MySubscriber';

Nächster Schritt