<a href="http://www.linuxidc.com/linux/2013-08/88522.htm">http://www.linuxidc.com/linux/2013-08/88522.htm</a>
高可用叢集的衡量标準
ha(high available), 高可用性群集是通過系統的可靠性(reliability)和可維護性(maintainability)來度量的。工程上,通常用平均無故障時間(mttf)來度量系統的可靠性,用平均維修時間(mttr)來度量系統的可維護性。于是可用性被定義為:ha=mttf/(mttf+mttr)*100%
具體ha衡量标準:
99% 一年當機時間不超過4天
99.9% 一年當機時間不超過10小時
99.99% 一年當機時間不超過1小時
99.999% 一年當機時間不超過6分鐘
~~~~~~~~~~~~~~~~
高可用叢集可分為三個層次結構,分别由紅色部分的messaging與membership層,藍色部分的cluster resource manager(crm)層,綠色部分的local resource manager(lrm)與resource agent(ra)組成,下面我們就來具體說明(如上圖),
1.位于最底層的是資訊和成員關系層(messaging and membership),messaging主要用于節點之間傳遞心跳資訊,也稱為心跳層。節點之間傳遞心跳資訊可以通過廣播,多點傳播,單點傳播等方式。成員關系(membership)層,這層最重要的作用是主節點(dc)通過cluster consensus menbership service(ccm或者ccs)這種服務由messaging層提供的資訊,來産生一個完整的成員關系。這層主要實作承上啟下的作用,承上,将下層産生的資訊生産成員關系圖傳遞給上層以通知各個節點的工作狀态;啟下,将上層對于隔離某一裝置予以具體實施。
2.叢集資源管理層(cluster resource manager),真正實作叢集服務的層。在該層中每個節點都運作一個叢集資料總管(crm,cluster resource manager),它能為實作高可用提供核心元件,包括資源定義,屬性等。在每一個節點上crm都維護有一個cib(叢集資訊庫 xml文檔)和lrm(本地資料總管)元件。對于cib,隻有工作在dc(主節點)上的文檔是可以修改的,其他cib都是複制dc上的那個文檔而來的。對于lrm,是執行crm傳遞過來的在本地執行某個資源的執行和停止的具體執行人。當某個節點發生故障之後,是由dc通過pe(政策引擎)和te(實施引擎)來決定是否搶奪資源。
3.資源代理層(resource agents),叢集資源代理(能夠管理本節點上的屬于叢集資源的某一資源的啟動,停止和狀态資訊的腳本),資源代理分為:lsb(/etc/init.d/*),ocf(比lsb更專業,更加通用),legacy heartbeat(v1版本的資源管理)。
~~~~~~~~~~~
核心元件的具體說明(如上圖):
1.ccm元件(cluster consensus menbership service):作用,承上啟下,監聽底層接受的心跳資訊,當監聽不到心跳資訊的時候就重新計算整個叢集的票數和收斂狀态資訊,并将結果轉遞給上層,讓上層做出決定采取怎樣的措施,ccm還能夠生成一個各節點狀态的拓撲結構概覽圖,以本節點做為視角,保證該節點在特殊情況下能夠采取對應的動作。
2.crmd元件(cluster resource manager,叢集資料總管,也就是pacemaker):實作資源的配置設定,資源配置設定的每個動作都要通過crm來實作,是核心組建,每個節點上的crm都維護一個cib用來定義資源特定的屬性,哪些資源定義在同一個節點上。
3.cib元件(叢集資訊基庫,cluster infonation base):是xml格式的配置檔案,在記憶體中的一個xml格式的叢集資源的配置檔案,主要儲存在檔案中,工作的時候常駐在記憶體中并且需要通知給其它節點,隻有dc上的cib才能進行修改,其他節點上的cib都是拷貝dc上。配置cib檔案的方法有,基于指令行配置和基于前台的圖形界面配置。
4.lrmd元件(local resource manager,本地資料總管):用來擷取本地某個資源的狀态,并且實作本地資源的管理,如當檢測到對方沒有心跳資訊時,來啟動本地的服務程序等。
5.pengine元件:
pe(policy engine):政策引擎,來定義資源轉移的一整套轉移方式,但隻是做政策者,并不親自來參加資源轉移的過程,而是讓te來執行自己的政策。
te(transition engine): 就是來執行pe做出的政策的并且隻有dc上才運作pe和te。
6.stonithd元件
stonith(shoot the other node in the head,”爆頭“), 這種方式直接操作電源開關,當一個節點發生故障時,另 一個節點如果能偵測到,就會通過網絡發出指令,控制故障節點的電源開關,通過暫時斷電,而又上電的方式使故障節點被重新開機動, 這種方式需要硬體支援。
stonith應用案例(主從伺服器),主伺服器在某一端時間由于服務繁忙,沒時間響應心跳資訊,如果這個時候備用伺服器一下子把服務資源搶過去,但是這個時候主伺服器還沒有宕掉,這樣就會導緻資源搶占,就這樣使用者在主從伺服器上都能通路,如果僅僅是讀操作還沒事,要是有寫的操作,那就會導緻檔案系統崩潰,這樣一切都玩了,是以在資源搶占的時候,可以采用一定的隔離方法來實作,就是備用伺服器搶占資源的時候,直接把主伺服器給stonith,就是我們常說的”爆頭 ”。
~~~~~~~~~~~~~~
高可用叢集軟體
messaging and membership layer(資訊與關系層):
heartbeat (v1,v2,v3),heartbeat v3 分拆 heartbeat pacemaker cluster-glue
corosync
cman
keepalived
ultramokey
cluster resource manager layer(資源管理層,簡稱:crm):
haresource,crm (heartbeat v1/v2)
pacemaker (heartbeat v3/corosync)
rgmanager (cman)
常用組合:
heartbeat v2+haresource(或crm) (說明:一般常用于centos 5.x)
heartbeat v3+pacemaker (說明:一般常用于centos 6.x)
corosync+pacemaker (說明:現在最常用的組合)
cman + rgmanager (說明:紅帽叢集套件中的元件,還包括gfs2,clvm)
keepalived+lvs (說明:常用于lvs的高可用)
總結:我們經常在技術部落格中看到,heartbeat+pacemaker實作mysql高可用,或corosync+pacemaker實作mysql高可用等,有的博友會問了,我們到底用什麼好呢?經過上面的說明大家應該有所了解!
~~~~~~~~~~~~~~~~~
共享存儲
說到叢集, 我們不得不說到,共享存儲,因為不管理是web高可用也,mysql高可用也好,他們的資料都是共享的就一份,所有必須放在共享存儲中,主節點能通路,從節點也能通路。下面我們就簡單說一下共享存儲。
1.das:(direct attached storage)直接附加存儲
說明:裝置直接連接配接到主機總線上的,距離有限,而且還要重新挂載,之間有資料傳輸有延時
raid 陣列
scsi 陣列
2.nas:(network attached storage)網絡附加存儲
說明:檔案級别的共享
nfs
ftp
cifs
3.san:(storage area network)存儲區域網絡
說明:塊級别的,模拟的scsi協定
fc光網絡(交換機的光接口超貴,一個差不多2萬,如果使用這個,代價太高)
ipsan(iscsi)存取快,塊級别,廉價
叢集檔案系統與叢集lvm(叢集邏輯卷管理clvm)
叢集檔案系統:gfs2、ocfs2
叢集lvm:clvm
注:一般用于高可用雙主模型中
高可用叢集的工作原理
說明:這裡主要以主/從節點的高可用來說明工作原理。
主伺服器和從伺服器建立雙機熱備,基本上都是共享一個存儲,以mysql為例。通常情況下,資料庫檔案挂載在主資料庫伺服器上,使用者連接配接到主伺服器上進行資料庫操作。當主伺服器出現故障時,從伺服器就會自動挂載資料庫檔案,并接替主伺服器的工作。使用者在未通知的情況下,通過從資料庫連接配接到資料庫檔案進行操作。等主伺服器的故障修複之後,又可以重新提供服務;
那麼,從伺服器是如何知道主伺服器挂掉了呢,這就要使用一定的檢測機制,如心跳檢測,也就是說每一個節點都會定期向其他節點通知自己的心跳資訊,尤其是主伺服器,如果從伺服器在幾個心跳周期内(可自行設定心跳周期)還沒有檢測到的話,就認為主伺服器宕掉了,而這期間在通告心跳資訊當然不能使用tcp傳輸的,如果使用tcp檢測,還要經過三次握手,等手握完了,不定經過幾個心跳周期了,是以在檢測心跳資訊的時候采用的是udp的端口694來進行傳遞資訊的,如果主伺服器在某一端時間由于服務繁忙,沒時間響應心跳資訊,這個時候從伺服器要是把主服務資源搶過去(共享資料檔案),但是這個時候主伺服器還沒有宕掉,這樣就會導緻資源搶占,就這樣使用者在主從上都能通路,如果僅僅是讀操作還沒事,要是有寫的操作,那就會導緻檔案系統崩潰,這樣一切都玩了,是以在資源搶占的時候,可以采用一定的隔離方法來實作,就是從伺服器搶占資源的時候,直接把主伺服器給“stonith”,就是我們常說的“爆頭”;
那麼,我們又用什麼方式來檢測心跳資訊呢?就是通過心跳線來檢測。運作在從伺服器上的heartbeat可以通過以太網連接配接檢測主伺服器的運作狀态,一旦其無法檢測到主伺服器的“心跳”則自動接管主伺服器的資源。通常情況下,主、從伺服器間的心跳連接配接是一個獨立的實體連接配接,這個連接配接可以是串行線纜、一個由“交叉線”實作的以太網連接配接。heartbeat甚至可同時通過多個實體連接配接檢測主伺服器的工作狀态,而其隻要能通過其中一個連接配接收到主伺服器處于活動狀态的資訊,就會認為主伺服器處于正常狀态。從實踐經驗的角度來說,建議為heartbeat配置多條獨立的實體連,以避免heartbeat通信線路本身存在單點故障。
上面的原理中我們提到了“隔離方法”,下面我們來說一說,隔離方法有兩種,一種是節點隔離,另一種是資源隔離。節點隔離就是我們常說的stonith(shoot the other node in the head ,俗稱“爆頭”),意思就是直接切斷電源;常用的方法是所有節點都接在一個電源交換機上,如果有故障,就直接導緻該節點的電壓不穩定,或斷電,讓有故障的節點重新開機或關閉。(如下圖),而資源隔離,就是 fencing 直接把某種資源截獲過來。
下面我們再來說一說“心路線”的類型,一種是串行電纜,另一種就是我們常看到的以太網線(交叉的雙絞線),它們各有優缺點,串行電纜,被認為是比以太網連接配接安全性稍好些的連接配接方式,因為hacker無法通過串行連接配接運作諸如telnet、ssh或rsh類的程式,進而可以降低其通過已劫持的伺服器再次侵入備份伺服器的幾率。但串行線纜受限于可用長度,是以主、備伺服器的距離必須非常短。以太網線連接配接,使用此方式可以消除串行線纜的在長度方面限制,并且可以通過此連接配接在主從伺服器之間同步檔案系統,進而減少了對正常通信連接配接帶寬的占用。(如下圖)