Поддержка SqlClient для высокого уровня доступности, аварийного восстановления

В этой статье рассматривается поддержка SqlClient (добавленная в платформа .NET Framework 4.5) для обеспечения высокой доступности, аварийного восстановления с функциями AlwaysOn — группы доступности AlwaysOn (AG) и экземпляры отказоустойчивого кластера AlwaysOn с SQL Server 2012 или более поздней версии.

Теперь можно указать прослушиватель группы доступности или имя FCI в свойстве подключения. Если приложение SqlClient подключено к базе данных, которая выполняет отработку отказа, исходное соединение будет нарушено, и приложение должно открыть новое подключение, чтобы продолжить работу после отработки отказа.

Если вы не подключаетесь к группе доступности или FCI, а если несколько IP-адресов связаны с именем узла, SqlClient будет последовательно выполнять итерацию по всем IP-адресам, связанным с записью DNS. Это может занять много времени, если первый IP-адрес, возвращенный DNS-сервером, не привязан ни к одной из сетевых интерфейсных плат. При подключении FCI или прослушивателю группы доступности SqlClient пытается установить подключения ко всем IP-адресам параллельно. Если попытка соединения завершается успешно, драйвер отменяет все ожидающие попытки подключения.

Примечание.

Увеличение времени ожидания соединения и реализация логики повторного соединения позволяют повысить вероятность соединения приложения с группой доступности. Кроме того, в связи с возможностью неудачного подключения при отработке отказа следует реализовать логику повторного соединения, обеспечивающую неограниченное число попыток соединения до достижения успеха.

Следующие свойства подключения были добавлены в SqlClient в платформа .NET Framework 4.5:

  • ApplicationIntent

  • MultiSubnetFailover

Вы можете программно изменить эти ключевые слова строк подключения:

Примечание.

true Параметр MultiSubnetFailover не требуется для платформа .NET Framework версий 4.6.1 и более поздних версий. Он необходим в .NET Core и .NET 5+.

Соединение с помощью MultiSubnetFailover

Всегда указывайте MultiSubnetFailover=True при подключении к FCI или прослушивателю группы доступности. MultiSubnetFailover обеспечивает более быструю отработку отказа для всех групп доступности и ЦК в SQL Server 2012 или более поздней версии и значительно сокращает время отработки отказа для топологий AlwaysOn с несколькими подсетями. При отработке отказа в сети с несколькими подсетями клиент пытается установить соединения параллельно. Во время отработки отказа подсети клиент агрессивно повторяет TCP-подключение.

Свойство MultiSubnetFailover подключения указывает, что приложение использует группу доступности или FCI, а SqlClient попытается подключиться к базе данных на основном экземпляре SQL Server, пытаясь подключиться ко всем IP-адресам. Когда для соединения установлено свойство MultiSubnetFailover=True, то клиент производит повторные попытки установить TCP-соединение быстрее интервалов повторной отправки TCP-пакетов по умолчанию для операционной системы. Это позволяет ускорить повторное подключение после отработки отказа группы доступности или FCI и применимо как к одно-, так и к нескольким подсетям AGs и FCIs.

Дополнительные сведения о ключевых словах строк подключения в SqlClient см. в разделе ConnectionString.

Указание MultiSubnetFailover=True при подключении к ней, отличной от группы доступности или FCI, может привести к негативному влиянию на производительность и не поддерживается.

Используйте следующие рекомендации для подключения к серверу с помощью одной из функций AlwaysOn:

  • Используйте свойство соединения MultiSubnetFailover при установке соединения с одной подсетью или с несколькими подсетями; производительность возрастет в любом случае.

  • Чтобы подключиться к группе доступности, укажите прослушиватель группы доступности в качестве сервера в строка подключения.

  • При установлении соединения с экземпляром SQL Server, настроенным на работу более чем с 64 IP-адресами, будет возникать ошибка соединения.

  • Используемый тип проверки подлинности (SQL Server, Kerberos или Windows) не влияет на работу приложения, использующего свойство соединения MultiSubnetFailover.

  • Увеличьте значение Connect Timeout, чтобы обеспечить отработку отказов и сократить число попыток повторного соединения, предпринимаемых приложением.

  • Распределенные транзакции не поддерживаются.

Если маршрутизация только для чтения неактивна, то подключение к местоположению вторичной реплики завершится ошибкой в следующих случаях.

  • Если местоположение вторичных реплик не настроено для приема подключений.

  • Если приложение использует свойство ApplicationIntent=ReadWrite (которое обсуждается ниже) и местоположение дополнительных реплик настроено для доступа только для чтения.

На вторичных репликах только для чтения не поддерживается SqlDependency.

При соединении произойдет ошибка, если первичная реплика настроена для отклонения рабочих нагрузок только для чтения, а строка подключения содержит ApplicationIntent=ReadOnly.

Переход с зеркального отображения базы данных на использование кластеров с несколькими подсетями

Если в строке подключения содержатся ключевые слова MultiSubnetFailover и Failover Partner или MultiSubnetFailover=True используется с любым протоколом, кроме TCP, то при соединении произойдет ошибка ArgumentException. Ошибка (SqlException) возникает также в том случае, если используется MultiSubnetFailover и SQL Server возвращает ответ партнера по обеспечению отработки отказа, указывающего на то, что он является частью пары зеркального отображения базы данных.

Если производится обновление приложения SqlClient, в котором в данный момент используется зеркальное отображение базы данных в сценарии с несколькими подсетями, то следует удалить свойство соединения Failover Partner и заменить его свойством MultiSubnetFailover со значением True, а также заменить имя сервера в строке подключения на имя прослушивателя группы доступности. Если в строке подключения используются Failover Partner и MultiSubnetFailover=True, то драйвер выдаст ошибку. Но если в строке подключения используются параметры Failover Partner и MultiSubnetFailover=False (или ApplicationIntent=ReadWrite), то приложение будет использовать зеркальное отображение базы данных.

Драйвер вернет ошибку, если зеркальное отображение базы данных используется для базы данных-источника в группе доступности, а свойство MultiSubnetFailover=True указано в строке подключения для соединения с базой данных-источником, а не с прослушивателем группы доступности.

Задание намерения приложения

При указании параметра ApplicationIntent=ReadOnly клиент запросит рабочую нагрузку чтения при установлении соединения с базой данных с поддержкой AlwaysOn. Сервер принудительно реализует намерение в момент соединения и во время выполнения инструкции USE database, но только в базе данных с поддержкой Always On.

Ключевое слово ApplicationIntent не работает с базами данных прежних версий, доступными только для чтения.

База данных может допускать или не допускать рабочую нагрузку чтения для целевой базы данных AlwaysOn. (Это выполняется с использованием предложения ALLOW_CONNECTIONS в инструкциях Transact-SQL PRIMARY_ROLE и SECONDARY_ROLE.)

Ключевое слово ApplicationIntent служит для включения маршрутизации только для чтения.

Маршрутизация только для чтения

Маршрутизация только для чтения — это функция, которая может обеспечить доступность реплики базы данных, доступной только для чтения. Включение маршрутизации только для чтения

  1. Необходимо установить соединение с прослушивателем группы доступности Always On.

  2. Ключевое слово ApplicationIntent строки подключения должно быть установлено в значение ReadOnly.

  3. Группа доступности должна быть настроена администратором базы данных на поддержку маршрутизации только для чтения.

Возможно, что не все из нескольких соединений, использующих маршрутизацию только для чтения, будут подключаться к одной и той же реплике только для чтения. Изменения в синхронизации баз данных или в конфигурации маршрутизации сервера могут привести к тому, что клиент будет подключаться к различным репликам только для чтения. Чтобы гарантировать, что все запросы на подключение только для чтения будут соединяться с одной и той же репликой только для чтения, не указывайте прослушиватель группы доступности в ключевом слове строки подключения Data Source. Вместо этого укажите имя экземпляра, доступного только для чтения.

На маршрутизацию только для чтения может потребоваться больше времени, чем на подключение к первичной реплике, поскольку маршрутизация только для чтения предусматривает прежде всего подключение к первичной реплике, а затем поиск наиболее подходящей доступной для чтения вторичной реплики. Учитывая этот факт, следует увеличить время ожидания входа в систему.

См. также