keepalived的几个注意点:virtual_router_id,persistence,nopreempt

1、virtual_router_id

作用: virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。

注意:

同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下:

Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :
one or more VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment...

可以用这条命令来查看该网络中所存在的vrid: tcpdump -nn -i any net 224.0.0.0/8

tcpdump -nn -i any net 224.0.0.0/8
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
12:00:41.699852 IP 10.172.4.110 > 224.0.0.18: VRRPv2, Advertisement, vrid 222, prio 101, authtype simple, intvl 1s, length 20
12:00:41.699857 IP 10.172.4.110 > 224.0.0.18: VRRPv2, Advertisement, vrid 222, prio 101, authtype simple, intvl 1s, length 20

2、persistence_timeout

作用: 用会话保持,保持客户端的请求在这个时间段内全部发到同一个真实服务器

使用场景:

有些Web服务可能用到HTTP Cookie,它是将数据存储在客户的浏览器来追踪和标识客户的机制。使用HTTP Cookie后,来同一客户的不同连接存在相关性,这些连接必须被发送到同一Web服务器。一些Web服务使用安全的HTTPS协议,它是HTTP协议加 SSL(Secure Socket Layer)协议。另有些Web服务可能使用安全的HTTPS协议,它是HTTP协议加SSL协议。当客户访问HTTPS服务(HTTPS的缺省端口为 443)时,会先建立一个SSL连接,来交换对称公钥加密的证书并协商一个SSL Key,来加密以后的会
话。在SSL Key的生命周期内,后续的所有HTTPS连接都使用这个SSL Key,所以同一客户的不同HTTPS连接也存在相关性。针对这些需要,IPVS调度器提供了持久服务的功能,它可以使得在设定的时间内,来自同一IP地 址的不同连接会被发送到集群中同一个服务器结点,可以很好地解决客户连接的相关性问题。

权衡:

如果需要严格的控制负载均衡,那么需要关闭会话保持,因为开启了之后,虽然对于每个不同的ip去做nat到后端服务器是负载均衡的,但是每个相同ip发起的请求不是负载均衡,可能导致出现局部的不均衡,比如:ip1和ip2分别nat到两个后端服务器,但是ip1每秒发10个请求,ip2每秒发1个请求,此时clinet数是1:1,但是流量是10:1。

3、nopreempt

作用: 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。

使用场景:

nopreempt用于决定当故障发生时,vip从master切到了slave,当master恢复后是否要抢回vip。

权衡:

如果vip是用于主备的,且备不能完全代替主,比如:备是只读,临时顶替一下master。这种情况下,master回来后需要抢回vip,以正常提供服务。

如果vip是用于主备的,且备能完全代替主,既主备是无状态的,这种情况下,master回来后不需要抢回vip,备继续提供服务,避免多一次vip切换导致服务抖动

注意点:

nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。

推荐做法:

使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。