Heartbeat Score的計算(轉)

Steven1981發表於2009-11-24
原文地址:http://hi.baidu.com/hzxy0830/blog/item/c09fdd240a95d039c895590d.html[@more@]

在V2的Heartbeat中,為了將資源的監控和切換結合起來,同時支援多節點叢集,Heartbeat提供了一種積分策略來控制各個資源在叢集中各節點之間的切換策略。透過該積分機制,計算出各節點的的總分數,得分最高者將成為active狀態來管理某個(或某組)資源。

如果在CIB的配置檔案中不做出任何配置的話,那麼每一個資源的初始分數(resource-stickiness)都會是預設的0,而且每一個資源在每次失敗之後所減掉的分數(resource-failure-stickiness)也是0。如此的話,一個資源不論他失敗多少次,heartbeat都只是執行restart操作,不會進行節點切換。一般來說,resource-stickiness的值都是正數,resource-failure-stickiness的值都是負數。另外還有一個特殊值那就是正無窮大(INFINITY)和負無窮大(-INFINITY)。如果節點的分數為負分,那麼不管什麼情況發生,該節點都不會接管資源(冷備節點)。隨著資源的各種狀態的發生,在各節點上面的分數就會發生變化,隨著分數的變化,一旦某節點的分數大於當前執行該資源的節點的分數之後,heartbeat就會做出切換動作,現在執行該資源的節點將釋放資源,分數高出的節點將接管該資源。

在CIB的配置中,可以給每個資源定義一個分數,透過resource-stickiness來設定,同樣也可以設定一個失敗後丟失的分數,透過resource-failure-stickiness來設定。如下:






上面的配置就是給mysql_db這個resource配置了兩個分數,成功執行的時候所得到的分數(resource_stickiness)和執行失敗會丟失的分數(resource_failure_stickiness),兩項分數值一樣多,成功則得100分,失敗則-100分。

除了可以透過給每個資源單獨設定兩項的分數之外,也可以將所有的resource設定成相同的分數,如下:









在這個配置中,就是給所有資源設定了兩個預設的分數,省去單獨每個資源都設定的麻煩。當然,如果在設定了這個default分數之後,同時也給部分或者全部資源也設定了這兩個分數的話,將取單獨設定的各個資源設定的分數而不取預設分數。

除了資源的分數之外,節點自身同樣也有分數。節點分數可以如下設定:



#注意這裡定義的是每個資源的分數






注意這裡節點分數的設定是放在configuration配置項裡面的constraints配置項下的,透過rule來設定。這裡是透過節點主機名來匹配的(實際上heartbeat的很多配置中對主機名都是很敏感的)。這裡的value值就是節點的主機名,rule裡面的score就是一個節點的分數。

透過上面的配置,我們可以作出如下計算:

a、在最開始,兩邊同時啟動heartbeat的話,兩邊都沒有開始執行這個resource,resource本身沒有分數,那麼僅僅計算節點的分數:

mysql1的分數:node+resource+failcount*failure=200+0+(0*(-100))=200

mysql2的分數:node+resource+failcount*failure=150+0+(0*(-100))=150

heartbeat會做出選擇在mysql1上面執行mysql_db這個資源,然後mysql1的分數發生變化了,因為有資源自身的分數加入了:

mysql1的分數:node+resource+failcount*failure=200+100+(0*(-100))=300

mysql2的分數:node+resource+failcount*failure=150+0+(0*(-100))=150

b、過了一段時間,heartbeat的monitor發現mysql_db這個資源crash(或者其他問題)了,分數馬上會發生變化,如下:

mysql1的分數:node+resource+failcount*failure=200+100+(1*(-100))=200

mysql2的分數:node+resource+failcount*failure=150+0+(0*(-100))=150

heartbeat發現mysql1節點的分數還是比mysql2的高,那麼資源不發生遷移,將執行restart類操作。

c、繼續執行一段時間發現又有問題(或者是b後面restart沒有起來)了,分數又發生變化了:

mysql1的分數:node+resource+failcount*failure=200+100+(2*(-100))=100

mysql2的分數:node+resource+failcount*failure=150+0+(0*(-100))=150

這時候heartbeat發現mysql2節點比mysql1節點的分數高了,資源將發生遷移切換,mysql1釋mysql_db相關資源,mysql2接管相關資源,並在mysql2上執行mysql_db這個資源。這時候,節點的分數又會發生變化如下:

mysql1的分數:node+resource+failcount*failure=200+0+(2*(-100))=0

mysql2的分數:node+resource+failcount*failure=150+100+(0*(-100))=250

這時候如果在mysql2上面三次出現問題,那麼mysql2的分數將變成-50,又比mysql1少了,資源將遷移回mysql1,mysql1的分數將變成100,而mysql2的分數將變成-150,因為又少了資源所有者的那100分。到這裡,mysql2節點的分數已經是負數了。heartbeat還有一個規則,就是資源永遠都不會遷移到一個分數分數是負數的節點上面去。也就是說從這以後,mysql1節點上面不管mysql_db這個資源失敗多少次,不管這個資源出現什麼問題,都不會遷移回mysql2節點了。一2>&1 ptest -LVVVVVVVV|grep -E "dump_node_scores"個節點的分數會在該節點的heartbeat重啟之後被重置為初始狀態。或者透過相關命令來對叢集中某個節點的某個資源或者資源組來重置或者檢視其failcount,如下:

crm_failcount -G -U mysql1 -r mysql_db #將檢視mysql1節點上面的mysql_db這個資源的failcount

crm_failcount -D -U mysql1 -r mysql_db #將重置mysql1節點上面的mysql_db這個資源的failcount

當然,在實際應用中,我們一般都是將某一些互相關聯的資源放到一起組成一個資源組,一旦資源組中某資源有問題的時候,需要遷移整個資源組的資源。這個和上面針對單個資源的情況實際上沒有太多區別,只需要將上面mysql_db的設定換到資源組即可,如下:












這樣,在該資源組中任何一個資源出現問題之後,都會被認為該資源組有問題,當分數低於其他節點出現切換的時候就是整個資源組的切換。

另外,對於INFINITY和-INFINITY這兩個值,實際上主要用途就是為了控制永遠不切換和只要失敗必須切換用的。因為代表的意思就是擁有正無窮大的分數和失敗就到負無窮大,主要用來滿足極端規則的簡單配置項。

總的來說,一項資源(或者資源組)在一個節點執行遷移到另一個節點之前,可以失敗的次數的計算公式可以如下表示:

(nodeA score - nodeB score + stickiness)/abs(failure stickiness),即為A節點分數減去B節點分數,再加上資源執行分數後得到的總分數,除以資源失敗分數的絕對值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-1028989/,如需轉載,請註明出處,否則將追究法律責任。

相關文章