Поделиться через


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

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

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

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

Примечание.

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

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

  • ApplicationIntent
  • MultiSubnetFailover

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

Примечание.

Установка MultiSubnetFailover на true не требуется для платформы .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-пакетов по умолчанию для операционной системы. Это позволяет ускорить повторное подключение после отработки отказа группы доступности (AG) или класса отказоустойчивости (FCI) и применяется как к одно-, так и к многоподсетевым AG и FCI.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если в строке подключения содержатся ключевые слова ArgumentException и MultiSubnetFailover, или если Failover Partner используется с любым протоколом, кроме TCP, произойдет ошибка подключения. Ошибка (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 служит для включения маршрутизации только для чтения.

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

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

  • Необходимо установить соединение с прослушивателем группы доступности Always On.
  • Ключевое слово ApplicationIntent строки подключения должно быть установлено в значение ReadOnly.
  • Группа доступности должна быть настроена администратором базы данных на поддержку маршрутизации только для чтения.

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

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

См. также