linux高可用集羣(HA)原理詳解

高可用集羣mysql

1、什麼是高可用集羣linux

        高可用集羣就是當某一個節點或服務器發生故障時,另外一個節點可以自動且當即向外提供服務,即將有故障節點上的資源轉移到另外一個節點上去,這樣另外一個節點有了資源既能夠向外提供服務。高可用集羣是用於單個節點發生故障時,可以自動將資源、服務進行切換,這樣能夠保證服務一直在線。在這個過程當中,對於客戶端來講是透明的。sql

 

2、高可用集羣的衡量標準服務器

高可用集羣通常是經過系統的可靠性(reliability)和系統的可維護性(maintainability)來衡量的。一般用平均無端障時間(MTTF)來衡量系統的可靠性,用平均維護 時間(MTTR)來衡量系統的可維護性。所以,一個高可用集羣服務能夠這樣來定義:HA=MTTF/(MTTF+MTTR)*100%。網絡

通常高可用集羣的標準有以下幾種:架構

99%:表示 一年宕機時間不超過4天ide

99.9% :表示一年宕機時間不超過10小時工具

99.99%: 表示一年宕機時間不超過1小時性能

99.999% :表示一年宕機時間不超過6分鐘spa

 

3、高可用集羣的三種方式

實現高可用集羣有三種方式:

(1)、主從方式(非對稱)

這種方式組建的高可用集羣一般包含2個節點和一個或多個服務器,其中一臺做爲主節點(active),另外一臺做爲備份節點(standy)。備份節點隨時都在檢測主節點的健康情況,當主節點發生故障時,服務會自動切換到備份節點上以保證服務正常運行。

這種方式下的高可用集羣其中的備份節點平時不會啓動服務,只有發生故障時纔會有用,所以感受比較浪費。

 

(2)、對稱方式

這種方式通常包含2個節點和一個或多個服務,其中每個節點都運行着不一樣的服務且相互做爲備份,兩個節點互相檢測對方的健康情況,這樣當其中一個節點發生故障時,該節點上的服務會自動切換到另外一個節點上去。這樣能夠保證服務正常運行。

 

(3)、多機方式

這種集羣包含多個節點和多個服務。每個節點均可能運行和不運行服務,每臺服務器都監視着幾個指定的服務,當其中的一個節點發生故障時,會自動切換到這組服務器中的一個節點上去。

 

 

4、高可用集羣的組件

實現高可用集羣須要用到以下組件:

一、Messaging  Layer:能夠理解爲信息層,主要的做用是傳遞當前節點的心跳信息,並告知給對方,這樣對方就知道其餘節點是否在線。若是不在線,則能夠實現資源轉移,這樣另外一臺節點就能夠充當主節點,並正常提供服務。傳遞心跳信息通常使用一根心跳線鏈接,該線接口可使用串行接口也能夠是以太網接口來鏈接。每個節點上都包含信息層。

能夠提供該組件的軟件有:

(1)、heartbeat

heartbeat有三個版本即heartbeat v一、heartbeat  v2和heartbeat  v3

heartbeat v1是比較老的版本,heartbeat v2是目前穩定的版本,在作實驗的時候使用該版本。

(2)、corosync(openAIS的子項目)

(3)、keepalive

(4)、cman

Heartbeat 是比較經常使用的軟件,Keepalived配置相對比較簡單,而ultramonkey好像不怎麼經常使用,Corosync比heartbeat功能還要強大,功能更加豐富
後續實驗過程以上三種都會使用到

 

二、CRM:Cluster  Resource Messager,該組件叫作資源管理器,它主要是用來提供那些不具備高可用的服務提供高可用性的。它須要藉助Messaging  Layer來實現工做,所以工做在Messaging Layer上層。資源管理器的主要工做是根據messaging Layer傳遞的健康信息來決定服務的啓動、中止和資源轉移、資源的定義和資源分配。在每個節點上都包含一個CRM,且每一個CRM都維護這一個CIB(Cluster Internet  Base,集羣信息庫),只有在主節點上的CIB是能夠修改的,其餘節點上的CIB都是從主節點那裏複製而來的。在CRM中還包含LRM和DC等組件。

能夠提供CRM的軟件有:

heartbeat v1自帶的資源管理爲haresource

heartbeat v2自帶的資源管理有haresource和crm

其中crm因爲配置文件是XML格式的,大多數人若是不懂其語法格式的話,可能會出現配置錯誤。所以crm提供了一個監聽端口,能夠用其它GUI工具來配置管理集羣

Heartbeat V3 版後資源管理器獨立出來,而不是做爲Heartbeat的一部分了,它的名字叫Pacemaker功能異常強大,還提供了命令行工具來管理集羣。

Cman 是紅帽開發的一個資源管理器,在紅帽5.X版本上可能遇到,6.x版本後紅帽也開始使用強大的pacemaker

 

三、LRM:Local Resource  Messager,叫作本地資源管理器,它是CRM的一個子組件,用來獲取某個資源的狀態,而且管理本地資源的。例如:當檢測到對方沒有心跳信息時,則會啓動本地相應服務。

 

四、DC:能夠理解爲事務協調員,這個是當多個節點之間彼此收不到對方的心跳信息時,這樣各個節點都會認爲對方發生故障了,因而就會產塵分裂情況(分組)。而且都運行着相關服務,所以就會發生資源爭奪的情況。所以,事務協調員在這種狀況下應運而生。事務協調員會根據每一個組的法定票數來決定哪些節點啓動服務,哪些節點中止服務。 例如高可用集羣有3個節點,其中2個節點能夠正常傳遞心跳信息,與另外一個節點不能相互傳遞心跳信息,所以,這樣3個節點就被分紅了2組,其中每個組都會推選一個DC,用來收集每一個組中集羣的事務信息,並造成CIB,且同步到每個集羣節點上。同時DC還會統計每一個組的法定票數(quorum),當該組的法定票數大於二分之一時,則表示啓動該組節點上的服務;不然中止該節點上的服務。對於某些性能比較強的節點來講,它能夠投多張票,所以每一個節點的法定票數並非只有一票,須要根據服務器的性能來肯定。DC通常位於主節點上。

 

五、PE和TE

PE和TE也是DC的子組件,其中:

PE(Policy Engine):策略引擎,來定義資源轉移的一整套轉移方式,但只是作策略者,並不親自來參加資源轉移的過程,而是讓TE來執行本身的策略。

 

TE(Transition Engine): 就是來執行PE作出的策略的而且只有DC上才運行PE和TE。


 

 六、stonithd組件
STONITH(Shoot The Other Node in the Head,」爆頭「), 這種方式直接操做電源開關,當一個節點發生故障時,另 一個節點若是能偵測到,就會經過網絡發出命令,控制故障節點的電源開關,經過暫時斷電,而又上電的方式使故障節點被重啓動或者直接斷電, 這種方式須要硬件支持。

若是備份節點在某一時刻不能收到主節點的心跳信息時,那麼若是此時備份節點馬上搶佔資源時,而此時主節點正好在執行寫操做,備份節點一旦也執行相應的寫操做,會致使文件系統錯亂或者服務器崩潰,所以在搶佔資源的時候可使用資源隔離機制來防止此類事件發生。而咱們經常使用stonithd(即爆頭)來使主節點不在搶佔資源。

其中資源隔離包括:

(1)、節點級別

使用stonithd設備來實現

(2)、資源級別

例如:使用FC SAN switch能夠實如今存儲資源級別拒絕某節點的訪問

 

七、共享存儲

對於某些服務如http、mysql等服務,須要將某些數據共享,這樣當使用不一樣的節點來訪問存儲設備時,均可以返回正確的信息。若是不使用存儲設備,假設http服務爲例,當某個客戶想訪問某個圖片時,若是這個圖片只放在某個指定的服務器上時,一旦該服務器掛了,http服務就會切換到另外一臺設備上去,而另外一臺設備上面沒有該圖片,那麼該用戶此時就不能訪問該圖片了,固然這種狀況是咱們不想看到了。爲了解決這類事件發生,可使用共享存儲設備,將相關的數據放在共享設備上,這樣不管那一臺服務器掛了,都不會影響用戶的訪問。

經常使用的共享存儲設備有以下三種:

DAS:Direct  Attached  Storage,直接附加存儲

NAS:Network Attached Storage,網絡附加存儲

SAN:Storage  Area  Network,存儲區域網絡

 

所以,一個高可用集羣服務的組件架構大概是這樣子的:

wKiom1SxYbjT9fBkAADA1XIVAJI184.jpg

 

八、資源

在上面好多地方都講到了資源,那麼什麼是資源呢?實現一個高可用性須要那些資源呢?

其實資源就是啓動一個服務須要的子項目。例如啓動一個httpd服務,須要ip,也須要服務腳本、還須要文件系統(用來存儲數據的),這些咱們均可以統稱爲資源。所以,實現一個高可用集羣通常須要

ip、服務(腳本)和文件系統(存儲數據),固然有些高可用集羣不須要存儲設備的。

資源也是有類型的,能夠分爲這樣幾類:

(1)、primitive:能夠理解爲主資源,有時候看到的會是native,都是一個意思,該資源只在主節點上有。(固然備份節點一旦將資源奪過來了,也就成了主節點,所以,主節點是相對來講的)

(2)、group:組資源,將多個資源綁定在一個同一個組上面且運行在同一個節點上。

(3)、clone:是將primitive資源克隆n份且運行在每個節點上

(4)、master/slave:也是將primitive克隆2份、其中master和slave節點各運行一份,且只能在這2個節點上運行。

 

對於某些集羣服務來講,啓動相關的資源是有前後順序的。例如啓動一個mysql集羣服務,首先應該先掛載共享存儲設備,不然即時mysql服務啓動起來了,用戶也訪問不了數據。所以,通常說來,咱們須要將資源進行約束。資源約束有以下幾類:

(1)、位置約束(location):資源對節點的傾向程度,一般可使用一個分數(score)來定義,當score爲正值時,表示資源傾向與此節點;負值表示資源傾向逃離於此節點。也能夠將score定義爲-inf(負無窮大)和inf(正無窮大)。例如:有三個節點rs一、rs二、rs3當rs1是主節點且發生故障時,則比較rs2和rs3的score值,誰是正值,則資源將會轉移到哪一個節點上去。

(2)、排列約束(colocation):用來定義資源是否能夠在一塊兒,一般也是使用一個score來定義的。當score是正值表示資源能夠在一塊兒;不然表示不能夠在一塊兒。經過定義資源類型爲group也能夠來將全部資源綁定在一塊兒。

(3)、順序約束(order):用來定義資源啓動和中止的順序。例如,首先應該先掛載共享存儲,在啓動httpd或mysqld服務才行吧。

 

資源粘性:用來定義資源是否傾向留在該節點。一般使用score來定義,當score爲正數表示樂意留在當前節點,負數表示不樂意留在當前節點。

當某個高可用集羣即包含資源粘性又包含位置約束,一旦該節點發生故障後,資源就會轉移到另外一個節點上去。可是當以前的節點恢復正常時,須要比較全部的資源粘性之和與全部位置約束之和誰大誰小,這樣資源纔會留在大的一方。

 

 

資源轉移

將有故障節點的VIP設置到另外一個節點上去,並在另外一個節點啓用相應的服務,掛載相應的存儲設備等等均可以叫作資源轉移。

 

九、資源代理(Resource Agent)

RA實際負責啓動資源的,LRM用來管理本地資源的,可是不能啓動資源,當須要啓動資源時會調用RA來啓動,RA是一個腳本文件,在一個節點上可能有多個RA。一般在rhel上,啓動系統服務的不也都是一些腳本文件嗎。常見的RA有以下風格:

(1)、LSB(Linux  Standard  Base),這是一種咱們常見的如/etc/init.d/下的標準linux腳本風格。

(2)、OCF(Open Cluster Framwork):OCF腳本是比LSB更強大的一種腳本,支持更多的參數

 

通常說來,構建一個高可用集羣服務須要以上組件才能完成。

接下來關於實驗部分將在後文介紹

相關文章
相關標籤/搜索