Database
 sql >> Base de données >  >> RDS >> Database

Routage en lecture seule pour un Always On

En tant que DBA, nous rencontrons généralement nos clients qui se plaignent que le serveur de production actuel n'est pas en mesure de supporter la charge sur le serveur et si la charge peut être équilibrée avec le serveur secondaire. Cela est possible avec une base de données dans DR Server avec une base de données en lecture seule dans Log Shipping et des réplicas SQL Server secondaires dans Always On Availability Group. Le plus grand avantage de Always On Groups est qu'il nous permet de configurer HA au niveau du groupe pour n'importe quel nombre de bases de données et nous pouvons créer jusqu'à quatre répliques secondaires. Il s'agit d'une combinaison de clustering, d'envoi de journaux et de mise en miroir de bases de données où la transmission des données est plus flexible et fonctionnel.

Always On Readable Secondary Replica dispose d'une fonctionnalité permettant de gérer des demandes de connexion en lecture seule particulières appelées Routage en lecture seule. Généralement, par défaut, la lecture et l'intention de lecture sont dirigées vers le réplica principal et rien n'est destiné aux réplicas secondaires. Désormais, les réplicas secondaires peuvent non seulement être utilisés à des fins de sauvegarde, de DBCC et de création de rapports, mais peuvent également être interrogés à l'avenir en utilisant "ReadOnly" comme intention d'application dans la chaîne de connexion de l'application.

Nous avons trois répliques SQL1, SQL2 et SQL3 dans le cluster de basculement Windows. Chaque nœud dispose d'une instance autonome de SQL Server 2012 installée et configurée avec Always On AG. Nous sommes toujours sur AG Group nommé "CODEAG" avec le nom d'auditeur "CODELIS"

Dans la capture d'écran suivante, SQL1 est un réplica principal, SQL2 est un réplica secondaire, SQL3 est un réplica secondaire.

Comment configurer la liste de routage en lecture seule dans les groupes de disponibilité permanents

Étape 1 :

Les connexions sont établies avec le groupe de disponibilité à l'aide du nom ou de l'adresse IP de l'écouteur. Maintenant, pour créer plusieurs écouteurs pour un groupe de disponibilité, veuillez suivre la procédure ci-dessous.

Pour créer ou configurer manuellement un écouteur pour un groupe de disponibilité

  1. Sous l'Explorateur d'objets, connectez-vous à l'instance qui contient le réplica principal du groupe de disponibilité.
  2. Développez le groupe AON et cliquez sur le groupe de disponibilité pour lequel nous essayons de configurer manuellement l'écouteur et continuez.
  3. Cliquez avec le bouton droit sur le nœud des écouteurs du groupe de disponibilité et sélectionnez Nouvelle commande d'écouteur. Cela ouvre une nouvelle boîte de dialogue pour configurer un écouteur.
  4. Le numéro de port d'un écouteur existant peut être modifié en développant le nœud d'écouteurs du groupe de disponibilité, puis en cliquant avec le bouton droit sur les écouteurs et en sélectionnant les propriétés.
  5. Maintenant, saisissez le nouveau numéro de port et cliquez sur OK.

Identifiez le nom de l'écouteur configuré pour la réplication Always On en interrogeant DMV comme ci-dessous.

SELECT AV.name AS AVGName
, AVGLis.dns_name AS ListenerName
, AVGLis.ip_configuration_string_from_cluster AS ListenerIP
FROM sys.availability_group_listeners AVGLis
INNER JOIN sys.availability_groups AV on AV.group_id = AV.group_id

Dans la capture d'écran suivante, le nom du groupe AG est CODEAG et l'IP de l'auditeur AG est CODELIS.

Étape 2 :

Pour configurer le routage en lecture seule, nous devons configurer les répliques en lecture seule pour autoriser les connexions en lecture seule aux répliques secondaires.

  1. Connectez-vous à l'instance qui contient le réplica principal.
  2. Développez le nœud de haute disponibilité AON, puis le nœud de groupe AG.
  3. Cliquez sur le groupe AG dont le réplica doit être modifié.
  4. Cliquez avec le bouton droit sur le réplica et sélectionnez les propriétés pour modifier l'accès à la connexion pour les rôles principal et secondaire comme suit.

Le rôle secondaire a une nouvelle valeur dans la liste déroulante secondaire lisible.

Intention de lecture uniquement

Cette option permet un accès en lecture aux bases de données secondaires de cette réplique. Seules les connexions en lecture seule sont autorisées.

Oui

Cette option permet un accès en lecture uniquement mais toutes les connexions sont autorisées pour le réplica secondaire.

Non

Cela arrête toutes les connexions utilisateur au réplica secondaire et ne vous permet même pas de lire.

Définissez les propriétés secondaires lisibles sur Intention de lecture uniquement.

Dans la capture d'écran suivante, les propriétés Readable Secondary de chaque réplica secondaire sont définies sur Read-intent only.

Étape 3 :

Chaque réplica secondaire lisible peut se voir attribuer une URL de routage en lecture seule qui sera utilisée pour acheminer les demandes de connexion d'intention de lecture vers un réplica secondaire lisible spécifique.

Utilisez T-SQL pour spécifier une URL de routage en lecture seule pour tous les réplicas de notre groupe de disponibilité.

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL1.abc.com:17999'));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));


ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL2.abc.com:17999'));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL3.abc.com:17999'));

Étape 4 :

Pour le réplica que nous marquons comme routage en lecture seule lorsqu'il s'agit du réplica principal, il est nécessaire de spécifier une liste de routage en lecture seule et cela n'est effectué que lorsque le réplica local s'exécute sous le rôle principal.

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL3')));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL1')));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL3','SQL1')));

Dans le script ci-dessus, l'exemple où SQL1 est le réplica principal, la charge de travail d'intention de lecture seule sera redirigée vers les réplicas secondaires lisibles ; SQL2 et SQL3 respectivement :de la même manière, si SQL3 est le réplica principal, la charge de travail en lecture seule sera redirigée vers les réplicas secondaires lisibles ; le SQL2 et le SQL1 respectivement.

Le trafic dirigé en lecture seule sera acheminé vers le premier réplica disponible jusqu'à et à moins qu'il ne soit pas accessible, il dirigera le trafic vers le prochain réplica disponible dans la liste de routage. Lorsque vous avez plusieurs répliques, il n'est pas possible de partager la charge entre les répliques jusqu'à SQL Server 2012 et 2014. Cependant, SQL Server 2016 vous permet d'équilibrer la charge entre les répliques en lecture seule.

Exemple :

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL3','SQL1'), ‘SQL2’)));

Ce comportement de liste de routage "équilibre la charge" des connexions en lecture seule entre SQL3 et SQL1. Ci-dessus, nous avons deux listes intégrées dans la liste de routage :

Liste 1 :'SQL3', 'SQL1'

Liste 2 :‘SQL2’

Acheminez vers les répliques de la première liste. SQL3 et SQL1 sont accessibles aux connexions en lecture seule. La première connexion entrante en lecture seule sera acheminée vers SQL3, la deuxième connexion en lecture seule sera acheminée vers SQL1, la troisième connexion en lecture seule sera acheminée vers SQL3, la quatrième connexion en lecture seule sera acheminée vers SQL1, et ainsi de suite, avec une distribution "round-robin" des connexions en lecture seule entre les deux répliques de la première liste.

Si des répliques deviennent indisponibles, le routage se poursuivra avec les répliques restantes dans la première liste. Si SQL3 ou SQL1 devient inaccessible aux connexions en lecture seule, les connexions en lecture seule ne seront acheminées que vers les répliques accessibles en lecture seule de la première liste. Par exemple, si SQL3 est dans un état non synchronisé ou ALLOW_CONNECTIONS est défini sur NO, toutes les connexions en lecture seule seront routées vers SQL1. Tant que l'un des serveurs est disponible pour les connexions en lecture seule, AUCUNE connexion en lecture seule ne sera acheminée vers SQL2.

Si toutes les répliques de la première liste sont inaccessibles, acheminer vers les répliques dans la liste suivante. Si SQL3 et SQL1 deviennent inaccessibles aux connexions en lecture seule, toutes les connexions en lecture seule ne seront acheminées que vers la liste suivante de répliques, qui dans ce cas est SQL2.

Reprendre le routage vers la première liste si des répliques deviennent disponibles. Au fur et à mesure que les répliques secondaires qui ont une priorité plus élevée dans la liste deviennent accessibles aux connexions en lecture seule, les futures connexions en lecture seule s'y connecteront le cas échéant.

Dans SQL Server 2016, vous pouvez configurer l'équilibrage de charge sur un ensemble de réplicas en lecture seule.

Étape 5 :

sys.availability_read_only_routing_lists DMV, qui renvoie la liste de routage en lecture seule de chaque réplica de groupe de disponibilité dans le groupe de disponibilité Always On.

SELECT   AVGSrc.replica_server_name AS SourceReplica 
, AVGRepl.replica_server_name AS ReadOnlyReplica
, AVGRepl.read_only_routing_url AS RoutingURL
, AVGRL.routing_priority AS RoutingPriority
FROM sys.availability_read_only_routing_lists AVGRL
INNER JOIN sys.availability_replicas AVGSrc ON AVGRL.replica_id = AVGSrc.replica_id
INNER JOIN sys.availability_replicas AVGRepl ON AVGRL.read_only_replica_id = AVGRepl.replica_id
INNER JOIN sys.availability_groups AV ON AV.group_id = AVGSrc.group_id
ORDER BY SourceReplica

Dans la capture d'écran suivante, le résultat affiche l'URL de routage et la priorité de routage.

Étape 6 :

Pour tester le routage en lecture seule à l'aide de SQLCMD, utilisez le paramètre –K ReadOnly qui affiche le réplica secondaire recevant des connexions en lecture conformément à la liste de routage.

Dans la capture d'écran suivante, le réplica secondaire accepte les connexions de lecture, c'est-à-dire… SQL2.

Étape 7 :

Basculez le groupe de disponibilité et testez le routage en lecture seule.

  1. Dans l'Explorateur d'objets, connectez-vous à une instance de serveur qui héberge un réplica secondaire du groupe de disponibilité qui doit être basculé. Développez l'arborescence des serveurs.
  2. Développez le nœud Haute disponibilité AlwaysOn et le nœud Groupes de disponibilité.
  3. Cliquez avec le bouton droit sur le groupe de disponibilité à basculer et sélectionnez Basculement.

Désormais, SQL2 devient le réplica principal et les connexions sont gérées par SQL1.

La syntaxe de la chaîne de connexion que l'application doit utiliser dépend du fournisseur SQL Server.

S'il s'agit de .Net Framework Data Provider 4.0.2 pour SQL Server, la syntaxe sera la suivante :

Server=tcp:MyAgListener,portnumber;Database=SQL1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True

Conclusion :

Pour faire baisser les charges de travail, ce routage en lecture seule reste la meilleure option. Une application impliquant SQL Server Reporting Services hébergé dans SharePoint ou l'installation en mode natif de Report Server peut utiliser l'intention de lecture seule qui évite le blocage typique, la mémoire et l'utilisation du processeur sur les nœuds principaux.