我们最近实施了 SQL Server 2012 Always On 故障转移群集。上线时间为 2 周,并且出现了一些令人担忧的问题。以前我们处理的是同一子网中的服务器,但后来我们将服务器移动到了多个子网。既然这样做了,我们就遇到了多子网故障转移问题;http://technet.microsoft.com/en-us/library/ff878716.aspx。
“在多子网配置中,网络名称的在线和离线 IP 地址都将在 DNS 服务器上注册。客户端应用程序然后从 DNS 服务器检索所有注册的 IP 地址并尝试按顺序连接到这些地址或并行。这意味着多子网故障转移中的客户端恢复时间不再取决于 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
子网设置正确,当我提供“MultiSubnetFailover=Yes”参数时,我可以通过 SQL Server Management Studio 等其他服务正常连接,实际上区别是白天和黑夜。
任何帮助表示赞赏,这个太接近释放舒适。
编辑:实际上我错过了第二个连接字符串,但是一旦使用多子网故障转移参数配置它,错误仍然会发生;
$pdoHandle = new PDO("sqlsrv:server={$myServer};database={$myDB};multiSubnetFailover=yes", $myUser, $myPass);