sql >> Database >  >> RDS >> Database

Alleen-lezen routering voor een Always On

Als DBA's komen we over het algemeen onze klanten tegen die klagen dat de huidige productieserver de belasting van de server niet kan vasthouden en of de belasting in evenwicht is met de secundaire server. Dit is mogelijk met een database in DR Server met alleen-lezen database in Logboekverzending en secundaire SQL Server-replica's in AlwaysOn-beschikbaarheidsgroep. Het grootste voordeel van Always On Groups is dat het ons in staat stelt om HA op groepsniveau in te stellen voor een willekeurig aantal databases en we kunnen maximaal vier secundaire replica's maken en dit is een combinatie van Clustering, Log Shipping en Database Mirroring waarbij de gegevensoverdracht plaatsvindt. flexibeler en functioneler.

Always On Readable Secondary Replica heeft een functie voor het afhandelen van bepaalde alleen-lezen verbindingsverzoeken, genaamd alleen-lezen routering. Over het algemeen worden zowel de lees- als de leesintentie standaard doorgestuurd naar de primaire replica en is er niets bedoeld voor de secundaire replica's. Nu kunnen de secundaire replica's niet alleen worden gebruikt voor back-up-, DBCC- en rapportagedoeleinden, maar kunnen ze in de toekomst ook worden opgevraagd door 'ReadOnly' te gebruiken als hun toepassingsintentie in de verbindingsreeks van de toepassing.

We hebben drie replica's SQL1, SQL2 en SQL3 in het Windows-failovercluster. Op elk knooppunt is een zelfstandig exemplaar van SQL Server 2012 geïnstalleerd en geconfigureerd met Always On AG. We zijn altijd op AG Group met de naam "CODEAG" met de luisteraarnaam "CODELIS"

In de volgende schermafbeelding is SQL1 een primaire replica, SQL2 is een secundaire replica en SQL3 is een secundaire replica.

Alleen-lezen routeringslijst configureren in altijd op beschikbaarheidsgroepen

Stap1:

Verbindingen worden gemaakt met de beschikbaarheidsgroep met behulp van de naam van de luisteraar of het IP-adres. Als u nu meerdere luisteraars voor één beschikbaarheidsgroep wilt maken, volgt u de onderstaande procedure.

Handmatig een listener maken of configureren voor een beschikbaarheidsgroep

  1. Maak onder Objectverkenner verbinding met de instantie die de primaire replica van de beschikbaarheidsgroep bevat.
  2. Breid de AON-groep uit en klik op de beschikbaarheidsgroep waarvoor we de luisteraar handmatig proberen te configureren en ga verder.
  3. Klik met de rechtermuisknop op het knooppunt voor beschikbaarheidsgroepluisteraars en selecteer Nieuwe luisteraaropdracht. Dit opent een nieuw dialoogvenster voor het configureren van een luisteraar.
  4. Poortnummer van een bestaande listener kan worden gewijzigd door het knooppunt voor beschikbaarheidsgroep-luisteraars uit te vouwen, gevolgd door met de rechtermuisknop op de luisteraars te klikken en de eigenschappen te selecteren.
  5. Voer nu het nieuwe poortnummer in en klik op OK.

Identificeer de naam van de luisteraar die is geconfigureerd voor Always On-replicatie door DMV op te vragen zoals hieronder.

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

In de volgende schermafbeelding is de naam van de AG-groep CODEAG en is het IP-adres van de luisteraar van AG CODELIS.

Stap 2:

Om alleen-lezen routering te configureren, moeten we de replica's configureren voor alleen-lezen om alleen-lezen verbindingen met secundaire replica's toe te staan.

  1. Maak verbinding met de instantie die de primaire replica bevat.
  2. Breid de AON High Availability Node uit en daarna de AG Group Node.
  3. Klik op de AG-groep waarvan de replica moet worden gewijzigd.
  4. Klik met de rechtermuisknop op de replica en selecteer eigenschappen om de verbindingstoegang voor de primaire en secundaire rollen als volgt te wijzigen.

De secundaire rol heeft een nieuwe waarde uit de leesbare secundaire vervolgkeuzelijst.

Alleen leesintentie

Deze optie geeft leestoegang tot de secundaire data bases van deze replica. Alleen alleen-lezen verbindingen zijn toegestaan.

Ja

Met deze optie is alleen leestoegang mogelijk, maar alle verbindingen zijn toegestaan ​​voor de secundaire replica.

Nee

Dit stopt alle gebruikersverbindingen met de secundaire replica en staat u zelfs niet toe om te lezen.

Stel de leesbare secundaire eigenschappen in op Alleen leesintentie.

In de volgende schermafbeelding zijn de leesbare secundaire eigenschappen van elke secundaire replica ingesteld op alleen leesintentie.

Stap 3:

Aan elke leesbare secundaire replica kan een alleen-lezen routerings-URL worden toegewezen die wordt gebruikt voor het routeren van verbindingsverzoeken met leesintentie naar een specifieke leesbare secundaire replica.

Gebruik T-SQL om een ​​alleen-lezen routerings-URL op te geven voor alle replica's in onze beschikbaarheidsgroep.

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'));

Stap 4:

Voor de replica die we markeren als alleen-lezen routering wanneer het de primaire replica is, is het nodig om een ​​alleen-lezen routeringslijst op te geven en dit wordt alleen uitgevoerd wanneer de lokale replica wordt uitgevoerd onder de primaire rol.

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')));

In het bovenstaande script, het voorbeeld waarin SQL1 de primaire replica is, wordt de werkbelasting met alleen leesintentie omgeleid naar de leesbare secundaire replica's; respectievelijk de SQL2 en SQL3:op dezelfde manier, als SQL3 de primaire replica is, wordt de werkbelasting met alleen leesintentie omgeleid naar de leesbare secundaire replica's; de SQL2 en SQL1 respectievelijk.

Alleen-lezen gericht verkeer wordt omgeleid naar de eerste beschikbare replica totdat en tenzij het niet toegankelijk is, het verkeer naar de volgende beschikbare replica in de routeringslijst leidt. Als u meer dan één replica hebt, is het niet mogelijk om de belasting tussen replica's te delen tot SQL Server 2012 en 2014. Maar met SQL Server 2016 kunt u de belasting verdelen over alleen-lezen replica's.

Voorbeeld:

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

Dit gedrag van de routeringslijst 'load balances' alleen-lezen verbindingen tussen SQL3 en SQL1. Hierboven hebben we twee ingesloten lijsten in de routelijst:

Lijst 1:‘SQL3’, ‘SQL1’

Lijst 2:‘SQL2’

Route naar de replica's in de eerste lijst. SQL3 en SQL1 zijn toegankelijk voor alleen-lezen verbindingen. De eerste inkomende alleen-lezen verbinding wordt gerouteerd naar SQL3, de tweede alleen-lezen verbinding wordt gerouteerd naar SQL1, de derde alleen-lezen verbinding wordt gerouteerd naar SQL3, de vierde alleen-lezen verbinding wordt gerouteerd naar SQL1 en enzovoort, met een 'round-robin'-distributie van alleen-lezen verbindingen tussen de twee replica's in de eerste lijst.

Als er replica's niet meer beschikbaar zijn, gaat de routering verder met de resterende replica's in de eerste lijst. Als SQL3 of SQL1 ontoegankelijk wordt voor alleen-lezen verbindingen, worden de alleen-lezen verbindingen alleen doorgestuurd naar de toegankelijke alleen-lezen replica's in de eerste lijst. Als SQL3 bijvoorbeeld niet gesynchroniseerd is of ALLOW_CONNECTIONS is ingesteld op NO, worden alle alleen-lezen verbindingen doorgestuurd naar SQL1. Zolang een van de servers beschikbaar is voor alleen-lezen verbindingen, worden GEEN alleen-lezen verbindingen doorgestuurd naar SQL2.

Als alle replica's in de eerste lijst ontoegankelijk zijn, route naar replica's in volgende lijst. Als SQL3 en SQL1 ontoegankelijk worden voor alleen-lezen verbindingen, worden alle alleen-lezen verbindingen alleen doorgestuurd naar de volgende lijst met replica's, in dit geval SQL2.

Hervat de routering naar de eerste lijst als er replica's beschikbaar komen. Naarmate secundaire replica's met een hogere prioriteit in de lijst toegankelijk worden voor alleen-lezen-verbindingen, zullen toekomstige alleen-lezen-verbindingen daar waar nodig verbinding mee maken.

In SQL Server 2016 kunt u taakverdeling configureren voor een set alleen-lezen replica's.

Stap 5:

sys.availability_read_only_routing_lists DMV, die de alleen-lezen-routeringslijst retourneert van elke replica van de beschikbaarheidsgroep in de Always On-beschikbaarheidsgroep.

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

In de volgende schermafbeelding toont het resultaat de routerings-URL en de routeringsprioriteit.

Stap 6:

Als u alleen-lezen routering wilt testen met SQLCMD, gebruikt u de parameter –K ReadOnly die secundaire replica-ontvangst-leesverbindingen toont volgens de routeringslijst.

In de volgende schermafbeelding accepteert de secundaire replica de leesverbindingen, d.w.z. SQL2.

Stap 7:

Failover voor de beschikbaarheidsgroep en test alleen-lezen routering.

  1. Maak in Object Explorer verbinding met een serverinstantie die als host fungeert voor een secundaire replica van de beschikbaarheidsgroep waarvoor een failover moet worden uitgevoerd. Vouw de serverstructuur uit.
  2. Breid het knooppunt AlwaysOn High Availability en het knooppunt Beschikbaarheidsgroepen uit.
  3. Klik met de rechtermuisknop op de beschikbaarheidsgroep waarvoor een failover moet worden uitgevoerd en selecteer Failover.

Nu wordt de SQL2 de primaire replica en worden verbindingen afgehandeld door SQL1.

De Connection String-syntaxis die de toepassing moet gebruiken, is afhankelijk van de SQL Server Provider.

Als het .Net Framework Data Provider 4.0.2 voor SQL Server is, is de syntaxis als volgt:

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

Conclusie:

Om de workloads naar beneden te halen, blijft deze alleen-lezen routering de beste optie. Een toepassing met SQL Server Reporting Services die wordt gehost in SharePoint of de Native Mode-installatie van Report Server kan alleen-lezen-intentie gebruiken die typische blokkering, geheugen- en CPU-gebruik op primaire knooppunten vermijdt.


  1. Illegale mix van sorteerfouten in MySql

  2. Beter ALTER dan DROP

  3. Parameters doorgeven aan een JDBC PreparedStatement

  4. .NET Core 2.1 Identity krijgt alle gebruikers met hun bijbehorende rollen