oracle rac理论知识
?????? oracle數(shù)據(jù)庫高可靠性高性能的特性是很多企業(yè)需要的,這些年一直給各大政府企業(yè)做oracle咨詢與規(guī)劃,實施安裝以及維護,回頭看看,自己已經(jīng)忘記大部分oracle rac的整體具體架構(gòu)理論知識,現(xiàn)在回頭再復習一次,感覺很清晰。
1.集群相關(guān)理論概述
一個集群(cluster)由2個或多個節(jié)點(nodes)組成。一般集群對外都會有統(tǒng)一的服務(wù)接口(集群地址),對內(nèi)需要(集群內(nèi)部通信)不斷確定集群內(nèi)部節(jié)點可用,一旦發(fā)生異常,可以通過(集群仲裁)驅(qū)逐問題Partition,使得集群能夠不影響整體對外提供服務(wù)。
集群系統(tǒng)的設(shè)計一般都需要考慮2個經(jīng)典問題:健忘和腦裂。
健忘:集群的配置文件,集群中各節(jié)點需要保證集群配置文件的一致性;
Oracle Clusterware集中記錄這些信息到OCR,且整個集群只保留一份配置,各節(jié)點共用這份配置,解決了健忘的問題。
腦裂:集群內(nèi)節(jié)點心跳通信故障時,集群需要決定具體哪個partition被踢出集群。
Oracle Clusterware采用兩種心跳機制:網(wǎng)絡(luò)心跳和磁盤心跳;當通過私有網(wǎng)絡(luò)的網(wǎng)絡(luò)心跳故障,需要使用voting disk的磁盤心跳來仲裁Partition剔除。
腦裂問題緊接著還涉及一個IO Fencing問題,即需要保護數(shù)據(jù)不被故障節(jié)點所修改破壞。RAC使用oprocd進程實現(xiàn)IO Fencing。
為了便于學習和理解,將RAC環(huán)境分為 存儲層、網(wǎng)絡(luò)層、集群層、應(yīng)用層 4層來分別學習。
存儲層
由SAN組成的存儲層,由于RAC架構(gòu)是共享存儲,常規(guī)場景下只需要有一個存儲。
但如果預算充足,為了進一步提高可用性,我們完全可以在存儲層考慮使用2個存儲,在存儲層構(gòu)建一個存儲層面的集群。比如使用EMC的vplex,HDS的GAD(Global-Active Device)等。
這種存儲級別的集群,在extended RAC架構(gòu)中很常見。這一塊基本都偏向于底層存儲層面的知識,與RAC本身關(guān)系不大,不再多說。
網(wǎng)絡(luò)層
public IP:集群各節(jié)點真實IP地址,和其他應(yīng)用服務(wù)器連接在一個交換機上。
10g RAC VIP:在Public IP所在網(wǎng)卡上綁定一個VIP。
優(yōu)點是:VIP是浮動的,使用VIP,可以避開對TCP協(xié)議棧超時的依賴。
11g RAC SCAN IP:在 VIP 基礎(chǔ)上 再引入的scan IP,也有對應(yīng)的scan IP的監(jiān)聽。
優(yōu)點是:使用scan IP配置客戶端連接,以后集群內(nèi)部添加刪除節(jié)點,不需改動客戶端的tns配置。
private IP:集群內(nèi)部互聯(lián)IP,大數(shù)據(jù)量、低延遲要求,預算低用G級以太網(wǎng),預算高用infiniband。
網(wǎng)絡(luò)心跳(Network Heartbeat)使用這個private IP網(wǎng)絡(luò)。
緩存融合(Cache Fusion)也是通過這個private IP網(wǎng)絡(luò)進行傳輸。
集群層
集群層是在OS kernel和應(yīng)用之間的一層。用來統(tǒng)一協(xié)調(diào)集群內(nèi)各節(jié)點正常調(diào)度有序工作。
10g RAC 通過Oracle Clusterware來實現(xiàn)這一層的功能。
11g RAC 改名clusterware為GI。
GI除了名字上的不同,還有很多改變,比如將ASM安裝的集成到GI中,比如GI的安裝一般建議單獨用戶(grid)安裝,而之前clusterware一般都是和數(shù)據(jù)庫在同一用戶(oracle)安裝的等等,可以簡單認為GI比clusterware更加完善細化了。
應(yīng)用層
應(yīng)用層是指在集群件之上的具體應(yīng)用和資源。
RAC 按照用途主要把應(yīng)用層分為2大類:nodeapps(節(jié)點應(yīng)用) 和 database-related resource(數(shù)據(jù)庫資源)。
nodeapps:GSD、ONS、VIP、Listener等。
database-related:Database、Instance、Service等。
2.Oracle Clusterware
Oracle Clusterware是Oracle自己開發(fā)的能支持所有平臺的集群件,現(xiàn)在市場上還主要是用于RAC。
它的運行環(huán)境由兩個磁盤文件、若干后臺進程以及網(wǎng)絡(luò)元素組成。
2.1 磁盤文件
兩個磁盤文件,即OCR和Voting disk。
在10g RAC中,這兩個文件必須放在真正的裸設(shè)備上,不可以放在ASM中。
在11g RAC中,這兩個文件可以放在ASM上。
OCR:
負責維護整個集群的配置信息,包括RAC以及Clusterware資源,包括節(jié)點成員、數(shù)據(jù)庫、實例、服務(wù)、監(jiān)聽器、應(yīng)用程序等。
Voting disk:
存放在共享存儲上,在集群出現(xiàn)“腦裂”時,仲裁哪個Partition最終獲得集群的控制權(quán)。
2.2 后臺進程
大家都知道的Clusterware最重要的進程:
CSS:管理集群內(nèi)節(jié)點
CRS:管理集群資源
EVM:管理事件通知
我們具體來看clusterware中的主要后臺進程:
ocssd: 用來管理集群內(nèi)節(jié)點的加入/踢除。這個進程是clusterware中最關(guān)鍵的進程,如果該進程出現(xiàn)異常,會導致系統(tǒng)重啟。
oprocd: 用來實現(xiàn)IO Fencing,早期Linux平臺,使用hangcheck-timer模塊來實現(xiàn)IO Fencing,從10.2.0.4開始,Linux平臺也使用oprocd進程。
oclsomon: 用來監(jiān)控css進程,如果發(fā)現(xiàn)進程掛起,會重啟節(jié)點。
crsd: 用來管理集群內(nèi)資源,是實現(xiàn)HA的主要進程。負責管理注冊應(yīng)用的start、stop、monitor、failover。
racgwrap腳本:CRSD會使用這個腳本來啟動、關(guān)閉、檢查實例的狀態(tài)。
evmd: 負責發(fā)布CRS產(chǎn)生的各種事件。
racgimon: 用來監(jiān)控集群健康狀態(tài),負責Service的啟動、停止、故障轉(zhuǎn)移。
2.3 網(wǎng)絡(luò)元素
Oracle TAF是建立在VIP技術(shù)之上的。
TAF(Transparent Application Failover):對應(yīng)用透明的故障轉(zhuǎn)移。
文章前面在網(wǎng)絡(luò)層概述提到過:VIP是浮動的,使用VIP,可以避開對TCP協(xié)議棧超時的依賴。
原因是:
TCP/IP實際的四層模型從下到上依次為:網(wǎng)絡(luò)接口層(MAC)、網(wǎng)絡(luò)層(IP)、傳輸層(TCP)、應(yīng)用層(Listener)。
Public IP 和 VIP都屬于網(wǎng)絡(luò)層。
而當節(jié)點異常,對應(yīng)的VIP會飄到其他節(jié)點,而其他節(jié)點沒有該VIP地址的監(jiān)聽。VIP利用應(yīng)用層的立即響應(yīng),避開對TCP協(xié)議棧超時的依賴。
3.Oracle RAC 原理
拋磚引玉:
GCS、GES、GRD、PCM這些東西是如何堆砌在一起的?
RAC的HA、LB、Cache Fusion...
3.1 數(shù)據(jù)庫基本原理
數(shù)據(jù)庫基本原理:同時保證并發(fā)和數(shù)據(jù)一致性。
1) 隔離級別
SQL-92標準中定義了四個隔離級別:Read Uncommitted、Read committed、Repeatable、Serializable。
Oracle 默認實現(xiàn)read committed隔離級別而不影響并發(fā);這也曾是Oracle比較得意的地方。
2) 鎖
數(shù)據(jù)庫系統(tǒng)使用“鎖”來控制“并發(fā)”。
Lock:代表一種控制機制,Lock框架包含3個組件:Resource Structure(資源)、Lock Structure(鎖)、Enqueue(排隊機制)。
Row-Level Lock:對于“數(shù)據(jù)記錄”這種細粒度資源,Oracle使用的是行級鎖。
行級鎖共涉及以下4種數(shù)據(jù)結(jié)構(gòu):
ITL:塊頭ITL,用于記錄哪些事物修改了這個數(shù)據(jù)塊的內(nèi)容,可以把它想成一個表格,每行記錄一個事物,包括事物號、事物是否提交等重要信息。
記錄頭ITL索引:每條記錄的記錄頭部有一個字段,用于記錄ITL表項號,可以看作是指向ITL表的指針。
TX鎖:這個鎖代表一個事物,屬于Lock機制。
TM鎖:屬于Lock機制,用于保護對象的定義不被修改。
無論一個事物修改多少個表的多少條記錄,該事物真正需要的只是一個TX鎖,每個表一個TM鎖,內(nèi)存開銷非常小。而所謂的“行級鎖”只是數(shù)據(jù)塊頭、數(shù)據(jù)記錄頭的一些字段,不會消耗額外資源。
因此,對于Oracle的“行級鎖”必須要有正確的理解,它不是Oracle中通常意義上的“鎖”,雖然有鎖的功能,但是沒有鎖的開銷。
Latch: Latch請求,獲得,釋放等操作是原子操作,一般幾個硬件指令就可以完成。是一種低級鎖,主要用于保護數(shù)據(jù)結(jié)構(gòu)。
也就是說如果請求Latch得不到,不會釋放CPU資源,而會不斷嘗試請求,只有在一定次數(shù)還不能獲得時,才釋放CPU。這就是Latch的spin機制。
鎖模式:
--官方文檔中v$lock中LMODE取值 0 - none 1 - null (NULL) 2 - row-S (SS) 3 - row-X (SX) 4 - share (S) 5 - S/Row-X (SSX) 6 - exclusive (X) --手工加鎖語句語法參考 lock table &table_name in [ROW] SHARE, [[SHARE] ROW] EXCLUSIVE, SHARE UPDATE--2 - row-S (SS) lock table t_second_p in row share mode; lock table t_second_p in share update mode; --3 - row-X (SX) lock table t_second_p in row exclusive mode; --4 - share (S) lock table t_second_p in share mode; --5 - S/Row-X (SSX) lock table t_second_p in share row exclusive mode; --6 - exclusive (X) lock table t_second_p in exclusive mode;--查看被鎖的對象 select * from v$locked_object;3) SQL語句執(zhí)行過程:
用戶發(fā)出一條SQL語句,將主要經(jīng)過解析、優(yōu)化、產(chǎn)生執(zhí)行計劃、返回執(zhí)行結(jié)果幾個階段。
如果解析后發(fā)現(xiàn),在shared pool中已經(jīng)有對應(yīng)的執(zhí)行計劃,就可以直接拿來使用,相當于跳過了中間優(yōu)化、產(chǎn)生執(zhí)行計劃2個步驟,這就是軟解析。
這個過程中對Lock和Latch的使用:
前三個階段目的就是產(chǎn)生執(zhí)行計劃,所謂“執(zhí)行計劃”就是對應(yīng)shared pool中一個復雜的數(shù)據(jù)結(jié)構(gòu)。
a. 為了產(chǎn)生這個數(shù)據(jù)結(jié)構(gòu),Oracle要計算SQL語句的哈希值,根據(jù)這個值確定要檢索的“桶“(Hash Bucket),然后遍歷這個桶中的”鏈表“,看是否有相同的SQL語句。如果沒有,就要進行硬解析。
進程要從shared pool空閑空間中申請一塊空間,用來存放編譯后的執(zhí)行計劃。這就需要檢索另一個”空閑鏈表“,從中申請一個大小合適的空閑塊,申請成功后要更新這兩個鏈表。在這個過程中,至少
涉及兩個數(shù)據(jù)鏈表的訪問,這個訪問是”排他“(exclusive)的,不允許其他進程同時修改乃至訪問,這就需要對”鏈表“加鎖,這種鎖用的就是Latch機制。
b. 在語句編譯和執(zhí)行過程中,“引用對象”的結(jié)構(gòu)不能被更改。在編譯前,需要把表的”元數(shù)據(jù)“加載到內(nèi)存,在隨后編譯和執(zhí)行過程中,這個內(nèi)容保持不變,也就是不能讓其他用戶改變這個表的結(jié)構(gòu)。
這里使用的就是TM Lock。
c. 執(zhí)行階段,要在buffer cache中定位到數(shù)據(jù)塊,同樣根據(jù)數(shù)據(jù)塊地址查找“桶”中的“鏈表”找到最終的數(shù)據(jù)塊。在這個過程中,鏈表數(shù)據(jù)結(jié)構(gòu)也不能被修改,同樣是使用latch保護。訪問數(shù)據(jù)塊
中的記錄時,也要限制其他進程的訪問,使用的是行級鎖進行保護。
3.2 RAC環(huán)境并發(fā)控制
1) DLM、Cache Fusion、Non-Cache Fusion
由于要解決多個節(jié)點的并發(fā),所以額外引入了DLM(Distribute Lock Management)。
DLM在Oracle發(fā)展的不同時期,名字也不相同,在OPS時期,叫做PCM;而在RAC時期叫做Cache Fusion。
在RAC中,DLM是以數(shù)據(jù)塊作為粒度單位進行協(xié)調(diào)。
DLM協(xié)調(diào)集群各節(jié)點對資源使用的功能就叫做同步。在DLM中,根據(jù)資源數(shù)量、活動密集程度將資源分成了兩類:PCM Resource、Non-PCM Resource。[也稱Cache Fusion Resource、Non-Cache Fusion Resource]
對應(yīng)兩種資源,DLM提供的鎖也是兩種:PCM Lock、Non-PCM Lock。[也稱Cache Fusion Lock、Non-Cache Fusion Lock]
在RAC數(shù)據(jù)庫中共有兩大類四種鎖:
Local Lock:用于本地進程的并發(fā)控制,就是與傳統(tǒng)單實例一樣的,Latch 和 Lock。
Global Lock:用于集群間的并發(fā)控制,就是 PCM Lock 和 Non-PCM Lock。
典型的Non-Cache Fusion資源就是row cache和library cache。
PCM Lock 有三種模式,分別對應(yīng)SGA中數(shù)據(jù)塊的狀態(tài)如下:
PCM Lock Mode Buffer state X XCUR S SCUR NULL CR2) GRD
Cache Fusion要解決的首要問題是:數(shù)據(jù)塊拷貝在集群節(jié)點間的狀態(tài)分布圖。RAC是通過GRD來實現(xiàn)的。
GRD位于每個實例的SGA中,所有實例的GRD匯總在一起才是一個完整的GRD。
GRD中記錄的是PCM Lock信息,這種鎖有三個屬性:Mode、Role、PI。
Mode:X、S、NULL。
Role:L和G。
PI:Past Image主要能夠加速Crash Recovery的恢復過程。
書中模擬一個場景:4節(jié)點RAC,針對一個數(shù)據(jù)塊,這個數(shù)據(jù)塊的Master node是節(jié)點2。PCM Lock用ModeRolePastimage格式描述,比如SL0代表Share Mode、Local Role、0個Past Image。
分別對并發(fā)讀、讀并發(fā)寫、寫并發(fā)寫、寫入磁盤、寫并發(fā)讀等情形,描述了集群相關(guān)節(jié)點的GRD、PCM Lock的變化過程,體會到Cache Fusion具體是如何工作的。限于篇幅,這里不再贅述。
總之,無論是單實例還是RAC,實例要修改數(shù)據(jù)塊,必須獲得這個數(shù)據(jù)塊的當前版本。
3.3 RAC架構(gòu)
1) SGA的變化
多了一個GRD(Global Resource Directory)部分,GSD的功能前面已經(jīng)說過。
2) 后臺進程的變化
LMSn GCS(Global Cache Service),這個進程是Cache Fusion的主要進程,負責數(shù)據(jù)塊在實例間的傳遞。
LMD GES(Global Enqueue Service),這個進程負責在多個實例之間協(xié)調(diào)對數(shù)據(jù)塊的訪問順序。它與LMSn進程的GCS服務(wù)還有GRD共同構(gòu)成RAC最核心的功能Cache Fusion。
LCK 這個進程負責Non-Cache Fusion資源的同步訪問。
LMON 各個實例等LMON進程會定期通信,檢查集群中各節(jié)點的健康狀態(tài)。負責集群重構(gòu)、GRD恢復等操作,它提供的服務(wù)叫做CGS(Cluster Group Services)。
LMON提供節(jié)點監(jiān)控功能:通過一個保存在GRD中的位圖來記錄(0代表節(jié)點關(guān)閉,1代表節(jié)點正常);
LMON檢測到實例級別的“腦裂”時,會通知clusterware解決,如果等待超時,LMON進程會自動觸發(fā)IMR(Instance Membership Recovery)。
LMON進程提供的IMR功能可以看作是Oracle在數(shù)據(jù)庫層提供的“腦裂”,“IO隔離”機制。(LMON也借助兩種心跳:網(wǎng)絡(luò)心跳、控制文件的磁盤心跳)。
DIAG DIAG監(jiān)控實例的健康狀態(tài),并在實例運行錯誤時收集診斷數(shù)據(jù)到Alert.log日志中。
GSD GSD進程負責從客戶端工具,比如srvctl接收用戶命令,為用戶提供管理接口。
3) 文件
spfile 需要被所有節(jié)點訪問,存放在共享存儲上。
redo thread 每個實例都需要自己的一套redo log。需要被所有節(jié)點訪問,存放在共享存儲上。
archived log 建議存放在共享存儲上。當然也有其他設(shè)計方式。
undo tablespace 每個實例都需要有一個單獨的回滾表空間。存放在共享存儲上。
4) SCN
在RAC中,由GCS負責全局維護SCN的產(chǎn)生,ORACLE 10g RAC 缺省使用的是Broadcast算法,可以從alert.log中看到。
5) Cache Fusion、GCS、 GES
GCS負責數(shù)據(jù)塊在實例間的傳遞;
GES負責鎖管理。
3.4 RAC和Clusterware的交互
RAC集群和節(jié)點集群是兩個層次的集群,兩個集群都有腦裂、IO隔離等問題。
兩個集群有各自的故障檢測機制,二者之間的機制可以有重疊也可以不同。
在RAC這一層出現(xiàn)節(jié)點故障時,首先會通知clusterware這種異常,等待clusterware完成集群重構(gòu),完成后再通知RAC,RAC集群再開始自己的重構(gòu),但是RAC并不完全依賴于clusterware解決問題,如果發(fā)生等待超時,RAC的LMON進程會自動觸發(fā)IMR執(zhí)行節(jié)點排除。
轉(zhuǎn)載于:https://www.cnblogs.com/zywu-king/p/8550181.html
總結(jié)
以上是生活随笔為你收集整理的oracle rac理论知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仔细讨论 C/C++ 字节对齐问题⭐⭐
- 下一篇: 高效使用PC需要记住的快捷键