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 an einer Topologie für die Peer-to-Peer-Transaktionsreplikation teilnehmen. 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äranbieter 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). Geben Sie für
@passworddenselben Wert an, der verwendet wurde, alssp_adddistributorauf dem Verteiler ausgeführt wurde, um die Verteilung einzurichten.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. Geben Sie für @password denselben Wert an, der verwendet wurde, als sp_adddistributor auf dem Verteiler ausgeführt wurde, um die Verteilung einzurichten.
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 obigen Skript sind Informationen in eckigen Klammern (
[ ... ]) optional. Verwenden Sie es, um einen Nicht-Standardwert für den TCP-Port anzugeben. Keine Klammern einbeziehen.
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 obigen Skript ist ,<port> optional. Sie ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie keine 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
Mache die Peer-to-Peer-Publikation kompatibel mit der Verfügbarkeitsgruppe (Peer1)
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 obigen Skript ist ,<port> optional. Sie ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest.
Nachdem Sie die oben genannten 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äranbieter 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, alssp_adddistributorauf dem Verteiler ausgeführt wurde, um die Verteilung einzurichten.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, der verwendet wurde, als sp_adddistributor auf dem Verteiler ausgeführt wurde, um die Verteilung einzurichten.
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 obigen Skript sind Informationen in eckigen Klammern (
[ ... ]) optional. Verwenden Sie es, um einen Nicht-Standardwert für den TCP-Port anzugeben. Keine Klammern einbeziehen.
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 obigen Skript ist ,<port> optional. Sie ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie keine 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
Kompatibilität von Peer-zu-Peer-Veröffentlichung mit Verfügbarkeitsgruppe (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 obigen Skript ist ,<port> optional. Sie 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. Dies setzt voraus, dass Knoten1 die primäre Replik ausführt.
Important
Das untenstehende Skript gibt den Namen des Verfügbarkeitsgruppen-Listeners für den Abonnenten an.
@subscriber = N'MyAGListenerName,<port>'
Note
Im obigen Skript ist ,<port> optional. Sie ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie keine spitzen Klammern <>.
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 untenstehende Skript gibt den Namen des Verfügbarkeitsgruppen-Listeners für den Abonnenten an.
@subscriber = N'MyAGListenerName,<port>'
Note
Im obigen Skript ist ,<port> optional. Sie ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie keine 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 Replica-Host sollte sichergestellt werden, dass die Push-Abonnenten der Datenbankpublikationen als verknüpfte Server erscheinen.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';