Поддержка SqlClient для обеспечения высокой доступности и аварийного восстановления
В этой статье рассматривается поддержка SqlClient (добавленная в платформа .NET Framework 4.5) для обеспечения высокой доступности и аварийного восстановления с помощью функций AlwaysOn: группы доступности AlwaysOn (AG) и экземпляры отказоустойчивого кластера Always On с 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
служит для включения маршрутизации только для чтения.
Маршрутизация только для чтения
Маршрутизация только для чтения — это функция, которая способна обеспечить доступность реплики базы данных только для чтения. Включение маршрутизации только для чтения
- Необходимо установить соединение с прослушивателем группы доступности Always On.
- Ключевое слово
ApplicationIntent
строки подключения должно быть установлено в значениеReadOnly
. - Группа доступности должна быть настроена администратором базы данных на поддержку маршрутизации только для чтения.
Возможно, что не все из нескольких соединений, использующих маршрутизацию только для чтения, будут подключаться к одной и той же реплике только для чтения. Изменения в синхронизации баз данных или в конфигурации маршрутизации сервера могут привести к тому, что клиент будет подключаться к различным репликам только для чтения. Чтобы гарантировать, что все запросы на подключение только для чтения будут соединяться с одной и той же репликой только для чтения, не указывайте прослушиватель группы доступности в ключевом слове строки подключения Data Source
. Вместо этого укажите имя экземпляра, доступного только для чтения.
На маршрутизацию только для чтения может потребоваться больше времени, чем на подключение к первичной реплике, поскольку маршрутизация только для чтения предусматривает прежде всего подключение к первичной реплике, а затем поиск наиболее подходящей доступной для чтения вторичной реплики. Учитывая этот факт, следует увеличить время ожидания входа в систему.