Delen via


SqlClient-ondersteuning voor hoge beschikbaarheid, herstel na noodgevallen

In dit artikel wordt de ondersteuning van SqlClient (toegevoegd in .NET Framework 4.5) besproken voor hoge beschikbaarheid, herstel na noodgevallen met de AlwaysOn-functies : AlwaysOn-beschikbaarheidsgroepen (AG's) en AlwaysOn-failoverclusterexemplaren (FCI's) met SQL Server 2012 of hoger.

U kunt nu een listener voor een beschikbaarheidsgroep of de naam van een FCI opgeven in de verbindingseigenschap. Als een SqlClient-toepassing is verbonden met een database waarvoor een failover wordt uitgevoerd, wordt de oorspronkelijke verbinding verbroken en moet de toepassing een nieuwe verbinding openen om door te gaan met werken na de failover.

Als u geen verbinding maakt met een AG of FCI en er meerdere IP-adressen zijn gekoppeld aan een hostnaam, wordt sqlClient opeenvolgend herhaald via alle IP-adressen die zijn gekoppeld aan DNS-vermelding. Dit kan tijdrovend zijn als het eerste IP-adres dat door de DNS-server wordt geretourneerd, niet is gebonden aan een netwerkinterfacekaart (NIC). Wanneer u een FCI of de listener van een beschikbaarheidsgroep verbindt, probeert SqlClient gelijktijdig verbindingen met alle IP-adressen tot stand te brengen. Als een verbindingspoging is geslaagd, verwijdert het stuurprogramma alle verbindingspogingen die in behandeling zijn.

Notitie

Door de time-out van de verbinding te verhogen en logica voor opnieuw proberen te implementeren, wordt de kans vergroot dat een toepassing verbinding maakt met een beschikbaarheidsgroep. Omdat een verbinding kan mislukken vanwege een failover, moet u verbindingslogica voor opnieuw proberen implementeren en een mislukte verbinding opnieuw proberen totdat deze opnieuw verbinding maakt.

De volgende verbindingseigenschappen zijn toegevoegd aan SqlClient in .NET Framework 4.5:

  • ApplicationIntent

  • MultiSubnetFailover

U kunt deze verbindingsreeks trefwoorden programmatisch wijzigen met:

Notitie

Instelling is MultiSubnetFailovertrue niet vereist voor .NET Framework-versies 4.6.1 en hoger. Dit is vereist in .NET Core en .NET 5+.

Verbinding maken met MultiSubnetFailover

Geef altijd op MultiSubnetFailover=True wanneer u verbinding maakt met de FCI of de listener van een AG. MultiSubnetFailover maakt snellere failover mogelijk voor alle AG's en of FCI's in SQL Server 2012 of hoger en vermindert de failovertijd voor AlwaysOn-topologieën met één en meerdere subnetten aanzienlijk. Tijdens een failover met meerdere subnetten probeert de client verbindingen parallel uit te voeren. Tijdens een subnetfailover probeert de client de TCP-verbinding agressief opnieuw uit te voeren.

De MultiSubnetFailover verbindingseigenschap geeft aan dat de toepassing gebruikmaakt van een AG of FCI en dat SqlClient verbinding probeert te maken met de database op het primaire SQL Server-exemplaar door verbinding te maken met alle IP-adressen. Wanneer MultiSubnetFailover=True wordt opgegeven voor een verbinding, probeert de client tcp-verbinding sneller te proberen dan de standaardintervallen van TCP-hertransmit van het besturingssysteem. Hierdoor kunt u sneller opnieuw verbinding maken na een failover van een AG of FCI, en is van toepassing op zowel AG's voor één als meerdere subnetten en FCI's.

Zie voor meer informatie over verbindingsreeks trefwoorden in SqlClientConnectionString.

MultiSubnetFailover=True Het opgeven van verbinding met iets anders dan een AG of FCI kan een negatieve invloed hebben op de prestaties en wordt niet ondersteund.

Gebruik de volgende richtlijnen om verbinding te maken met een server met behulp van een van de AlwaysOn-functies:

  • Gebruik de MultiSubnetFailover verbindingseigenschap wanneer u verbinding maakt met één subnet of meerdere subnetten. Hierdoor worden de prestaties voor beide verbeterd.

  • Als u verbinding wilt maken met een beschikbaarheidsgroep, geeft u de listener van de beschikbaarheidsgroep op als de server in uw verbindingsreeks.

  • Verbinding maken het configureren van een SQL Server-exemplaar met meer dan 64 IP-adressen leidt tot een verbindingsfout.

  • Gedrag van een toepassing die gebruikmaakt van de MultiSubnetFailover verbindingseigenschap wordt niet beïnvloed op basis van het type verificatie: SQL Server-verificatie, Kerberos-verificatie of Windows-verificatie.

  • Verhoog de waarde van het maken van een failovertijd en het verminderen van Connect Timeout nieuwe pogingen van de toepassingsverbinding.

  • Gedistribueerde transacties worden niet ondersteund.

Als alleen-lezenroutering niet van kracht is, mislukt het maken van verbinding met een secundaire replicalocatie in de volgende situaties:

  • Als de secundaire replicalocatie niet is geconfigureerd voor het accepteren van verbindingen.

  • Als een toepassing gebruikmaakt ApplicationIntent=ReadWrite (hieronder besproken) en de secundaire replicalocatie is geconfigureerd voor alleen-lezentoegang.

SqlDependency wordt niet ondersteund op secundaire replica's met het kenmerk Alleen-lezen.

Een verbinding mislukt als een primaire replica is geconfigureerd om alleen-lezenworkloads te weigeren en de verbindingsreeks bevatApplicationIntent=ReadOnly.

Upgraden naar multisubnetclusters van databasespiegeling

Er treedt een verbindingsfout (ArgumentException) op als de trefwoorden voor verbindingen MultiSubnetFailoverFailover Partner aanwezig zijn in de verbindingsreeks of als MultiSubnetFailover=True en een ander protocol dan TCP wordt gebruikt. Er treedt ook een fout (SqlException) op als MultiSubnetFailover deze wordt gebruikt en de SQL Server een reactie van een failoverpartner retourneert die aangeeft dat het deel uitmaakt van een databasespiegelingspaar.

Als u een SqlClient-toepassing bijwerkt die momenteel gebruikmaakt van databasespiegeling naar een scenario met meerdere subnetten, moet u de verbindingseigenschap verwijderen en vervangen door MultiSubnetFailoverTrue de Failover Partner servernaam in de verbindingsreeks door een listener voor een beschikbaarheidsgroep. Als een verbindingsreeks gebruikt Failover Partner enMultiSubnetFailover=True, genereert het stuurprogramma een fout. Als een verbindingsreeks echter gebruikt Failover Partner en MultiSubnetFailover=False (ofApplicationIntent=ReadWrite), gebruikt de toepassing databasespiegeling.

Het stuurprogramma retourneert een fout als databasespiegeling wordt gebruikt voor de primaire database in de beschikbaarheidsgroep en als MultiSubnetFailover=True deze wordt gebruikt in de verbindingsreeks die verbinding maakt met een primaire database in plaats van met een listener voor beschikbaarheidsgroepen.

Toepassingsintentie opgeven

Wanneer ApplicationIntent=ReadOnlyvraagt de client een leesworkload aan bij het maken van verbinding met een database met AlwaysOn. De server dwingt de intentie af tijdens de verbinding en tijdens een USE-database-instructie, maar alleen voor een alwayson-database.

Het ApplicationIntent trefwoord werkt niet met verouderde, alleen-lezen databases.

Een database kan leesworkloads voor de beoogde AlwaysOn-database toestaan of weigeren. (Dit gebeurt met de ALLOW_CONNECTIONS component van de PRIMARY_ROLESECONDARY_ROLEtransact-SQL-instructies.)

Het ApplicationIntent trefwoord wordt gebruikt om alleen-lezenroutering in te schakelen.

Alleen-lezenroutering

Alleen-lezenroutering is een functie die ervoor kan zorgen dat een alleen-lezen replica van een database beschikbaar is. Alleen-lezenroutering inschakelen:

  1. U moet verbinding maken met een alwayson-beschikbaarheidsgroep-listener.

  2. Het ApplicationIntent trefwoord verbindingsreeks moet worden ingesteld op ReadOnly.

  3. De beschikbaarheidsgroep moet worden geconfigureerd door de databasebeheerder om alleen-lezenroutering in te schakelen.

Het is mogelijk dat meerdere verbindingen die alleen-lezenroutering gebruiken, niet allemaal verbinding maken met dezelfde alleen-lezen replica. Wijzigingen in databasesynchronisatie of wijzigingen in de routeringsconfiguratie van de server kunnen leiden tot clientverbindingen met verschillende alleen-lezen replica's. Als u ervoor wilt zorgen dat alle alleen-lezenaanvragen verbinding maken met dezelfde alleen-lezenreplica, geeft u geen listener van een beschikbaarheidsgroep door aan het Data Source trefwoord verbindingsreeks. Geef in plaats daarvan de naam op van het exemplaar met het kenmerk Alleen-lezen.

Alleen-lezenroutering kan langer duren dan verbinding maken met de primaire, omdat alleen-lezenroutering eerst verbinding maakt met de primaire en vervolgens zoekt naar de best beschikbare leesbare secundaire. Als gevolg hiervan moet u uw aanmeldingstime-out verhogen.

Zie ook