又拍云之 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 keepalived global_defs { process_names keepalived_bfd bfd_process_name bfdp router_id LVS_UPYUN } bfd_instance bfdp { neighbor_ip 10.0.2.8 # 对端的服务器心跳ip source_ip 10.0.2.4 # 本地的服务器心跳ip } vrrp_instance VI_1 { ... track_bfd{ bfdp weight 40 # 多跑一个bfd进程来监控心跳 } }
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 keepalived global_defs { router_id SLB-SAD script_user root enable_script_security # 检查vrrp报文中的所有地址比较耗时。默认是跳过检查 vrrp_skip_check_adv_addr # 重点是启用vrrp3 vrrp_version 3 } vrrp_script chk_upyun { # 除了心跳检测外,还可以调用脚本做业务上的健康检测 script "/etc/keepalived/bin/check_vip.sh" interval 1 # check every 1 seconds fall 1 # require 2 failures for failures rise 1 # require 1 sucesses for ok # weight 值为负数时,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差 weight -30 } vrrp_instance upyun_lb { strict_mode off advert_int 0.03 state BACKUP interface eth3 virtual_router_id 19 priority 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/sh TMP="/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 ];then echo "${LOSS}% lost #`date`" >> $TMP fi if [ -e $TMP ] ;then exit 1 fi
change_state.sh
当检测到服务器的角色转换时,这个脚本就会调用钉钉报警,并且调整业务上的一些操作。如 sysctl.conf 配置或者 iptables 上的规则,甚至可以配合 LVS 做一些负载均衡的部署。
#!/bin/bash HOME="/etc/keepalived/" LIP=`/sbin/ip addr | 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=07xxxxxxxxxxxxx" [ -z $LIP ] && LIP=$VIP ############################################################################ dingding(){ curl $URL --connect-timeout 10 -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=$3 NAME=$2 TYPE=$1 dingding Keepalived $LIP Change_state "$ENDSTATE" case $ENDSTATE in "BACKUP") # Perform action for transition to BACKUP state echo "--- I am $ENDSTATE #`date`" >> /tmp/keepalived.log sed -r -i '/state/s#MASTER#BACKUP#g' $HOME/keepalived.conf sysctl -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/tunl start exit 0 ;; "FAULT") # Perform action for transition to FAULT state exit 0 ;; "MASTER") # Perform action for transition to MASTER state echo "+++ I am $ENDSTATE #`date`" >> /tmp/keepalived.log sed -r -i '/state/s#BACKUP#MASTER#g' $HOME/keepalived.conf sysctl -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=1 iptables -L -vn | grep -iqE "vrrp|112" [ $? = 0 ] || iptables -I INPUT -p vrrp -j ACCEPT iptables -L -vn | grep -iq "accept .*$VIP" [ $? = 0 ] || iptables -I INPUT -d $VIP -j ACCEPT exit 0 ;; *) echo "Unknown state ${ENDSTATE} for VRRP ${TYPE} ${NAME}" exit 1 ;; esac
今天的分享就到这了,感谢大家的阅读。
推荐阅读

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Karmada大规模测试报告发布:突破100倍集群规模
摘要:在本文中,我们将介绍用于测试的相关指标,如何进行大规模测试,以及我们如何实现大规模的集群接入。 本文分享自华为云社区《突破100倍集群规模!Karmada大规模测试报告发布》,作者:华为云云原生团队。 摘要 随着云原生技术在越来越多的企业和组织中的大规模落地,如何高效、可靠地管理大规模资源池以应对不断增长的业务挑战成为了当下云原生技术的关键挑战。在过去的很长一段时间内,不同厂商尝试通过定制Kubernetes原生组件的方式扩展单集群的规模,这在提高规模的同时也引入了复杂的单集群运维、不清晰的集群升级路径等问题。而多集群技术能在不侵入修改Kubernetes单集群的基础上横向扩展资源池的规模,在扩展资源池的同时降低了企业的运维管理等成本。 在Karmada的大规模落地进程中,Karmada的可扩展性和大规模逐渐成为社区用户的新关注点。因此,我们对Karmada开展了大规模环境下的测试工作,以获取Karmada管理多个Kubernetes集群的性能基线指标。对于以Karmada为代表的多集群系统而言,单集群的规模不是制约它的资源池规模的限制因素。因此,我们参考了Kubernetes的...
- 下一篇
大咖分享 | 如何构建 Alluxio 审计日志分析系统
本文作者:耿云涛 本文作者:葛大力 大数据技术日新月异,数据湖、数据中台、逻辑数据湖、数据编织、数据编排等数据建设理念不断出现、深化,究其根本依然是如何能够将数据规整起来,以统一的规范对数据的脉络进行梳理,形成统一的视图、统一的标准,实现业务层面的数据治理目标。 对于任何一种数据建设理念,数据安全都是绕不开的话题,数据安全的保障也是一个数据平台能否真正交付使用的准入门槛。 数据安全大体从4个维度展开:认证、授权、审计、加密。通过认证确保了用户的身份,严格的授权可以保护数据的访问隐私,审计数据的访问记录,发现可能的非法访问,通过加密确保数据存储持久化与数据传输链路的基础安全。 数据安全的每个维度都是很广泛的主题,本篇文章主要从审计的维度,分享一些Alluxio审计的实操做法以及一些注意事项。 Alluxio作为云原生数据编排平台,可以在面向异构基础设施环境(本地、混合云、公有云)的时候实现高效的数据统一管理编排,服务大数据与AI应用,Alluxio已经被广泛的应用在数据湖、数据中台、逻辑数据湖、数据编织等数据平台的建设架构中,在协助企业/组织解决技术变迁导致的多平台混合架构和数据碎片化、...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程