Почему мой веб-сервер PHP 5.4 не может связаться с моим отказоустойчивым кластером с несколькими подсетями, используя SQL Always On?

Недавно мы внедрили отказоустойчивый кластер SQL Server 2012 Always On. Запуск состоится через 2 недели, и возникли некоторые проблемы. Раньше мы имели дело с серверами в одной подсети, но с тех пор мы переместили серверы в несколько подсетей. После этого мы столкнулись с проблемой аварийного переключения нескольких подсетей; http://technet.microsoft.com/en-us/library/ff878716.aspx .

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

По умолчанию клиент пробует IP-адреса по порядку. Когда клиент использует новый необязательный параметр MultiSubnetFailover=True в своей строке подключения, вместо этого он одновременно пытается использовать IP-адреса и подключается к первому ответившему серверу. Это может помочь свести к минимуму задержку восстановления клиента при аварийном переключении».

Признаки проблемы: Сервер PHP 5.4 периодически не может подключиться. Он может работать 20 минут, потом 25 минут не работать, а потом работать 40 минут.

Мы попытались ввести параметр MultiSubnetFailover следующим образом:

$dbhandle = sqlsrv_connect(
    $myServer,
    array("UID"=>$myUser, "PWD"=>$myPass, "Database"=>$myDB, 'ReturnDatesAsStrings'=> true,
    'MultiSubnetFailover'=> true)
   )

И обновление веб-сервера с помощью драйверов Microsoft SQL, которые явно поддерживают отказоустойчивость в нескольких подсетях; http://blogs.msdn.com/b/sqlphp/archive/2012/03/07/microsoft-drivers-3-0-for-php-for-sql-server-released-to-web.aspx

Подсети настроены правильно, и я могу нормально подключаться через другие службы, такие как SQL Server Management Studio, когда я задаю параметр «MultiSubnetFailover=Yes», ​​на самом деле разница между днем ​​и ночью.

Любая помощь приветствуется, это слишком близко к выпуску для комфорта.

РЕДАКТИРОВАТЬ: на самом деле есть вторая строка подключения, которую я пропустил, но после ее настройки с параметром аварийного переключения с несколькими подсетями ошибка все еще возникает;

   $pdoHandle = new PDO("sqlsrv:server={$myServer};database={$myDB};multiSubnetFailover=yes", $myUser, $myPass);

person Jansky    schedule 04.12.2013    source источник
comment
В ваших логах есть что-нибудь по этому поводу? К сожалению, не знаком со средой MS - какие у вас есть варианты поддержки?   -  person halfer    schedule 04.12.2013
comment
Что касается ведения журнала, у нас есть ошибка подключения, которая кажется тайм-аутом. Невозможно завершить процесс входа в систему из-за задержки при открытии подключения к серверу. Мы также настроили скрипт для отправки HTTP-запросов и записи при сбое сервера. Из этого я вижу, что это удалось сегодня утром с 9:52 до 10:09, затем неудачно до 10:28, успешно до 10:37, неудачно до 10:46. Однако я сомневаюсь, что есть полезная схема. У нас нет контрактов на поддержку с Microsoft.   -  person Jansky    schedule 04.12.2013
comment
Хорошо. Стоит ли попробовать другую версию 5.4? Вы не говорите, какой вы используете, поэтому я предполагаю, что он самый последний - может быть, сбросить пару второстепенных версий? Кроме того, если вы застряли, посмотрите, наблюдается ли такое же поведение в последней версии 5.5?   -  person halfer    schedule 04.12.2013
comment
Это не какая-то пропущенная сетевая конфигурация, такая как правило брандмауэра, отсутствующий маршрут или что-то в этом роде, не так ли?   -  person steoleary    schedule 04.12.2013
comment
Это определенно проблема с сервером, потому что, когда я указываю его на другой сервер базы данных (в той же сети), он работает. Я буду экспериментировать с разными версиями PHP, но я думаю, что драйверы являются подозреваемыми.   -  person Jansky    schedule 04.12.2013
comment
В качестве обновления я попробовал PHP 5.5 и не нашел разницы. Для PHP 5.5 нет официально поддерживаемых драйверов sqlsrv, а неофициальные компиляции потерпели неудачу так же, как и 5.4.   -  person Jansky    schedule 05.12.2013
comment
Вы нашли решение? Если да, можете ли вы опубликовать свое решение, чтобы помочь другим?   -  person James Jenkins    schedule 18.04.2014


Ответы (1)


Это неуклюжая проблема без большого количества документации, но мы нашли решение. Параметр SQLSRV_Connect должен читаться

'MultiSubnetFailover'=> "Yes"

а не "правда". Потому что true просто возвращает логическое значение, тогда как ему нужна строка. Для строки подключения, используемой интерфейсом PDO, для нас работает следующий синтаксис:

"MultiSubnetFailover=True" 

Но даже если вы используете правильный синтаксис, поддержка невелика. Если это решение не работает, вам нужно увеличить время ожидания соединения, потому что драйвер SQL Server будет пытаться использовать каждую запись DNS по очереди. Мы используем «LoginTimeout=75» (секунд) для настройки с 2 подсетями и 110 для настройки с 3 подсетями.

Однако это решение все еще является дерьмом. Он работает приемлемо для интерфейсного приложения, которому нужно подключиться только один раз и с тех пор использовать одно и то же соединение. Это не так хорошо работает для веб-серверов, которые имеют тенденцию создавать новое соединение для каждого запроса. Это может привести к тому, что загрузка каждой веб-страницы займет 30, 70 или 100 секунд, в зависимости от того, как в это время настроены записи DNS.

person Jansky    schedule 22.04.2014