linux学习记录
分类:
2010-11-22 16:58:56
resource-stickiness为每一个资源的初始分数,一般为正数;resource-failure-stickiness为每一个资源在每次失败之后所减掉的分数,一般为负数。
默认情况下,resource-stickiness为0,resource-failure-stickiness也为0。此时,一个资源不论失败多少次,heartbeat都只是执行restart操作,不会进行节点切换。
除了可以通过给每个资源单独设置两项的分数之外,也可以将所有的resource设置成相同的分数,除了资源的分数之外,节点自身同样也有分数。各节点上资源分数的计算方法为node+resource+failcount*failure。
如果节点的分数为负分,那么不管什么情况发生,该节点都不会接管资源(冷备节点)。随着资源的各种状态的发生,在各节点上面的分数就会发生变化,随着分数的变化,一旦某节点的分数大于当前运行该资源的节点的分数之后,heartbeat就会做出切换动作,现在运行该资源的节点将释放资源,分数高出的节点将接管该资源。
以下举例说明。
假设给mysql_db这个resource配置分数如下:
resource_stickiness=100
resource_failure_stickiness=-100
mysql1上的rsc_location=200
mysql2上的rsc_location=150
在最开始,两节点同时启动heartbeat的话,两边都没有开始运行这个resource,resource本身没有分数,那么仅仅计算节点的分数。mysql1的分数200+0+(0*(-100))=200;mysql2的分数150+0+(0*(-100))=150。
heartbeat会做出选择在mysql1上面运行mysql_db这个资源,然后mysql1的分数发生变化了,因为有资源自身的分数加入了,此时mysql1的分数200+100+(0*(-100))=300;mysql2的分数150+0+(0*(-100))=150。
过了一段时间,假设mysql_db这个资源crash或者其他问题,分数马上会发生变化,mysql1的分数200+100+(1*(-100))=200;mysql2的分数150+0+(0*(-100))=150。由于mysql1节点的分数还是比mysql2的高,那么资源不发生迁移,而是执行restart操作。
继续运行一段时间发现又有问题(或者是b后面restart没有起来)了,分数又发生变化了,mysql1的分数200+100+(2*(-100))=100;mysql2的分数150+0+(0*(-100))=150。
这时候mysql2节点比mysql1节点的分数高,资源将发生迁移切换,mysql1释放mysql_db相关资源,mysql2接管相关资源,并在mysql2上运行mysql_db这个资源。这时候,节点的分数又会发生变化如下:mysql1的分数200+0+(2*(-100))=0;mysql2的分数150+100+(0*(-100))=250。
这时候如果在mysql2上面三次出现问题,那么mysql2的分数将变成-50,又比mysql1少了,资源将迁移回mysql1,mysql1的分数将变成100,而mysql2的分数将变成-150,因为又少了资源所有者的那100分。到这里,mysql2节点的分数已经是负数了。heartbeat还有一个规则,就是资源永远都不会迁移到一个分数分数是负数的节点上面去。也就是说从这以后,mysql1节点上面不管mysql_db这个资源失败多少次,不管这个资源出现什么问题,都不会迁移回mysql2节点了。一个节点的分数会在该节点的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