php 做积分策略,Heartbeat的切换策略-积分统计方法
在V2的Heartbeat中,為了將資源的監(jiān)控和切換結(jié)合起來(lái),同時(shí)支持多節(jié)點(diǎn)集群,Heartbeat提供了一種積分策略來(lái)控制各個(gè)資源在集群中各節(jié)點(diǎn)之間的切換策略。通過該積分機(jī)制,計(jì)算出各節(jié)點(diǎn)的的總分?jǐn)?shù),得分最高者將成為active狀態(tài)來(lái)管理某個(gè)(或某組)資源。 如果
在V2的Heartbeat中,為了將資源的監(jiān)控和切換結(jié)合起來(lái),同時(shí)支持多節(jié)點(diǎn)集群,Heartbeat提供了一種積分策略來(lái)控制各個(gè)資源在集群中各節(jié)點(diǎn)之間的切換策略。通過該積分機(jī)制,計(jì)算出各節(jié)點(diǎn)的的總分?jǐn)?shù),得分最高者將成為active狀態(tài)來(lái)管理某個(gè)(或某組)資源。
如果在CIB的配置文件中不做出任何配置的話,那么每一個(gè)資源的初始分?jǐn)?shù)(resource-stickiness)都會(huì)是默認(rèn)的0,而且每一個(gè)資源在每次失敗之后所減掉的分?jǐn)?shù)(resource-failure-stickiness)也是0。如此的話,一個(gè)資源不論他失敗多少次,heartbeat都只是執(zhí)行restart操作,不會(huì)進(jìn)行節(jié)點(diǎn)切換。一般來(lái)說(shuō),resource-stickiness的值都是正數(shù),resource-failure-stickiness的值都是負(fù)數(shù)。另外還有一個(gè)特殊值那就是正無(wú)窮大(INFINITY)和負(fù)無(wú)窮大(-INFINITY)。如果節(jié)點(diǎn)的分?jǐn)?shù)為負(fù)分,那么不管什么情況發(fā)生,該節(jié)點(diǎn)都不會(huì)接管資源(冷備節(jié)點(diǎn))。隨著資源的各種狀態(tài)的發(fā)生,在各節(jié)點(diǎn)上面的分?jǐn)?shù)就會(huì)發(fā)生變化,隨著分?jǐn)?shù)的變化,一旦某節(jié)點(diǎn)的分?jǐn)?shù)大于當(dāng)前運(yùn)行該資源的節(jié)點(diǎn)的分?jǐn)?shù)之后,heartbeat就會(huì)做出切換動(dòng)作,現(xiàn)在運(yùn)行該資源的節(jié)點(diǎn)將釋放資源,分?jǐn)?shù)高出的節(jié)點(diǎn)將接管該資源。
在CIB的配置中,可以給每個(gè)資源定義一個(gè)分?jǐn)?shù),通過resource-stickiness來(lái)設(shè)置,同樣也可以設(shè)置一個(gè)失敗后丟失的分?jǐn)?shù),通過resource-failure-stickiness來(lái)設(shè)置。如下:
…
上面的配置就是給mysql_db這個(gè)resource配置了兩個(gè)分?jǐn)?shù),成功運(yùn)行的時(shí)候所得到的分?jǐn)?shù)(resource_stickiness)和運(yùn)行失敗會(huì)丟失的分?jǐn)?shù)(resource_failure_stickiness),兩項(xiàng)分?jǐn)?shù)值一樣多,成功則得100分,失敗則-100分。
除了可以通過給每個(gè)資源單獨(dú)設(shè)置兩項(xiàng)的分?jǐn)?shù)之外,也可以將所有的resource設(shè)置成相同的分?jǐn)?shù),如下:
…
…
…
在這個(gè)配置中,就是給所有資源設(shè)置了兩個(gè)默認(rèn)的分?jǐn)?shù),省去單獨(dú)每個(gè)資源都設(shè)置的麻煩。當(dāng)然,如果在設(shè)置了這個(gè)default分?jǐn)?shù)之后,同時(shí)也給部分或者全部資源也設(shè)置了這兩個(gè)分?jǐn)?shù)的話,將取單獨(dú)設(shè)置的各個(gè)資源設(shè)置的分?jǐn)?shù)而不取默認(rèn)分?jǐn)?shù)。
除了資源的分?jǐn)?shù)之外,節(jié)點(diǎn)自身同樣也有分?jǐn)?shù)。節(jié)點(diǎn)分?jǐn)?shù)可以如下設(shè)置:
…
…
注意這里節(jié)點(diǎn)分?jǐn)?shù)的設(shè)置是放在configuration配置項(xiàng)里面的constraints配置項(xiàng)下的,通過rule來(lái)設(shè)置。這里是通過節(jié)點(diǎn)主機(jī)名來(lái)匹配的(實(shí)際上heartbeat的很多配置中對(duì)主機(jī)名都是很敏感的)。這里的value值就是節(jié)點(diǎn)的主機(jī)名,rule里面的score就是一個(gè)節(jié)點(diǎn)的分?jǐn)?shù)。
通過上面的配置,我們可以作出如下計(jì)算:
a、在最開始,兩邊同時(shí)啟動(dòng)heartbeat的話,兩邊都沒有開始運(yùn)行這個(gè)resource,resource本身沒有分?jǐn)?shù),那么僅僅計(jì)算節(jié)點(diǎn)的分?jǐn)?shù):
mysql1的分?jǐn)?shù):node+resource+failcount*failure=200+0+(0*(-100))=200
mysql2的分?jǐn)?shù):node+resource+failcount*failure=150+0+(0*(-100))=150
heartbeat會(huì)做出選擇在mysql1上面運(yùn)行mysql_db這個(gè)資源,然后mysql1的分?jǐn)?shù)發(fā)生變化了,因?yàn)橛匈Y源自身的分?jǐn)?shù)加入了:
mysql1的分?jǐn)?shù):node+resource+failcount*failure=200+100+(0*(-100))=300
mysql2的分?jǐn)?shù):node+resource+failcount*failure=150+0+(0*(-100))=150
b、過了一段時(shí)間,heartbeat的monitor發(fā)現(xiàn)mysql_db這個(gè)資源crash(或者其他問題)了,分?jǐn)?shù)馬上會(huì)發(fā)生變化,如下:
mysql1的分?jǐn)?shù):node+resource+failcount*failure=200+100+(1*(-100))=200
mysql2的分?jǐn)?shù):node+resource+failcount*failure=150+0+(0*(-100))=150
heartbeat發(fā)現(xiàn)mysql1節(jié)點(diǎn)的分?jǐn)?shù)還是比mysql2的高,那么資源不發(fā)生遷移,將執(zhí)行restart類操作。
c、繼續(xù)運(yùn)行一段時(shí)間發(fā)現(xiàn)又有問題(或者是b后面restart沒有起來(lái))了,分?jǐn)?shù)又發(fā)生變化了:
mysql1的分?jǐn)?shù):node+resource+failcount*failure=200+100+(2*(-100))=100
mysql2的分?jǐn)?shù):node+resource+failcount*failure=150+0+(0*(-100))=150
這時(shí)候heartbeat發(fā)現(xiàn)mysql2節(jié)點(diǎn)比mysql1節(jié)點(diǎn)的分?jǐn)?shù)高了,資源將發(fā)生遷移切換,mysql1釋 mysql_db相關(guān)資源,mysql2接管相關(guān)資源,并在mysql2上運(yùn)行mysql_db這個(gè)資源。這時(shí)候,節(jié)點(diǎn)的分?jǐn)?shù)又會(huì)發(fā)生變化如下:
mysql1的分?jǐn)?shù):node+resource+failcount*failure=200+0+(2*(-100))=0
mysql2的分?jǐn)?shù):node+resource+failcount*failure=150+100+(0*(-100))=250
這時(shí)候如果在mysql2上面三次出現(xiàn)問題,那么mysql2的分?jǐn)?shù)將變成-50,又比mysql1少了,資源將遷移回 mysql1,mysql1的分?jǐn)?shù)將變成100,而mysql2的分?jǐn)?shù)將變成-150,因?yàn)橛稚倭速Y源所有者的那100分。到這里,mysql2節(jié)點(diǎn)的分?jǐn)?shù)已經(jīng)是負(fù)數(shù)了。heartbeat還有一個(gè)規(guī)則,就是資源永遠(yuǎn)都不會(huì)遷移到一個(gè)分?jǐn)?shù)分?jǐn)?shù)是負(fù)數(shù)的節(jié)點(diǎn)上面去。也就是說(shuō)從這以后,mysql1節(jié)點(diǎn)上面不管mysql_db這個(gè)資源失敗多少次,不管這個(gè)資源出現(xiàn)什么問題,都不會(huì)遷移回mysql2節(jié)點(diǎn)了。一個(gè)節(jié)點(diǎn)的分?jǐn)?shù)會(huì)在該節(jié)點(diǎn)的heartbeat重啟之后被重置為初始狀態(tài)。或者通過相關(guān)命令來(lái)對(duì)集群中某個(gè)節(jié)點(diǎn)的某個(gè)資源或者資源組來(lái)重置或者查看其failcount,如下:
crm_failcount -G -U mysql1 -r mysql_db #將查看mysql1節(jié)點(diǎn)上面的mysql_db這個(gè)資源的failcount
crm_failcount -D -U mysql1 -r mysql_db #將重置mysql1節(jié)點(diǎn)上面的mysql_db這個(gè)資源的failcount
當(dāng)然,在實(shí)際應(yīng)用中,我們一般都是將某一些互相關(guān)聯(lián)的資源放到一起組成一個(gè)資源組,一旦資源組中某資源有問題的時(shí)候,需要遷移整個(gè)資源組的資源。這個(gè)和上面針對(duì)單個(gè)資源的情況實(shí)際上沒有太多區(qū)別,只需要將上面mysql_db的設(shè)置換到資源組即可,如下:
…
… …
…
這樣,在該資源組中任何一個(gè)資源出現(xiàn)問題之后,都會(huì)被認(rèn)為該資源組有問題,當(dāng)分?jǐn)?shù)低于其他節(jié)點(diǎn)出現(xiàn)切換的時(shí)候就是整個(gè)資源組的切換。
另外,對(duì)于INFINITY和-INFINITY這兩個(gè)值,實(shí)際上主要用途就是為了控制永遠(yuǎn)不切換和只要失敗必須切換用的。因?yàn)榇淼囊馑季褪菗碛姓裏o(wú)窮大的分?jǐn)?shù)和失敗就到負(fù)無(wú)窮大,主要用來(lái)滿足極端規(guī)則的簡(jiǎn)單配置項(xiàng)。
總的來(lái)說(shuō),一項(xiàng)資源(或者資源組)在一個(gè)節(jié)點(diǎn)運(yùn)行遷移到另一個(gè)節(jié)點(diǎn)之前,可以失敗的次數(shù)的計(jì)算公式可以如下表示:
(nodeA score – nodeB score + stickiness)/abs(failure stickiness),即為A節(jié)點(diǎn)分?jǐn)?shù)減去B節(jié)點(diǎn)分?jǐn)?shù),再加上資源運(yùn)行分?jǐn)?shù)后得到的總分?jǐn)?shù),除以資源失敗分?jǐn)?shù)的絕對(duì)值。
總結(jié)
以上是生活随笔為你收集整理的php 做积分策略,Heartbeat的切换策略-积分统计方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCL QD-MiniLED 电视新品将
- 下一篇: php改变图片宽高,php缩放图片(根据