-- tnsnames.ora 設定
MYDB =
(DESCRIPTION =
(LOAD_BALANCE = YES)
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
)
客戶端隨機選取地址清單中的一個。缺點:無感知實際負載,極易造成節點負載不均,生產環境極少採用。
機制:PMON 定期收集節點負載(CPU、連線數等),向本地與遠端 Listener 註冊。Listener 接收連線請求時,導向負載最低節點。
關鍵設定:
REMOTE_LISTENER 參數指向所有節點的 Listener(採用 SCAN VIP 最佳)。優點:動態感知負載;風險:可能將同一應用的連線分散至多節點,引發大量 Cache Fusion(全域緩存融合)傳輸,反而降低效能。
「將同一業務的連線集中在同一節點,最大化本地存取,最小化跨節點傳輸。」
-- 建立服務並指定慣用/可用實例
SRVCTL ADD SERVICE -d orcl -s app_a -r "orcl1" -a "orcl2"
SRVCTL ADD SERVICE -d orcl -s app_b -r "orcl2" -a "orcl1"
-- 客戶端連線指定服務
APP_A = (DESCRIPTION = (ADDRESS = ...)(CONNECT_DATA = (SERVICE_NAME = app_a)))
-a (AVAILABLE) 實例自動接管,高可用性不折損。| 場景 | 推薦策略 |
|---|---|
| 少數核心 OLTP 應用、高併發 | Service 綁定慣用節點 + 故障切換 |
| 大量異構報表/批次查詢 | Server-side Load Balance(利用並行查詢分散) |
| 混合負載 | 核心交易用 Service 親和性,報表用負載均衡 |
-- 檢視服務分佈
SELECT inst_id, name, goal, dtp FROM gv$services;
-- 檢視連線分佈
SELECT inst_id, service_name, count(*) FROM gv$session GROUP BY inst_id, service_name;
-- Cache Fusion 統計
SELECT * FROM gv$sysstat WHERE name LIKE '%gc cr%';
RAC 負載均衡不是越均勻越好。理解 Cache Fusion 代價,透過 Service 實現「業務親和性」,才是發揮 RAC 效能的關鍵。