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

Скачать ADO.NET

В этой статье представлены сведения о поддержке групп доступности Always On с высоким уровнем доступности и аварийного восстановления в поставщике данных Microsoft SqlClient для SQL Server. Группы доступности Always On появились в SQL Server 2012. Дополнительные сведения о группах обеспечения доступности Always On см. в электронной документации на SQL Server.

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

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

Примечание.

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

В поставщике данных Microsoft SqlClient для SQL Server поддерживаются следующие свойства подключения:

  • ApplicationIntent

  • MultiSubnetFailover

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

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

При установлении соединения с прослушивателем группы доступности SQL Server 2012 или экземпляром отказоустойчивого кластера SQL Server 2012 всегда необходимо указывать MultiSubnetFailover=True. MultiSubnetFailover дает возможность группам доступности и экземпляру отказоустойчивого кластера в SQL Server 2012 быстрее выполнить отработку отказа, а также значительно сократить время перехода на другой ресурс для топологий Always On с одной или несколькими подсетями. При отработке отказа с в нескольких подсетях клиент будет выполнять попытки соединения параллельно. Во время отработки отказа в подсети будут агрессивно выполняться попытки повторного TCP-соединения.

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

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

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

Следуйте приведенным ниже рекомендациям для подключения к серверу в группе доступности или экземпляру отказоустойчивого кластера SQL Server 2012.

  • Используйте свойство соединения 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 клиент запросит рабочую нагрузку чтения при установлении соединения с базой данных с поддержкой Always On. Сервер принудительно реализует намерение в момент соединения и во время выполнения инструкции USE database, но только в базе данных с поддержкой Always On.

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

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

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

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

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

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

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

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

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

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

Следующие шаги