keepalived集群中MASTER和BACKUP选举策略
在keepalived中,并没有严格意义上的主节点和备节点,虽然可以在keepalived.conf中配置state选项设置为MASTER状态,但是不意味此节点一直就是MASTER节点,控制节点角色的选项是priority的值,另一个能控制节点角色的选项是vrrp_script模块中设置的weight的值 ,这两个选项的值都是一个整数值,其中”weight”的值可以是负数,也可以是正数,集群中节点的角色就是通过这两个值的大小决定的
在vrrp_script模块中,如果不设置weight选项值,那么集群节点的优先级将由priority的值来决定,如果需要对集群优先级进行灵活控制时,可以通过在vrrp_script模块中设置”weight”的值来实现
例如:有A、B两个节点组成keepalived集群,在A节点中设置priority的值为100,B节点的priority的值为80,A和B节点都使用了vrrp_script模块来监控mysql服务,同时设置了”weight”的值为10 ,将会出现一下状况:
两个节点都启动keepalived后,正常情况下A节点成为集群中的master节点,B节点为backup节点,如果此时将A节点的MySQL服务关闭,通过日志查看可以发现B节点并没有接管A节点的日志,B节点仍然处于backup状态,A节点依旧是master状态,此时集群将失去意义
造成这种情况的主要原因就是选举策略出现了问题,因为vrrp_script模块中配置了weight,weight的值可以是正数也可以是负数,因此keepalived在使用vrrp_script模块时,集群的选举策略要分以下两种情况说明:
1、”weight”的值为正数:
在vrrp_script中指定的脚本如果检测成功(返回值为0),那么master节点的权值将是”weight”值和”priority”值的和,如果检测失败(返回值为1),那么master节点的权值将保持为”priority”的值,因此切换策略如下:
- 当master节点的”vrrp_script” 中脚本检测失败时(返回值1),如果master中的”priority”值小于backup中的”weight”与”priority”值之和,将发生主备切换,否则不切换
- 当master节点的”vrrp_scrity”中脚本检测成功时(返回值0),如果master节点的”weight”的值与”priority”的值之和大于backu中”weight”与”priority值之和,不发生切换,否侧切换
2、”weight”的值为负数:
在”vrrp_script”中指定的脚本如果检测成功,那么master节点的权值仍为”priority”值,当检测失败时,master的值将是”weight”与”priority”的值之差,因此切换策略如下:
- 当master节点的vrrp_script脚本检测失败时(返回值1),如果master节点的priority的值与weight的值之差小于backup节点的priority的值,将发生主备切换,否则不切换
- 当master节点的vrrp_scrity的脚本检测成功时(返回值0),如果master节点的priority的值大于backup节点的priority的值,主节点依旧为主节点,不切换,否则切换
上图中的例子,符合第一种策略,weight的值为正数,当Mysql服务关闭后,master中的priority的值(100)依旧大于backup节点中weight与priority的值之和(90),因此不会发生主备切换
*注意:对于weight的值,有一个简单的标准,即”weight”的值的绝对值要大于master和backup节点的priority的值之差,上述例子只要将weight的值设置为大于20即可


