支持高可用性、灾难恢复

下载 PHP 驱动程序

本主题介绍了 Microsoft Drivers for PHP for SQL Server 支持高可用性和灾难恢复(版本 3.0 中新增支持)。

自 Microsoft Drivers for PHP for SQL Server 版本 3.0 起,可以在连接字符串中将高可用性、灾难恢复可用性组或故障转移群集实例的可用性组侦听程序指定为服务器。

MultiSubnetFailover 连接属性指明,应用程序正部署在可用性组或故障转移群集实例中,且驱动程序会通过尝试连接到所有 IP 地址来尝试连接到主 SQL Server 实例中的数据库。 在连接到 SQL Server 可用性组侦听程序或 SQL Server 故障转移群集实例时,应始终指定 MultiSubnetFailover=True。 如果将应用程序连接到具有故障转移功能的 Always On 数据库,那么在故障转移后,原始连接会断开,且应用程序必须建立新连接才能继续运行。

有关 AlwaysOn 可用性组的完整详细信息,可以访问高可用性、灾难恢复文档页。

透明网络 IP 解析 (TNIR)

透明网络 IP 解析 (TNIR) 是对现有 MultiSubnetFailover 功能的修订。 如果第一个解析的主机名 IP 未响应,且存在多个与主机名关联的 IP,就会影响驱动程序的连接序列。 相应的连接选项是 TransparentNetworkIPResolution。 它与 MultiSubnetFailover 一起提供以下四个连接序列:

  • TNIR 已启用且 MultiSubnetFailover 已禁用:先尝试一个 IP,再并行尝试所有 IP
  • TNIR 已启用且 MultiSubnetFailover 已启用:并行尝试所有 IP
  • TNIR 已禁用且 MultiSubnetFailover 已禁用:逐一尝试所有 IP
  • TNIR 已禁用且 MultiSubnetFailover 已启用:并行尝试所有 IP

TNIR 默认处于启用状态,MultiSubnetFailover 默认处于禁用状态。

下面的示例展示了如何使用 PDO_SQLSRV 驱动程序同时启用 TNIR 和 MultiSubnetFailover

<?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);
}
?>

升级以便使用来自数据库镜像的多子网群集

如果连接字符串中已存在 MultiSubnetFailoverFailover_Partner 连接关键字,将出现连接错误。 如果使用的是 MultiSubnetFailover,且 SQL Server 返回指明它属于数据库镜像对的故障转移伙伴响应,也会导致错误抛出。

如果将当前使用数据库镜像的 PHP 应用程序升级到多子网方案,请删除 Failover_Partner 连接属性,并使用设置为“True”的 MultiSubnetFailover 替换它,同时还使用可用性组侦听程序替换连接字符串中的服务器名称。 如果连接字符串使用 Failover_Partner 和 MultiSubnetFailover=true,驱动程序将生成一个错误 。 但是,如果连接字符串使用 Failover_Partner 和 MultiSubnetFailover=false(或 ApplicationIntent=ReadWrite),则该应用程序将使用数据库镜像 。

如果数据库镜像用于 AG 中的主数据库,并且 MultiSubnetFailover=true 用于连接到主数据库(而非连接到可用性组侦听程序)的连接字符串中,则驱动程序将返回错误。

指定应用程序意图

你可以在连接字符串中指定 ApplicationIntent 关键字。 可分配的值为 ReadWrite(默认值)或 ReadOnly

当你设置 ApplicationIntent=ReadOnly 时,客户端将在连接时请求读取工作负荷。 服务器在连接时和在执行 USE 数据库语句期间强制执行此意图。

ApplicationIntent 关键字不适用于旧版只读数据库。

ReadOnly 的目标

如果连接选择 ReadOnly,连接就会分配到数据库可能存在的下列任何特殊配置:

  • AlwaysOn。 数据库可允许或禁止目标可用性组数据库上的读取工作负载。 此选项通过使用 PRIMARY_ROLESECONDARY_ROLE Transact-SQL 语句的 ALLOW_CONNECTIONS 子句进行控制。

  • 异地复制

  • 读取横向扩展

如果这些特殊目标都不可用,则从常规数据库读取。

关键字 ApplicationIntent 启用只读路由。

只读路由

只读路由是一项功能,可用于确保数据库的只读副本的可用性。 若要启用只读路由,必须遵守以下所有要求:

  • 必须连接到 AlwaysOn 可用性组侦听程序。

  • ApplicationIntent 连接字符串关键字必须设置为 ReadOnly

  • 数据库管理员必须配置可用性组才能启用只读路由。

使用只读路由的多个连接可能不会全部连接到相同的只读副本。 对数据库同步进行更改或对服务器的路由配置进行更改可能导致客户端连接到不同的只读副本。

你可以确保所有只读请求都连接到相同的只读副本,方法是不将可用性组侦听程序传递到 Server 连接字符串关键字。 而是指定只读实例的名称。

只读路由可能比连接到主要副本需要更长的时间。 等待时间较长是因为只读路由首先会连接到主要副本,然后查找最合适的可读次要副本。 由于需要执行多个步骤,所以应将 login 超时时间增加到至少 30 秒。

另请参阅

连接到服务器