2

我们最近实施了 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);
4

1 回答 1

0

这是一个没有太多文档的尴尬问题,但我们确实找到了解决方案。SQLSRV_Connect 参数应为

'MultiSubnetFailover'=> "Yes"

而不是“真实”。因为 true 只返回一个布尔值,而它需要一个字符串。对于 PDO 接口使用的连接字符串,以下语法似乎对我们有用:

"MultiSubnetFailover=True" 

但即使您使用正确的语法,支持也不是很好。如果此解决方案不起作用,那么您需要增加连接超时,因为 SQL Server 驱动程序将依次尝试每个 DNS 记录。我们使用“LoginTimeout=75”(秒)来设置 2 个子网,而 110 应该用于设置 3 个子网。

然而,这个解决方案仍然是废话。它适用于只需要连接一次并从那时起使用相同连接的前端应用程序。对于倾向于为每个请求创建新连接的 Web 服务器来说,它并不能很好地工作。它可能使每个网页的加载时间长达 30、70 或 100 秒,具体取决于当时如何配置 DNS 记录。

于 2014-04-22T12:47:57.900 回答