天天看點

高可用叢集1 HA基礎概念一、高可用出現的原因二、高可用的引出三、高可用叢集的層次四、資源管理的相關概念

一、高可用出現的原因

整個IT業務系統在運作過程中,軟硬體都有可能發生故障;按照墨菲定律,當一件事有發生的可能性時,則這件事必然會發生。軟硬體發生的故障主要有以下幾類:

1.硬體故障:

1、産品設計缺陷

2、使用時間累計造成的自然損耗

3、人為故障,例如支付寶光纖被挖斷事件

2.軟體故障:

1、軟體設計缺陷

2、軟體中存在bug

3、人為誤操作,典型代表為2015年5月攜程大規模當機事件

3.系統可用性

衡量一個系統的可用性可以用如下公式來表示:

A=MTBF/(MTBF+MTTR),

A為Availability可用性

MTBF為Mean Time Between Failure平均可用時間

MTTR為Mean Time To Repair平均修複時間

A的取值範圍是0<A<1,提高可用性就是要增加MTBF和減小MTTR。除了使用各種自動化運維監控工具提高排障效率,普遍方法是提供備援備份。以下講的主要是主機層面的備援,對于網線、交換機、甚至電源的備援,這由專門的網絡工程師和機房運維負責,這裡不做讨論。

二、高可用的引出

1.高可用術語

在提供了備援主機的業務系統中,備用主機每隔很短的時間,周期性不斷探測活動主機目前狀态的機制稱為心跳機制,即heartbeat,負責傳遞心跳資訊的線纜稱為心跳線。當備用主機檢測不到活動主機的狀态,自己就取而代之,取代之前的活動主機并對外提供服務。但是活動主機有可能因為網絡擁堵或者CPU繁忙導緻備用主機收不到心跳資訊,活動主機其實并沒有當機,是以備用主機不可能第一次檢測不到心跳資訊就取代活動主機,一般需要多次探測。這種為提升可用性,使用多台計算機建構的叢集稱為高可用叢集High Availability Cluster,叢集内每一個單獨主機稱為叢集的節點Node。

對于HA叢集提供的服務,都是由不同的資源組成。例如一個NFS的HA叢集,對外需要提供一個ip位址和檔案系統;LVS叢集需要提供ip位址和ipvs規則,像ip位址、檔案系統、ipvs規則等每個都是構成整個叢集服務的組成部分,這稱為叢集的資源resource。HA叢集提供了硬體備援,但真正的高可用性在于當活動節點發生故障時,能夠将服務的資源轉移到備用節點,進而保證服務的高可用性。這個資源轉移的過程稱為故障轉移failover。

在一個HA叢集中,會出現以下情況,節點狀态正常,心跳也正常,但提供的服務不一定可用,當資源服務不可用,如何解決服務高可用呢?可以首先嘗試在故障節點重新開機服務,如果重新開機後不可用再轉移資源。當故障主機修複好恢複之後,如果主備節點性能相當,則不用再度将資源轉移回原主節點;如果一定要轉移回原主節點,這個過程叫做failback。一般不建議這麼做,因為在轉移的過程中,服務是不可用的。高可用叢集要做到能夠監控資源的狀态,以及資源出現故障時能夠決策如何轉移資源。

2.心跳傳遞機制

心跳資訊并不是節點去探測對方擷取,而是節點主動向對方發送心跳資訊。傳遞心跳的媒體有2種:串行線纜和以太網線;串行線路作用範圍有限,不建議使用。

2節點叢集:使用UDP協定單點傳播傳輸(unicast),心跳傳輸封包都很小,使用TCP協定會降低傳輸效率

多節點叢集:使用UDP協定多點傳播傳輸(multicast)

3.多點傳播位址

辨別一個IP多點傳播域,保證單個主機向這個多點傳播域内發送的資訊都能讓域内的其他主機接受,實作一對多傳輸,位址範圍:224.0.0.0-239.255.255.255,有以下幾類:

永久多點傳播位址:224.0.0.0-224.0.0.255,在網際網路固定使用

臨時多點傳播位址:224.0.1.0-238.255.255.255,個人測試使用

本地多點傳播位址:239.0.0.0-239.255.255.255,僅在特定本地範圍内有效(不做深究)

配置HA叢集,通常使用臨時多點傳播位址,網卡必須啟用多點傳播功能,否則就算配置了多點傳播位址也不能傳遞接收資訊

4.腦裂問題

運作的HA叢集,由于某些網絡故障或其他原因,導緻主備節點之間收不到心跳資訊,例如心跳線發生故障,備用節點收不到主節點的心跳,會認為主節點發生故障,并試圖将資源轉移到自己身上,而主節點認為自己沒有故障,并不打算将資源轉手他人,此時雙方會發生資源争用。這種情況的出現表明叢集出現了分區partition,或者出現分裂,一般稱為腦裂split brain。例如在一個含有共享存儲的叢集,如果出現腦裂,主備節點争搶存儲資源,同時對同一檔案進行讀寫操作,會發生檔案系統損壞,是以一定要避免腦裂。對于叢集分裂,普遍使用投票系統vote system作為解決方案。

5.投票系統

HA各節點無法探測彼此的心跳資訊,必然無法協調工作,這時候叢集各節點進行投票,采用少數服從多數的原則,超過一半的叢集節點可以代表叢集繼續工作。例如一個5節點構成的叢集分裂為A和B兩個分區,A分區有3個節點,B分區有2個節點,每個節點1票。A分區有3票,超過了5的一半,是以稱A分區具備了法定票數,即with quorum,這部分可以代表叢集繼續工作;而B分區的2個節點,由于不具備法定票數,即without quorum,是以就被叢集剔除。為了友善投票決策,叢集要奇數個節點。如果是偶數個節點,而且恰好分裂的兩部分數量相同,則要引入仲裁機制,使用第三方力量,例如仲裁盤quorum disk,或者網關。雙方都向仲裁盤寫資料,或者向網關發起ping操作,能寫入資料或ping通網關的就認為具備法定票數。對于2節點的叢集,必須使用仲裁機制。

三、高可用叢集的層次

高可用叢集1 HA基礎概念一、高可用出現的原因二、高可用的引出三、高可用叢集的層次四、資源管理的相關概念

1.message (叢集資訊層)或infrustructure(叢集架構層)

這是整個叢集的最底層,在這一層中,所有節點上運作一個程式來傳遞資訊,主機通過程式向其他節點發送心跳資訊,使用多點傳播方式傳輸,每個主機主動對外向特定的多點傳播位址發送心跳。message layer不僅能傳輸心跳,還能傳遞叢集事務資訊,例如叢集腦裂時,多數節點決定将少數節點剔除叢集

2.cluster resource mananger(叢集資源管理層CRM)

對于叢集運作的服務程式,在開發過程中需要調用message層程式提供的API,服務通過message層傳遞心跳資訊,還要通過這個message程式擷取各節點的硬體性能,來決定在哪個節點運作,這樣服務才能運作在高可用場景,才能在出現故障時做出資源轉移的決策。

事實上,很多程式自身并不具備有高可用能力,例如使用httpd需要開發針對httpd的高可用功能,使用mysql需要開發針對mysql的高可用功能。為了減輕應用開發的負擔,就有好事者在message層上開發出第二個層次,cluster resource manager。CRM可以根據管理者的配置去在對應節點上運作服務,還能監控資源狀态,在故障時轉移資源。CRM承上可以為不具備高可用的服務程式提供高可用,讓其利用message層完成HA;啟下可以利用底層message傳遞的心跳和叢集事務資訊,做出整個叢集内部事務決策。對于可以直接調用message層的功能實作HA的資源,稱為HA-aware資源;而必須借助CRM在叢集上實作HA的資源,稱為none HA-aware資源。

3.local resource manager(本地資源管理層LRM)

以web服務的高可用為例,需要的資源有ip位址、httpd服務甚至于頁面檔案。對于httpd服務可以使用符合LSB标準的腳本,使用start或stop等參數進行管理,但是對于ip位址等是沒有這種方法進行管理,要麼使用指令,要麼使用配置檔案。為了避免這種麻煩,在CRM之上,又提供一個層次,叫本地資源管理local resource manager,一般LRM都內建在CRM當中,LRM主要在本地節點上對資源進行決策管理。

4.resource agent(資源代理RA)

LRM隻是起到決策功能,決定了一個資源在本地節點上究竟是啟動還是關閉,還是轉移,并不能直接對一個資源做出start或stop操作,需要借助于資源代理resource agent,由這個代理去進行操作。以RHEL6系統為例,在/etc/init.d/目錄下衆多服務的管理腳本,這些腳本就是一個個對應的資源代理,對于ip位址這種資源,隻要安裝了HA的軟體,會自帶管理ip位址的腳本。

四、資源管理的相關概念

1.資源的限制關系

1.1 location位置限制

定義資源對節點的傾向性,資源更傾向運作在哪個節點;用數值表示,範圍是-∞到+∞,負無窮表示無論如何都不在這個節點運作,正無窮則是始終在這個節點。例如某一個節點的硬體性能很好,可以定義資源傾向在這個節點運作。

1.2 colocation排列限制

定義資源彼此間在一起的傾向性:數值表示,-∞到+∞,負無窮表示不在一起運作,有你沒我,有我沒他;正無窮表示二者始終在一起運作,相生相滅。例如一個web的高可用叢集,ip位址和http服務必須啟動在同一個節點,不能孤立存在于不同節點。在HA中有另一種方法,将多個資源綁定在一起,形成一個資源組,在這個資源組下的所有資源同進退,但是這個方法隻能讓多個資源在一起,不能讓多個資源不在一起,是以不能在一起運作的多個資源還得由排列限制管理。

1.3 order順序限制

定義資源在同一個節點上啟動的先後順序,例如一個NFS叢集,必須首先挂載存儲,然後才能啟用ip位址。

2.資源類型

(1)Primitive:主資源,隻能運作在叢集内的單個節點,也叫做native資源

(2)Group:組資源,容器,包含一個或者多個資源,這個資源可以通過“組”這個資源進行統一排程

(3)Clone:克隆資源,可以在同一叢集的多個節點運作,在這個類型下還有一種特殊類型

Master/slave:主從資源,在同一叢集内的2個節點運作2份資源,一主一從

3.資源屬性

(1)priority:優先級,一個叢集要運作多個資源,但是叢集整體的性能有限,可以配置優先級高的資源優先運作

(2)target-role:目标角色,資源配置到叢集後是什麼狀态,有started、stopped、master等狀态

(3)is-managed:是否允許叢集管理此資源,布爾值

(4)resource-stickiness:資源粘性,指資源對目前所在節點的傾向性

(5)allow-migrate:是否允許遷移

4.資源隔離

叢集主節點發生故障,将資源轉移到其他節點,但故障節點隻是突然出現假死,并沒有徹底死絕,萬一在某個時候又活了,會争搶叢集資源;為了避免這個情況,需要給這個節點補一刀讓其徹底死透,這個機制稱為資源隔離。

隔離是有不同的級别,主要有2種:

(1)節點級别:将整個節點進行隔離,STONITH機制,shooting the other node in the head,即爆頭。常用的解決方案是電源交換機,通過電源交換機把這個節點的電源關閉

(2)資源級别:隔離節點對資源的使用,fence機制;例如HA中使用的共享儲存設備,預設情況隻能由一個節點挂載,可以向連接配接儲存設備的交換機發出指令,關閉故障節點與交換機連接配接的端口

繼續閱讀