JDBC 驅動程式對於高可用性、災害復原的支援
此文討論 Microsoft JDBC Driver for SQL Server 對於高可用性、災害復原的支援:Always On 可用性群組。 如需 Always On 可用性群組的詳細資訊,請參閱 SQL Server 2012 (11.x) 線上叢書。
從 Microsoft JDBC Driver for SQL Server 4.0 版開始,您可以在連線屬性中指定 (高可用性、災害復原) 可用性群組 (AG) 的可用性群組接聽程式。 如果 Microsoft JDBC Driver for SQL Server 應用程式已連線至容錯移轉的 Always On 資料庫,則原始連線會中斷,且應用程式必須在容錯移轉後開啟新連線,才能繼續運作。 Microsoft JDBC Driver 4.0 for SQL Server 中新增了下列連線屬性:
multiSubnetFailover
applicationIntent
在連線到可用性群組的可用性群組接聽程式或容錯移轉叢集執行個體時,指定 multiSubnetFailover=true。
注意
multiSubnetFailover 預設為 false。 使用 applicationIntent 來宣告應用程式工作負載類型。 如需詳細資訊,請參閱以下幾節。
從 Microsoft JDBC Driver for SQL Server 6.0 版開始,新增了新的連線屬性 transparentNetworkIPResolution (TNIR),可用來明確連線到 Always On 可用性群組或具有多個相關聯 IP 位址的伺服器。 當 transparentNetworkIPResolution 為 true 時,驅動程式會嘗試連線到第一個可用的 IP 位址。 如果第一次嘗試失敗,驅動程式就會嘗試以平行方式連線到所有 IP 位址,直到逾時到期為止,當其中一個成功時,就會捨棄所有暫止的連線嘗試。
注意:
- transparentNetworkIPResolution 預設為 true
- 如果 multiSubnetFailover 為 true,則會忽略 transparentNetworkIPResolution
- 如果使用資料庫鏡像,則會忽略 transparentNetworkIPResolution
- 如果 IP 位址超過 64 個,則會忽略 transparentNetworkIPResolution
- 當 transparentNetworkIPResolution 為 true 時,第一次連線嘗試會使用 500 毫秒的逾時值。 其餘的連線嘗試都會遵循與 multiSubnetFailover 功能相同的邏輯。
注意
如果您使用的是 Microsoft JDBC Driver 4.2 (或更早版本) for SQL Server,且 multiSubnetFailover 為 false,則 SQL Server 會嘗試連線至第一個 IP 位址。 如果 Microsoft JDBC Driver for SQL Server 無法建立與第一個 IP 位址的連線,則連線會失敗。 Microsoft JDBC Driver for SQL Server 將不會嘗試連線至與伺服器建立關聯的任何後續 IP 位址。
注意
增加連接逾時並實作連接重試邏輯可提高應用程式連接到可用性群組的機率。 此外,因為連接可能會由於可用性群組容錯移轉而失敗,所以您應該實作連接重試邏輯,並重試失敗的連接,直到重新連接為止。
使用 multiSubnetFailover 進行連線
在連線至 SQL Server 2012 (11.x) 可用性群組的可用性群組接聽程式或 SQL Server 2012 (11.x) 容錯移轉叢集執行個體時,一律指定 multiSubnetFailover=true。 multiSubnetFailover 可讓所有可用性群組和 SQL Server 2012 (11.x) 中的容錯移轉叢集執行個體容錯移轉得更快,並大幅縮短單一和多重子網路 Always On 拓撲的容錯移轉時間。 在多重子網路容錯移轉期間,用戶端會平行嘗試連接。 在子網路容錯移轉期間,Microsoft JDBC Driver for SQL Server 會積極重試 TCP 連線。
multiSubnetFailover 連線屬性指出正在可用性群組或容錯移轉叢集執行個體中部署應用程式,且 Microsoft JDBC Driver for SQL Server 將會嘗試連線至所有 IP 位址,以試著連線至主要 SQL Server 執行個體上的資料庫。 為連線指定 MultiSubnetFailover=true 時,用戶端會以比作業系統預設 TCP 重新傳輸間隔更快的速度,重試 TCP 連線嘗試。 此行為可在容錯移轉 Always On 可用性群組或 Always On 容錯移轉叢集執行個體之後更快重新連線,且同時適用於單一和多重子網路可用性群組和容錯移轉叢集執行個體。
若要深入了解 Microsoft JDBC Driver for SQL Server 中的連接字串關鍵字,請參閱設定連線屬性。
當連線至可用性群組接聽程式或容錯移轉叢集執行個體以外的某個項目時,指定 multiSubnetFailover=true 會導致降低效能,所以不支援此方式。
如果未安裝安全性管理員,則 Java Virtual Machine 會在一段有限期間快取虛擬 IP 位址 (VIP),這在預設情況下是由您的 JDK 實作以及 Java 屬性 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 所定義。 如果已安裝 JDK 安全性管理員,則 Java Virtual Machine 將會快取 VIP,而且預設不會重新整理快取。 您應該針對 Java Virtual Machine 快取將「存留時間」(networkaddress.cache.ttl) 設定為一天。 如果您未將預設值變更為一天 (或一天左右),則當新增或更新 VIP 時,將不會從「Java 虛擬機器」快取中清除舊的值。 如需 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 的詳細資訊,請參閱 https://download.oracle.com/javase/6/docs/technotes/guides/net/properties.html。
請使用下列指導方針,連接到可用性群組或容錯移轉叢集執行個體中的伺服器:
如果在與 multiSubnetFailover 連線屬性相同的連接字串中使用 instanceName 連線屬性,驅動程式將會產生錯誤。 此錯誤反映以下事實:可用性群組中並未使用 SQL Browser。 但是,如果同時指定了 portNumber 連線屬性,驅動程式將會忽略 instanceName 並使用 portNumber。
如果在連線到單一子網路或多重子網路時使用 multiSubnetFailover 連線屬性,則會提高兩者的效能。
若要連接到可用性群組,在連接字串中指定可用性群組的可用性群組接聽程式做為伺服器。 例如,jdbc:sqlserver://VNN1。
連線到設定超過 64 個 IP 位址的 SQL Server 執行個體會導致連線失敗。
根據驗證的類型,使用 multiSubnetFailover 連線屬性的應用程式,其行為不會受到影響:SQL Server 驗證、Kerberos 驗證或 Windows 驗證。
提高 loginTimeout 的值來配合容錯移轉時間,並減少應用程式連線重試次數。
如果唯讀路由不在作用中,在下列狀況下,連線至可用性群組中的次要複本位置將會失敗:
如果未設定次要複本位置來接受連線。
如果應用程式使用 applicationIntent=ReadWrite,而且已針對唯讀存取設定次要複本位置。
如果設定主要複本拒絕唯讀工作負載,而且連接字串包含 ApplicationIntent=ReadOnly,則連接會失敗。
從資料庫鏡像升級到使用多重子網路叢集
如果您將目前使用資料庫鏡像的 Microsoft JDBC Driver for SQL Server 應用程式升級至多重子網路案例,則應移除 failoverPartner 連線屬性,並取代成設定為 true 的 multiSubnetFailover,然後將連接字串中的伺服器名稱取代為可用性群組接聽程式。 如果連接字串使用 failoverPartner 和 multiSubnetFailover=true,驅動程式會產生錯誤。 不過,如果連接字串使用 failoverPartner 和 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 秒。
連線共用
將 Microsoft JDBC Driver for SQL Server 與連線共用程式庫一起使用時,應考慮下列幾點:
- 若已設定唯讀路由,並具有將負載分散到其中的唯讀伺服器集區,則連線共用將可減少新連線分配到目標伺服器上的機會。
- 若要避免在集區中的任何單一伺服器上產生較高的負載,請選擇 [集區] 選項,以鼓勵連線平均分散在整個集區。
- 請確定使用連線存留期來設定連線集區。 若在進行唯讀連線時無法使用唯讀複本時,組態應確定最後會關閉連線,並在其中一個複本再次可供使用時,重新建立至唯讀複本。
支援 multiSubnetFailover 與 applicationIntent 的新方法
下列方法可讓您以程式設計方式存取 multiSubnetFailover、applicationIntent 和 transparentNetworkIPResolution 連接字串關鍵字:
SQLServerDataSource.setTransparentNetworkIPResolution
SQLServerDataSource.getTransparentNetworkIPResolution
getMultiSubnetFailover、setMultiSubnetFailover、getApplicationIntent、setApplicationIntent、getTransparentNetworkIPResolution 和 setTransparentNetworkIPResolution 方法也會新增到 SQLServerDataSource 類別、SQLServerConnectionPoolDataSource 類別和 SQLServerXADataSource 類別。
TLS/SSL 憑證驗證
可用性群組是由多個實體伺服器所組成。 Microsoft JDBC Driver 4.0 for SQL Server 已在 TLS/SSL 憑證中新增對主體別名的支援,以便讓多個主機可以與相同憑證建立關聯。 如需 TLS 的詳細資訊,請參閱了解加密支援。