Почему мой веб-сервер PHP 5.4 не может общаться с моим отказоустойчивым кластером из нескольких подсетей с помощью SQL Always On?
Недавно мы внедрили отказоустойчивый кластер SQL Server 2012 Always On. Начало работы через 2 недели, и возникли некоторые вопросы. Ранее мы имели дело с серверами в одной подсети, но с тех пор мы переместили серверы в несколько подсетей. После этого мы столкнулись с проблемой отработки отказа нескольких подсетей; http://technet.microsoft.com/en-us/library/ff878716.aspx.
"В конфигурации с несколькими подсетями на DNS-сервере будут зарегистрированы как онлайновые, так и автономные IP-адреса сетевого имени. Затем клиентское приложение извлекает все зарегистрированные 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);
1 ответ
Это неловкая проблема без большого количества документации, но мы пришли к решению. Параметр SQLSRV_Connect должен читать
'MultiSubnetFailover'=> "Yes"
а не "правда". Потому что true просто возвращает логическое значение, тогда как ему нужна строка. Для строки подключения, используемой интерфейсом PDO, следующий синтаксис нам подходит:
"MultiSubnetFailover=True"
Но даже если вы используете правильный синтаксис, поддержка не велика. Если это решение не работает, вам нужно увеличить время ожидания соединения, потому что драйвер SQL Server будет пробовать каждую запись DNS по очереди. Мы используем "LoginTimeout=75" (секунд) для установки с 2 подсетями, и 110 должны делать для установки с 3 подсетями.
Это решение, однако, все еще дерьмо. Он работает приемлемо для внешнего приложения, которому нужно подключиться только один раз и с тех пор использовать то же соединение. Это не очень хорошо работает для веб-серверов, которые, как правило, создают новое соединение для каждого запроса. Это может сделать загрузку каждой веб-страницы длительностью 30, 70 или 100 секунд, в зависимости от того, как DNS-записи конфигурируются в то время.