与lvs集成到linux内核相比,nginx是7层的负载均衡调度器。因此keepalived需要一个脚本来检查本机nginx的存活状态。而lvs由于是内核模块,没有vrrp script。
keepalived的HA分为抢占模式和非抢占模式; 抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。默认抢占模式 非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。nopreempt
2台ngigx的keepalvied配置:
keepalived通过vrrp_script来检查本机nginx,然后kill keepalived的进程,这样backup和master之间基于vrrp报文的心跳模式就能知道master现在失效,backup节点要接管vip。 即: vrrp_script 确定本机nginx的状态 vrrp报文确定多个vrrp节点的状态
vrrp_script check_nginx_status{ script “/etc/nginx/chk_nginx_status.sh” interval 2 #每2s检查本机的nginx服务状态 weight -20 #每失败一次,将本机vrrp 节点的priority减少 20 ,不建议设置此项 } vrrp_instance VI_1{ …
track_script{ check_nginx_status #调用上面定义的vrrp_script check_nginx_status }
}
#!/bin/bash #该脚本是网络上摘抄的,如果版权问题,请联系我,先道歉。 A=ps -C nginx --no-header | wc -l if [ $A -eq 0 ];then /opt/nginx/sbin/nginx #尝试重新启动nginx sleep 2 #睡眠2秒 if [ ps -C nginx --no-header | wc -l -eq 0 ];then killall keepalived #启动失败,将keepalived服务杀死。backup在3次vrrp通告间隔后没收到vrrp报文,认为master失效,将vip漂移到自身,同时发送vrrp通告,响应arp报文 fi fi
非抢占模式: 2台nginx的vrrp_instance模块,均配置nopreempt,且均为backup 这样,2台nginx通过priority来选举master,当master失效恢复后,并不会把vip抢占回来,避免了切换vip造成的业务延迟。
由于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值的设置,要非常谨慎,如果设置不好,将导致集群角色选举失败,使集群陷于瘫痪状态。