SqlClient-Unterstützung für hohe Verfügbarkeit, NotfallwiederherstellungSqlClient Support for High Availability, Disaster Recovery

In diesem Thema wird die SqlClient-Unterstützung (in .NET Framework 4,5) für hohe Verfügbarkeit, Notfall Wiederherstellung (AlwaysOn-Verfügbarkeitsgruppen) erläutert.This topic discusses SqlClient support (added in .NET Framework 4.5) for high-availability, disaster recovery -- AlwaysOn Availability Groups. AlwaysOn-Verfügbarkeitsgruppen Funktion wurde SQL Server 2012 hinzugefügt.AlwaysOn Availability Groups feature was added to SQL Server 2012. Weitere Informationen zu AlwaysOn-Verfügbarkeitsgruppen finden Sie unter SQL Server-Onlinedokumentation.For more information about AlwaysOn Availability Groups, see SQL Server Books Online.

Sie können jetzt den verfügbarkeitsgruppenlistener einer Verfügbarkeits Gruppe (hohe Verfügbarkeit, Notfall Wiederherstellung) oder SQL Server 2012-Failoverclusterinstanz in der Connection-Eigenschaft angeben.You can now specify the availability group listener of a (high-availability, disaster-recovery) availability group (AG) or SQL Server 2012 Failover Cluster Instance in the connection property. Wenn eine SqlClient-Anwendung mit einer AlwaysOn-Datenbank verbunden ist, die einen Failover ausführt, ist die ursprüngliche Verbindung unterbrochen, und die Anwendung muss eine neue Verbindung öffnen, um die Arbeit nach dem Failover fortzusetzen.If a SqlClient application is connected to an AlwaysOn database that fails over, the original connection is broken and the application must open a new connection to continue work after the failover.

Wenn Sie keine Verbindung mit einem verfügbarkeitsgruppenlistener oder SQL Server 2012-Failoverclusterinstanz herstellen und mehrere IP-Adressen einem Hostnamen zugeordnet sind, durchläuft SqlClient sequenziell alle IP-Adressen, die dem DNS-Eintrag zugeordnet sind.If you are not connecting to an availability group listener or SQL Server 2012 Failover Cluster Instance, and if multiple IP addresses are associated with a hostname, SqlClient will iterate sequentially through all IP addresses associated with DNS entry. Dies kann zeitaufwändig sein, wenn die erste IP-Adresse, die vom DNS-Server zurückgegeben wird, an keine Netzwerkschnittstellenkarte (NIC) gebunden ist.This can be time consuming if the first IP address returned by DNS server is not bound to any network interface card (NIC). Beim Herstellen einer Verbindung mit einem verfügbarkeitsgruppenlistener oder einer SQL Server 2012-Failoverclusterinstanz wird von SqlClient versucht, Verbindungen mit allen IP-Adressen parallel herzustellen. Wenn ein Verbindungsversuch erfolgreich ist, verwirft der Treiber alle ausstehenden Verbindungen. unternommen.When connecting to an availability group listener or SQL Server 2012 Failover Cluster Instance, SqlClient attempts to establish connections to all IP addresses in parallel and if a connection attempt succeeds, the driver will discard any pending connection attempts.

Hinweis

Ein höheres Verbindungstimeout und das Implementieren einer Logik für die Verbindungswiederholung erhöht die Wahrscheinlichkeit, dass eine Anwendung eine Verbindung mit einer Verfügbarkeitsgruppe herstellt.Increasing connection timeout and implementing connection retry logic will increase the probability that an application will connect to an availability group. Da eine Verbindung aufgrund eines Failovers fehlschlagen kann, sollte auch eine Logik für Verbindungswiederholungen implementiert werden, die bis zur erfolgreichen Verbindung Verbindungswiederholungen durchführt.Also, because a connection can fail because of a failover, you should implement connection retry logic, retrying a failed connection until it reconnects.

Die folgenden Verbindungs Eigenschaften wurden SqlClient in .NET Framework 4,5 hinzugefügt:The following connection properties were added to SqlClient in .NET Framework 4.5:

  • ApplicationIntent

  • MultiSubnetFailover

Sie können diese Schlüsselwörter für Verbindungszeichenfolgen programmgesteuert ändern:You can programmatically modify these connection string keywords with:

  1. ApplicationIntent

  2. MultiSubnetFailover

Hinweis

Das MultiSubnetFailover festlegen true von auf ist für .NET Framework 4.6.1 oder höhere Versionen nicht erforderlich.Setting MultiSubnetFailover to true isn't required with .NET Framework 4.6.1 or later versions.

Verbinden mit MultiSubnetFailoverConnecting With MultiSubnetFailover

Geben MultiSubnetFailover=True Sie immer an, wenn Sie eine Verbindung mit einem 2012 SQL Server verfügbarkeitsgruppenlistener oder einer SQL Server 2012-FailoverclusterAlways specify MultiSubnetFailover=True when connecting to a SQL Server 2012 availability group listener or SQL Server 2012 Failover Cluster Instance. MultiSubnetFailoverermöglicht ein schnelleres Failover für alle Verfügbarkeits Gruppen und oder Failoverclusterinstanzen in SQL Server 2012 und reduziert die Failoverzeit für einzelne und multisubnetz-AlwaysOn-Topologien erheblich.MultiSubnetFailover enables faster failover for all Availability Groups and or Failover Cluster Instance in SQL Server 2012 and will significantly reduce failover time for single and multi-subnet AlwaysOn topologies. Während eines Multisubnetzfailovers versucht der Client parallel, Verbindungen herzustellen.During a multi-subnet failover, the client will attempt connections in parallel. Während eines Subnetzfailovers wird die Herstellung der TCP-Verbindung aggressiv neu versucht.During a subnet failover, will aggressively retry the TCP connection.

Die MultiSubnetFailover -Verbindungs Eigenschaft gibt an, dass die Anwendung in einer Verfügbarkeits Gruppe oder SQL Server 2012-Failoverclusterinstanz bereitgestellt wird und dass SqlClient versucht, eine Verbindung mit der Datenbank auf der primären SQL Server Instanz herzustellen. Stellen Sie eine Verbindung mit allen IP-Adressen her.The MultiSubnetFailover connection property indicates that the application is being deployed in an availability group or SQL Server 2012 Failover Cluster Instance and that SqlClient will try to connect to the database on the primary SQL Server instance by trying to connect to all the IP addresses. Wenn MultiSubnetFailover=True für eine Verbindung angegeben wird, versucht der Client, TCP-Verbindungen schneller wiederherzustellen, als in den standardmäßigen TCP-Neuverbindungsintervallen des Betriebssystems angegeben.When MultiSubnetFailover=True is specified for a connection, the client retries TCP connection attempts faster than the operating system’s default TCP retransmit intervals. Dies ermöglicht die schnellere Wiederverbindung nach einem Failover einer AlwaysOn-Verfügbarkeitsgruppe oder einer AlwaysOn-Failoverclusterinstanz und ist auf Verfügbarkeitsgruppen und Failoverclusterinstanzen mit einem oder mehreren Subnetzen anwendbar.This enables faster reconnection after failover of either an AlwaysOn Availability Group or an AlwaysOn Failover Cluster Instance, and is applicable to both single- and multi-subnet Availability Groups and Failover Cluster Instances.

Weitere Informationen über Schlüsselwörter für Verbindungszeichenfolgen in SqlClient finden Sie unter ConnectionString.For more information about connection string keywords in SqlClient, see ConnectionString.

Wenn MultiSubnetFailover=True Sie angeben, dass eine Verbindung mit einem anderen als einem verfügbarkeitsgruppenlistener oder SQL Server 2012-Failoverclusterinstanz hergestellt werden kann, kann dies zu negativen Auswirkungen auf die Leistung führen.Specifying MultiSubnetFailover=True when connecting to something other than a availability group listener or SQL Server 2012 Failover Cluster Instance may result in a negative performance impact, and is not supported.

Verwenden Sie die folgenden Richtlinien zum Herstellen einer Verbindung mit einem Server in einer Verfügbarkeits Gruppe oder SQL Server 2012-Failoverclusterinstanz:Use the following guidelines to connect to a server in an availability group or SQL Server 2012 Failover Cluster Instance:

  • Verwenden Sie die MultiSubnetFailover-Verbindungseigenschaft beim Herstellen der Verbindung mit einem einzelnen oder mehreren Subnetzen. Die Leistung wird in beiden Fällen gesteigert.Use the MultiSubnetFailover connection property when connecting to a single subnet or multi-subnet; it will improve performance for both.

  • Um eine Verbindung mit einer Verfügbarkeitsgruppe herzustellen, geben Sie den Verfügbarkeitsgruppenlistener der Verfügbarkeitsgruppe als Server in der Verbindungszeichenfolge an.To connect to an availability group, specify the availability group listener of the availability group as the server in your connection string.

  • Das Herstellen einer Verbindung mit einer SQL Server-Instanz, die mit mehr als 64 IP-Adressen konfiguriert ist, verursacht einen VerbindungsfehlerConnecting to a SQL Server instance configured with more than 64 IP addresses will cause a connection failure.

  • Das Verhalten einer Anwendung, die die MultiSubnetFailover -Verbindungs Eigenschaft verwendet, wird nicht vom Authentifizierungstyp beeinflusst: SQL Server-Authentifizierung, Kerberos-Authentifizierung oder Windows-Authentifizierung.Behavior of an application that uses the MultiSubnetFailover connection property is not affected based on the type of authentication: SQL Server Authentication, Kerberos Authentication, or Windows Authentication.

  • Erhöhen Sie den Wert von Connect Timeout, um die Failoverzeit anzupassen und die Wiederholungsversuche für die Verbindung mit der Anwendung zu verringern.Increase the value of Connect Timeout to accommodate for failover time and reduce application connection retry attempts.

  • Verteilte Transaktionen werden nicht unterstützt.Distributed transactions are not supported.

Wenn das schreibgeschützte Routing nicht aktiviert ist, schlägt die Verbindung mit dem Speicherort eines sekundären Replikats in folgenden Situationen fehl:If read-only routing is not in effect, connecting to a secondary replica location will fail in the following situations:

  1. Wenn der Speicherort des sekundären Replikats keine Verbindungen akzeptiert.If the secondary replica location is not configured to accept connections.

  2. Wenn eine Anwendung ApplicationIntent=ReadWrite (unten erläutert) verwendet und der Speicherort des sekundären Replikats für den schreibgeschützten Zugriff konfiguriert ist.If an application uses ApplicationIntent=ReadWrite (discussed below) and the secondary replica location is configured for read-only access.

SqlDependency wird für schreibgeschützte sekundäre Replikate nicht unterstützt.SqlDependency is not supported on read-only secondary replicas.

Ein Verbindungsfehler tritt auf, wenn ein primäres Replikat so konfiguriert ist, dass schreibgeschützte Arbeitslasten abgelehnt werden und die Verbindungszeichenfolge ApplicationIntent=ReadOnly enthält.A connection will fail if a primary replica is configured to reject read-only workloads and the connection string contains ApplicationIntent=ReadOnly.

Upgrade von der Datenbankspiegelung auf die Verwendung von Multisubnetz-ClusternUpgrading to Use Multi-Subnet Clusters from Database Mirroring

Ein Verbindungsfehler (ArgumentException) tritt auf, wenn die Verbindungsschlüsselwörter MultiSubnetFailover und Failover Partner in der Verbindungszeichenfolge vorhanden sind oder wenn MultiSubnetFailover=True und ein anderes Protokoll als TCP verwendet werden.A connection error (ArgumentException) will occur if the MultiSubnetFailover and Failover Partner connection keywords are present in the connection string, or if MultiSubnetFailover=True and a protocol other than TCP is used. Ein Fehler (SqlException) tritt auch auf, MultiSubnetFailover wenn verwendet wird und das SQL Server eine failoverpartnerantwort zurückgibt, die angibt, dass es Teil eines Daten Bank Spiegelungs Paars ist.An error (SqlException) will also occur if MultiSubnetFailover is used and the SQL Server returns a failover partner response indicating it is part of a database mirroring pair.

Wenn Sie eine SqlClient-Anwendung, die aktuell die Datenbankspiegelung verwendet, auf ein Multisubnetz-Szenario aktualisieren, sollten Sie die Failover Partner-Verbindungseigenschaft entfernen und durch MultiSubnetFailover = True ersetzen und anstelle des Servernamens in der Verbindungszeichenfolge einen Verfügbarkeitsgruppenlistener verwenden.If you upgrade a SqlClient application that currently uses database mirroring to a multi-subnet scenario, you should remove the Failover Partner connection property and replace it with MultiSubnetFailover set to True and replace the server name in the connection string with an availability group listener. Wenn eine Verbindungszeichenfolge Failover Partner und MultiSubnetFailover=True verwendet, generiert der Treiber einen Fehler.If a connection string uses Failover Partner and MultiSubnetFailover=True, the driver will generate an error. Wenn jedoch eine Verbindungszeichenfolge Failover Partner und MultiSubnetFailover=False (oder ApplicationIntent=ReadWrite) verwendet, unterliegt die Anwendung der Datenbankspiegelung.However, if a connection string uses Failover Partner and MultiSubnetFailover=False (or ApplicationIntent=ReadWrite), the application will use database mirroring.

Der Treiber gibt einen Fehler zurück, wenn die Datenbankspiegelung auf der primären Datenbank in der Verfügbarkeitsgruppe verwendet wird und wenn MultiSubnetFailover=True in der Verbindungszeichenfolge verwendet wird, wodurch eine Verbindung mit einer primären Datenbank und nicht mit einem Verfügbarkeitsgruppenlistener hergestellt wird.The driver will return an error if database mirroring is used on the primary database in the AG, and if MultiSubnetFailover=True is used in the connection string that connects to a primary database instead of to an availability group listener.

Angeben des AnwendungszwecksSpecifying Application Intent

Bei ApplicationIntent=ReadOnly fordert der Client eine Lesearbeitslast an, wenn er eine Verbindung mit einer AlwaysOn-fähigen Datenbank herstellt.When ApplicationIntent=ReadOnly, the client requests a read workload when connecting to an AlwaysOn enabled database. Der Server erzwingt den Zweck zur Verbindungszeit und während einer USE-Datenbankanweisung, aber nur für eine AlwaysOn-fähige Datenbank.The server will enforce the intent at connection time and during a USE database statement but only to an Always On enabled database.

Das ApplicationIntent-Schlüsselwort funktioniert nicht mit schreibgeschützten Legacy-Datenbanken.The ApplicationIntent keyword does not work with legacy, read-only databases.

Eine Datenbank kann Lesearbeitslasten für die AlwaysOn-Zieldatenbank zulassen oder ablehnen.A database can allow or disallow read workloads on the targeted AlwaysOn database. (Dies erfolgt mit der ALLOW_CONNECTIONS PRIMARY_ROLE -Klausel der-Anweisung SECONDARY_ROLEund der Transact-SQL-Anweisung.)(This is done with the ALLOW_CONNECTIONS clause of the PRIMARY_ROLE and SECONDARY_ROLETransact-SQL statements.)

Das ApplicationIntent-Schlüsselwort wird verwendet, um das schreibgeschützte Routing zu aktivieren.The ApplicationIntent keyword is used to enable read-only routing.

Schreibgeschütztes RoutingRead-Only Routing

Das schreibgeschützte Routing ist eine Funktion, die die Verfügbarkeit eines schreibgeschützten Replikats einer Datenbank sicherstellt.Read-only routing is a feature that can ensure the availability of a read only replica of a database. So aktivieren Sie das schreibgeschützte RoutingTo enable read-only routing:

  1. Sie müssen eine Verbindung mit dem Verfügbarkeitsgruppenlistener einer AlwaysOn-Verfügbarkeitsgruppe herstellen.You must connect to an Always On Availability Group availability group listener.

  2. Das ApplicationIntent-Schlüsselwort der Verbindungszeichenfolge muss auf ReadOnly festgelegt werden.The ApplicationIntent connection string keyword must be set to ReadOnly.

  3. Die Verfügbarkeitsgruppe muss vom Datenbankadministrator so konfiguriert werden, dass schreibgeschütztes Routing aktiviert ist.The Availability Group must be configured by the database administrator to enable read-only routing.

Es ist möglich, dass mehrere Verbindungen, die das schreibgeschützte Routing verwenden, nicht alle eine Verbindung mit demselben schreibgeschützten Replikat herstellen.It is possible that multiple connections using read-only routing will not all connect to the same read-only replica. Änderungen in der Datenbanksynchronisierung oder Änderungen an der Routingkonfiguration des Servers können dazu führen, dass Clientverbindungen mit anderen schreibgeschützten Replikaten hergestellt werden.Changes in database synchronization or changes in the server's routing configuration can result in client connections to different read-only replicas. Um sicherzustellen, dass alle schreibgeschützten Anforderungen an dasselbe schreibgeschützte Replikat gerichtet werden, übergeben Sie keinen Verfügbarkeitsgruppenlistener an das Data Source-Schlüsselwort der Verbindungszeichenfolge.To ensure that all read-only requests connect to the same read-only replica, do not pass an availability group listener to the Data Source connection string keyword. Stattdessen geben Sie den Namen der schreibgeschützten Instanz an.Instead, specify the name of the read-only instance.

Das schreibgeschützte Routing dauert möglicherweise länger als die Verbindung mit der primären Datenbank, da zuerst eine Verbindung mit der primären Datenbank hergestellt und dann nach dem besten verfügbaren lesbaren sekundären Replikat gesucht wird.Read-only routing may take longer than connecting to the primary because read only routing first connects to the primary and then looks for the best available readable secondary. Aus diesem Grund sollten Sie das Anmeldetimeout erhöhen.Because of this, you should increase your login timeout.

Siehe auchSee also