在Keepalived集群中,其实并无严格意义上的主、备节点,虽然能够在Keepalived配置文件中设置“state”选项为“MASTER”状态,可是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制全部节点的角色,另外一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值能够是个负整数,一个节点在集群中的角色就是经过这两个值的大小决定的。mysql
在一个一主多备的Keepalived集群中,“priority”值最大的将成为集群中的Master节点,而其余都是Backup节点。在Master节点发生故障后,Backup节点之间将进行“民主选举”,经过对节点优先级值“priority”和““weight”的计算,选出新的Master节点接管集群服务。算法
在vrrp_script模块中,若是不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在须要对集群中优先级进行灵活控制时,能够经过在vrrp_script模块中设置“weight”值来实现。下面列举一个实例来具体说明。sql
假定有A和B两节点组成的Keepalived集群,在A节点keepalived.conf文件中,设置“priority”值为100,而在B节点keepalived.conf文件中,设置“priority”值为80,而且A、B两个节点都使用了“vrrp_script”模块来监控mysql服务,同时都设置“weight”值为10,那么将会发生以下状况。spa
在两节点都启动Keepalived服务后,正常状况是A节点将成为集群中的Master节点,而B自动成为Backup节点,此时将A节点的mysql服务关闭,经过查看日志发现,并无出现B节点接管A节点的日志,B节点仍然处于Backup状态,而A节点依旧是Master状态,在这种状况下整个HA集群将失去意义。日志
下面就分析一下产生这种状况的缘由,这也就是Keepalived集群中主、备角色选举策略的问题。下面总结了在Keepalived中使用vrrp_script模块时整个集群角色的选举算法,因为“weight”值能够是正数也能够是负数,所以,要分两种状况进行说明。ip
1. “weight”值为正数时it
在vrrp_script中指定的脚本若是检测成功,那么Master节点的权值将是“weight值与”priority“值之和,若是脚本检测失败,那么Master节点的权值保持为“priority”值,所以切换策略为:io
Master节点“vrrp_script”脚本检测失败时,若是Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。ast
Master节点“vrrp_script”脚本检测成功时,若是Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。class
2. “weight”值为负数时
在“vrrp_script”中指定的脚本若是检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,所以切换策略为:
Master节点“vrrp_script”脚本检测失败时,若是Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。
Master节点“vrrp_script”脚本检测成功时,若是Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。
在熟悉了Keepalived主、备角色的选举策略后,再来分析一下刚才实例,因为A、B两个节点设置的“weight”值都为10,所以符合选举策略的第一种,在A节点中止Mysql服务后,A节点的脚本检测将失败,此时A节点的权值将保持为A节点上设置的“priority”值,即为100,而B节点的权值将变为“weight”值与“priority”值之和,也就是90(10+80),这样就出现了A节点权值仍然大于B节点权值的状况,所以不会发生主、备切换。
对于“weight”值的设置,有一个简单的标准,即“weight”值的绝对值要大于Master和Backup节点“priority”值之差。对于上面A、B两个节点的例子,只要设置“weight”值大于20便可保证集群正常运行和切换。因而可知,对于“weight值的设置,要很是谨慎,若是设置很差,将致使集群角色选举失败,使集群陷于瘫痪状态。