再次讲Keepalived之前,我们需要简单了解一下VRRP。VRRP(VirtualRouterRedundancyProtocol)是一种虚拟路由冗余协议,专门用于解决静态路由的高可用问题。简单说一下它的工作原理:一个虚拟路由器由多台路由器组成,每台路由器都有自己的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配置v2之前的VRRP版本配置简单,但只能提供秒级以上的检测。这在十多年前就有了,但已经不适合今天的环境了。幸运的是,VRRPv2.0.5增加了对BFD的支持。双向转发检测BFD(BidirectionalForwardingDetection)用于快速检测系统间的通信故障,并在故障发生时通知上层应用。BFD提供了一种独立于介质和协议的快速故障检测机制,具有以下优点:它为网络设备之间的任何类型的双向转发路径提供快速和轻载的故障检测。使用单一机制对任意介质、任意协议层进行实时检测,支持不同的检测时间和开销。因此VRRPv2+BFD可以实现毫秒级的检测。我们可以选择新版本来编译和测试BFD。示例如下:yuminstall-ylibnl-devel./configure--prefix=/opt/keepalived--enable-bfd--with-init=system!keepalivedglobal_defs的配置文件{process_nameskeepalived_bfdbfd_process_namebfdprouter_idLVS_UPYUN}bfd_instancebfdp{neighbor_ip10.0.2.8#对端服务器心跳ipsource_ip10.0.2.4#本地服务器心跳ip}vrrp_instanceVI_1{...track_bfd{bfdprunoneweightmoreheart40#监控bfd进程}Keepalived+VRRPv3配置随着时间的推移,Kee??palived也支持VRRPv3协议。与上一版本协议相比,VRRPv3有以下改进:支持的网络类型不同。VRRPv3适用于IPv4和IPv6网络,而VRRPv2仅适用于IPv4网络。认证功能不同。VRRPv3不支持认证功能,VRRPv2支持认证功能。VRRPv2为了兼容早期版本,保留了报文的认证字段,因为VRRP认证不能提高安全性。发送通知消息的时间间隔单位不同。VRRPv2的默认单位是1秒,VRRPv3的默认单位是100厘秒。由于VRRPv3协议的改进,可以在不使用BFD的情况下实现30ms内的心跳检测和故障切换。让我们关注如何在实践中配置它。!ConfigurationFileforkeepalivedglobal_defs{router_idSLB-SADscript_userrootenable_script_security#检查vrrp报文中的所有地址比较耗时。默认跳过检查vrrp_skip_check_adv_addr#重点是启用vrrp3vrrp_version3}vrrp_scriptchk_upyun{#除了心跳检测,还可以调用脚本做业务健康检测脚本"/etc/keepalived/bin/check_vip.sh"interval1#每1秒检查一次fall1#失败需要2次失败rise1#成功需要1次ok#当权重值为负时,当脚本检测失败时,Master节点的权重将是与“priority”值和“weight”值weight-30}vrrp_instanceupyun_lb{strict_modeoffadvert_int0.03stateBACKUPinterfaceeth3virtual_router_id19priority100#当主备角色切换时,触发脚本切换业务notify"/etc/keepalived/bin/change_state.sh"track_script{chk_upyun}virtual_ipaddress{192.168.147.19labeleth3:9}}#这一段是可选的,如果匹配lvs规则,可以调用ipvsadmi的转发规则nclude/etc/keepalived/virserver.conf配置中使用了“check_vip.sh”我们简单看一下“change_state.sh”的两个脚本。上面check_vip.sh的配置只是一个例子。当ping丢包超过80%时,才考虑切换主备关系。也可以根据具体的业务场景进行一些逻辑判断,实现主备切换,达到高可用。#!/bin/shTMP="/tmp/bad"GATEWAY=$(ipro|awk'/default/{print$3}')LOSS=$(ping-fc10-s1$GATEWAY|sed-r-n'/loss/s@.*(.*)%.*@\1@p')if[$LOSS-ge80];然后echo"${LOSS}%lost#`date`">>$TMPfiif[-e$TMP];然后退出1fichange_state.sh当检测到服务器角色变化时,该脚本会调用钉钉告警,调整业务上的一些操作。比如sysctl.conf配置或者iptables上的规则,甚至可以配合LVS做一些负载均衡部署。#!/bin/bashHOME="/etc/keepalived/"LIP=`/sbin/ip地址|awk'/192.168./{gsub("/.*","");if($2!=""){print$2}}'|sort-u|head-n1`VIP=$(awk'/virtual_ipaddress/{getline;print$1}'$HOME/keepalived.conf)URL="https://oapi.dingtalk.com/robot/send?access_token=07xxxxxxxxxxxxxx"[-z$LIP]&&LIP=$VIP#############################################################################dingding(){curl$URL--connect-timeout10-H'Content-Type:application/json'\-d'{"msgtype":"markdown","markdown":{"title":"数据中心告警","text":"*告警类型:'"$1"'\n*告警机:'"$2"'\n*报警服务:'"$3"'\n*报警内容:'"$4"'\n*报警时间:'"$(date"+%Y-%m-%d%T")"'\n"}}'}ENDSTATE=$3NAME=$2TYPE=$1dingdingKeepalived$LIPChange_state"$ENDSTATE"case$ENDSTATEin"BACKUP")#执行转换到BACKUP状态的操作echo"---Iam$ENDSTATE#`date`">>/tmp/keepalived.logsed-r-i'/state/s#MASTER#BACKUP#g'$HOME/keepalived.confsysctl-w\net.ipv4.conf.all.arp_accept=1\net.ipv4.conf.all.arp_ignore=0\net.ipv4.conf.all.arp_announce=0\net.ipv4.ip_nonlocal_bind=1#$HOME/tunlstartexit0;;"FAULT")#执行转换到FAULT状态的操作exit0;;"MASTER")#执行转换到MASTER状态的操作echo"+++Iam$ENDSTATE#`date`">>/tmp/keepalived.logsed-r-i'/state/s#BACKUP#MASTER#g'$HOME/keepalived.confsysctl-w\net.ipv4.conf.all.arp_ignore=1\net.ipv4.conf.all.arp_accept=1\net.ipv4.conf.all.arp_announce=1\net.ipv4.ip_nonlocal_bind=1iptables-L-vn|grep-iqE"vrrp|112"[$?=0]||iptables-I输入-pvrrp-j接受iptables-L-vn|grep-iq"接受。*$VIP"[$?=0]||iptables-IINPUT-d$VIP-jACCEPTexit0;;*)echo"Unknownstate${ENDSTATE}forVRRP${TYPE}${NAME}"exit1;;esac今天的分享到此结束,谢谢大家推荐阅读SSL详解(三):Howto选择SSL证书?红利之风之下,企业如何突围出海?
