Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Vanaf SQL Server 2019 (15.x) CU 13 kan een database die behoort tot een SQL Server Always On beschikbaarheidsgroep als peer deelnemen aan een peer-to-peer transactionele replicatietopologie. Dit artikel beschrijft hoe je dit scenario kunt configureren.
De scripts in dit voorbeeld gebruiken T-SQL stored procedures.
Rollen & namen
Deze sectie beschrijft de rollen en namen van de verschillende elementen die deelnemen aan de replicatietopologie voor dit artikel.
Peer1
- Node1: Replica 1 in de MyAG-beschikbaarheidsgroep .
- Node2: Replica 2 in de MyAG-beschikbaarheidsgroep .
- MyAG: De naam van de beschikbaarheidsgroep die je aanmaakt op Node1 en Node2.
- MyAGListenerName: Naam van de luisteraar van de beschikbaarheidsgroep.
- Dist1: De naam van de externe distributie-instantie.
- MyDBName: Naam van de database.
- P2P_MyDBName: Publicatienaam.
Peer2
- Node3: Een zelfstandige server die een standaardinstantie van SQL Server host.
- Dist2: De naam van de externe distributeur-instantie.
- MyDBName: Naam van de database.
- P2P_MyDBName: Publicatienaam.
Prerequisites
Twee instanties van SQL Server op aparte fysieke of virtuele servers om de beschikbaarheidsgroep te hosten. De beschikbaarheidsgroep bevat een peerdatabase.
Eén instantie van SQL Server om een andere peer-database te hosten.
Twee instanties van SQL Server om de distributeurdatabases te hosten.
Alle serverinstanties vereisen een ondersteunde editie - Enterprise edition of Developer edition.
Alle serverinstanties vereisen een ondersteunde versie - SQL Server 2019 (15.x) CU13 of later.
Voldoende netwerkconnectiviteit en bandbreedte tussen alle instanties.
Installeer SQL Server-replicatie op alle instanties van SQL Server.
Om te zien of replicatie op een instantie is geïnstalleerd, voer je de volgende query uit:
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;Note
Om een single point of failure voor de distributiedatabase te voorkomen, gebruik je voor elke peer een externe distributeur.
Voor demonstratie- of testomgeving kun je de distributiedatabases configureren op één enkele instantie.
Configureer de distributeur en externe uitgever (Peer1)
Voer
sp_adddistributoruit om distributie op Dist1 te configureren. Gebruik@password =om een wachtwoord op te geven dat de externe uitgever gebruikt om verbinding te maken met de distributeur. Gebruik dit wachtwoord bij elke externe uitgever wanneer je de externe distributeur configureert.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';Maak de distributiedatabase bij de distributeur.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Configureer Node1 en Node2 als externe uitgever.
Bepaalt
@security_modehoe de replicatieagenten verbinding maken met de huidige primaire agent.-
1= Windows-verificatie. -
0= SQL Server-authenticatie. Vereist@loginen@password. De opgegeven login en het wachtwoord moeten geldig zijn bij elke secundaire replica.
Note
Als er aangepaste replicatieagenten op een andere computer dan de distributeur draaien, gebruik dan Windows authentication voor de verbinding met de primaire machine, vereist Kerberos-authenticatie voor de communicatie tussen de replica-hostcomputers. Gebruik een SQL Server-login voor de verbinding met de huidige primaire functie, waarvoor geen Kerberos-authenticatie nodig is.
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-
Configureer de uitgever bij de oorspronkelijke uitgever (Node1)
Configureer de oorspronkelijke uitgever (Node1) voor externe distributie. Geef voor
@passworddezelfde waarde op als de waarde die is gebruikt toensp_adddistributorbij de distributeur werd uitgevoerd om de distributie in te stellen.exec sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'Schakel de database in voor replicatie.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Configureer de secundaire replicahost als replicatie-uitgever (Node2)
Configureer distributie op elke secundaire replicahost. Specificeer dezelfde waarde voor @password als de waarde die je gebruikt wanneer je bij de distributeur de sp_adddistributor distributie opzet.
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
Maak de database onderdeel van de beschikbaarheidsgroep en maak de luisteraar aan (Peer1)
Op de beoogde primaire replica maak je de beschikbaarheidsgroep aan met de database als liddatabase.
Maak een DNS-luisteraar aan voor de beschikbaarheidsgroep. De replicatieagent maakt verbinding met de huidige primaire replica via de luisteraar. Het volgende voorbeeld creëert een luisteraar genaamd
MyAGListername.ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Note
In het voorgaande script is informatie tussen vierkante haken (
[ ... ]) optioneel. Gebruik deze om een niet-standaard waarde voor de TCP-poort aan te geven. Voeg de haakjes niet toe.
Leid de oorspronkelijke uitgever door naar de naam van AG-luisteraar (Peer1)
Op de distributeur voor Peer1 verwijs je de oorspronkelijke uitgever door naar de naam van de AG-luisteraar.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node1',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAGListenerName,<port>';
Note
In het voorgaande script ,<port> is optioneel. Het is alleen verplicht als je niet-standaard poorten gebruikt. Sluit de hoekbeugels <>er niet bij.
Maak peer-to-peer publicatie aan (Peer1) op de oorspronkelijke uitgever - Node1
Het volgende script maakt de publicatie voor Peer1 aan.
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
Maak peer-to-peer publicatie compatibel met de beschikbaarheidsgroep (Peer1)
Op de oorspronkelijke uitgever (Node1) voer je het volgende script uit om de publicatie compatibel te maken met de beschikbaarheidsgroep:
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
In het voorgaande script ,<port> is optioneel. Het is alleen verplicht als je niet-standaard poorten gebruikt. Sluit de hoekbeugels <>er niet bij.
Nadat je de voorgaande stappen hebt voltooid, is de beschikbaarheidsgroep klaar om deel te nemen aan peer-to-peer topologie. De volgende stappen configureren een zelfstandige instantie van SQL Server (Peer2) om deel te nemen.
Configureer de distributeur en externe uitgever (Peer2)
Configureer distributie bij de distributeur.
USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '**Strong password for distributor**';Maak de distributiedatabase bij de distributeur.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Configureer Node3 als externe uitgever op distributeur Dist2.
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node3', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir2', @security_mode = 1
Configureer de uitgever (Peer2)
Configureer op Node3 de externe distributie.
exec sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'Op Node3 activeer je de database voor replicatie.
USE master;
GO
EXEC sys.sp_replicationdboption
@dbname = 'MyDBName',
@optname = 'publish',
@value = 'true';
Maak peer-to-peer publicatie aan (Peer2)
Op Node3 voer je het volgende commando uit om de peer-to-peer publicatie te maken.
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
Maak een push-abonnement aan van Peer1 naar Peer2
Deze stap maakt een push-abonnement aan van de beschikbaarheidsgroep naar de zelfstandige instantie van SQL Server.
Voer het volgende script uit op Node1. Deze stap gaat ervan uit dat Node1 de primaire replica uitvoert.
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
Maak een push-abonnement aan van Peer2 naar de availability group listener
Om een push-abonnement van Peer2 naar de availability group listener te maken, voer je het volgende commando uit op Node3.
Important
Met het volgende script wordt de naam van de availability group-listener voor de abonnee opgegeven.
@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
Configureer gekoppelde servers
Zorg ervoor dat de push-abonnees van publicaties op elke secundaire replicahost verschijnen als gekoppelde servers.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';