HeartBeat?你到底要干什么!
??? 上一篇博客我寫了通過使用HeartBeat的簡單配置來實現一個完整的高可用集群的方案,說白了,配置真的非常簡單,安裝幾個軟件,定義幾個參數,寫一下配置文件,一運行,搞定了~可以說我們使用了最簡單的方式實現了一個聽起來挺犀利的詞,高可用集群。
??? 但是HeartBeat到底在這過程中都干了什么?做了什么,為什么架構圖上要出現“搶奪”這個詞?難道HeartBeat是強盜?劫匪?
??? 這篇博客,就一舉通過HeartBeat揭開高可用集群的秘密!
?
?
??? 首先我們知道高可用集群(HA),就要像其名字一樣,高可用,那么它帶給人們的就是24*365不間斷運行,你很難想象如果哪天你正在銀行存款,剛存了10W塊錢進去,立刻再一查,發現竟然沒存上?!這時候工作人員很抱歉的告訴你,由于銀行內部的服務器剛才斷線了0.5秒,導致你現在這筆存款不翼而飛了……那時候的你抓狂不?所以,高可用集群就是為了解決這個問題而存在的。
??? 它最起碼的要保證我們的服務器必須不能因為一臺服務器的宕機而導致全盤皆輸~
??? 我們通過兩臺或者兩臺以上的服務器,來提供相同的服務,雖然兩臺機子都開著,但是同時工作的只有一臺,此時正在工作的這個主機叫做主節點,而處于暫時檢測隨時準備替代主節點的那個主機叫備節點。這樣,當主節點因為某些原因宕機之后,備節點會立刻接替主節點的任務,并且開始提供服務。
??? 但是問題出現了,備節點如何去檢測主節點呢?這時候我們就要用到心跳信息了。心跳信息,是主機通過向外發出一種信號,來證明自己還活著,以告知其他備主機只需要一直檢測狀態就行,而不需要來瓜分自己的資源。于是,備節點們通過主節點發出的心跳信息,來不斷的確定主節點活著,自己不需要去工作。
??? 當然,現實的問題總比我們設計好的要差很遠,現實的問題就是,我們的主節點太忙了,它已經忙到沒有時間去向外發送心跳信息了,于是一個新的問題出現了。備節點們很高興的發現自己在規定的周期內沒有檢測到主節點發出的心跳信息,于是備節點們一個個高興的準備啟動了,以便能夠接替主節點的所有任務。但是辛苦的主節點此時并沒有任何問題,還正在歡快的忙碌著得時候,忽然發現了意見不妙的事情:自己的IP沒了?服務也沒了?用戶在自己身上的連接瞬間被轉移到其他的地方了!
??? 主節點立刻就意識到了有人搶它的飯碗,憤怒的主節點立刻運行了一個機制再次把資源搶了回來。一搶回來不要緊,備節點依然因為主節點太忙而收不到主節點的心跳信息,于是,一個惡性循環開始了,主節點和備節點他們搶來搶去,直接導致我們用戶的數據各種出錯,各種無法讀寫。這種因為集群節點各行其事,導致資源哄搶的問題就叫做腦裂(Split-brain)。
??? 畢竟這些節點主機都是人設計的,當我們發現問題,改正就行了。于是,我們設計出了一個機制節點級別的隔離機制。常用的叫做STONITH(Shoot The Other Node In The Head)爆頭機制,一旦自己搶到資源,就立刻把其他節點主機的電源給掐斷,讓那個節點永遠的不能跟自己搶奪資源。而這種機制就是專門來解決腦裂問題的。
??? 當然,我們不能單純的直接將電源切斷,那樣我們的當前節點正好宕機的話,那豈不是就再也沒有備節點幫它提供服務了?所以我們又出了一種叫做資源級別的隔離機制,這種隔離只隔離服務器提供的資源,而不對服務器造成其他的什么損害。
??? 但是,我們剛才的情況都僅僅針對了只有一個主節點和一從節點,如果有一堆節點怎么辦?到底誰搶呢?難道是搶得快的搶的多,搶的慢的就搶的少么?呵呵,雖然備節點們一個個都像強盜一樣在搶著各種資源,但是我們主節點可以規定,到底只允許哪個強盜在自己死后獲得遺產,獲得資源。而這種在自己死后控制資源轉移的方式就叫做故障轉移(failover)。
??? 對于很多節點,他們都在提供不同的服務,不管哪個節點上的服務掛了,都會有其他的節點將其資源搶奪過來以保證服務的正常運行,那么到底掛掉多少節點,我們的服務才都不能運行了呢?這時候我們就需要一個機制,來計算整個多節點集群的工作是否處于一個正常狀態,而計算的方法,我們采用投票制,每一個節點都握有票,要求集群的總體票數要超過半數才能運行,而我們投的票數叫做法定代表人數(quorum),一般必須是半數以上才能夠確保一個多節點集群是處于正常狀態的。而整個總管投票,決定投票的節點就叫做DC。
??? 那么,一個完整的高可用集群到底是以什么結構來工作的呢?
第一層(最底層),Messaging and Infrastructure 信息和基礎架構層,又稱心跳層
??? 用于傳遞心跳信息,和其他集群事物信息,向別人通知當前節點是否正常工作。
第二層:Membership Layer 成員關系層,
??? 最重要的是CCM,這是個服務,根據第一層提供的信息,來計算成員關系,上面是否要采取各種動作,需要這一層提供的成員關系來提供功能。CCM還要為所有節點的狀態信息生成一個所有節點的預覽圖,而且是以本節點作為主視角,確保本節點可以在某些情況下采取某種動作
第三層:Resource Allocation Layer資源分配層:(真正實現高可用服務層)
??? 1.CRM(集群資源管理器),它運行在HA的每一個節點上。定義資源的特定屬性,哪些資源誰先誰后,哪些資源運行在哪個節點上。資源管理的每一個動作都需要通過CRM來實現。在每一個節點上CRM都維護有一個CIB(集群信息機庫 XML文檔),而只有工作在DC上的文檔是可以修改的,其他CIB都是復制DC上的那個文檔而來的。當某個節點發生故障之后,是由DC來決定是否搶奪資源。
??? 2.CIB(集群信息庫),這個庫其實就是XML文檔:在內存當中的集群級別的內存文件,工作的時候是常駐內存的,并且需要通知給其他節點的,在紅帽里有一個叫CCSD的專門用于同步文件。配置它需要使用cibadmin命令,或者使用CRM等,也可以使用HeartBeat提供的前臺處理窗口來配置。
??? 3.PE和TE。任何時候資源的控制都需要又DC來控制,而PE是進行策略決策的,TE是來決策執行的。
??? 4.LRM(本地資源管理器)是執行CRM傳遞過來的在本地執行某個資源的執行和停止的具體執行人,相對于資源來講,CRM是決策者,LRM是執行者。這樣CRM是管理全局資源,LRM則是管理本地資源的。
??? XML文檔:各節點之間最通用的配置文檔。需要修改的時候只需要修改DC的XML文檔。而當修改其他各節點上的XML文件,其實都是在修改DC上的XML文件,而這種樣實現需要使用Cluster Information Base來實現。
第四層:Resource Layer,資源層
??? 通過Resource Agents(RA),通過腳本來實現的:資源的代理,啟動、停止、重新載入配置文件、獲取狀態信息等,真正實現在本機或者某個節點上管理某種資源的。這些都是LSB腳本。
??? 還有一種是OCF(Open Clustering Framework)腳本。比LSB稍微強大一點的腳本。通用性比LSB更好。
?
而我們使用的HeartBeat,就是這樣一款,能夠控制整個HA工作的,定義如何分配資源的,高可用集群的實現軟件。
轉載于:https://blog.51cto.com/foreveryan/662825
總結
以上是生活随笔為你收集整理的HeartBeat?你到底要干什么!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Windows沙拉]调整Windows
- 下一篇: HDU_2795 Billboard(线