又拍云之 Keepalived 高可用部署 - 知乎

标签: | 发表时间:2022-11-29 22:30 | 作者:
出处:https://zhuanlan.zhihu.com

在聊 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

本次的内容分享就到这了~

推荐阅读:

相关 [keepalived 用部 知乎] 推荐:

又拍云之 Keepalived 高可用部署 - 知乎

- -
在聊 Keepalived 之前,我们需要先简单了解一下 VRRP. VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而设计的. 简单说下它的工作原理:虚拟路由器由多个路由器组成,每个路由器都有各自的 IP 和共同的 VRID(0-255),其中一个 VRRP 路由器通过竞选成为 MASTER,就会接管 VIP(虚拟漂移IP),对外提供路由服务,其他成为 BACKUP.

Keepalived安装

- - CSDN博客架构设计推荐文章
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可以实现web前端服务的高可用. 安装Keeplived依赖. 安装 openssl. #通知email,根据实际情况配置 { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id node1.

配置LVS+Keepalived

- -
lvs说明:目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);. 八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh). 在调度器的实现技术中,IP负载均衡技术是效率最高的. 在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性.

Haproxy+KeepAlived 负载均衡

- - CSDN博客系统运维推荐文章
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现. LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. 还可以使用nginx来实现,不过nginx只工作在7层网络之上. 详细请参考 抚琴煮酒写的“ 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比”这篇文章,简单很详细,很好.

lvs+keepalived 负载均衡

- - CSDN博客系统运维推荐文章
LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡. LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器. 目前有三种IP负 载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh).

Keepalived+Mysql 高可用方案

- - 数据库 - ITeye博客
Keepalived+Mysql 高可用方案. 安装: 略  Keepalived可从CentOS系统安装包中获得. 建立一个脚本用于在keepalived检测到mysql挂了的时候调用该脚本把keepalived杀死. 当然,在这个文件你也可以加入邮件通知等功能,这里就不列举了.. 配置keepalived.conf.

Keepalived避免无用的failover

- - 小火箭
通常情况下,当主挂掉时,从会自动切换为主. 当主上的服务恢复时,则会再次抢占成为主,这里就发生了一次不必要的failover. 为了解决上述情况,可以在主的配置中vrrp_instance增加nopreempt. 注意:确保实验机器防火墙不会过滤掉vrrp协议的数据包. 以下是 sudo tcpdump vrrp -i eno16777736命令输出.

keepalived-1.2.9集群的安装及配置

- - CSDN博客系统运维推荐文章
一、目        的:本文实现的Linux集群是基于Keepalived-1.2.9软件实现,. 二、难        点:实现虚拟IP(VIP)自动切换的同时,还要同时实现虚拟MAC地址(VMAC)的切换,即无论集群中的Host如何切换,对外访问的IP和MAC始终不变. 三、适用环境:当对外路由或交换机绑定主机MAC时适用.

LVS+Keepalived实现高可用集群(转)

- - 行业应用 - ITeye博客
操作系统平台:CentOS5.2. 软件:LVS+keepalived. LVS+Keepalived 介绍. LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项 目之一.

MySQL 5.5 keepalived + haproxy + MHA 自动容灾

- - CSDN博客数据库推荐文章
keepalived安装:. } } 在83上配置 vim /usr/local/etc/keepalived/keepalived.conf global_defs {. 在81和83上安装mha node,在82上安装mha manager. vi /usr/local/share/perl5/MHA/ManagerConst.pm 89 my $msg = $args{message}; 90 $msg = "" unless($msg); <=插入一行 91 chomp $msg;.