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