Oracle RAC原理及分析
單點(diǎn)數(shù)據(jù)庫(kù)VS RAC
單節(jié)點(diǎn)數(shù)據(jù)庫(kù),如果實(shí)例宕機(jī)了,如果一個(gè)業(yè)務(wù)鏈接在實(shí)例上面,那么這個(gè)業(yè)務(wù)就中斷了。這個(gè)時(shí)候系統(tǒng)就不具有可用性了,那么這個(gè)時(shí)候單節(jié)點(diǎn)的可用性是很差的。
對(duì)于RAC來說,和單實(shí)例一樣,還是一份數(shù)據(jù)文件,都是相同的存儲(chǔ)上面放著oracle的文件,但是是由三個(gè)實(shí)例共用同一份數(shù)據(jù)文件。這樣的好處是在三個(gè)實(shí)例之間做了冗余,在上面三個(gè)實(shí)例當(dāng)中任意兩個(gè)壞了業(yè)務(wù)都可以鏈接到剩下的一個(gè)實(shí)例,都可以正常的工作。RAC提供了在實(shí)例級(jí)別的冗余。
RAC不能夠解決在數(shù)據(jù)的安全,盡管有多個(gè)實(shí)例,但是只有一份數(shù)據(jù)文件,這樣只要數(shù)據(jù)文件損壞了,那么整個(gè)數(shù)據(jù)庫(kù)就損壞了。
什么是RAC
一般每個(gè)實(shí)例都放在不同的服務(wù)器上面,這樣可以起到冗余作用。所有的數(shù)據(jù)庫(kù)文件都放在共享存儲(chǔ)上面,但是還有一些文件放在每個(gè)實(shí)例自己的本地的磁盤上面,比如參數(shù)文件,每一個(gè)實(shí)例都可以有自己的參數(shù)文件,這個(gè)參數(shù)文件既可以放在本地也可以放在共享存儲(chǔ)上面,多個(gè)實(shí)例都使用同一個(gè)參數(shù)文件。
在RAC里面,最重要的就是實(shí)例和實(shí)例之間的交互,即使是分離的實(shí)例,但是讀取的數(shù)據(jù)是相同的,RAC不是分布式的系統(tǒng),因?yàn)樗挥幸粋€(gè)存儲(chǔ),分布式系統(tǒng)是指數(shù)據(jù)發(fā)布在不同的數(shù)據(jù)庫(kù)上面,然后通過中間件來協(xié)調(diào)做查詢。RAC還是一臺(tái)數(shù)據(jù)庫(kù),多個(gè)實(shí)例。
RAC架構(gòu)
對(duì)于RAC來說至少有兩套物理上不同的網(wǎng)絡(luò),私有網(wǎng)絡(luò)是專門用來實(shí)例之間的數(shù)據(jù)交互。
如果私有網(wǎng)絡(luò),所有的數(shù)據(jù)都在一個(gè)網(wǎng)絡(luò)下面,那么那么就會(huì)對(duì)數(shù)據(jù)造成影響,嚴(yán)重的影響RAC的性能了。
實(shí)例之間數(shù)據(jù)之間傳遞使用私有網(wǎng)絡(luò)和對(duì)外服務(wù)提供的網(wǎng)絡(luò)之間是物理分開的。
所以RAC至少有兩套網(wǎng)絡(luò),一個(gè)是實(shí)例之間的數(shù)據(jù)的傳遞,另外一個(gè)是公有網(wǎng)絡(luò),是對(duì)外提供服務(wù)的,外面的業(yè)務(wù)是提供公有網(wǎng)絡(luò)的IP鏈接到數(shù)據(jù)庫(kù)的。
RAC的特點(diǎn)
除了具有普通的數(shù)據(jù)庫(kù)特性外:
每一個(gè)節(jié)點(diǎn)的instance都有自己的SGA
每一個(gè)節(jié)點(diǎn)的instance都有自己的background process
每一個(gè)節(jié)點(diǎn)的instance都有自己的redo logs
每一個(gè)節(jié)點(diǎn)的instance都有自己的undo表空間
每一個(gè)節(jié)點(diǎn)的實(shí)例都有自己的SGA,但是之間在SGA里面的數(shù)據(jù)塊都是需要相互傳遞的。
每一個(gè)節(jié)點(diǎn)都有自己的redo,redo不是共用的。雖然redo是放在共享磁盤上面,但是每個(gè)實(shí)例都有自己的redo,各有各的。當(dāng)實(shí)例2壞了,實(shí)例1做恢復(fù)的時(shí)候可以通過實(shí)例2的redo信息來進(jìn)行恢復(fù)。
每個(gè)實(shí)例都要處理自己的一套事務(wù),所以需要使用自己的UNDO。
所以在RAC架構(gòu)下面,每一套實(shí)例都有自己的東西。
RAC如何容錯(cuò)的
使用SAN存儲(chǔ),存儲(chǔ)和服務(wù)器就不在一起了,而是和服務(wù)器分離了,是一個(gè)網(wǎng)絡(luò)的存儲(chǔ)系統(tǒng),服務(wù)器是服務(wù)器,存儲(chǔ)是存儲(chǔ),完全分離的。
當(dāng)節(jié)點(diǎn)1壞了,不僅僅只是將業(yè)務(wù)切換到節(jié)點(diǎn)2,這個(gè)時(shí)候還要處理節(jié)點(diǎn)1壞了遺留下來的問題。主要是一些提交和未提交的事務(wù)。
比如實(shí)例1壞了,實(shí)例2就要從實(shí)例1的redo里面讀最后一次checkpoint之后的信息,就是實(shí)例1最后將所有的數(shù)據(jù)寫到磁盤之后產(chǎn)生的所有的redo應(yīng)用,該回滾的回滾,該恢復(fù)的恢復(fù)。
即現(xiàn)將以提交和未提交的事務(wù)產(chǎn)生的redo都先應(yīng)用,因?yàn)槭亲詈笠淮蝐heckpoint之后的信息,之前的信息是已經(jīng)寫到磁盤上面了,所謂的恢復(fù)是將未寫到磁盤上面的信息進(jìn)行恢復(fù)。(雖然實(shí)例壞了,但是實(shí)例的redo并沒有壞,放置在共享存儲(chǔ)上面,它的redo還是允許其他實(shí)例訪問的)實(shí)例2讀取實(shí)例1的redo,然后全部應(yīng)用一遍,之后再回滾未提交的事務(wù)修改的數(shù)據(jù)塊,這個(gè)有點(diǎn)像實(shí)例的恢復(fù)。
RAC Background Processes
這里面會(huì)比單實(shí)例環(huán)境下面的實(shí)例多出幾個(gè)進(jìn)程。
多出來的進(jìn)程就用來保證在rac環(huán)境下面rac之間交換需要做的比如鎖,資源交換之間的控制。
RAC相關(guān)的后臺(tái)進(jìn)程
LMS - Gobal Cache Service Process 全局緩存服務(wù)進(jìn)程
LMS進(jìn)程是在RAC環(huán)境下面最重要的一個(gè)進(jìn)程,是處理全局的緩存,所謂的緩存就是數(shù)據(jù)庫(kù)一個(gè)實(shí)例到另外一個(gè)實(shí)例數(shù)據(jù)的交換進(jìn)程。
LMD - Global Enqueue Service Daemon 全局查詢服務(wù)守護(hù)進(jìn)程
LMON - Global Enqueue Service Monitor全局查詢服務(wù)監(jiān)視進(jìn)程
LCK0 - Instance Enqueue Process 實(shí)例查詢進(jìn)程
DIAG (Diagnostic Daemon) 診斷守護(hù)進(jìn)程
RAC后臺(tái)進(jìn)程
LMON--Lock Monitor Processes
監(jiān)控整個(gè)集群狀況,維護(hù)GCS的內(nèi)存結(jié)構(gòu)。
處理非正常終止的進(jìn)程和實(shí)例。
當(dāng)實(shí)例離開和加入集群時(shí),鎖和資源的重新配置。
管理全局的鎖和資源。
監(jiān)控全局的鎖資源,處理死鎖和阻塞。
也被稱為Global enqueue service monitor
LMSn-- Lock Monitor Services
LMS進(jìn)程主要用來管理集群內(nèi)數(shù)據(jù)塊的訪問,并在不同實(shí)例的BUFFER CACHE中傳輸塊鏡像。
當(dāng)在某個(gè)數(shù)據(jù)塊上發(fā)生一致性讀時(shí),LMS負(fù)責(zé)回滾該數(shù)據(jù)塊,并將它c(diǎn)opy到請(qǐng)求的實(shí)例上。
每個(gè)RAC節(jié)點(diǎn)至少有2個(gè)LMS進(jìn)程。 也稱作 GCS (Global Cache Services) processes.
LCK--Lock Process
LCK進(jìn)程主要用來管理實(shí)例間資源請(qǐng)求和跨實(shí)例調(diào)用操作,調(diào)用操作包括數(shù)據(jù)字典等對(duì)象的訪問;并處理非CACEH FUSION的CHACE資源請(qǐng)求(例如:DICTIONARY CACHE或row cache的請(qǐng)求)由于LMS進(jìn)程負(fù)責(zé)主要的鎖管理功能,所以每個(gè)實(shí)例只有一個(gè)LCK進(jìn)程。
可以看到有這么多的進(jìn)程都和鎖有關(guān)系,歸根結(jié)底就是一個(gè)數(shù)據(jù)塊從一個(gè)實(shí)例到另外一個(gè)實(shí)例,維護(hù)一致性的依據(jù)就是鎖。只有通過鎖才可以維護(hù)數(shù)據(jù)塊在兩個(gè)實(shí)例之間的一致性。
LMD--Lock Monitor Daemon Process
LMD進(jìn)程主要管理對(duì)全局隊(duì)列和資源的訪問,并更新相應(yīng)隊(duì)列的狀態(tài),處理來自于其他實(shí)例的資源請(qǐng)求。
每一個(gè)全局隊(duì)列的當(dāng)前狀態(tài)存儲(chǔ)在相應(yīng)的實(shí)例共享內(nèi)存中,該狀態(tài)表明該實(shí)例具有相應(yīng)的權(quán)利使用該資源。
一個(gè)實(shí)例(master)的共享內(nèi)存中存在一個(gè)特殊的隊(duì)列,該隊(duì)列紀(jì)錄來自其他遠(yuǎn)程實(shí)例的資源請(qǐng)求,當(dāng)遠(yuǎn)程實(shí)例的LMD進(jìn)程發(fā)出一個(gè)資源請(qǐng)求時(shí),該請(qǐng)求指向master實(shí)例的LMD,當(dāng)master實(shí)例的LMD進(jìn)程受到該請(qǐng)求后,在共享內(nèi)存中的特殊隊(duì)列中監(jiān)測(cè)該資源是否無效,如果有效則LMD進(jìn)程更新該資源對(duì)列的狀態(tài),并通知請(qǐng)求資源的LMD進(jìn)程該資源隊(duì)列可以使用了,如果資源隊(duì)列正在被其他實(shí)例使用或者當(dāng)前無效,則LMD進(jìn)程通知正在使用中的實(shí)例的LMD進(jìn)程應(yīng)該釋放該資源,等資源釋放變得有效時(shí),MASTER實(shí)例的LMD進(jìn)程更新該資源隊(duì)列的狀態(tài)并通知請(qǐng)求資源實(shí)例的LMD進(jìn)程該資源隊(duì)列可以使用了。
DIAG (Diagnostic Daemon)
Oracle10g新的后臺(tái)進(jìn)程。
例行對(duì)實(shí)例的健康情況進(jìn)行監(jiān)控,同時(shí)也監(jiān)控實(shí)例是否掛起或者出現(xiàn)死鎖。
收集實(shí)例和進(jìn)程出錯(cuò)時(shí)的關(guān)鍵診斷信息。
這個(gè)進(jìn)程會(huì)更新alert日志文件,寫入一些重要告警信息。
上面這些都是RAC下面實(shí)例多出的進(jìn)程,下面就是RAC自己的進(jìn)程了。
RAC的服務(wù)進(jìn)程
獨(dú)立的服務(wù)CRS
- CRS- 集群資源服務(wù)
- CSS - 集群同步服務(wù)
- EVMD 事件管理服務(wù)
- ONS--事件的發(fā)布及訂閱服務(wù)
用來協(xié)調(diào)兩個(gè)實(shí)例之間來訪問存儲(chǔ),這個(gè)架構(gòu)就是CRS。在RAC下面因?yàn)橐獙?duì)全局資源進(jìn)行控制,所以實(shí)例不能直接訪問存儲(chǔ),必須通過CRS層來訪問。(RAC指的是架構(gòu),具體是由CRS這套服務(wù)來實(shí)現(xiàn)的,這套服務(wù)里面有上面的四個(gè)服務(wù)組成)。
CRS--Cluster Ready Services
管理集群內(nèi)高可用操作的基本程序。
CRS管理的任何事物被稱之為資源
數(shù)據(jù)庫(kù)、實(shí)例、監(jiān)聽、虛擬IP(VIP)地址、應(yīng)用進(jìn)程等等
CRS是根據(jù)存儲(chǔ)于OCR中的資源配置信息來管理這些資源
當(dāng)一資源的狀態(tài)改變時(shí),CRS進(jìn)程生成一個(gè)事件。
CSS--Cluster Synchronization Service
管理集群節(jié)點(diǎn)的成員資格
控制哪個(gè)結(jié)點(diǎn)為集群的成員、結(jié)點(diǎn)在加入或離開集群時(shí)通知集群成員來控制
集群的配置信息
此進(jìn)程發(fā)生故障導(dǎo)致集群重啟
EVM--Event Management
事件管理守護(hù)進(jìn)程。
發(fā)布CRS創(chuàng)建事件的后臺(tái)進(jìn)程
ONS--Oracle Notification Service
通信的快速應(yīng)用通知事件的發(fā)布及訂閱服務(wù)
Oracle集群體系結(jié)構(gòu)
Oracle RAC,全稱是Oracle Real Application Cluster,即正真的應(yīng)用集群,是Oracle提供的一個(gè)并行集群系統(tǒng),整個(gè)集群系統(tǒng)由Oracle Clusterware(集群就緒軟件)和Real Aplication(RAC)兩大部分組成。
Oracle RAC的實(shí)質(zhì)是位于不同的操作系統(tǒng)的Oracle實(shí)例節(jié)點(diǎn)同時(shí)訪問訪問同一個(gè)Oracle數(shù)據(jù)庫(kù),每個(gè)節(jié)點(diǎn)間可以通過私有網(wǎng)絡(luò)進(jìn)行通信,互相監(jiān)控節(jié)點(diǎn)的運(yùn)行狀態(tài),Oracle數(shù)據(jù)庫(kù)所有的數(shù)據(jù)文件,聯(lián)機(jī)日志文件,控制文件等均放在集群的共享設(shè)備上面,而共享設(shè)備可以是RAW,ASM,OCFS2等,所有集群節(jié)點(diǎn)可以同時(shí)讀寫共享存儲(chǔ),Oracle RAC的基本拓?fù)浣Y(jié)構(gòu)如下。(RAW就是裸設(shè)備,沒有文件系統(tǒng),就是直接在硬盤上面進(jìn)行讀寫)。
這個(gè)圖分為三個(gè)部分,第一個(gè)部分就是客戶端,第二個(gè)部分是節(jié)點(diǎn)部分,最后一部分是共享存儲(chǔ)部分。
作為用戶會(huì)去訪問集群數(shù)據(jù)庫(kù),在節(jié)點(diǎn)層有許多節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)相當(dāng)于一個(gè)主機(jī),或者一個(gè)操作系統(tǒng)。每一個(gè)操作系統(tǒng)是安裝在一臺(tái)服務(wù)器上獨(dú)立完成的。最底層是os,即操作系統(tǒng)。在操作系統(tǒng)上層安裝的是clusterware,這是一個(gè)高可用的集群軟件。再上面一層是oracle rac數(shù)據(jù)庫(kù),這個(gè)數(shù)據(jù)庫(kù)還啟動(dòng)了rac監(jiān)聽,每一個(gè)節(jié)點(diǎn)都是有os,clusterware,oracle rac listener三部分組成的。
在10g之前的產(chǎn)品,如果要使用rac集群就必須要借助第三方高可用軟件。在10g之后Oracle推出了自己的一款clusterware,對(duì)于高可用軟件這部分可以使用oracle自身的,也可以使用第三方的。
在每一個(gè)節(jié)點(diǎn)上面啟動(dòng)相關(guān)的實(shí)例,每一個(gè)實(shí)例會(huì)啟動(dòng)相關(guān)的監(jiān)聽端口。這個(gè)端口就是監(jiān)聽客戶端過來的請(qǐng)求,在Oracle集群當(dāng)中可以有多個(gè)節(jié)點(diǎn)。
共享存儲(chǔ)是rac為了實(shí)現(xiàn)數(shù)據(jù)的共享,實(shí)現(xiàn)共享方式有很多種,比如raw,asm等。
由拓?fù)浣Y(jié)構(gòu)可知:
一個(gè)Oracle Rac數(shù)據(jù)庫(kù)有多個(gè)服務(wù)器節(jié)點(diǎn)組成,每個(gè)服務(wù)節(jié)點(diǎn)上面都有自己獨(dú)立的OS,ClusterWare,Oracle RAC數(shù)據(jù)庫(kù)程序等,每個(gè)節(jié)點(diǎn)都有自己的網(wǎng)絡(luò)監(jiān)聽器。ClusterWare是一個(gè)集群軟件,主要用于集群系統(tǒng)管理,Oracle RAC數(shù)據(jù)庫(kù)程序用于提供Oracle實(shí)例進(jìn)程,以提供客戶端訪問集群系統(tǒng),監(jiān)聽服務(wù)主要用于監(jiān)控自己網(wǎng)絡(luò)端口的信息,所有的服務(wù)和程序提供操作系統(tǒng)都去訪問一個(gè)共享存儲(chǔ),最終完成數(shù)據(jù)的讀寫。共享存儲(chǔ)的方式有很多種,可以通過自動(dòng)存儲(chǔ)管理(ASM),Oracle集群文件系統(tǒng)(OCFS),裸設(shè)備(RAW),網(wǎng)絡(luò)共享區(qū)域存儲(chǔ)(NAS)等來保證整個(gè)集群系統(tǒng)的數(shù)據(jù)一致性。
Oracle rac數(shù)據(jù)庫(kù)和經(jīng)常所說的數(shù)據(jù)庫(kù)有什么區(qū)別呢?Oracle rac數(shù)據(jù)庫(kù)主要是提供oracle實(shí)例進(jìn)程,以供客戶端訪問集群系統(tǒng)。從Oracle運(yùn)行機(jī)制來說,集群中每臺(tái)服務(wù)器就是一個(gè)Oracle實(shí)例,多個(gè)實(shí)例對(duì)應(yīng)同一個(gè)Oracle數(shù)據(jù)庫(kù),組成了Oracle數(shù)據(jù)庫(kù)的集群。
從圖中可以看出,運(yùn)行在兩個(gè)節(jié)點(diǎn)上面的數(shù)據(jù)庫(kù)訪問同一個(gè)RAC數(shù)據(jù)庫(kù),并且兩個(gè)節(jié)點(diǎn)的本地磁盤僅用存放Oracle安裝程序和ClusterWare軟件,而在共享存儲(chǔ)上,存放著Oracle的控制文件,數(shù)據(jù)文件,聯(lián)機(jī)日志文件,歸檔日志文件等,這是安裝Oracle Rac時(shí)的一種數(shù)據(jù)存儲(chǔ)方式,其實(shí),RAC提供了多種數(shù)據(jù)存儲(chǔ)方式。
集群里面的每一個(gè)服務(wù)器或者里面的每一個(gè)節(jié)點(diǎn)就是一個(gè)Oracle實(shí)例,有多個(gè)節(jié)點(diǎn)或者說是多個(gè)實(shí)例同時(shí)訪問同一個(gè)數(shù)據(jù)庫(kù)。從上圖可以看到節(jié)點(diǎn)的本地磁盤上面存儲(chǔ)的是Oracle的安裝程序和clusterware集群軟件的程序。在共享存儲(chǔ)上面存放著Oracle的數(shù)據(jù)文件,控制文件,聯(lián)機(jī)文件等等。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle表的分類以及相關(guān)參數(shù)的詳解
本篇文章是對(duì)Oracle中表的分類以及相關(guān)參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05- Oracle中如果刪除了表中的某一條數(shù)據(jù),還可以通過回滾操作(rollback)進(jìn)行回滾,假如想清空一張表的數(shù)據(jù),但是又不想使其能進(jìn)行回滾操作,就可以立刻釋放資源,這時(shí)就需要使用截?cái)啾?/div> 2012-11-11
Oracle和MySQL的數(shù)據(jù)導(dǎo)入為何差別這么大
這篇文章主要介紹了Oracle和MySQL的數(shù)據(jù)導(dǎo)入有哪些區(qū)別,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08Oracle將查詢的結(jié)果放入一張自定義表中并再查詢數(shù)據(jù)
可以將查詢的結(jié)果放入到一張自定義表中,同時(shí)可以再?gòu)倪@個(gè)自定義的表中查詢數(shù)據(jù),詳細(xì)的sql如下,感興趣的朋友不要錯(cuò)過2014-08-08Oracle聯(lián)機(jī)日志文件與歸檔文件詳細(xì)介紹
這篇文章主要介紹了Oracle聯(lián)機(jī)日志文件與歸檔文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11Oracle 10g利用amdu抽取數(shù)據(jù)文件的方法教程
這篇文章主要給大家介紹了關(guān)于Oracle 10g利用amdu抽取數(shù)據(jù)文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Oracle數(shù)據(jù)庫(kù)常用命令整理(實(shí)用方法)
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)常用命令整理(實(shí)用方法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Oracle進(jìn)行數(shù)據(jù)庫(kù)升級(jí)和降級(jí)的操作代碼
數(shù)據(jù)庫(kù)升級(jí)是一個(gè)復(fù)雜的過程,涉及到備份現(xiàn)有數(shù)據(jù)、安裝新版本的數(shù)據(jù)庫(kù)軟件、遷移數(shù)據(jù)和應(yīng)用程序的兼容性測(cè)試等步驟,數(shù)據(jù)庫(kù)降級(jí)通常比升級(jí)更具挑戰(zhàn)性,所以本文給大家介紹了Oracle進(jìn)行數(shù)據(jù)庫(kù)升級(jí)和降級(jí)的操作,需要的朋友可以參考下2024-09-09最新評(píng)論