Поддержка высокой доступности и аварийного восстановления в JDBC Driver
В этой статье обсуждаются сведения о поддержке Microsoft JDBC Driver для SQL Server для высокой доступности и аварийного восстановления (группы доступности Always On). Дополнительные сведения о среде группы доступности AlwaysOn см. в электронной документации по SQL Server 2012 (11.x).
Начиная с версии 4.0 драйвера Microsoft JDBC для SQL Server, в свойстве подключения можно указать прослушиватель группы доступности (высокий уровень доступности, аварийное восстановление). Если приложение Microsoft JDBC Driver для SQL Server подключается к базе данных Always On, которая выполняет отработку отказа, то первоначальное подключение разрывается и приложение должно открыть новое подключение, чтобы продолжить работу после обработки отказа. В Microsoft JDBC Driver 4.0 для SQL Server добавлены следующие свойства подключения:
multiSubnetFailover
applicationIntent
Укажите multiSubnetFailover=true при подключении к прослушивателю группы доступности или экземпляру отказоустойчивого кластера.
Примечание.
multiSubnetFailover по умолчанию имеет значение false. Используйте applicationIntent, чтобы объявить тип рабочей нагрузки приложения. Дополнительные сведения см. в приведенных ниже разделах.
Начиная с версии 6.0 Microsoft JDBC Driver for SQL Server, для прозрачного подключения к группе доступности Always On или к серверу с несколькими IP-адресами добавляется новое свойство соединения transparentNetworkIPResolution (TNIR). Если transparentNetworkIPResolution имеет значение true, драйвер пытается подключиться к первому доступному IP-адресу. Если первая попытка завершается неудачно, драйвер пытается подключиться ко всем IP-адресам параллельно до истечения времени ожидания, отменяя все ожидающие попытки подключения, когда один из них завершается успешно.
Примечание.
- по умолчанию transparentNetworkIPResolution имеет значение true
- transparentNetworkIPResolution игнорируется, если multiSubnetFailover имеет значение true
- transparentNetworkIPResolution игнорируется, если используется зеркальное отображение базы данных
- transparentNetworkIPResolution игнорируется, если количество IP-адресов превышает 64.
- Если transparentNetworkIPResolution имеет значение true, первая попытка соединения использует значение времени ожидания 500 мс. Остальные попытки подключения следуют той же логике, что и компонент multiSubnetFailover.
Примечание.
Если для SQL Server используется драйвер Microsoft JDBC Driver 4.2 (или более поздней версии), а если multiSubnetFailover имеет значение false, драйвер Microsoft JDBC для SQL Server пытается подключиться к первому IP-адресу. Если драйвер Microsoft JDBC для SQL Server не может установить подключение с первым IP-адресом, подключение завершается ошибкой. Драйвер Microsoft JDBC для SQL Server не попытается подключиться к любому последующему IP-адресу, связанному с сервером.
Примечание.
Увеличение времени ожидания соединения и реализация логики повторного соединения позволяют повысить вероятность соединения приложения с группой доступности. Кроме того, в связи с возможностью неудачного подключения при отработке отказа группы доступности следует реализовать логику повторного соединения, обеспечивающую неограниченное число попыток соединения до достижения успеха.
Подключение с помощью multiSubnetFailover
Всегда указывайте multiSubnetFailover=true при подключении к прослушивателю группы доступности SQL Server 2012 (11.x) или экземпляру отказоустойчивого кластера SQL Server 2012 (11.x). multiSubnetFailover позволяет группам доступности и экземплярам отказоустойчивого кластера в SQL Server 2012 (11.x) быстрее выполнить отработку отказа, а также значительно сократить время перехода на другой ресурс для топологий Always On с одной подсетью или несколькими. При отработке отказа с в нескольких подсетях клиент будет выполнять попытки соединения параллельно. Во время отработки отказа подсети драйвер Microsoft JDBC для SQL Server будет агрессивно повторять TCP-подключение.
Свойство подключения multiSubnetFailover указывает, что приложение развертывается в группе доступности или экземпляре отказоустойчивого кластера, а драйвер Microsoft JDBC для SQL Server попытается подключиться к базе данных на основном экземпляре SQL Server, пытаясь подключиться ко всем IP-адресам. Когда для подключения установлено свойство MultiSubnetFailover=true, клиент будет пытаться повторно установить TCP-подключение с более частым интервалом, чем заданные в операционной системе интервалы повторной отправки TCP-пакетов по умолчанию. Это поведение позволяет ускорить восстановление соединения после отработки отказа в группе доступности Always On или в экземпляре отказоустойчивого кластера Always On. Метод можно применять к группам доступности и экземплярам отказоустойчивых кластеров как с одной, так и с несколькими подсетями.
Дополнительные сведения о ключевых словах строка подключения в драйвере Microsoft JDBC для SQL Server см. в разделе "Настройка свойств подключения".
Указание multiSubnetFailover=true при подключении к объекту, отличному от прослушивателя группы доступности или экземпляра отказоустойчивого кластера, может привести к снижению производительности, и по этой причине не поддерживается.
Если диспетчер безопасности не установлен, то виртуальная машина Java кэширует виртуальные IP-адреса (VIP) на ограниченный период (который определяется реализацией JDK, а также свойствами Java networkaddress.cache.ttl и networkaddress.cache.negative.ttl). Если диспетчер безопасности JDK установлен, то виртуальная машина Java будет кэшировать виртуальные IP-адреса. При этом кэш по умолчанию не обновляется. Необходимо установить «время существования» для кэша виртуальной машины Java (networkaddress.cache.ttl) в один день. Если этого не сделать, старые значения не будут исключаться из кэша виртуальной машины Java при добавлении или обновлении виртуальных IP-адресов. Дополнительные сведения о networkaddress.cache.ttl и networkaddress.cache.negative.ttl см. в разделе https://download.oracle.com/javase/6/docs/technotes/guides/net/properties.html.
Следуйте приведенным ниже рекомендациям для подключения к серверу в группе доступности или экземпляру отказоустойчивого кластера.
Драйвер выдаст ошибку, если свойство соединения instanceName указано в той же строке подключения, что и свойство соединения multiSubnetFailover. Эта ошибка отражает тот факт, что обозреватель SQL Server в группе доступности не используется. Однако если также указано свойство подключения portNumber, драйвер будет игнорировать instanceName и использовать portNumber.
Используйте свойство подключения multiSubnetFailover при подключении к одной подсети или нескольким — это благоприятно скажется на производительности в любом случае.
Чтобы установить соединение с группой доступности, указывайте ее прослушиватель в строке подключения вместо сервера. Например, jdbc:sqlserver://VNN1.
При установлении соединения с экземпляром SQL Server, настроенным на работу более чем с 64 IP-адресами, будет возникать ошибка соединения.
Поведение приложения, использующего свойство подключения multiSubnetFailover , не влияет на тип проверки подлинности: проверку подлинности SQL Server, проверку подлинности Kerberos или проверку подлинности Windows.
Значение loginTimeout можно увеличить с учетом времени отработки отказа и для уменьшения количества попыток приложения повторно установить подключение.
Если маршрутизация только для чтения не применяется, то подключение к расположению вторичной реплики в группе доступности завершится ошибкой в следующих ситуациях:
если расположение вторичных реплик не настроено на прием подключений;
Если приложение использует applicationIntent=ReadWrite (описано ниже) и расположение вторичных реплик настроено для доступа только для чтения.
При соединении произойдет ошибка, если первичная реплика настроена для отклонения рабочих нагрузок только для чтения, а строка подключения содержит ApplicationIntent=ReadOnly.
Переход с зеркального отображения базы данных на использование кластеров с несколькими подсетями
При обновлении приложения Microsoft JDBC Driver для SQL Server, которое в настоящее время использует зеркальное отображение базы данных до сценария с несколькими подсетями, необходимо удалить свойство подключения FailoverPartner и заменить его значением multiSubnetFailover на true и заменить имя сервера в строка подключения прослушивателем группы доступности. Если в строке подключения используются failoverPartner и multiSubnetFailover=true, то драйвер выдаст ошибку. Но если в строке подключения используются параметры failoverPartner и multiSubnetFailover=false (или ApplicationIntent=ReadWrite), то приложение будет использовать зеркальное отображение базы данных.
Если зеркальное отображение базы данных применяется к базе данных-источнику группы доступности, то драйвер вернет ошибку. Это также произойдет при использовании параметра multiSubnetFailover=true в строке подключения, относящейся к базе данных-источнику, а не к прослушивателю группы доступности.
Указание намерения приложения
В строке подключения можно указать ключевое слово ApplicationIntent
. Присваиваемые значения: ReadWrite
(по умолчанию) или ReadOnly
.
Если задано значение ApplicationIntent=ReadOnly
, при подключении клиент запрашивает рабочую нагрузку чтения. Сервер принудительно реализует намерение в момент соединения и во время выполнения инструкции USE
для базы данных.
Ключевое слово ApplicationIntent
не работает с базами данных прежних версий, доступными только для чтения.
Целевые объекты ReadOnly
Если при подключении выбрано значение ReadOnly
, подключение назначается любой из следующих специальных конфигураций, которые могут применяться для базы данных:
Always On. База данных может допускать или не допускать рабочую нагрузку чтения для целевой базы данных группы доступности. Для управления этим вариантом используется предложение
ALLOW_CONNECTIONS
инструкций Transact-SQLPRIMARY_ROLE
иSECONDARY_ROLE
.
Если все эти специальные целевые объекты недоступны, выполняется чтение из обычной базы данных.
Ключевое слово ApplicationIntent
активирует маршрутизацию только для чтения.
Маршрутизация только для чтения
Маршрутизация только для чтения — это функция, которая способна обеспечить доступность реплики базы данных только для чтения. Чтобы включить маршрутизацию только для чтения, необходимо выполнить следующие условия:
Необходимо установить подключение к прослушивателю группы доступности Always On.
Ключевое слово
ApplicationIntent
строки подключения должно быть установлено в значениеReadOnly
.Администратор базы данных должен настроить группу доступности на включение маршрутизации только для чтения.
Возможно, не все соединения, для каждого из которых используется маршрутизация только для чтения, будут подключаться к одной и той же реплике только для чтения. Изменения в синхронизации баз данных или в конфигурации маршрутизации сервера могут привести к тому, что клиент будет подключаться к различным репликам только для чтения.
Чтобы гарантировать, что все запросы на подключение только для чтения будут соединяться с одной и той же репликой только для чтения, не указывайте прослушиватель группы доступности в ключевом слове строки подключения Server
. Вместо этого укажите имя экземпляра, доступного только для чтения.
Маршрутизация только для чтения может занять больше времени, чем подключение к первичной реплике. Это происходит потому, что при маршрутизации с правом доступа только для чтения выполняется подключение к первичной реплике, а затем выполняется поиск наиболее подходящей вторичной реплики, доступной для чтения. При выполнении этих нескольких действий время ожидания для операции login
нужно увеличить как минимум на 30 секунд.
Организация пулов соединений
При использовании драйвера Microsoft JDBC для SQL Server в сочетании с библиотекой пулов соединений следует учитывать следующие моменты.
- Если настроена маршрутизация только для чтения и пул серверов, доступных только для чтения, для которых требуется распределить нагрузку, пул подключений уменьшит число возможностей для новых подключений, которые будут распределены по целевым серверам.
- Чтобы избежать более высокой нагрузки на один сервер в пуле, выберите параметры пула, которые допускают равномерное распределение подключений в пуле.
- Убедитесь, что для пула подключений настроено время существования соединения. Если реплика только для чтения недоступна, когда осуществляется подключение только для чтения, то конфигурация должна гарантировать, что подключение в конечном итоге будет закрыто и повторно установлено к реплике только для чтения, когда она снова станет доступной.
Новые методы, поддерживающие multiSubnetFailover и applicationIntent
Следующие методы предоставляют программный доступ к ключевым словам строки подключения multiSubnetFailover, applicationIntent и transparentNetworkIPResolution.
SQLServerDataSource.setTransparentNetworkIPResolution
SQLServerDataSource.getTransparentNetworkIPResolution
Методы getMultiSubnetFailover, setMultiSubnetFailover, getApplicationIntent, setApplicationIntent, getTransparentNetworkIPResolution и setTransparentNetworkIPResolution также добавляются в классы SQLServerDataSource, SQLServerConnectionPoolDataSource и SQLServerXADataSource.
Проверка TLS/SSL-сертификатов
Группа доступности состоит из нескольких физических серверов. Microsoft JDBC Driver 4.0 для SQL Server добавил поддержку альтернативного имени субъекта в TLS/SSL-сертификатах, чтобы несколько узлов могли быть связаны с тем же сертификатом. Дополнительные сведения о TLS см. в разделе Основные сведения о поддержке шифрования.
См. также
Подключение к SQL Server с помощью JDBC Driver
Настройка свойств подключения