"继拜读""大师空空""的关于HEARTBEAT SCORE的计算方法,(详见http://steven1981.itpub.net/post/7967/494023),基于一定的理解,自己也作了一些测试,在实验过程中,发现SCORE的计算方法与前面文章中写的大致相同,但有一些细节还是不一样.所以写下这些来给大家拍砖.
注:以下所有得出的结论是基于<2resource2group4score>的配置环境测试的。
[@more@]
一,HB(heartbeat简称)的一些常规动作
1.当HB发现NODE资源失败或发生切换时,会减去之前赋给该NODE的"成功分:default-resource-stickiness"
2.当HB发生NODE资源失败时,会给该NODE加上"失败分:default-resource-failure-stickiness"
3.当HB的资源成功在NODE上START,那么会给该NODE加上"成功分:default-resource-stickiness"
二, Starting Heartbeat on 2 Nodes (mysql3/mysql4):
1. Check status of resources on 2 Nodes. If there is resources running, The score will be added by ""resource-stickiness-default"" ;
CASE 0:
There is no resource on 2 Nodes;
mysql3.mysql.score = mysql4.mysql.score(cib.set)
mysql4.mysql.score = mysql4.mysql.score(cib.set)
CASE 1:
If resource MYSQL is running on the Node mysql3 Before heartbeat start ; then
mysql3.mysql.score = mysql3.mysql.score(cib.set) + ""resource-stickiness-default"";
mysql4.mysql.score = mysql4.mysql.score(cib.set)
CASE 2:
If resource MYSQL is running on the Node mysql4 and mysql 3; then
mysql3.mysql.score = mysql3.mysql.score(cib.set) + ""resource-stickiness-default"";
mysql4.mysql.score = mysql4.mysql.score(cib.set) + ""resource-stickiness-default"";
2. To decide with Node to run resource :
mysql3.mysql.score VS mysql4.mysql.score.
Resource will run on the node which score is bigger;
3. Set Score for 2 Node .
We supposed resource run on the mysql3. (mysql3.mysql.score > mysql4.mysql.score) Then
For Case 0 in Step 1.
mysql3.mysql.score += ""resource-stickiness-default"" ;
msyql4.mysql.score += 0 ;
For Case 1 in Step 1.
mysql4.mysql.score +=0;
mysql3.mysql.score +=0;
For Case 2 in Step 1.
mysql4.mysql.score -= ""resource-stickiness-default"" ;
msyql3.mysql.score += 0 ;"
三, The Monitor find resource mysql failed on mysql3
mysql3.mysql.score=mysql3.mysql.score- ""default-resource-stickiness"" + ""default-failed_resource-stickiness"" ;
if (mysql3.mysql.score+ ""resource-stickiness-default"")>=mysql4.mysql.score then
""NOT_SWITCH"";
else
""SWITCH"" ;
fi"
"NOT_SWITCH():
mysql3.mysql start again;
if START failed ,
mysql3.mysql.score = -100000 ; SWITCH to Node mysql4;
else
mysql3.mysql.score += ""resource-stickiness-default"";
mysql4.mysql.score += 0;
fi"
"SWITCH():
mysql4.mysql start ;
if START failed ,
mysql4.mysql.score = -100000 ; SWITCH to Node mysql3
else
mysql4.mysql.score += ""resource-stickiness-default""
mysql3.mysql.score += 0;
fi"
四, Service heartbeat stop/start
Now Resource mysql running on the Node mysql4, and the Service heartbeat stop/start on the Mysql3;
1, HB stop on the Mysql3,HB set score for 2 Nodes :
mysql4.mysql.score +-= 0;
mysql3.mysql.score = mysql3.mysql.score(cib.set), bug node mysql3.status is "dead"
2, HB start on the Mysql3,Then,HB will decide whether need to Switch resource mysql from mysql4 to mysql3 ;
If mysql3.mysql.score > mysql4.mysql.score then
Switch resource mysql ;
mysql3.mysql.score += ""resource-stickiness-default"" ;
mysql4.mysql.score -= ""resource-stickiness-default"" ;
else
mysql3.status is active . And nothing happened with score for 2 Nodes."
五, 测试结果
1, 测试环境:
OS LINUX RHEL 5.3
HEARTBEAT 2.1.4
RESOURCE: IPADDR,MYSQL
NODES : mysql3,mysql4
2, CIB.XML 重要参数设置: (完整cib.xml见: http://steven1981.itpub.net/post/7967/494026 )
default-resource-stickiness=100 default-resource-failure-stickiness=-101
mysql4.ipaddr.score=350 mysql3.ipaddr.score=400
mysql4.mysql.score=350 mysql3.mysql.score=400
3, 详细的步骤和SCORE,以及资源的状态."
| Score | Status | Action | Memo |
| mysql3.ipaddr | mysql4.ipaddr | mysql3.mysql | mysql4.mysql | mysql3.all | mysql4.all | mysql3.status | mysql4.status | seq | operation | HB在启动时,会先判断NODE上资源是否已经启动,如果已经启动就会给已经启动的一边加分.比如, mysql4.mysql在hb启动前就已经工作.那么HB用400<(350+100)判决,MYSQL的资源就跑到MYSQL4上 Mysql3/mysql4.mysql在HB启动前都工作,那么HB用(400+100)>(350+100)判决,决定resocre mysql run on MYSQL3, 然后再把mysql4.mysql stop. Mysql4.mysql.score=450-100=350 |
| 500 | 350 | 500 | 350 | - | - | IPADDR/mysql | | 0 | Start | 刚开始NODE都没有启资源,先比较400>350,决定跑在mysql3上, 然后mysql3.score+=default-resource-stickiness |
| 500 | 350 | 399 | 350 | - | - | IPADDR/mysql | | 1 | mysql3.mysql down | 先mysql3.mysql.score=mysql3.mysql.score-"default-resource-stickiness"+"default-failed_resource-stickiness"; if (mysql3.mysql.score+ "resource-stickiness-default")>=mysql4.mysql.score then 不切换 else 发生切换 fi |
| 500 | 350 | 198 | 450 | - | - | IPADDR | mysql | 2 | mysql3.mysql down | 先mysql3.mysql.score=(399-101-100),然后发现198+100也小于mysql4.mysql.score=350, 这时就发生切换.mysql4.mysql.score+=100 |
| 400 | 450 | 400 | 450 | - | - | | ipaddr/mysql | 3 | mysql3.hb down | mysql3.hb stop, HB把mysql3.ipaddr迁到mysql4上. Mysql4.ipaddr.score+=100; mysql3.hb.start 后,其score=cib.sets |
| 500 | 249 | 400 | 450 | | | ipaddr | mysql | 4 | mysql4.ipaddr down | 计算方法同action.1 |
| 400 | 349 | 400 | 450 | | | | ipaddr/mysql | 5 | mysql3.hb down | |
| 500 | 249 | 400 | 450 | | | ipaddr | mysql | 6 | mysql3.hb start | 重启后,发现mysql3.cib.set.score>mysql4.ipaddr.score.发生切换. mysql4.ipaddr.score-=default-resource-stickiness, mysql3.ipaddr.score+=default-resource-stickiness |
| | | | | | | | | | | |
六, 小结
根据自己的环境和应用需要,合理的设置SCORE和resource-stickiness参数,做到真正的HA,是很有技术含量的一件事情.你可能需要在很多次测试和计算中得出结果.
当然这一次的测试环境相对比较简单,一个资源组只包括一个资源,而且也没有设置Colocation.
如果在一个资源组里包括多个资源的环境里, SCORE的计算更为复杂.我也将再继续研究… 待续.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/703656/viewspace-1028994/
,如需转载,请注明出处,否则将追究法律责任。