Petite question que je me posais aujourd’hui vu qu’en ce moment je travaille souvent sur des environnements haute disponibilité avec SQL Server 2012 et AlwaysOn. Est-il possible de créer un serveur lié qui se connecte sur un réplica secondaire en lecture et profiter du coup d’une redirection transparente en cas de changement de rôle de réplica lors d’un basculement automatique par exemple ?
Le meilleur moyen de le savoir est de faire un test.
Créons tout d’abord un serveur lié en utilisant le provider SQL Server Native Client 11.0 pour pouvoir utiliser le paramètre de connexion applicationintent=readonly. Le script de création du serveur lié est le suivant :
@server = N'LST_APPLIX',
@srvproduct=N'',
@provider=N'SQLNCLI', -- Provider SQL Native Client
@datasrc=N'LST_APPLIX', -- Availability group listener
@provstr=N'applicationintent=readonly', -- Readonly intent parameter
@catalog=N'ApplixEnterprise' --Target database to connect
Mon groupe de disponibilité est composé de 3 réplicas avec :
- REPLICA1 (réplica primaire)
- REPLICA2 (réplica secondaire en lecture seule utilisé en priorité)
- REPLICA3 (réplica secondaire en lecture seule utilisé si REPLICA2 n’est plus joignable)
Mon serveur lié est quant à lui configuré sur un serveur standalone à part.
La requête suivante illustre l’état de note scénario :
g.name AS group_name,
r.replica_server_name,
rs.role_desc,
rs.operational_state_desc,
ro.replica_server_name AS replica_ro_server_name,
rol.routing_priority,
r.secondary_role_allow_connections_desc
FROM sys.dm_hadr_availability_replica_states AS rs
JOIN sys.availability_groups AS g
ON rs.group_id = g.group_id
JOIN sys.availability_replicas AS r
ON r.replica_id = rs.replica_id
AND r.group_id = rs.group_id
JOIN sys.availability_read_only_routing_lists rol
ON rol.replica_id = r.replica_id
JOIN sys.availability_replicas AS ro
ON ro.replica_id = rol.read_only_replica_id
WHERE g.name = 'ApplixGrp'
AND r.replica_server_name = 'REPLICA1'
Tentons de retrouver le serveur sur lequel le serveur lié pointe :
FROM OPENQUERY(LST_APPLIX, 'SELECT @@SERVERNAME AS SERVER_NAME');
qui donne
Ok visiblement cela fonctionne. En utilisant le listener la requête est automatiquement redirigée vers le REPLICA2 comme le stipule notre configuration.
On lance maintenant un basculement manuel de groupe de disponibilité ApplixGrp de REPLICA1 vers REPLICA2. REPLICA2 devient donc le nouveau primaire.REPLICA1 et REPLICA3 deviennent les réplicas secondaires. On exécute à nouveau nos requêtes :
g.name AS group_name,
r.replica_server_name,
rs.role_desc,
rs.operational_state_desc,
ro.replica_server_name AS replica_ro_server_name,
rol.routing_priority,
r.secondary_role_allow_connections_desc
FROM sys.dm_hadr_availability_replica_states AS rs
JOIN sys.availability_groups AS g
ON rs.group_id = g.group_id
JOIN sys.availability_replicas AS r
ON r.replica_id = rs.replica_id
AND r.group_id = rs.group_id
JOIN sys.availability_read_only_routing_lists rol
ON rol.replica_id = r.replica_id
JOIN sys.availability_replicas AS ro
ON ro.replica_id = rol.read_only_replica_id
WHERE g.name = 'ApplixGrp'
AND r.replica_server_name = 'REPLICA2'
et
FROM OPENQUERY(LST_APPLIX, 'SELECT @@SERVERNAME AS SERVER_NAME');
qui donne
Comme on peut le voir l’utilisation d’un serveur lié vers une architecture SQL Server 2012 AlwaysOn avec une redirection des connexions en lecture seule vers les réplicas secondaires fonctionne très bien !
Bon paramétrage de serveurs liés