又拍云之 Keepalived 高可用部署

在聊 Keepalived 之前,我们需要先简单了解一下 VRRP 。VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而设计的 。
简单说下它的工作原理:虚拟路由器由多个路由器组成 , 每个路由器都有各自的 IP 和共同的 VRID(0-255) , 其中一个 VRRP 路由器通过竞选成为 MASTER , 就会接管 VIP(虚拟漂移IP),对外提供路由服务,其他成为 BACKUP 。MASTER 以 IP 组播形式发送 VRRP 协议包,与 BACKUP 保持心跳连接 , 若 MASTER 不可用,或 BACKUP 接收不到 VRRP 协议包,则 BACKUP 通过竞选产生新的 MASTER,并继续对外提供路由服务,从而实现高可用 。
Keepalived 简介Keepalived 是一款基于 VRRP 协议的高可用软件,借助它可以让多台服务器能像路由器一样做 VIP 虚拟地址的冗余转移,从而提升后端服务器的高可靠性 。Keepalived 由一台主服务器和多台备份服务器组成集群,在主服务器和备份服务器上部署相同的服务配置,并使用一个虚拟 IP 地址对外提供服务 。当主服务器出现故障时,虚拟 IP 地址会自动漂移到备份服务器 。
Keepalived+bfd 配置VRRP v2 之前的版本虽然配置简单,但只能提供秒级以上的检测 。这在十几年前是可用的,但已经不适合现在的环境了 。幸运的是,VRRP v2.0.5 加入了对 BFD 的支持 。
双向转发检测 BFD(Bidirectional Forwarding Detection)用于快速检测系统之间的通信故障,并在出现故障时通知上层应用 。
BFD 提供了一个与介质和协议无关的快速故障检测机制,它具有以下优点:

  • 对网络设备间任意类型的双向转发路径提供快速、轻负荷的故障检测 。
  • 用单一的机制对任何介质、任何协议层进行实时检测,并支持不同的检测时间与开销 。
因此 VRRP v2 + BFD 得以实现毫秒级的检测 。我们可以选用新版本编译测试 BFD,示例如下:
yum install -y libnl-devel./configure --prefix=/opt/keepalived --enable-bfd--with-init=system! Configuration File for keepalivedglobal_defs {process_names keepalived_bfdbfd_process_name bfdprouter_id LVS_UPYUN}bfd_instance bfdp {neighbor_ip 10.0.2.8 # 对端的服务器心跳ipsource_ip 10.0.2.4# 本地的服务器心跳ip}vrrp_instance VI_1 {...track_bfd{bfdp weight 40# 多跑一个bfd进程来监控心跳}}
又拍云之 Keepalived 高可用部署

文章插图
Keepalived+VRRP v3配置随着时间的推移,Keepalived 也支持了 VRRP v3 的协议 。相较于之前版本的协议,VRRP v3 版本有以下改进:
  • 支持的网络类型不同 。VRRP v3 适用于 IPv4 和 IPv6 两种网络,而 VRRP v2 仅适用于 IPv4 网络 。
  • 认证功能不同 。VRRP v3 不支持认证功能,而 VRRP v2 支持认证功能 。VRRP v2 版本保留报文的认证字段,是为了兼容早期版本,因为 VRRP 认证并不能提高安全性 。
  • 发送通告报文的时间间隔的单位不同 。VRRP v2 中缺省单位为 1 秒,VRRP v3 缺省单位为 100 厘秒 。
由于 VRRP v3 协议的改进,其不需要 BFD 也能实现 30ms 内的心跳检测和故障转移 。那实践中具体是如何配置的,我们重点来看一下 。
! Configuration File for keepalivedglobal_defs {router_id SLB-SADscript_user rootenable_script_security# 检查vrrp报文中的所有地址比较耗时 。默认是跳过检查vrrp_skip_check_adv_addr# 重点是启用vrrp3vrrp_version 3}vrrp_script chk_upyun {# 除了心跳检测外,还可以调用脚本做业务上的健康检测script"/etc/keepalived/bin/check_vip.sh"interval 1# check every 1 secondsfall1# require 2 failures for failuresrise1# require 1 sucesses for ok# weight 值为负数时,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差weight -30}vrrp_instance upyun_lb {strict_mode offadvert_int 0.03state BACKUPinterface eth3virtual_router_id 19priority 100# 当master和backup角色转换时,触发脚本做业务上的切换notify "/etc/keepalived/bin/change_state.sh"track_script {chk_upyun}virtual_ipaddress {192.168.147.19 label eth3:9}}# 这一段是可选的 , 如果和lvs规则就可以调用ipvsadm的转发规则include /etc/keepalived/virserver.conf配置中用到了“check_vip.sh”和“change_state.sh”的两个脚本,我们也来简单看下 。
check_vip.sh上面配置中只是举例说明,当 ping 丢包严重超过 80% 时 , 就认为要切换主备关系了 。大家也可以根据具体的业务场景做一些逻辑判断,来实现主备切换,以达到高可用的目的 。
#!/bin/shTMP="/tmp/bad"GATEWAY=$(ip ro|awk '/default/{print $3}')LOSS=$(ping -fc10 -s1 $GATEWAY | sed -r -n '/loss/s@.* (.*)%.*@\1@p')if [ $LOSS -ge 80 ];thenecho "${LOSS}% lost#`date`" >> $TMPfiif [ -e $TMP ] ;thenexit 1fi

推荐阅读