1. 程式人生 > >Oracle RAC原理

Oracle RAC原理

單點資料庫VS RAC



單節點資料庫,如果例項宕機了,如果一個業務連結在例項上面,那麼這個業務就中斷了。這個時候系統就不具有可用性了,那麼這個時候單節點的可用性是很差的。

對於RAC來說,和單例項一樣,還是一份資料檔案,都是相同的儲存上面放著oracle的檔案,但是是由三個例項共用同一份資料檔案。這樣的好處是在三個例項之間做了冗餘,在上面三個例項當中任意兩個壞了業務都可以連結到剩下的一個例項,都可以正常的工作。RAC提供了在例項級別的冗餘。

RAC不能夠解決在資料的安全,儘管有多個例項,但是隻有一份資料檔案,這樣只要資料檔案損壞了,那麼整個資料庫就損壞了。

什麼是RAC

一般每個例項都放在不同的伺服器上面,這樣可以起到冗餘作用。所有的資料庫檔案都放在共享儲存上面,但是還有一些檔案放在每個例項自己的本地的磁碟上面,比如引數檔案,每一個例項都可以有自己的引數檔案,這個引數檔案既可以放在本地也可以放在共享儲存上面,多個例項都使用同一個引數檔案。

在RAC裡面,最重要的就是例項和例項之間的互動,即使是分離的例項,但是讀取的資料是相同的,RAC不是分散式的系統,因為它只有一個儲存,分散式系統是指資料釋出在不同的資料庫上面,然後通過中介軟體來協調做查詢。RAC還是一臺資料庫,多個例項。

RAC架構

對於RAC來說至少有兩套物理上不同的網路,私有網路是專門用來例項之間的資料互動。如果私有網路,所有的資料都在一個網路下面,那麼那麼就會對資料造成影響,嚴重的影響RAC的效能了。例項之間資料之間傳遞使用私有網路和對外服務提供的網路之間是物理分開的。所以RAC至少有兩套網路,一個是例項之間的資料的傳遞,另外一個是公有網路,是對外提供服務的,外面的業務是提供公有網路的IP連結到資料庫的。

RAC的特點

除了具有普通的資料庫特性外:
每一個節點的instance都有自己的SGA
每一個節點的instance都有自己的background process
每一個節點的instance都有自己的redo logs
每一個節點的instance都有自己的undo表空間

每一個節點的例項都有自己的SGA,但是之間在SGA裡面的資料塊都是需要相互傳遞的。

每一個節點都有自己的redo,redo不是共用的。雖然redo是放在共享磁碟上面,但是每個例項都有自己的redo,各有各的。當例項2壞了,例項1做恢復的時候可以通過例項2的redo資訊來進行恢復。

每個例項都要處理自己的一套事務,所以需要使用自己的UNDO。

所以在RAC架構下面,每一套例項都有自己的東西。

RAC如何容錯的

使用SAN儲存,儲存和伺服器就不在一起了,而是和伺服器分離了,是一個網路的儲存系統,伺服器是伺服器,儲存是儲存,完全分離的。

當節點1壞了,不僅僅只是將業務切換到節點2,這個時候還要處理節點1壞了遺留下來的問題。主要是一些提交和未提交的事務。比如例項1壞了,例項2就要從例項1的redo裡面讀最後一次checkpoint之後的資訊,就是例項1最後將所有的資料寫到磁碟之後產生的所有的redo應用,該回滾的回滾,該恢復的恢復。即現將以提交和未提交的事務產生的redo都先應用,因為是最後一次checkpoint之後的資訊,之前的資訊是已經寫到磁碟上面了,所謂的恢復是將未寫到磁碟上面的資訊進行恢復。(雖然例項壞了,但是例項的redo並沒有壞,放置在共享儲存上面,它的redo還是允許其他例項訪問的)例項2讀取例項1的redo,然後全部應用一遍,之後再回滾未提交的事務修改的資料塊,這個有點像例項的恢復。

RAC Background Processes

這裡面會比單例項環境下面的例項多出幾個程序。多出來的程序就用來保證在rac環境下面rac之間交換需要做的比如鎖,資源交換之間的控制。

RAC相關的後臺程序

LMS - Gobal Cache Service Process 全域性快取服務程序

LMS程序是在RAC環境下面最重要的一個程序,是處理全域性的快取,所謂的快取就是資料庫一個例項到另外一個例項資料的交換程序。
LMD - Global Enqueue Service Daemon 全域性查詢服務守護程序
LMON - Global Enqueue Service Monitor全域性查詢服務監視程序
LCK0 - Instance Enqueue Process 例項查詢程序
DIAG (Diagnostic Daemon) 診斷守護程序

RAC後臺程序

LMON--Lock Monitor Processes
監控整個叢集狀況,維護GCS的記憶體結構。
 處理非正常終止的程序和例項。
 當例項離開和加入叢集時,鎖和資源的重新配置。
 管理全域性的鎖和資源。
 監控全域性的鎖資源,處理死鎖和阻塞。
 也被稱為Global enqueue service monitor

LMSn-- Lock Monitor Services
LMS程序主要用來管理叢集內資料塊的訪問,並在不同例項的BUFFER CACHE
中傳輸塊映象。
當在某個資料塊上發生一致性讀時,LMS負責回滾該資料塊,並將它copy到請求的例項上。
每個RAC節點至少有2個LMS程序。 也稱作 GCS (Global Cache Services) processes.

LCK--Lock Process
LCK程序主要用來管理例項間資源請求和跨例項呼叫操作,呼叫操作包括資料字典等物件的訪問;並處理非CACEH FUSION的CHACE資源請求(例如:DICTIONARY CACHE或row cache的請求)由於LMS程序負責主要的鎖管理功能,所以每個例項只有一個LCK程序。

可以看到有這麼多的程序都和鎖有關係,歸根結底就是一個數據塊從一個例項到另外一個例項,維護一致性的依據就是鎖。只有通過鎖才可以維護資料塊在兩個例項之間的一致性。


 LMD--Lock Monitor Daemon Process
LMD程序主要管理對全域性佇列和資源的訪問,並更新相應佇列的狀態,處理來
自於其他例項的資源請求。
每一個全域性佇列的當前狀態儲存在相應的例項共享記憶體中,該狀態表明該例項
具有相應的權利使用該資源。
一個例項(master)的共享記憶體中存在一個特殊的佇列,該佇列紀錄來自其他遠
程例項的資源請求,當遠端例項的LMD程序發出一個資源請求時,該請求指向
master例項的LMD,當master例項的LMD程序受到該請求後,在共享記憶體中的
特殊佇列中監測該資源是否無效,如果有效則LMD程序更新該資源對列的狀態
,並通知請求資源的LMD程序該資源佇列可以使用了,如果資源佇列正在被其
他例項使用或者當前無效,則LMD程序通知正在使用中的例項的LMD程序應該
釋放該資源,等資源釋放變得有效時,MASTER例項的LMD程序更新該資源隊
列的狀態並通知請求資源例項的LMD程序該資源佇列可以使用了。

DIAG (Diagnostic Daemon)
Oracle10g新的後臺程序。
例行對例項的健康情況進行監控,同時也監控例項是否掛起或者出現死鎖。
收集例項和程序出錯時的關鍵診斷資訊。
這個程序會更新alert日誌檔案,寫入一些重要告警資訊。

上面這些都是RAC下面例項多出的程序,下面就是RAC自己的程序了。

RAC的服務程序

獨立的服務CRS
CRS- 叢集資源服務
CSS - 叢集同步服務
EVMD 事件管理服務
ONS--事件的釋出及訂閱服務

用來協調兩個例項之間來訪問儲存,這個架構就是CRS。在RAC下面因為要對全域性資源進行控制,所以例項不能直接訪問儲存,必須通過CRS層來訪問。(RAC指的是架構,具體是由CRS這套服務來實現的,這套服務裡面有上面的四個服務組成)。

CRS--Cluster Ready Services
管理叢集內高可用操作的基本程式。
CRS管理的任何事物被稱之為資源
資料庫、例項、監聽、虛擬IP(VIP)地址、應用程序等等
 CRS是根據儲存於OCR中的資源配置資訊來管理這些資源
 當一資源的狀態改變時,CRS程序生成一個事件。

 CSS--Cluster Synchronization Service
 管理叢集節點的成員資格
控制哪個結點為叢集的成員、結點在加入或離開叢集時通知叢集成員來控制
叢集的配置資訊
此程序發生故障導致叢集重啟

EVM--Event Management
事件管理守護程序。
釋出CRS建立事件的後臺程序

ONS--Oracle Notification Service
通訊的快速應用通知事件的釋出及訂閱服務

Oracle叢集體系結構

Oracle RAC,全稱是Oracle Real Application Cluster,即正真的應用叢集,是Oracle提供的一個並行集群系統,整個集群系統由Oracle Clusterware(叢集就緒軟體)和Real Aplication(RAC)兩大部分組成。

Oracle RAC的實質是位於不同的作業系統的Oracle例項節點同時訪問訪問同一個Oracle資料庫,每個節點間可以通過私有網路進行通訊,互相監控節點的執行狀態,Oracle資料庫所有的資料檔案,聯機日誌檔案,控制檔案等均放在叢集的共享裝置上面,而共享裝置可以是RAW,ASM,OCFS2等,所有叢集節點可以同時讀寫共享儲存,Oracle RAC的基本拓撲結構如下。(RAW就是裸裝置,沒有檔案系統,就是直接在硬碟上面進行讀寫)。

這個圖分為三個部分,第一個部分就是客戶端,第二個部分是節點部分,最後一部分是共享儲存部分。

作為使用者會去訪問叢集資料庫,在節點層有許多節點,每一個節點相當於一個主機,或者一個作業系統。每一個作業系統是安裝在一臺伺服器上獨立完成的。最底層是os,即作業系統。在作業系統上層安裝的是clusterware,這是一個高可用的叢集軟體。再上面一層是oracle rac資料庫,這個資料庫還啟動了rac監聽,每一個節點都是有os,clusterware,oracle rac listener三部分組成的。

在10g之前的產品,如果要使用rac叢集就必須要藉助第三方高可用軟體。在10g之後Oracle推出了自己的一款clusterware,對於高可用軟體這部分可以使用oracle自身的,也可以使用第三方的。

在每一個節點上面啟動相關的例項,每一個例項會啟動相關的監聽埠。這個埠就是監聽客戶端過來的請求,在Oracle叢集當中可以有多個節點。

共享儲存是rac為了實現資料的共享,實現共享方式有很多種,比如raw,asm等。

由拓撲結構可知:

一個Oracle Rac資料庫有多個伺服器節點組成,每個服務節點上面都有自己獨立的OS,ClusterWare,Oracle RAC資料庫程式等,每個節點都有自己的網路監聽器。ClusterWare是一個叢集軟體,主要用於集群系統管理,Oracle RAC資料庫程式用於提供Oracle例項程序,以提供客戶端訪問集群系統,監聽服務主要用於監控自己網路埠的資訊,所有的服務和程式提供作業系統都去訪問一個共享儲存,最終完成資料的讀寫。共享儲存的方式有很多種,可以通過自動儲存管理(ASM),Oracle叢集檔案系統(OCFS),裸裝置(RAW),網路共享區域儲存(NAS)等來保證整個集群系統的資料一致性。

Oracle rac資料庫和經常所說的資料庫有什麼區別呢?Oracle rac資料庫主要是提供oracle例項程序,以供客戶端訪問集群系統。從Oracle執行機制來說,叢集中每臺伺服器就是一個Oracle例項,多個例項對應同一個Oracle資料庫,組成了Oracle資料庫的叢集。

從圖中可以看出,執行在兩個節點上面的資料庫訪問同一個RAC資料庫,並且兩個節點的本地磁碟僅用存放Oracle安裝程式和ClusterWare軟體,而在共享儲存上,存放著Oracle的控制檔案,資料檔案,聯機日誌檔案,歸檔日誌檔案等,這是安裝Oracle Rac時的一種資料儲存方式,其實,RAC提供了多種資料儲存方式。

叢集裡面的每一個伺服器或者裡面的每一個節點就是一個Oracle例項,有多個節點或者說是多個例項同時訪問同一個資料庫。從上圖可以看到節點的本地磁碟上面儲存的是Oracle的安裝程式和clusterware叢集軟體的程式。在共享儲存上面存放著Oracle的資料檔案,控制檔案,聯機檔案等等。