企業級應用對高可用性的要求日益嚴苛,99.99% 甚至 99.999% 的可用性指標意味著全年停機時間不得超過 52.6 分鐘甚至 5.26 分鐘。Oracle 9i RAC (Real Application Clusters) 作為高可用架構的核心組件,提供了透明應用故障切換功能,使資料庫連接在節點故障時自動遷移至可用節點,對應用程式完全透明。本文詳細解析如何通過 JDBC 配置實現 TAF。
Oracle 9i RAC 的 TAF(Transparent Application Failover)屬於客戶端故障切換機制。當集群節點發生故障時:
透過 JDBC Thin 驅動連接 RAC 並啟用 TAF,關鍵在於構建包含負載均衡與故障切換參數的連接描述符:
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@(" +
"DESCRIPTION=" +
" (ADDRESS_LIST=" +
" (LOAD_BALANCE=yes)" + // 啟用客戶端負載均衡
" (ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521))" +
" (ADDRESS=(PROTOCOL=TCP)(HOST=node2)(PORT=1521))" +
" (ADDRESS=(PROTOCOL=TCP)(HOST=node3)(PORT=1521))" +
" (ADDRESS=(PROTOCOL=TCP)(HOST=node4)(PORT=1521))" +
" )" +
" (CONNECT_DATA=" +
" (SERVICE_NAME=oracleServerName)" + // 服務名而非 SID
" (FAILOVER_MODE=" +
" (TYPE=select)" + // 故障切換類型:select/session/none
" (METHOD=basic)" + // 切換模式:basic/preconnect
" (RETRIES=20)" + // 重試次數
" (DELAY=15)" + // 重試間隔(秒)
" )" +
" )" +
")";
String user = "userName";
String password = "userPassword";
Connection conn = DriverManager.getConnection(url, user, password);
| 參數 | 說明 | 推薦值/選項 |
|---|---|---|
LOAD_BALANCE | 客戶端連接時是否隨機選擇地址列表中的節點 | yes(生產環境建議開啟) |
FAILOVER_MODE.TYPE | 故障切換類型 | select(查詢重發)、session(僅會話切換)、none(禁用) |
FAILOVER_MODE.METHOD | 切換策略 | basic(故障時重連)、preconnect(預建備用連接,資源消耗大) |
RETRIES | 重連嘗試最大次數 | 視網絡環境而定,典型值 10-30 |
DELAY | 兩次重試間隔(秒) | 5-30 秒,避免風暴式重連 |
SERVICE_NAME 支援負載均衡與故障切換,SID 僅指向單一實例。connectionInitSql 或 validationQuery 檢測失效連接。oracle.jdbc.OracleConnection.FailoverCallback 介面記錄切換日誌,便於事後分析。正確配置 JDBC TAF 能夠顯著提升 Oracle RAC 環境下應用的韌性,是構建高可用企業級系統的關鍵技術環節之一。