keepalived
Keepalived主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
在我们的主备方案中,就是提供一个虚拟IP供用户去使用和访问,当其中一台服务器出现宕机的情况时,另一台服务器能够在短时间内接替这个虚拟IP为用户提供服务。
keepalived虚拟IP切换的原理如下:
1、正常情况下,用户通过虚拟IP是直接访问到Keepalived-Master的(没有成为Master的就是Backup);
2、成为Master的Keepalived,会每秒向所有的Backup发送VRRP包,通告自己是主,且运行正常;
3、当Master因为网络原因或者是别的原因导致与集群断开之后,Backup会在3.6秒左右(以优先级100为例,计算公式为3 × 1 + 256 × (256 - 100))认定Master宕机;
4、如果是多播的情况下,Master宕机,那么剩余的Backup要通过选举产生新的Master;如果是单播,则由剩下的Bakcup直接作为新的Master。
选举机制如下:
keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其他主机,同时,它还会以多播的形式(默认目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责处理MASTER发出的多播包,在抢占模式下,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状态,然后做MASTER该做的事:响应arp包和发送VRRP通告
当一个激活了VRRP的接口Up之后,如果接口的VRRP优先级为255,那么其VRRP状态将直接从
Initialize切换到Master,而如果接口的VRRP优先级不为255,则首先切换到Backup状态,然后再
视竞争结果决定是否能够切换到Master状态。
如果在同一个广播域的同一个VRRP组内出现了两台Master路由器,那么它们收到对方发送的VRRP通
告报文之后,将比较自己与对方的优先级,优先级的值更大的设备胜出,继续保持Master状态,而
竞争失败的路由器则切换到Backup状态。如果这两台Master路由器的优先级相等,那么接口IP地址
更大的路由器接口将会保持Master状态,而另一台设备则切换到Backup状态。
上面提到了一个抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后重新争夺主机、成为主机的情况。这种情况比较适合需要崩溃的主机重新上线做主机的情况。也就是本模式是某主机节点在崩溃后,集群新选出了主机。但是崩溃的节点恢复后,又触发了选举,最终原节点再次成为主机的过程。
那么就还有非抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后并不争夺主机的情况。这种模式适合那些倾向于认为崩溃的主机即便上线还是会出现崩溃的场景。
这种模式的核心思想是将所有节点的优先级(priority)值设为相同,当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。
因此这种模式下,当主机崩溃时,所有从机中IP地址最大的那个节点一定会成为主机,并且原来的主机
上线后不会再次触发选举,原来的主机也就成为了从机。
灵活切换模式,在抢占模式下,keepalived配置中可以设定按时自动执行用户脚本,当用户脚本执行完毕后可以在规则内对节点的优先值进行更新,这个值只会更新一次。主要通过偏移量weight来实现:
当weight > 0 时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight,
否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
当weight < 0 时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight,
否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。
我们的主备方案的配置文件如下:
## onos_check脚本相关配置
vrrp_script onos_check {
script "/etc/keepalived/onos_check.sh" ## 检测 nginx 状态的脚本路径
interval 3 ## 检测时间间隔
weight 0 ## 如果条件成立,权重+0
}
vrrp_instance VI_1 {
state BACKUP ## 都设置为BACKUP,首先启动的作为Master
nopreempt ## 非抢占模式
interface enp0s3 ## 虚拟IP绑定网卡
virtual_router_id 99 ## 虚拟路由id,这个id在整个局域网中需要唯一
priority 100 ## 优先级
advert_int 1 ## VRRP广播的时间间隔
authentication {
auth_type PASS ## keepalived认证,类型有AH加密和PASS明文
auth_pass 123456 ## 密码,集群中保持一致,且取前8个字符
}
unicast_src_ip 10.10.10.237 ## 绑定IP
unicast_peer {
10.10.10.238 ## 对端IP
}
virtual_ipaddress { ## 虚拟IP
10.10.10.239
}
track_script {
onos_check ## 执行 onos 监控的服务
}
}