溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle RAC如何避免腦裂

發(fā)布時(shí)間:2020-07-11 04:41:51 來源:網(wǎng)絡(luò) 閱讀:14731 作者:leesbing 欄目:關(guān)系型數(shù)據(jù)庫

bebeOracle CSSD(Cluster ServicesSynchronization Daemon)進(jìn)程通過兩個(gè)互相獨(dú)立的心跳信號來監(jiān)控集群節(jié)點(diǎn)的健康狀況:network heart beatdisk heart beat

 

網(wǎng)絡(luò)心跳:集群里每一個(gè)節(jié)點(diǎn)的CSSD進(jìn)程的一個(gè)線程每秒會通過inteconnect發(fā)送一個(gè)TCP協(xié)議心跳信號給RAC里面的所有節(jié)點(diǎn)(包括自己)。如果心跳信號傳輸出現(xiàn)問題,TCP協(xié)議的自我矯正機(jī)制會重新傳送數(shù)據(jù)包。這種情況下,oracle不會關(guān)注傳輸細(xì)節(jié)。

 

磁盤心跳:集群里每一個(gè)節(jié)點(diǎn)的CSSD進(jìn)程會在voting磁盤的特定位置的數(shù)據(jù)塊通過讀寫數(shù)據(jù)維持心跳信號。此外,每個(gè)節(jié)點(diǎn)還會監(jiān)控其它節(jié)點(diǎn)CSSD進(jìn)程維護(hù)的心跳信號數(shù)據(jù)塊。如果發(fā)現(xiàn)某個(gè)節(jié)點(diǎn)在指定的時(shí)間內(nèi)沒有寫入磁盤心跳,這個(gè)節(jié)點(diǎn)就被判決為死亡。如果一個(gè)節(jié)點(diǎn)處于未知狀態(tài),其它節(jié)點(diǎn)也會被通過更新它的voting disk上的kill block狀態(tài)的方式把它驅(qū)逐出集群。

 

總的來說,網(wǎng)絡(luò)心跳每秒都會發(fā)起,如果一個(gè)節(jié)點(diǎn)超出了參數(shù)css_miscount time設(shè)定的時(shí)間沒有響應(yīng),就會被踢出集群。類似的,集群里的每個(gè)節(jié)點(diǎn)每秒讀寫voting disk特定區(qū)域,出現(xiàn)超時(shí)響應(yīng)的節(jié)點(diǎn)也會被踢出集群。下面是節(jié)點(diǎn)面臨的心跳可能出現(xiàn)的狀況及后果:

Oracle RAC如何避免腦裂

腦裂: RAC環(huán)境里,所有的oracle實(shí)例都是通過高速私有網(wǎng)絡(luò)互相通訊的。這個(gè)私有網(wǎng)絡(luò)的鏈路都應(yīng)該配置成冗余的,并且僅用于實(shí)例之間的oracle數(shù)據(jù)塊傳輸。以含有運(yùn)行在兩臺機(jī)器上的2個(gè)實(shí)例組成的RAC集群為例,當(dāng)RAC集群里服務(wù)器運(yùn)行正常,兩個(gè)實(shí)例本身也運(yùn)行正常的情況下,兩個(gè)oracle實(shí)例不能夠通過私有網(wǎng)絡(luò)互相通訊時(shí),如果不做預(yù)防,兩個(gè)實(shí)例會各自獨(dú)立的運(yùn)行并對外提供服務(wù)。由于兩個(gè)實(shí)例失去了互相之間的通訊,都會認(rèn)為對方已死,從而不再使用原有的保護(hù)共享數(shù)據(jù)的機(jī)制,這會導(dǎo)致共享數(shù)據(jù)混亂。這就是腦裂。

 

IOfencing:如果操作系統(tǒng)正常但是oracle實(shí)例出現(xiàn)故障導(dǎo)致時(shí),recovery進(jìn)程可能會把之前故障實(shí)例殘留的寫操作執(zhí)行。由于在這種情況下寫操作無法保持正確的寫入順序,他們可能會導(dǎo)致數(shù)據(jù)混亂,所以必須阻止。所以,在集群環(huán)境里,如果一個(gè)節(jié)點(diǎn)故障,必須阻止它對共享存儲的寫操作。這種方法稱之為IO fencing。

 

簡單多數(shù)原則:為了維持RAC集群正常運(yùn)行,配置的仲裁盤必須有一半以上數(shù)量正常運(yùn)行。


下面兩個(gè)實(shí)例用來理解當(dāng)心跳出現(xiàn)問題時(shí),仲裁盤的作用機(jī)制。

例子1,如下圖,三個(gè)節(jié)點(diǎn)的集群,配有3個(gè)仲裁盤. Node3與其它兩個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)通訊(network heartbeat)中斷。但是,CSSD進(jìn)程通過讀仲裁盤狀態(tài)發(fā)現(xiàn)所有的節(jié)點(diǎn)都可以寫仲裁盤,這說明出現(xiàn)了腦裂。于是節(jié)點(diǎn)1和節(jié)點(diǎn)2就會更新仲裁盤上的節(jié)點(diǎn)3 kill block狀態(tài)。然后節(jié)點(diǎn)3CSSD進(jìn)程通過讀仲裁盤上對應(yīng)的kill block,知道自己應(yīng)該退出集群。于是執(zhí)行IO fencing,然后關(guān)閉自己。


Oracle RAC如何避免腦裂

例子2,配有3個(gè)仲裁盤的雙節(jié)點(diǎn)集群,disk heartbeat出現(xiàn)問題,導(dǎo)致節(jié)點(diǎn)1可以訪問2個(gè)仲裁盤,節(jié)點(diǎn)2可以訪問1個(gè)仲裁盤。這時(shí)基于簡單多數(shù)原則,節(jié)點(diǎn)1(兩個(gè)仲裁盤)會發(fā)出自殺指令給節(jié)點(diǎn)2。這樣節(jié)點(diǎn)2就會退出集群。

 

例子2中更進(jìn)一步的問題,如果出現(xiàn)一個(gè)仲裁盤故障導(dǎo)致兩個(gè)節(jié)點(diǎn)都不能訪問它,但是另外兩個(gè)仲裁盤對兩個(gè)節(jié)點(diǎn)都可訪問。這種情況下,如何判定該退出哪個(gè)節(jié)點(diǎn)?此時(shí),由于兩個(gè)節(jié)點(diǎn)可以訪問的仲裁盤滿足簡單多數(shù)原則,如果此時(shí)Network heartbeat正常,RAC會正常運(yùn)行,不會踢出任何一個(gè)節(jié)點(diǎn)。如果不幸,又有一個(gè)仲裁盤故障導(dǎo)致它不能被兩個(gè)node訪問,又會發(fā)生什么?

此時(shí),網(wǎng)絡(luò)正常,但是仲裁盤低于簡單多數(shù),所以RAC必然重構(gòu),但是兩個(gè)節(jié)點(diǎn)條件一致。RAC會選擇保留最低節(jié)點(diǎn)號的節(jié)點(diǎn),在這個(gè)案例中,就是node1被保留,node2被踢出。


本文大部分內(nèi)容來自需要科學(xué)上網(wǎng)的英文網(wǎng)站https://nitishanandsrivastava.wordpress.com/,我對其做了裁剪和引申。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI