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

Скачать драйвер JDBC

В этой статье обсуждаются сведения о поддержке Microsoft JDBC Driver для SQL Server для высокой доступности и аварийного восстановления (группы доступности Always On). Дополнительные сведения о среде группы доступности AlwaysOn см. в электронной документации по SQL Server 2012 (11.x).

Начиная с версии 4.0 драйвера Microsoft JDBC Driver для SQL Server в свойствах подключения можно указать прослушиватель группы доступности (высокой доступности и аварийного восстановления). Если приложение Microsoft JDBC Driver для SQL Server подключается к базе данных Always On, которая выполняет отработку отказа, то первоначальное подключение разрывается и приложение должно открыть новое подключение, чтобы продолжить работу после обработки отказа. В версии Microsoft JDBC Driver 4.0 for 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.

Примечание

Если вы используете Драйвер Microsoft JDBC версии 4.2 (или более ранней) для SQL Server и если multiSubnetFailover имеет значение false, Microsoft JDBC Driver для SQL Server пытается подключиться к первому IP-адресу. Если Microsoft JDBC Driver для SQL Server не может установить подключение к первому IP-адресу, то подключение завершается сбоем. Microsoft JDBC Driver для 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 Driver для SQL Server будет активно повторять попытки установить TCP-подключение.

Свойство подключения multiSubnetFailover указывает, что приложение развертывается в группе доступности или экземпляре отказоустойчивого кластера, а также что Microsoft JDBC Driver для SQL Server попытается подключиться ко всем IP-адресам базы данных в первичном экземпляре SQL Server. Когда для подключения установлено свойство MultiSubnetFailover=true, клиент будет пытаться повторно установить TCP-подключение с более частым интервалом, чем заданные в операционной системе интервалы повторной отправки TCP-пакетов по умолчанию. Это поведение позволяет ускорить восстановление соединения после отработки отказа в группе доступности Always On или в экземпляре отказоустойчивого кластера Always On. Метод можно применять к группам доступности и экземплярам отказоустойчивых кластеров как с одной, так и с несколькими подсетями.

Дополнительные сведения о ключевых словах строки подключения драйвера Microsoft JDBC Driver для 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, подключение назначается любой из следующих специальных конфигураций, которые могут применяться для базы данных:

Если все эти специальные целевые объекты недоступны, выполняется чтение из обычной базы данных.

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

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

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

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

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

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

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

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

Маршрутизация только для чтения может занять больше времени, чем подключение к первичной реплике. Это происходит потому, что при маршрутизации с правом доступа только для чтения выполняется подключение к первичной реплике, а затем выполняется поиск наиболее подходящей вторичной реплики, доступной для чтения. При выполнении этих нескольких действий время ожидания для операции login нужно увеличить как минимум на 30 секунд.

Организация пулов соединений

При использовании драйвера Microsoft JDBC для SQL Server в сочетании с библиотекой пулов соединений следует учитывать следующие моменты.

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

Новые методы, поддерживающие multiSubnetFailover и applicationIntent

Следующие методы предоставляют программный доступ к ключевым словам строки подключения multiSubnetFailover, applicationIntent и transparentNetworkIPResolution.

Методы getMultiSubnetFailover, setMultiSubnetFailover, getApplicationIntent, setApplicationIntent, getTransparentNetworkIPResolution и setTransparentNetworkIPResolution также добавляются в классы SQLServerDataSource, SQLServerConnectionPoolDataSource и SQLServerXADataSource.

Проверка TLS/SSL-сертификатов

Группа доступности состоит из нескольких физических серверов. В драйвер Microsoft JDBC Driver 4.0 for SQL Server добавлена поддержка альтернативного имени субъекта в TLS/SSL-сертификатах, что позволяет связать несколько узлов с одним сертификатом. Дополнительные сведения о TLS см. в разделе Основные сведения о поддержке шифрования.

См. также раздел

Подключение к SQL Server с помощью JDBC Driver
Настройка свойств подключения