Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab SQL Server 2019 (15.x) CU 13 kann eine Datenbank, die zu einer SQL Server Always On-Verfügbarkeitsgruppe gehört, als Peer in einer Peer-to-Peer-Topologie für die Transaktionsreplikation fungieren. Dieser Artikel beschreibt, wie man dieses Szenario mit zwei Peers konfiguriert – jeder in seiner eigenen Verfügbarkeitsgruppe.
Die Skripte in diesem Beispiel verwenden gespeicherte T-SQL-Prozeduren.
Rollen & Namen
Dieser Abschnitt beschreibt die Rollen und Namen der verschiedenen Elemente, die an der Replikationstopologie für diesen Artikel beteiligt sind.
Peer1
- Knoten1: Primäres Replikat für die erste Verfügbarkeitsgruppe
- Node2: Sekundäre Replik für die erste Verfügbarkeitsgruppe
- MyAG: Name für die erste Verfügbarkeitsgruppe
- MyDBName: Peer1-Datenbank . Zu veröffentlichende Datenbank
- Dist1: Fernverteiler
- P2P_MyDBName: Publikationsname
- MyAGListenerName: Verfügbarkeitsgruppen-Listener
Peer2
- Knoten3: Primäre Replik für die zweite Verfügbarkeitsgruppe
- Knoten4: Sekundäre Replik für die zweite Verfügbarkeitsgruppe
- MyAG2: Verfügbarkeitsgruppenname für den Namen der zweiten Verfügbarkeitsgruppe
- MyDBName: Datenbank wird veröffentlicht
- Dist2: Fernverteiler
- P2P_MyDBName: Publikationsname
- MyAG2ListenerName: Listener der Verfügbarkeitsgruppe
Voraussetzungen
Vier Instanzen von SQL Server auf separaten physischen oder virtuellen Servern, um die Verfügbarkeitsgruppen zu hosten. Zwei Verfügbarkeitsgruppen enthalten jeweils eine Peer-Datenbank.
Zwei Instanzen von SQL Server zum Hosten der Distributor-Datenbanken.
Alle Serverinstanzen benötigen eine unterstützte Edition – Enterprise Edition oder Developer Edition.
Alle Serverinstanzen benötigen eine unterstützte Version – SQL Server 2019 (15.x) CU13 oder neuer.
Ausreichende Netzwerkverbindung und Bandbreite zwischen allen Instanzen.
Installieren Sie SQL Server-Replikation auf allen Instanzen von SQL Server.
Um zu sehen, ob Replikation auf einer Instanz installiert ist, führen Sie folgende Abfrage aus:
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;Note
Um einen einzelnen Ausfallpunkt für die Verteilungsdatenbank zu vermeiden, verwenden Sie für jeden Peer einen Remoteverteiler.
Für eine Demonstrations- oder Testumgebung können Sie die Verteilungsdatenbanken auf einer einzigen Instanz konfigurieren.
Konfigurieren Sie den Distributor und den entfernten Publisher (Peer1)
Dieser Abschnitt beschreibt, wie man den ersten Peer (Peer1) in einer Verfügbarkeitsgruppe einrichtet.
Führe
sp_adddistributoraus, um die Verteilung auf Dist1 zu konfigurieren. Verwenden Sie@password =, um ein Kennwort anzugeben, das der entfernte Publisher verwendet, um eine Verbindung mit dem Distributor herzustellen. Verwenden Sie dieses Passwort bei jedem entfernten Verlag, wenn Sie den entfernten Verteiler konfigurieren.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';Erstellen Sie die Verteilungsdatenbank beim Verteiler.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Konfigurieren Sie Node1 und Node2 als Remote-Publisher.
Die
@security_modebestimmt, wie die Replikationsagenten mit dem aktuellen Primär verbunden sind.-
1= Windows-Authentifizierung. -
0= SQL Server-Authentifizierung. Erfordert@loginund@password. Der angegebene Login und das Passwort müssen bei jeder sekundären Replik gültig sein.
Note
Wenn modifizierte Replikationsagenten auf einem anderen Computer als dem Distributor laufen, erfordert die Verwendung der Windows-Authentifizierung für die Verbindung zum Primär eine Kerberos-Authentifizierung für die Kommunikation zwischen den Replik-Hostcomputern. Die Nutzung eines SQL Server-Logins für die Verbindung zum aktuellen primären Server 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 Sie den Publisher im ursprünglichen Publisher (Node1)
Konfigurieren Sie den ursprünglichen Publisher der entfernten Distribution (Node1). Gib für
@passworddenselben Wert an wie den, den du verwendet hast, als dusp_adddistributorauf dem Distributor zum Einrichten der Verteilung ausgeführt hast.EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'Aktivieren Sie die Datenbank für die Replikation.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Konfigurieren Sie den sekundären Replikator-Host als Replikationspublisher (Node2)
An jedem sekundären Replikator-Host (Node2) für die erste Verfügbarkeitsgruppe konfigurieren Sie die Verteilung. Gib für @password denselben Wert an, den du beim Ausführen von sp_adddistributor auf dem Verteiler zum Einrichten der Verteilung verwendet hast.
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
Machen Sie die Datenbank Teil der Verfügbarkeitsgruppe und erstellen Sie den Listener (Peer1).
Erstellen Sie auf dem vorgesehenen primären Replikat die Verfügbarkeitsgruppe mit der Datenbank als Mitgliedsdatenbank.
Erstelle einen DNS-Listener für die Verfügbarkeitsgruppe. Der Replikationsagent verbindet sich mit dem aktuellen primären Replikat über den Listener. Das folgende Beispiel erzeugt einen Listener namens
MyAGListenerName.ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Note
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 Publisher auf den AG-Listenernamen (Peer1) um.
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>';
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie nicht die spitzen Klammern <>.
Erstellen Sie eine Peer-to-Peer-Publikation (Peer1) im ursprünglichen Publisher – 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
Im ursprünglichen Publisher (Node1) wird folgendes Skript ausgeführt, 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
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest.
Nachdem Sie die vorherigen Schritte abgeschlossen haben, ist die Verfügbarkeitsgruppe bereit, an der Peer-to-Peer-Topologie teilzunehmen. Die nächsten Schritte konfigurieren eine separate Verfügbarkeitsgruppe als zweiten Peer (Peer2) in der Peer-to-Peer-Replikationstopologie.
Konfigurieren Sie den Distributor und den entfernten Publisher (Peer2)
Dieser Abschnitt beschreibt, wie man den zweiten Peer (Peer2) in einer anderen Verfügbarkeitsgruppe einrichtet.
sp_adddistributorausführen, um die Verteilung auf Dist2 zu konfigurieren. Verwenden Sie@password =, um ein Kennwort anzugeben, das der entfernte Publisher verwendet, um eine Verbindung mit dem Distributor herzustellen. Verwenden Sie dieses Passwort bei jedem entfernten Verlag, wenn Sie den entfernten Verteiler konfigurieren.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Strong password for distributor>';Erstellen Sie die Verteilungsdatenbank beim Verteiler.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Konfigurieren Sie Node3 und Node4 als Remote-Publisher.
Die
@security_modebestimmt, wie die Replikationsagenten mit dem aktuellen Primär verbunden sind.-
1= Windows-Authentifizierung. -
0= SQL Server-Authentifizierung. Erfordert@loginund@password. Der angegebene Login und das Passwort müssen bei jeder sekundären Replik gültig sein.
Note
Wenn modifizierte Replikationsagenten auf einem anderen Computer als dem Distributor laufen, erfordert die Verwendung der Windows-Authentifizierung für die Verbindung zum Primär eine Kerberos-Authentifizierung für die Kommunikation zwischen den Replik-Hostcomputern. Die Nutzung eines SQL Server-Logins für die Verbindung zum aktuellen primären Server erfordert keine Kerberos-Authentifizierung.
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-
Konfigurieren Sie den Publisher (Peer2)
Remote-Distribution auf (Node3) konfigurieren. Geben Sie für
@passworddenselben Wert an, der verwendet wurde, als Siesp_adddistributorauf dem Distributor zum Einrichten der Verteilung ausgeführt haben.EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'Aktivieren Sie die Datenbank für die Replikation.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Konfigurieren Sie den sekundären Replikator-Host als Replikationspublisher (Node4)
An jedem sekundären Replikator-Host (Node4) für die zweite Verfügbarkeitsgruppe konfigurieren Sie die Verteilung. Geben Sie für @password denselben Wert an wie den, den Sie beim Ausführen von sp_adddistributor auf dem Verteiler zum Einrichten der Verteilung verwendet haben.
EXEC sys.sp_adddistributor
@distributor = 'Dist2',
@password = '<Password used when running sp_adddistributor on distributor server>'
Machen Sie die Datenbank Teil der Verfügbarkeitsgruppe und erstellen Sie den Listener (Peer2).
Erstellen Sie auf dem vorgesehenen primären Replikat die Verfügbarkeitsgruppe mit der Datenbank als Mitgliedsdatenbank.
Erstelle einen DNS-Listener für die Verfügbarkeitsgruppe. Der Replikationsagent verbindet sich mit dem aktuellen primären Replikat über den Listener. Das folgende Beispiel erzeugt einen Listener namens
MyAG2ListenerName.ALTER AVAILABILITY GROUP 'MyAG2' ADD LISTENER 'MyAG2ListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Note
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.
Umleiten des ursprünglichen Verlegers zum Namen des Verfügbarkeitsgruppenlisteners (Peer2)
Leiten Sie auf dem Verteiler für Peer2den ursprünglichen Verleger an den Namen des Verteilergruppen-Listeners um.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node3',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAG2ListenerName,<port>';
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie nicht die spitzen Klammern <>.
Erstellen Sie eine Peer-to-Peer-Publikation (Peer2)
Das folgende Skript erstellt die Veröffentlichung für 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
Peer-to-Peer-Publikationen für Verfügbarkeitsgruppen kompatibel machen (Peer2)
Im ursprünglichen Publisher (Node3) wird folgendes Skript ausgeführt, 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'MyAG2ListenerName,<port>'
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value
GO
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest.
Erstellen Sie ein Push-Abonnement von Peer1 zum Verfügbarkeitsgruppen-Listener für Peer2
Um ein Push-Abonnement von Peer1 an den Verfügbarkeitsgruppen-Listener Peer2 zu erstellen, führen Sie folgenden Befehl auf Node1 aus.
Führe das folgende Skript auf Node1 aus. Dieses Skript geht davon aus, dass Node1 die primäre Replik ausführt.
Important
Das folgende Skript gibt den Namen des Verfügbarkeitsgruppen-Listeners für den Abonnenten an.
@subscriber = N'MyAGListenerName,<port>'
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Fügen Sie die spitzen Klammern <> nicht ein.
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
Erstellen Sie ein Push-Abonnement von Peer2 für den Verfügbarkeitsgruppen-Listener (Peer1)
Um ein Push-Abonnement von Peer2 zum Verfügbarkeitsgruppen-Listener (Peer1) zu erstellen, führen Sie folgenden Befehl auf Node3 aus.
Important
Das folgende Skript gibt den Namen des Verfügbarkeitsgruppen-Listeners für den Abonnenten an.
@subscriber = N'MyAGListenerName,<port>'
Note
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie nicht die spitzen Klammern <>.
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 von verknüpften Servern
An jedem sekundären Replikator-Host stellen Sie sicher, dass die Push-Abonnenten der Datenbankpublikationen als verknüpfte Server erscheinen.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';