Configurer les deux pairs dans des groupes de disponibilité
À compter de SQL Server 2019 (15.x) CU 13, une base de données appartenant à un groupe de disponibilité Always On SQL Server peut participer en tant qu’homologue dans une topologie de réplication transactionnelle d’égal à égal. Cet article explique comment configurer ce scénario avec deux pairs, chacun dans son propre groupe de disponibilité.
Les scripts de cet exemple utilisent des procédures stockées T-SQL.
Rôles et noms
Cette section décrit les rôles et les noms des différents éléments qui participent à la topologie de réplication utilisée dans cet article.
Peer1
- Node1 : réplica principal du premier groupe de disponibilité
- Node2 : réplica secondaire du premier groupe de disponibilité
- MyAG : nom du premier groupe de disponibilité
- MyDBName : base de données de Peer1. Base de données à publier
- Dist1 : serveur de distribution distant
- P2P_MyDBName : nom de la publication
- MyAGListenerName : écouteur du groupe de disponibilité
Peer2
- Node3 : réplica principal du deuxième groupe de disponibilité
- Node4 : réplica secondaire du deuxième groupe de disponibilité
- MyAG2 : nom du deuxième groupe de disponibilité
- MyDBName : base de données à publier
- Dist2 : serveur de distribution distant
- P2P_MyDBName : nom de la publication
- MyAG2ListenerName : écouteur du groupe de disponibilité
Prérequis
Quatre instances de SQL Server sur des serveurs physiques ou virtuels distincts pour héberger les groupes de disponibilité. Deux groupes de disponibilité contenant chacun une base de données de pair.
Deux instances de SQL Server pour héberger les bases de données du serveur de distribution.
Toutes les instances de serveur nécessitent une édition prise en charge : édition Entreprise ou Développeur.
Toutes les instances de serveur nécessitent une version prise en charge : SQL Server 2019 (15.x) CU13 ou version ultérieure.
Connectivité réseau et bande passante suffisantes entre toutes les instances.
Installez la réplication SQL Server sur toutes les instances de SQL Server.
Pour voir si la réplication est installée sur une instance, exécutez la requête suivante :
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;
Remarque
Pour éviter un point de défaillance unique pour la base de données de distribution, utilisez un serveur de distribution distant pour chaque pair.
Dans le cas d’un environnement de démonstration ou de test, vous pouvez configurer les bases de données de distribution sur une seule instance.
Configurer le serveur de distribution et le serveur de publication distant (Peer1)
Cette section décrit comment configurer le premier pair (Peer1) dans un groupe de disponibilité.
Exécutez
sp_adddistributor
pour configurer la distribution sur Dist1. Utilisez@password =
pour spécifier un mot de passe que le serveur de publication distant utilise pour se connecter au serveur de distribution. Utilisez ce mot de passe sur chaque serveur de publication distant quand vous configurez le serveur de distribution distant.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';
Créez la base de données de distribution sur le serveur de distribution.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;
Configurez Node1 et Node2 comme serveurs de publication distants.
@security_mode
détermine la façon dont les agents de réplication se connectent au serveur principal actuel.1
= Authentification Windows.0
= Authentification SQL Server. Nécessite@login
et@password
. La connexion et le mot de passe spécifiés doivent être valides sur chaque réplica secondaire.
Remarque
Si des agents de réplication modifiés s’exécutent sur un ordinateur autre que le serveur de distribution, l’utilisation de l’authentification Windows pour la connexion au serveur principal nécessite de configurer l’authentification Kerberos afin d’assurer la communication des ordinateurs hôtes de réplica. L’utilisation d’un compte de connexion SQL Server pour la connexion au serveur principal actuel ne nécessite pas l’authentification Kerberos.
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
Configurer le serveur de publication sur le serveur de publication d’origine (Node1)
Configurer le serveur de publication d’origine pour la distribution à distance (Node1). Spécifiez la même valeur pour
@password
que celle utilisée quandsp_adddistributor
a été exécuté sur le serveur de distribution pendant la configuration de la distribution.EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'
Activez la base de données pour la réplication.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Configurer les hôtes de réplica secondaire comme serveurs de publication de réplication (Node2)
Sur chaque hôte de réplica secondaire (Node2) du premier groupe de disponibilité, configurez la distribution. Spécifiez la même valeur pour @password
que celle utilisée quand sp_adddistributor
a été exécuté sur le serveur de distribution pendant la configuration de la distribution.
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
Intégrer la base de données au groupe de disponibilité et créer l’écouteur (Peer1)
Sur le réplica principal prévu, créez le groupe de disponibilité avec la base de données comme base de données membre.
Créez un écouteur DNS pour le groupe de disponibilité. L’agent de réplication se connecte au réplica principal actuel à l’aide de l’écouteur. L’exemple suivant crée un écouteur nommé
MyAGListenerName
.ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));
Remarque
Dans le script ci-dessus, les informations entre crochets (
[ ... ]
) sont facultatives. Utilisez-les pour spécifier une valeur non définie par défaut pour le port TCP. N’incluez pas les chevrons.
Rediriger le serveur de publication d’origine sur le nom de l’écouteur du groupe de disponibilité (Peer1)
Sur le serveur de distribution de Peer1, redirigez le serveur de publication d’origine sur le nom de l’écouteur du groupe de disponibilité.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node1',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAGListenerName,<port>';
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut. Dans ce cas, n’ajoutez pas de crochets angulaires <>
.
Créer une publication de pair à pair (Peer1) sur le serveur de publication d’origine (Node1)
Le script suivant crée la publication pour 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
Rendre compatible la publication de pair à pair avec le groupe de disponibilité (Peer1)
Sur le serveur de publication d’origine (Node1), exécutez le script suivant pour rendre la publication compatible avec le groupe de disponibilité :
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
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut.
Une fois que vous avez effectué les étapes ci-dessus, le groupe de disponibilité est prêt à participer à la topologie de pair à pair. Les étapes suivantes configurent un groupe de disponibilité distinct comme deuxième pair (Peer2) dans la topologie de réplication de pair à pair.
Configurer le serveur de distribution et le serveur de publication distant (Peer2)
Cette section décrit comment configurer le deuxième pair (Peer2) dans un groupe de disponibilité différent.
Exécutez
sp_adddistributor
pour configurer la distribution sur Dist2. Utilisez@password =
pour spécifier un mot de passe que le serveur de publication distant utilise pour se connecter au serveur de distribution. Utilisez ce mot de passe sur chaque serveur de publication distant quand vous configurez le serveur de distribution distant.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Strong password for distributor>';
Créez la base de données de distribution sur le serveur de distribution.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;
Configurez Node3 et Node4 comme serveurs de publication distants.
@security_mode
détermine la façon dont les agents de réplication se connectent au serveur principal actuel.1
= Authentification Windows.0
= Authentification SQL Server. Nécessite@login
et@password
. La connexion et le mot de passe spécifiés doivent être valides sur chaque réplica secondaire.
Remarque
Si des agents de réplication modifiés s’exécutent sur un ordinateur autre que le serveur de distribution, l’utilisation de l’authentification Windows pour la connexion au serveur principal nécessite de configurer l’authentification Kerberos afin d’assurer la communication des ordinateurs hôtes de réplica. L’utilisation d’un compte de connexion SQL Server pour la connexion au serveur principal actuel ne nécessite pas l’authentification Kerberos.
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
Configurer le serveur de publication (Peer2)
Configurez la distribution à distance sur Node3. Spécifiez la même valeur pour
@password
que celle utilisée quandsp_adddistributor
a été exécuté sur le serveur de distribution pendant la configuration de la distribution.EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'
Activez la base de données pour la réplication.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Configurer l’hôte de réplica secondaire comme serveur de publication de réplication (Node4)
Sur chaque hôte de réplica secondaire (Node4) du deuxième groupe de disponibilité, configurez la distribution. Spécifiez la même valeur pour @password
que celle utilisée quand sp_adddistributor
a été exécuté sur le serveur de distribution pendant la configuration de la distribution.
EXEC sys.sp_adddistributor
@distributor = 'Dist2',
@password = '<Password used when running sp_adddistributor on distributor server>'
Intégrer la base de données au groupe de disponibilité et créer l’écouteur (Peer2)
Sur le réplica principal prévu, créez le groupe de disponibilité avec la base de données comme base de données membre.
Créez un écouteur DNS pour le groupe de disponibilité. L’agent de réplication se connecte au réplica principal actuel à l’aide de l’écouteur. L’exemple suivant crée un écouteur nommé
MyAG2ListenerName
.ALTER AVAILABILITY GROUP 'MyAG2' ADD LISTENER 'MyAG2ListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));
Remarque
Dans le script ci-dessus, les informations entre crochets (
[ ... ]
) sont facultatives. Utilisez-les pour spécifier une valeur non définie par défaut pour le port TCP. N’incluez pas les chevrons.
Rediriger le serveur de publication d’origine sur le nom de l’écouteur du groupe de disponibilité (Peer2)
Sur le serveur de distribution de Peer2, redirigez le serveur de publication d’origine sur le nom de l’écouteur du groupe de disponibilité.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node3',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAG2ListenerName,<port>';
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut. Dans ce cas, n’ajoutez pas de crochets angulaires <>
.
Créer la publication de pair à pair (Peer2)
Le script suivant crée la publication pour Peer2.
Sur Node3, exécutez la commande suivante pour créer la publication de pair à pair.
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
Rendre compatible la publication de pair à pair avec le groupe de disponibilité (Peer2)
Sur le serveur de publication d’origine (Node3), exécutez le script suivant pour rendre la publication compatible avec le groupe de disponibilité :
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
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut.
Créer un abonnement par émission de données de Peer1 vers l’écouteur du groupe de disponibilité de Peer2
Pour créer un abonnement par émission de données de Peer1 vers l’écouteur du groupe de disponibilité de Peer2, exécutez la commande suivante sur Node1.
Exécutez le script suivant sur Node1. Cela suppose que Node1 exécute le réplica principal.
Important
Le script ci-dessous spécifie le nom de l’écouteur du groupe de disponibilité pour l’abonné.
@subscriber = N'MyAGListenerName,<port>'
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut. Dans ce cas, n’ajoutez pas de crochets angulaires <>
.
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
Créer un abonnement par émission de données de Peer2 vers l’écouteur du groupe de disponibilité (Peer1)
Pour créer un abonnement par émission de données de Peer2 vers l’écouteur du groupe de disponibilité (Peer1), exécutez la commande suivante sur Node3.
Important
Le script ci-dessous spécifie le nom de l’écouteur du groupe de disponibilité pour l’abonné.
@subscriber = N'MyAGListenerName,<port>'
Remarque
Dans le script ci-dessus, ,<port>
est facultatif. Vous en avez besoin seulement si vous utilisez des ports autres que ceux par défaut. Dans ce cas, n’ajoutez pas de crochets angulaires <>
.
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
Configurer les serveurs liés
Sur chaque hôte de réplica secondaire, vérifiez que les abonnés de l’abonnement par émission de données des publications de la base de données apparaissent comme des serveurs liés.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';