對於RAC來說,最重要的還是要理解內部原理和體繫結構。安裝不是非常難的事情。排錯和維護都離不開體繫結構以及內部原理。
叢集分類
1、高效能運算
計算任務分配到不同電腦節點來提高整體計算能力,主要應用在科學計算領域。主要利用的是並行計算。
2、負載平衡叢集(LB)
把業務的負載流量儘可能的平均合理的分配到叢集的各個節點上,每個節點都可以處理一部分負載,並且可以根據負載情況進行動態平衡。負載平衡演算法不是簡單的平均,而是根據每個節點的可用資源或網路的特殊情況來進行最佳化分配。因此分配+合理才是負載平衡的核心。
3、高可用性(HA)
側重於提高系統的可用性,整合硬體和軟體的容錯性來實現整體服務的高可用性。如果某個節點發生故障,另外的節點代替他。
RAC是真正的LB和HA的複合體。從某種意義上說,只有最終應用(資料庫)才能實現真正意義上的LB,而絕大多數的叢集都是HA。
叢集環境的特殊問題
1、並發控制
叢集環境中,存在共用儲存的問題。叢集中各個節點對共用儲存是對等的,所有節點對資料有相同的存取權限,因此需要某種機制來控制節點對資料的訪問。
在RAC中,採用的是DLM(Distribute Lock Management)機制來進行執行個體間的並發控制。
2、健忘症(Amnesia)
如果叢集環境的設定檔不是集中存放,每個節點都有一個本機複本,叢集正常啟動並執行時候,使用者可以在任何節點修改叢集的配置,並且這些更改都會自動同步到其他節點。
如果節點1因為正常的維護需要關機,節點2修改了配置,然後關閉節點2.啟動節點1,因為之前節點2做的配置修改沒有同步到節點1,所以將節點1啟動以後,他仍然使用舊的設定檔,造成配置丟失。
3、腦裂(split brain)
叢集中,節點之間需要通過某種機制(心跳)瞭解彼此的健康情況,以確保各個節點協調工作。假設只是心跳出現故障,各個節點還在正常的工作,每個節點都認為其他節點宕機,自己是整個叢集的唯一健在者,因此需要獲得整個叢集的“控制權”。儲存是共用的,這就意味著災難,這種情況就是“腦裂”。
投票演算法可以解決這個問題
每個節點會在投票區記錄自己的票數(自己收到了多少節點的心跳,一個心跳是一票),各個節點會讀取其與節點的票數。
如果一個叢集分成了兩個partition,一個partition是3個節點,一個partition是2個節點。那麼3個節點的partition裡面所有的節點的票數都是3,兩個節點的partition裡面所有節點的票數都是2.擁有兩個節點的partition會被踢出,自動重啟。如果兩個partition的節點都相同,那麼第一個控制投票區的partiton將會存活,另外一個partition將會被踢出而重啟,這種情況通常是master節點(一般是第一個啟動的節點)所在的partition將會存活。
4、IO隔離(IO Fencing)、
叢集出現故障,必須判斷哪個節點應該獲得叢集的控制權,那些節點需要被踢出。這時投票需要解決的問題。
僅僅將他們踢出還不足夠,因為他們可能還在繼續運行(只是離開了這個叢集),需要保證他們不再訪問共用資料。這就是IO隔離要解決的問題。
IO Fencing實現有硬體和軟體方式。各個叢集廠商使用的方式不同,有些需要硬體的支援(主要是存放裝置是否支援某些協議)。Oracle RAC使用的是軟體的 方式,直接重啟故障節點。
無論採用哪種方式,IO Fencing的目的就是保證故障節點不能繼續訪問共用資料。
有一些存放裝置支援SCSI Reserve/Release命令,正常節點使用SCSI Reserve命令鎖住存放裝置,故障節點發現儲存被鎖定,就知道自己已經被踢出了cluster,自行重啟,這種機制叫做自殺機制(suicide)。例如Sun和Veritas的叢集使用的就是這種機制。
無論軟體還是硬體,大致原理就是:正常節點通過某種方式告知故障節點,故障節點會進行重啟。告知的方式有硬體和軟體之分,硬體更加安全一些。