Поддержка высокого уровня доступности и аварийного восстановления
В этом разделе рассматриваются драйверы Майкрософт для PHP для SQL Server (добавленная в версии 3.0) для обеспечения высокой доступности, аварийного восстановления.
Для драйверов Майкрософт для PHP для SQL Server, начиная с версии 3.0, в качестве сервера в строке подключения можно указать прослушиватель группы доступности с высокой доступностью, группу доступности с возможностью аварийного восстановления или экземпляр кластера отработки отказа.
Свойство подключения MultiSubnetFailover указывает, что приложение развертывается в группе доступности или экземпляре отказоустойчивого кластера, а также что драйвер попытается подключиться ко всем IP-адресам базы данных в первичном экземпляре SQL Server. Всегда задавайте MultiSubnetFailover=True при подключении к прослушивателю группы доступности или экземпляру отказоустойчивого кластера SQL Server. Если приложение подключается к базе данных Always On, которая выполняет отработку отказа, то первоначальное подключение разрывается и приложение должно открыть новое подключение, чтобы продолжить работу после обработки отказа.
Подробные сведения о группе доступности Always On можно найти на странице документации SQL Server Native Client Support for High Availability, Disaster Recovery (Поддержка SQL Server Native Client для высокого уровня доступности и аварийного восстановления).
Разрешение IP-адресов прозрачной сети (TNIR)
Разрешение IP-адресов прозрачной сети (TNIR) является исправленной версией существующей функции MultiSubnetFailover. Это влияет на последовательность подключений драйвера, когда первый разрешенный IP-адрес имени узла не отвечает и имеется несколько IP-адресов, связанных с именем этого узла. Соответствующий параметр соединения — TransparentNetworkIPResolution. Вместе с MultiSubnetFailover он предоставляет следующие четыре последовательности подключения.
- TNIR Enabled & MultiSubnetFailover Disabled: один IP-адрес пытается выполнить параллельно, а затем все IP-адреса параллельно
- Включение TNIR и MultiSubnetFailover : все IP-адреса выполняются параллельно.
- TNIR Disabled и MultiSubnetFailover Disabled: все IP-адреса пытаются один за другим
- TNIR Disabled & MultiSubnetFailover Enabled: все IP-адреса выполняются параллельно
По умолчанию TNIR включено, а MultiSubnetFailover — отключено.
Ниже приведен пример включения TNIR и MultiSubnetFailover с помощью драйвера PDO_SQLSRV.
<?php
$serverName = "yourservername";
$username = "yourusername";
$password = "yourpassword";
$connectionString = "sqlsrv:Server=$serverName; TransparentNetworkIPResolution=Enabled; MultiSubnetFailover=yes";
try {
$conn = new PDO($connectionString, $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
// your code
// more of your code
// when done, close the connection
unset($conn);
} catch(PDOException $e) {
print_r($e->errorInfo);
}
?>
Переход с зеркального отображения базы данных на использование кластеров с несколькими подсетями
Если в строке подключения содержатся ключевые слова MultiSubnetFailover и Failover_Partner, то при соединении произойдет ошибка. Ошибка возникает также в том случае, если используется MultiSubnetFailover и SQL Server возвращает ответ партнера по обеспечению отработки отказа, указывающий на то, что он является частью пары зеркальных баз данных.
При переводе приложения PHP, которое сейчас использует зеркальное отображение базы данных, на сценарий с использованием множества подсетей необходимо удалить свойство подключения Failover_Partner, заменив его свойством MultiSubnetFailover со значением True, а имя сервера в строке подключения — прослушивателем группы доступности. Если в строке подключения используются Failover_Partner и MultiSubnetFailover=true, то драйвер выдаст ошибку. Но если в строке подключения используются параметры Failover_Partner и 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 секунд.