高可用性與災害復原的支援
本主題探討提供高可用性及災害復原的 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 資料庫,則原始連線會中斷,且應用程式必須建立新的連線,才能在容錯移轉後繼續運作。
Always On 可用性群組的完整詳細資料,可在高可用性、災害復原 \(部分機器翻譯\) 文件頁面上找到。
透明網路 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);
}
?>
從資料庫鏡像升級到使用多子重網路叢集
如果連接字串中有 MultiSubnetFailover 和 Failover_Partner 連接關鍵字,則會發生連接錯誤。 如果使用 MultiSubnetFailover,且 SQL Server 傳回容錯移轉夥伴回應,指出其為資料庫鏡像配對的一部分,也會發生錯誤。
將目前使用資料庫鏡像的 PHP 應用程式升級為多重子網路案例時,請移除 Failover_Partner 連線屬性,並取代成設定為 True 的 MultiSubnetFailover,然後將連接字串中的伺服器名稱取代為可用性群組接聽程式。 如果連接字串使用 Failover_Partner 和 MultiSubnetFailover=true,驅動程式會產生錯誤。 不過,如果連接字串使用 Failover_Partner 和 MultiSubnetFailover=false (或 ApplicationIntent=ReadWrite),應用程式會使用資料庫鏡像。
如果在可用性群組中的主要資料庫上使用資料庫鏡像,而且如果在連線到主要資料庫 (而不是可用性群組接聽程式) 的連接字串中使用 MultiSubnetFailover=true,驅動程式會傳回錯誤。
指定應用程式意圖
您可以在連接字串中指定關鍵字 ApplicationIntent
。 可指派的值為 ReadWrite
(預設) 或 ReadOnly
。
若設定 ApplicationIntent=ReadOnly
,用戶端會在連線時要求讀取工作負載。 伺服器會在連線期間以及在 USE
資料庫陳述式期間,強制執行此意圖。
ApplicationIntent
關鍵字不適用於舊版唯讀資料庫。
ReadOnly 的目標
當連線選擇 ReadOnly
時,連線會指派給可能已因為資料庫存在的下列任何特殊設定:
Always On。 資料庫可在目標可用性群組資料庫允許或不允許讀取工作負載。 此選擇是透過使用
PRIMARY_ROLE
與SECONDARY_ROLE
Transact-SQL 陳述式的ALLOW_CONNECTIONS
子句來控制的。
如果沒有任何那些特殊目標可用,則會從一般資料庫讀取。
ApplicationIntentApplicationIntent
關鍵字可啟用「唯讀路由」 。
唯讀路由
唯讀路由功能可確保資料庫之唯讀複本的可用性。 若要啟用唯讀路由,必須符合下列所有條件:
您必須連線到 Always On 可用性群組接聽程式。
ApplicationIntent
連接字串關鍵字必須設為ReadOnly
。資料庫管理員必須設定可用性群組,以啟用唯讀路由。
每個都使用唯讀路由的多個連線,可能不會都連線到相同的唯讀複本。 資料庫同步處理的變更或伺服器路由組態的變更,可能會導致用戶端連接至不同的唯讀複本。
您可以「不」將可用性群組接聽程式傳遞給 Server
連接字串關鍵字,藉此確認所有唯讀要求都連線到同一個唯讀複本。 請改為指定唯讀執行個體的名稱。
唯讀路由連線到主要複本的時間可能會比較長。 這是因為唯讀路由會先連線到主要複本,再尋找最適合的可讀取次要複本。 由於有多個步驟,因此您應將 login
逾時增加為至少 30 秒。