Keepalived
原理
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组内出现了两台Master路由器,那么它们收到对方发送的VRRP通
告报文之后,将比较自己与对方的优先级,优先级的值更大的设备胜出,继续保持Master状态,而
竞争失败的路由器则切换到Backup状态。如果这两台Master路由器的优先级相等,那么接口IP地址
更大的路由器接口将会保持Master状态,而另一台设备则切换到Backup状态。
上面提到了一个抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后重新争夺主机、成为主机的情况。这种情况比较适合需要崩溃的主机重新上线做主机的情况。也就是本模式是某主机节点在崩溃后,集群新选出了主机。但是崩溃的节点恢复后,又触发了选举,最终原节点再次成为主机的过程。
那么就还有非抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后并不争夺主机的情况。这种模式适合那些倾向于认为崩溃的主机即便上线还是会出现崩溃的场景。
这种模式的核心思想是将所有节点的优先级(priority)值设为相同,当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。
因此这种模式下,当主机崩溃时,所有从机中IP地址最大的那个节点一定会成为主机,并且原来的主机
上线后不会再次触发选举,原来的主机也就成为了从机。
配置
因为需要保证当主机崩溃时,从机接替成功主机的工作之后,主机上线并成为新的从机,那么我们就要选择非抢占模式,配置如下:
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 AH ## keepalived认证,类型有AH加密和PASS明文
auth_pass 123456 ## 密码,集群中保持一致,且取前8个字符
}
unicast_src_ip 10.10.10.237 ## 绑定IP
unicast_peer {
10.10.10.238 ## 对端IP
10.10.10.104
}
virtual_ipaddress { ## 虚拟IP
10.10.10.239
}
}
测试
# 237
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type AH
auth_pass 123456
}
unicast_src_ip 10.10.10.237
unicast_peer {
10.10.10.238
10.10.10.104
}
virtual_ipaddress {
10.10.10.239
}
track_script {
onos_check ## 执行 onos 监控的服务
}
}
# 238
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type AH
auth_pass 123456
}
unicast_src_ip 10.10.10.238
unicast_peer {
10.10.10.237
10.10.10.104
}
virtual_ipaddress {
10.10.10.239
}
}
# 104
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type AH
auth_pass 123456
}
unicast_src_ip 10.10.10.104
unicast_peer {
10.10.10.238
10.10.10.237
}
virtual_ipaddress {
10.10.10.239
}
}
先启动104,再启动237和238,虚拟IP239偏移至104;说明集群在没有MASTER的情况下,先启动的成为MASTER,在非抢占模式下,后启动的就算是IP更大的也只能变成BACKUP。
关闭104,虚拟IP偏移至238,开启104,虚拟IP依旧在238;关闭239,虚拟IP飘移至237,开启238,虚拟IP依旧在237;说明在选举时,当优先级相同时,IP较大的将会作为新的MASTER,而原MASTER重新接入之后,只能成为BACKUP。
主动主备切换
将当前的MASTER-keepalived以及比指定成为新Master的keepalived的IP更大的keepalived关闭,然后等待完成故障转移,再将备关闭的keepalived开启即可。
例如目前104为MASTER,要使得238成为主,只需要104关闭,等待故障转移成功再将其开启即可;
目前238为MASTER,要使得104成为主,需要将238和237关闭,等待故障转移成功再将其开启即可。
被动主备切换
当MASTER宕机之后,剩余健康的keepalived中,IP较大的将会成为新的主MASTER,原MASTER重新上线之后将会成为BACKUP。