Oracle RAC 環境下的連接管理(一)

2021-12-25 雲和恩墨


崔華,網名 dbsnake

Oracle ACE Director,ACOUG 核心專家

(【崔華文章系列】已獲崔華獨家授權在雲和恩墨官方微信帳號陸續發布,請大家持續關注)

這篇文章詳細介紹了 Oracle RAC 環境下的連接管理,分別介紹了什麼是 Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover 和 Runtime Connection Failover,以及裡面所涉及到的 TAF、ONS、FCF、FAN、LBA 等諸多知識點。本文主要是針對 Oracle RAC 11gR2 環境下的連接管理,但同時也會對比說明一下 Oracle RAC 10gR2/9iR2,以體現他們之間在連接管理上的差異。

所謂「連接管理」,主要體現在 Load Balancing 和 Failover 兩方面。Oracle RAC 11gR2 下的 Load Balancing 和 Failover,根據是否使用了事先已經存在的連接(如連接池中的連接)又分為 Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover 和 Runtime Connection Failover 這 4 種類型,凡是帶上了「Runtime」前綴的,就是指連接已經存在的情況,比如使用了連接池。

一、首先來介紹 Connect Time Connection Failover

Connect Time Connection Failover 是指不從連接池中取得已有連接,而是直接連接 Oracle 資料庫時的 Failover。在 Oracle RAC 11gR2 之前,Connect Time Connection Failover 是非常容易實現的,只需要在相關的 tnsnames.ora 中指定多個 vip,同時指定 FAILOVER=ON 就好了。如下所示:

(DESCRIPTION= (FAILOVER=ON) (ADDRESS_LIST= (LOAD_BALANCE=OFF) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=RAC10g)) )

這裡客戶端進程首先會嘗試連接 RAC1-vip,如果連不上,則會嘗試 RAC2-vip,再連不上,則會繼續往下嘗試,直到所有出現在 ADDRESS_LIST 中的 vip 地址全部順序嘗試完為止。這種客戶端在連接 Oracle 資料庫時的 Failover,不僅適用於 RAC 環境,也適用於 Data Guard 環境。如下所示:

DESCRIPTION= (FAILOVER=ON) (ADDRESS_LIST= (LOAD_BALANCE=OFF) (ADDRESS=(PROTOCOL=TCP)(HOST=primary-ip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=standby-ip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=service10g)) )

Oracle RAC 11gR2 引入了 SCAN(Single Client Access Name),並且客戶端預設是通過 SCAN 來連接整個 RAC 環境的,如下是 SCAN 的架構圖:

如上圖所示,如果使用了 DNS 或者 GNS (Grid Naming Service),那麼最多可以有 3 個 SCAN VIP 和 3 個 SCAN Listener;如果沒有使用 DNS 或者 GNS,而是選擇使用 hosts 文件,則只會有 1 個 SCAN VIP 和 1 個 SCAN Listener。

這裡假設在 tnsnames.ora 中這樣配置:

(DESCRIPTION = (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g)))

嚴格意義上說,只有在 RAC 環境有 1 個以上 SCAN VIP 的時候,上述 FAILOVER=ON 才有意義——它表示的是客戶端在連接 SCAN VIP 的時候,如果其中的一個 SCAN VIP 連不上,則馬上會嘗試另外一個 SCAN VIP。

當使用了 hosts 文件來指定 SCAN VIP 的時候,即在整個 RAC 環境只有 1 個 SCAN VIP 的情況下,Failover 其實也存在,只不過這種情況下 Failover 的速度會慢一些。因為當 SCAN VIP 所在的節點宕掉後,SCAN VIP 會和相關的 SCAN Listener 一起整體 Failover 到其他節點,只不過這個 Failover 需要時間,而客戶端需要等待這個 Failover 過程完畢後才能重新連上 RAC。

二、接下來介紹 Runtime Connection Failover

Runtime Connection Failover 是指連接已經存在的情況下的 Failover。這個已存在的連接,可能是連接池中正在用的連接,也可能是不通過連接池、直接通過 OCI 客戶端(如 sqlplus)連上 Oracle 資料庫後的連接。

這種 Runtime Connection Failover,就是指在連接已經存在的情況下,如果 Oracle 資料庫端出現了異常的情況(比如 Service 宕了、Instance 崩潰了、Session 斷了)而導致已有連接中斷,怎樣 Failover 的問題。

有兩種手段來實現 Runtime Connection Failover,分別為 TAF(Transparent Application Failover)和 FCF(Fast Connection Failover)。

首先來介紹 TAF。TAF 有如下一些知識點需要我們注意:

1、它可以在 client 端的 tnsnames.ora 中的連接串裡定義,也可以在 server 端的 service 中定義,只不過 service 端的設置會取代(override)客戶端 tnsnames.ora 中的設置:

客戶端可以這樣設置 TAF:

(DESCRIPTION = (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = Email) (FAILOVER_MODE= (TYPE=select)(METHOD=basic)(RETRIES=180)(DELAY=5)))

Server 端可以這樣設置 TAF:

srvctl modify service -d RAC11g -s Email -q TRUE -P BASIC -e SELECT -z 180 -w 5 -j LONG 具體各個參數的含義可參見如下注釋:

Usage: srvctl modify service -d <db_unique_name> -s <service_name> [-c {UNIFORM | SINGLETON}] [-P {BASIC|PRECONNECT|NONE}] [-l [PRIMARY][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]] [-y {AUTOMATIC | MANUAL}][-q {true|false}] [-x {true|false}] [-j {SHORT|LONG}] [-B {NONE|SERVICE_TIME|THROUGHPUT}] [-e {NONE|SESSION|SELECT}] [-m {NONE|BASIC}] [-z <integer>] [-w <integer>] -d <db_unique_name> Unique name for the database -s <service> Service name -c {UNIFORM | SINGLETON} Service runs on every active server in the server pool hosting this service (UNIFORM) or just one server (SINGLETON) -P {NONE | BASIC | PRECONNECT} TAF policy specification -l <role> Role of the service (primary, physical_standby, logical_standby, snapshot_standby) -y <policy> Management policy for the service (AUTOMATIC or MANUAL) -e <Failover type> Failover type (NONE, SESSION, or SELECT) -m <Failover method> Failover method (NONE or BASIC) -w <integer> Failover delay -z <integer> Failover retries -j <clb_goal> Connection Load Balancing Goal (SHORT or LONG). Default is LONG. -B <Runtime Load Balancing Goal> Runtime Load Balancing Goal (SERVICE_TIME, THROUGHPUT, or NONE) -x <Distributed Transaction Processing> Distributed Transaction Processing (TRUE or FALSE) -q <AQ HA notifications> AQ HA notifications (TRUE or FALSE) -h Print usage

2、當 TAF 的TYPE 設置為 select 的時候,單純 select 操作(不包括 select … for update)可以做到「斷點續傳」,即單純的 select 操作在利用 TAF 實現 Failover 後是可以從中斷的地方繼續往下執行的;
3、TAF 對 DML 操作不能做到「斷點續傳」,即如果一個 transaction 在使用 TAF 實現 Failover 後,該 transaction 不能從中斷的地方繼續執行,需要再次從頭開始執行;
4、TAF 僅對使用 OCI 連接的客戶端和連接池有效,這裡的 OCI 連接可以是在 OCI 連接上的封裝,比如 JDBC-OCI driver 就支持 TAF,但 JDBC thin driver 就不支持 TAF(因為 JDBC thin driver 不是基於 OCI 的)。

接下來,在介紹 FCF(Fast Connection Failover)之前,我們必須要先介紹 FAN(Fast Application Notification)。

FAN 是 Oracle RAC 裡的一種消息主動通知機制。當 RAC 裡出現 service down/up,instance down/up,節點負載變化時,Oracle 資料庫都能通過 FAN events 將這些信息發布出去,訂閱這些 FAN events 的客戶端在第一時間收到這些 FAN events 後就能做出相應的動作來響應這些 FAN events。

FAN events 分為兩種,第一種是 FAN HA events,第二種是 LBA events,這裡的 LBA 是指 Load Balancing Advisory。

當 RAC 裡出現 service down/up、instance down/up 時就會觸發 FAN HA events。FAN HA events 的示例如下所示:

Event 1: FAN event type: instance Properties: version=1.0 service=PROD database=PROD instance=PROD1 host=node1 status=down Event 2: FAN event type: service_member Properties: version=1.0 service=ERP database=PROD instance=PROD1 host=node1 status=downEvent 3: FAN event type: service_member Properties: version=1.0 service=ERP database=PROD instance=PROD3 host=node3 status=up

RAC 裡節點的負載變化後也會產生 LBA events,LBA events 的示例如下所示:

Event 4: FAN-event type: service_metrics Properties: version=2.0 service=ERP database=PROD instance=PROD1 percent=70 service_quality=GOOD instance=PROD2 percent=30 service_quality=GOOD Event 5 :FAN-event type: service_metrics Properties: version=2.0 service=CRM database=PROD instance=PROD2 percent=30 service_quality=GOOD instance=PROD3 percent=70 service_quality=GOOD

上述 FAN events 可能會通過多種渠道傳播出去,這些渠道包括 ONS(Oracle Notification Service),AQ(Advanced Queue),PMON 等。下面是關於 FAN events 架構和傳播途徑的兩張圖,它們就直觀的說明了 FAN events 的傳播途徑:

訂閱 FAN HA events 的客戶端包括:JDBC Implicit Connection Cache, OCI, ODP.NET Connection Pools, Listener, Server Side Callouts 等;


訂閱 LBA events 的客戶端包括:JDBC Implicit Connection Cache, ODP.NET Connection Pools, Listener,OCI Session Pools 等;

介紹完 FAN,現在可以開始介紹 FCF:FCF 的意思是 Fast Connection Failover,它實際上是客戶端通過訂閱 FAN HA events 來實現的。如下是兩個客戶端通過訂閱 FAN HA events 來實現 FCF 的例子:

例一:JDBC Fast Connection Failover (FCF)
這裡的 JDBC 連接是指 JDBC thin 連接。因為 JDBC thin 連接不是基於 OCI 的,所以這種情況下的 Runtime Connection Failover 不能使用 TAF,只能用 FCF。並且要做如下幾件事情後才可以正常使用 FCF:
1、把 implicit connection cache 打開;
2、把 FastConnectionFailoverEnabled 打開;
3、最好是直接訂閱遠程的 ONS(在Oracle 10gR2 之前的版本不能直接訂閱遠程的 ONS,只能通過在本地安裝 ONS 後來實現 FAN events 的中轉);
4、最好是在 Java 程序裡設置一下 TCP timeout(後面專門會講到在 Oracle 資料庫裡如何調整 TCP timeout);

演示代碼如下:

OracleDataSource ods = new OracleDataSource() ... ods.setUser(「Scott」)ods.setPassword(「tiger」)ods.setConnectionCachingEnabled(true); ods.setFastConnectionFailoverEnabled(true); ods.setConnectionCacheName(「MyCache」)ods.setConnectionCacheProperties(cp); ods.setONSConfiguration("nodes=racnode1:6201,racnode2.:6201"); ods.setURL("jdbc:oracle:thin:@sales1-scan:1521/oltp");//TCP connect timeoutProperties prop = new Properties();prop.setProperty("MinLimit", MIN_CONN);prop.setProperty("MaxLimit", MAX_CONN);prop.setProperty("InitialLimit", INIT_CONN);prop.put (oracle.net.ns.SQLnetDef.TCP_CONNTIMEOUT_STR, "1000")); // 這裡是表示把TCP timeout設為1000毫秒,即1秒ods.setConnectionCacheProperties(prop);

例二:ODP.NET Fast Connection Failover (FCF)
對於 ODP.NET 而言,通常做了如下幾件事情後就可以使用 FCF 了:
1、把對應 service 的 AQ Notification 打開:
srvctl modify service -d RAC11g -s Email -q TRUE
2、把 aq_tm_processes 的值設為 1;
3、賦予指定用戶 de-queue 的權限:
exec dbms_aqadm.grant_queue_privilege('DEQUEUE','SYS.SYS$SERVICE_METRICS', <your username=>);
4、在 .NET 連接串裡設置 HA events=true;

演示代碼如下:

// C# using System; using Oracle.DataAccess.Client; class ConnectionPoolingSample { static void Main() { OracleConnection con = new OracleConnection(); //Open a connection using ConnectionString attributes //related to connection pooling. con.ConnectionString = "User Id=scott;Password=tiger;Data Source=crm;" + "Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;" + "HA events=true", "Incr Pool Size=5; Decr Pool Si=2"; con.Open(); Console.WriteLine("Connection pool successfully created"); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Connection is placed back into the pool."); } }

FCF 跟 TAF 有一個很大的不同就是即便是單純 select 操作,FCF 也不能像 TAF 那樣做到「斷點續傳」。對於配置好了 FCF 的連接池而言,當它接收到包含 instance/service 宕掉的 FAN HA events 後,原先 cache 在連接池裡的跟這個 instance/service 相關的連接馬上會被標記為失效(invalid)同時這些連接會被清除,使用這些連接的 transaction 也會馬上中止並回滾。當應用捕捉到這個中止的 transaction 所產生的錯誤信息後,要麼直接把相關錯誤返回給最終用戶,要麼從連接池中重新取得一個有效連接並重新執行這個被中止的 transaction。

在啟用了 FCF 的情況下,如果連接錯誤被返回給了最終用戶,那麼應該如何判斷錯誤信息的來源呢(即是否是 FCF 返回的錯誤)?很簡單,用 isFatalConnectionError(SQLException e)來判斷一下就好了,演示代碼如下:

try { conn = getConnection(); //這裡取得連接後做相關的工作} catch (SQLException e) { handleSQLException(e) } ... void handleSQLException (SQLException e) { if (OracleConnectionCacheManager.isFatalConnectionError(e)) ConnRetry = true; //這裡表示捕捉到FCF返回的錯誤 …}

搜索蓋國強(Eygle)微信號:eeygle,或者掃描下面二維碼,備註:雲和恩墨大講堂,即可入群。每周與千人共享免費技術分享,與講師在線討論。


數據驅動,成就未來。整合業界頂尖的技術與合作夥伴資源,圍繞數據及相關領域,提供解決方案和專業服務。專項服務:架構/安全/容災/優化/整合/升級/遷移恩墨學院是雲和恩墨(北京)信息技術有限公司旗下的培訓事業部,創業數年專注於資料庫認證、技能培訓,以專業的講師塑造品牌,以專業的訓練保證就業,目前已經發展成為國內資料庫領域培訓領導品牌。

相關焦點

  • Oracle RAC 環境下的連接管理(二)
    Oracle RAC 11gR2 裡引入了 SCAN,所以 Oracle RAC 11gR2 環境下 remote_listener 應設置為 SCAN:port。server 端的 Connect Time Load Balancing 實際上已經配置好了,但從如下內容可以看到,我們並沒有在 $ORACLE_HOME/network/admin 下的 tnsnames.ora 中配置相關的 local_listener 和 remote_listener:ora11g:/nbsdu01/app/oracle/product/11.2/network
  • Oracle RAC 集群結構
    RAC集群結構圖:RAC拓撲結構一個oracle rac集群資料庫是由兩個或者兩個以上的伺服器節點組成,每臺伺服器都有自己的OS,cluseterware,rac和listener網絡監聽器Cluseterware是oracle 開發的一個集成軟體,主要作用是集群的系統管理;rac作用是提供oracle實例進程,供客戶端訪問集群系統;監聽服務主要用於監控自己為網絡埠信息,所有的程序都是通過作業系統去訪問最下層的共享存儲讀寫數據。
  • 【安裝篇】- 基於 VMWARE Oracle Linux7.9 安裝 Oracle19c RAC 詳細配置方案
    尤其後面章節連接測試,日常管理,值得推薦。8.3.1 連接CDB8.3.2 連接pdb8.3.3 datafile九 RAC日常管理命令9.1 集群資源狀態9.2 集群服務狀態9.3 資料庫狀態9.4 監聽狀態9.5 scan狀態9.6 nodeapps狀態9.7 VIP狀態
  • Python連接oracle資料庫實踐
    方法一:官方網站下載安裝https://pypi.org/project/cx-Oracle/方法二:通過pip安裝pip install cx_oracle -i https://pypi.douban.com/simple 1、首先查看資料庫版本,通過如下sql查看版本信息:select
  • oracle 12.2 local temp的原理和實現
    Hub節點緊密連接,可以直接訪問共享存儲,並作為一個或多個Leaf 節點的錨點。 leaf 節點與Hub節點鬆動連接,可能無法直接訪問共享存儲。local temp和local undo的概念不一樣,首先pdb必須使用自己的temp表空間,local temp指的是RAC環境下,可以在各自的節點上創建local temp表空間,擁有各自的temp表空間就跟擁有各自的PGA一樣,對於只讀節點來說大的排序需要用到temp時就不需要去看這塊空間另外一個節點有沒有使用,另外避免了兩邊同時使用temp表空間產生的爭用
  • RAC環境診斷案例一則
    在RAC環境中,其中一個節點上的alert文件中出現了如下信息:waiting for instances to leave。首先是硬體維護髮現RAC伺服器的其中一個節點DOWN機,這個伺服器無法通過遠程登錄。在資料庫中檢查發現:節點1關閉,節點2正常運行。
  • Oracle 數據文件轉移:[1]表空間-百家號 - 百度經驗
    資料庫處於open狀態需求確定:1:確定需求操作步驟:1:停止監聽或者重啟資料庫(目的是保證應用不連接資料庫)2:設置表空間為read only 3:設置表空間為 offline狀態4:複製數據文件到新的路徑5:rename 轉移數據文件6:設置表空間 online 狀態7:設置表空間為 read write8:刪除原路徑中已經複製的數據文件注意:這裡是轉移的是應用表空間,對系統表空間system、
  • R語言:資料庫連接:oracle、mysql及hive
    這裡使用RJDBC與資料庫溝通,因為它對多種數據均適用,所以這裡暫時以這種簡單的方式與資料庫溝通,但是在使用RJDBC之前你首先要安裝java並配置環境變量,請參看輿情分析的章節,安裝完成之後可以在R裡面安裝rJava和RJDBC包了,如果還是不懂,就需要百度了,比如說如何安裝oracle客戶端,如何配置java的環境變量等等。
  • Oracle19c RAC異機恢復到單機
    1 環境信息主庫信息備庫信息
  • 時過境遷:Oracle跨平臺遷移之XTTS方案與實踐
    ,都在同一個目錄下,即目標端的最終存放數據文件的目錄大小要足夠存放一個批次中所有的表空間數據文件。注意:RAC 環境下,需要將塊追蹤文件存放在共享存儲上,否則會導致 DFS LOCKHANDLE,導致實例異常。3.3.  準備階段,進行數據全量同步3.3.1.
  • Oracle RAC上雲怎麼玩?
    實現Oracle RAC在雲化環境下的部署,有幾個關鍵因素需要考慮:1、資料庫可用性;2、資料庫磁碟配置和數據安全;3、資料庫性能保障。  超融合通過平臺的Hugepages並結合linux作業系統的內核特性,提升了在大量業務並發的壓力下Oracle RAC的事務性能。
  • oracle數據脫敏工具-安華金和
    功能三:數據子集管理oracle數據脫敏系統支持對目標資料庫中一部分數據進行脫敏,用戶可指定過濾條件,對數據來源進行過濾篩選形成數據子集,適應不同場景下脫敏需求。對於同一類應用場景,用戶可將若干脫敏策略組合成為適用於該場景的脫敏方案,脫敏方案制定後,可被重複利用於該場景下不同批次數據的脫敏需求。功能五:脫敏任務管理oracle數據脫敏任務可針對目標資料庫系統或結構化文件進行。
  • 技術乾貨|Oracle RAC上雲怎麼玩?
    圖示:RAC在傳統物理環境下的部署結構由上可看出Oracle RAC既有它的優勢也有不足之處:RAC方案優點:1、多節點並發處理,高性能;2、高可用,跨四切換;3、高擴展性RAC方案不足:1、相對單機管理更複雜;2、如果系統規劃設計能力不足,性能可能不如單節點;傳統的Oracle RAC在管理、監控、硬體性能擴展、存儲擴容方面有明顯局限性,超融合架構具有隨需應變、靈活擴展、高可用、高可靠等天然優勢,如果Oracle RAC與超融合架構相結合,則可以很好地解決這些問題。
  • Oracle連接查詢
    收錄於話題 #oracle其中可以包括:1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列。2、不等連接:在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值,這些關係運算符包括>、>=、<=、!>、!<、<>。案例所需表結構:學生信息系統。
  • 【DB筆試面試850】在Oracle中,造成錯誤「ORA-12547: TNS:lost contact」的常見原因有哪些?
    2、確認$ORACLE_HOME/bin/oracle文件權限和屬主是否有問題需要注意的是,在rac環境下需要查看$ORACLE_HOME/bin/oracle和$GRID_HOME/bin/oracle兩個文件。
  • 【高可用】Oracle高可用培訓(RAC+DG+OGG)--包括11g、12c、18c、19c等版本
    小麥苗高可用課程第24節(DG)【已加密】小麥苗高可用課程第25節(RAC)【已加密】小麥苗高可用課程第26節(OGG)【已加密】小麥苗高可用課程第27節(OGG)【已加密】小麥苗高可用課程第28節(RAC)【已加密】小麥苗高可用課程第29節(OGG)小麥苗高可用課程第30.0節小麥苗高可用課程第30.1節以下視頻的地址:https://ke.qq.com/course/346793Oracle 18c rac
  • Python 連接MS SQL和Oracle資料庫
    本文將介紹如何使用Python連接SQL Server及Oracle資料庫,並將返回結果轉換為Pandas DataFrame格式,便於後期數據分析
  • Oracle RAC性能調整
    顯然,如果在single-Instance環境中存在序列化問題,在RAC中,該問題會更加嚴重。    4、RAC操作特有的潛在因素    在RAC AWR報告中,在RAC統計一章包含了一個表,用於記錄一些全局cache services和全局隊列services操作的平均時間。該表被稱作是Global cache and Enqueue services: workload characteristics。
  • ORACLE 資料庫維護
    listener#su - oracle#lsnrctl start如果出錯檢查環境變量是否設好,及 lsnrctl 文件的內容和執行屬性。資料庫處於 shutdown 狀態2.5.3.1 磁碟全部損壞,僅保存上次聯機全備份和每天日誌備份這是最壞情況解決硬體故障,配置系統軟體及環境oracle 用戶,將全備份和日誌備份轉移至相應目錄,根據 initSid.ora中 controlfile 的配置,將備份控制文件複製到響應目錄下