Keepalived 高可用

Keepalived 介绍

    Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
    它与HeartBeat实现类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供HA软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。
    Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
    后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

功能

  • 基于 vrrp 协议完成地址流动
  • 为 vip 地址所在的节点生成 ipvs 规则(在配置文件中定义)
  • 为 ipvs 集群的各个RS做监控状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事物,以支持 nginx,haproxy等服务。

Keepalived 架构

官网地址:https://www.keepalived.org/documentation.html
用户空间核心组件:

  • vrrp stack: VIP消息通告
  • checkers: 检测 real server
  • system call:实现 vrrp 协议状态转换时调用脚本的功能
  • SMTP: 邮件组件
  • IPVS wrapper: 生成 IPVS 规则
  • Netlink Reflector: 网络接口
  • WatchDog: 监控进程
    控制组件: 提供keepalived.conf的解析器,完成 Keepalived 配置
    IO复用器:针对网络目的而优化的自己的线程抽象
    内存管理组件: 为某某些通用的内存管理功能(分配,重新分配,发布等)提供访问权限
    image

vrrp技术介绍

  1. VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)将可以承担网关功能的路由器加入到备份组中,形成一台虚拟路由器,由VRRP的选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关
  2. VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器
  3. VRRP是一种容错协议,在提高可靠性的同时,简化了主机的配置。在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息
  4. VRRP协议的实现有VRRPv2和VRRPv3两个版本,VRRPv2基于IPv4,VRRPv3基于IPv6
  5. VRRP路由器: 所有运行VRRP协议的路由器就叫做VRRP路由器
  6. VRRP备份组: 多台路由器被分到一个组中,在这个组中选举出一台主路由器,其他作为备份路由器。平常时候都是主路由器一个工作,备份路由器空闲,当主路由器故障后,从多台备份路由器中选举出一台替代故障的主路由器工作。这一组中的路由器构成了一个备份组。
  7. 虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个一样,你可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。如果虚拟IP和备份组中的某台路由器的IP相同的话,那么这台路由器称为IP地址拥有者,并且作为备份组中的主路由器
    Vrrp的三种状态:
  8. Initialize状态: 系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处处理,可以理解为初始化
  9. Master状态: 路由器会发送VRRP通告,发送免费ARP报文。
  10. Backup状态: 接受VRRP通告。一般主路由器处于Master状态,备份路由器处于Backup状态。
    Vrrp的工作过程
  11. 路由器使能VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master 路由器,优先级低的成为Backup 路由器。Master 路由器定期发送VRRP 通告报文,通知备份组内的其他设备自己工作正常;Backup 路由器则启动定时器等待通告报文的到来。
  12. 在抢占方式下,当Backup 路由器收到VRRP 通告报文后,会将自己的优先级与通告报 文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master 路由器;否则将保持Backup状态
  13. 在非抢占方式下,只要Master 路由器没有出现故障,备份组中的路由器始终保持Master 或Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器
  14. 如果Backup 路由器的定时器超时后仍未收到Master 路由器发送来的VRRP 通告报文,则认为Master 路由器已经无法正常工作,此时Backup 路由器会认为自己是Master 路由器,并对外发送VRRP 通告报文。备份组内的路由器根据优先级选举出Master 路由器,承担报文的转发功能

Keepalived 部署

在线安装

# Centos
yum install keepalived

# ubuntu 
apt install keepalived
cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf

Ubuntu 编译安装

  1. 安装必要软件包
apt install libssl-dev openssl libpopt-dev gcc make
  1. 下载keepalived软件
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
  1. 编译安装软件
tar xf keepalived-2.2.4.tar.gz 
cd keepalived-2.2.4/
./configure  --prefix=/usr/local/keepalived
  1. 软连接
ln -s /usr/local/keepalived/sbin/* /usr/sbin/
  1. 准备配置文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  1. 准备启动文件
sudo tee /usr/lib/systemd/system/keepalived.service <<-'EOF'
[Unit]
Description=Keepalive Daemon (LVS and VRRP)
After=network-online.target
Wants=network-online.target
# Only start if there is a configuration file
ConditionFileNotEmpty=/etc/keepalived/keepalived.conf

[Service]
Type=simple
# Read configuration variable file if it is present
EnvironmentFile=-/etc/default/keepalived
ExecStart=/usr/sbin/keepalived --dont-fork $DAEMON_ARGS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
EOF
  1. 启动软件测试
root@ops103:~# systemctl enable keepalived.service --now
root@ops103:~# systemctl status keepalived.service 
● keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2022-01-06 11:33:31 UTC; 1s ago
    Process: 27578 ExecStart=/usr/sbin/keepalived --dont-fork $DAEMON_ARGS (code=exited, status=0/SUCCESS)
   Main PID: 27578 (code=exited, status=0/SUCCESS)

Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Activating healthchecker for service [192.168.200.2]:tcp:1358 for VS [10.10.10.2]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Activating healthchecker for service [192.168.200.3]:tcp:1358 for VS [10.10.10.2]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Activating healthchecker for service [192.168.200.4]:tcp:1358 for VS [10.10.10.3]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Activating healthchecker for service [192.168.200.5]:tcp:1358 for VS [10.10.10.3]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Shutting down service [192.168.201.100]:tcp:443 from VS [192.168.200.100]:tcp:443
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Shutting down service [192.168.200.2]:tcp:1358 from VS [10.10.10.2]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Shutting down service [192.168.200.3]:tcp:1358 from VS [10.10.10.2]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Shutting down service [192.168.200.4]:tcp:1358 from VS [10.10.10.3]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Shutting down service [192.168.200.5]:tcp:1358 from VS [10.10.10.3]:tcp:1358
Jan 06 11:33:31 ops103.super-ops.top Keepalived_healthcheckers[27594]: Stopped
root@ops103:~# 

配置文件讲解

配置文件路径:/etc/keepalived/keepalived.conf
配置文件组成:

  1. GLOBAL CONFIGURATION
    1. 全局配置,定义邮件配置, route_id,vrrp配置,多播地址等。
  2. VRRP CONFIGURATION
    1. 定义每个 vrrp 虚拟路由器
  3. LVS CONFIGURATION
    1. LVS集群的VS和RS

全局配置

global_defs {
   notification_email {
     root@localhost           # 邮件接收地址
   }
   notification_email_from Alexandre.Cassen@firewall.loc # 邮件发送账户
   smtp_server 192.168.200.1                             # smtp 服务器地址
   smtp_connect_timeout 30                               # 邮件服务器连接timeout
   router_id LVS_ops105                                  # 唯一标识,不能重名
   vrrp_skip_check_adv_addr                              # 对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查。
   vrrp_garp_interval 0                                  # gratuitous ARP messages 报文发送延迟,0 标识不延迟。
   vrrp_gna_interval 0                                   # unsolicited NA messages 消息发送延迟
   vrrp_mcast_group4 224.0.0.18                          # 指定组播IP地址范围, 224.0.0.0 到 239.255.255.255 默认: 224.0.0.18
   vrrp_strict                                           # 严格最受VRRP协议,启用此项后以下状况将无法启动服务, 1. 无VIP地址,2. 配置了单播邻居, 3. 在VRRP版本2中有IPV6地址 开启此项并且没有配置vrrp_iptables 时会自动开启iptables防火墙规则, 默认导致vip无法访问,建议不开启此项。
   vrrp_iptables                                         # 此项和 vrrp_strict 同时开启, 则不会添加防火墙规则, 如果无配置 vrrp_strict项,则无需启动此项配置。
}

虚拟路由配置

vrrp_instance OPS1 {                                     # vrrp 实例名称
    state BACKUP                                         # 当前节点的状态,角色 不起实际作用 MASTER/BACKUP
    interface enp0s6                                     # 绑定的物理网卡
    virtual_router_id 100                                # 每个虚拟路由器唯一标识符,范围 0-255 ,同属于一组虚拟路由器的多个keepalived节点必须相同。
    nopreempt                                            # MASTER 故障后不尽兴抢占。
    priority 80                                          # 虚拟路由器的优先级, 范围 1-254 , 每个Keeplived 主机节点此值不能相同
    advert_int 1                                         # vrrp 通告的时间间隔, 默认 1s
    authentication {                                     # 认证机制 
        auth_type PASS                                   # 认证模式  AH/PASS
        auth_pass 123456                                 # 密钥
    }
    virtual_ipaddress {                                  # 虚拟IP
        10.10.0.100                                      # 不指定掩码默认为32位
        # 10.10.0.100/24 dev enp0s6                      # 指定VIP的网卡, 建议和 interface 指令指定的网卡相同
        # 10.10.0.100/24 dev enp0s6 label enp0s6:1       # 指定VIP网卡的label
    }
   track_interface {                                    # 配置监控网络接口,一旦出现故障, 则转为FAULT状态实现地址转移
       enp0s5
       enp0s6
   }
}

include /etc/keepalived/conf.d/*.conf

日志配置

# 设置 keepalived 启动参数
root@ops103:~# cat  /etc/default/keepalived
DAEMON_ARGS="-D -S 6"
# 添加 rsyslog
root@ops103:~# tail -n 1 /etc/rsyslog.conf 
local6.*                                               /var/log/keepalived.log
# 启动 rsyslog
root@ops103:~# systemctl restart rsyslog.service 
root@ops103:~# systemctl enable rsyslog.service 
# 重启 keepalived
root@ops103:~# systemctl restart keepalived.service 
# 查看日志
root@ops103:~# tail -f /var/log/keepalived.log 
Jan  6 14:25:09 ops103 Keepalived[31318]: Starting Keepalived v2.2.4 (08/21,2021)
......

高级配置

master/slave

     master / slave 模式通过 priority 进行识别 数高为 master,如果master down了,数值高的进行接管, master 恢复则继续接管(默认为抢占模式)。

master 配置

sudo tee /etc/keepalived/keepalived.conf  <<-'EOF'
! Configuration File for keepalived
  
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id ops103.pgoops.com
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.19
}

vrrp_instance test1 {
    state MASTER
    interface enp0s6
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.10.0.100/24 dev enp0s6 label enp0s6:1
    }
    track_interface {
        enp0s5
        enp0s6
    }
}


# include /etc/keepalived/conf.d/*.conf

EOF

BACKUP

备份服务器修改以下参数

  1. router_id
  2. state
  3. priority
root@ops104:~# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id ops104.pgoops.com
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.19
}

vrrp_instance test1 {
    state BACKUP
    interface enp0s6
    virtual_router_id 100
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.10.0.100/24 dev enp0s6 label enp0s6:1
    }
    track_interface {
        enp0s5
        enp0s6
    }
}

# include /etc/keepalived/conf.d/*.conf 

抓包观察

tcpdump -i enp0s6 224.0.0.19

抢占模式/非抢占模式

抢占模式: 指令preempt , 即 高优先级的主机恢复以后,会抢占低优先级主机的master角色,这样会造成网络抖动,建议设置为非抢占模式。
非抢占模式: 指令 nopreempt ,即 高优先主机恢复后,会被充当Backup,不会抢占master角色的主机。 配置时指令state都应该设置为BACKUP。
抢占延迟模式:指令preempt_delay 300s, 即优先级主机恢复后,不会立即抢回VIP,而是延迟一段时间默认为300s,这种模式推荐用在 master/backup服务器配置以及性能差别很大后使用。

VIP 单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。
注意:启用 vrrp_strict 时,不能启用单播

vrrp_instance test1 {
    state BACKUP
    interface enp0s6
    virtual_router_id 100
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.10.0.100/24 dev enp0s6 label enp0s6:1
    }
    unicast_src_ip 10.10.0.103        # 本机发送单播的源IP
    unicast_peer {                           # 目标主机地址,多个地址可在起一行写上即可
        10.10.0.104
    }
    track_interface {
        enp0s5
        enp0s6
    }
}

抓包测试

root@ops103:~# tcpdump -nn -i enp0s6 host 10.10.0.103
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s6, link-type EN10MB (Ethernet), capture size 262144 bytes
15:00:41.692507 IP 10.10.0.103 > 10.10.0.104: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
15:00:42.694047 IP 10.10.0.103 > 10.10.0.104: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
15:00:43.694992 IP 10.10.0.103 > 10.10.0.104: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20

Keepalived 脚本配置

当 keepalived 的状态变化时,可以自动触发脚本的执行,比如发邮件通知用户。
默认以用户 keepalived_script 身份执行脚本,如果次用户不存在,以root用户执行脚本。
在全局中使用:script_user user_name 指定脚本执行用户

脚本通知类型

  1. 当节点成为主节点时触发的脚本
notify_master [ScriptFilePath Args...]
  1. 当节点转为备节点时触发的脚本
notify_backup [ScriptFilePath Args...]
  1. 当节点转为 “失败” 状态时触发的脚本
notify_fault [ScriptFilePath Args...]
  1. 通用格式的通知触发机制吗一个脚本可以完成三种状态的转换时的通知
notify [ScriptFilePath Args...]
  1. 当停止VRRP时触发的脚本
notify_stop [ScriptFilePath Args...]

脚本调用方式

notify_master "/etc/keepalived/notify.sh -n master -a 10.10.0.103"
notify_backup "/etc/keepalived/notify.sh -n backup -a 10.10.0.103"
notify_fault "/etc/keepalived/notify.sh -n fault -a 10.10.0.103"

创建通知脚本

点击查看代码
#!/bin/bash
 
#contact='linuxedu@foxmail.com'
helpflag=0
serviceflag=0
modeflag=0
addressflag=0
notifyflag=0
contact='root@localhost'
Usage() {
  echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP>  <-n|--notify {master|backup|falut}>"
  echo "Usage: notify.sh -h|--help"
}
ParseOptions() {
  local I=1;
  if [ $# -gt 0 ]; then
    while [ $I -le $# ]; do
      case $1 in
  -s|--service)
[ $# -lt 2 ] && return 3
         serviceflag=1
         services=(`echo $2|awk -F"," ' {for(i=1;i<=NF;i++) print $i}' `)
shift 2 ;;
  -h|--help)
         helpflag=1
return 0
        shift
;;
  -a|--address)
[ $# -lt 2 ] && return 3
    addressflag=1
vip=$2
shift 2
;;
  -m|--mode)
[ $# -lt 2 ] && return 3
mode=$2
shift 2
;;
  -n|--notify)
[ $# -lt 2 ] && return 3
notifyflag=1
notify=$2
shift 2
;;
  *)
echo "Wrong options..."
Usage
return 7
;;
       esac
    done
    return 0
  fi
}
 
#workspace=$(dirname $0)
 
RestartService() {
  if [ ${#@} -gt 0 ]; then
    for I in $@; do
      if [ -x /etc/rc.d/init.d/$I ]; then
        /etc/rc.d/init.d/$I restart
      else
        echo "$I is not a valid service..."
      fi
    done
  fi
}
 
StopService() {
  if [ ${#@} -gt 0 ]; then
    for I in $@; do
      if [ -x /etc/rc.d/init.d/$I ]; then
        /etc/rc.d/init.d/$I stop
      else
        echo "$I is not a valid service..."
      fi
    done
  fi
}
 
 
Notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1."
    echo $mailbody | mail -s "$mailsubject" $contact
}
 
 
# Main Function
ParseOptions $@
[ $? -ne 0 ] && Usage && exit 5
 
[ $helpflag -eq 1 ] && Usage && exit 0
 
if [ $addressflag -ne 1 -o $notifyflag -ne 1 ]; then
  Usage
  exit 2
fi
 
mode=${mode:-mb}
 
case $notify in
'master')
  if [ $serviceflag -eq 1 ]; then
      RestartService ${services[*]}
  fi
  Notify master
  ;;
'backup')
  if [ $serviceflag -eq 1 ]; then
    if [ "$mode" == 'mb' ]; then
      StopService ${services[*]}
    else
      RestartService ${services[*]}
    fi
  fi
  Notify backup
  ;;
'fault')
  Notify fault
  ;;
*)
  Usage
  exit 4
  ;;
esac

Keepalived 双主模型

Keepalived 通常为 master/slave 单主模型架构, 同一时间只有一个Keepalived对外提供服务,这样的话 master 主机一直在繁忙状态,而另外的 slave 主机则一直在空闲状态,资源利用率低下,这个时候可以使用双主模式解决次问题。
实现方式:
如果有两个 VIP,可以设置两台 Keepalived 一人接管一个VIP为master ,另外为Slave。

基于 VRRP Script 实现其他应用高可用

Keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用功能。定义脚本的时候脚本返回值为0则是正常,不为0则为异常。
demo:cat /usr/share/doc/keepalived/samples/keepalived.conf.vrrp.localcheck

定义脚本

指令:vrrp_script, 自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义, 可被多个实例调用,定义在 vrrp 实例之外的独立配置块,一般放在global_defs设置块之后,是和 gloobal_defs 平级的语句块通常次脚本用于监控指定应用的状态,一旦发生应用的状态异常,则触发对MASTER节点的权重减至于SLAVE节点, 从而实现VIP切换到SLAVE节点。
注意:次定义脚本的语句块一定要放在下面调用次语句vrrp_instance语句块的前面

vrrp_script SCRIPT_NAME {
 script <STRING>|<QUOTED-STRING>   # 脚本路径
 OPTIONS 
}

参数说明:

vrrp_script <SCRIPT_NAME> {                 #定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING>        #shell命令或脚本路径(注意执行权限)
     interval <INTEGER>                     #间隔时间,单位为秒,默认1秒
     timeout <INTEGER>                      #超时时间
     weight <INTEGER:-254..254>             #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
     fall <INTEGER>                         #执行脚本连续几次都失败,则转换为失败,建议设为2
以上
     rise <INTEGER>                         #执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME]              #执行监测脚本的用户或组
     init_fail                              #设置默认标记为失败状态,监测成功之后再转换为成功状态
}

调用脚本

调用脚本直接在 VRRP 语句块 使用 task_script 指令。

vrrp_instance test1 {
 …
 track_script {
    SCTIPT_NAME
 }
}

实现 haproxy 配置示例

  1. haproxy 配置文件如下
cat /etc/haproxy/haproxy.cfg
listen magedu_http
   bind 10.10.0.100:80
   server web1 10.10.0.105:80 check
   server web2 10.10.0.106:80 check
listen stats
   mode http
   bind 10.10.0.103:9999
   stats enable
   log global
   stats uri     /status
   stats auth   haadmin:123456
  1. 内核参数如下
net.ipv4.ip_nonlocal_bind = 1
  1. 准备检测 ha 脚本
 cat /etc/keepalived/check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
chmod a+x /etc/keepalived/check_haproxy.sh
  1. keepalived 配置文件如下
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 global_defs {
 notification_email {
 root@localhost
 }
 notification_email_from kaadmin@localhost
 smtp_server 127.0.0.1
 smtp_connect_timeout 30
 router_id ops103.pgoops.com
 vrrp_mcast_group4 224.0.100.100
}
vrrp_script check_haproxy { 		#定义脚本
   script "/etc/keepalived/check_haproxy.sh"
   interval 1
   weight -30
   fall 3
   rise 2
   timeout 2 }
vrrp_instance HA_1 {
 state MASTER 				#在另一个节点为BACKUP
 interface enp0s6
 virtual_router_id 66
 priority 100 
 advert_int 1
 authentication {
	 auth_type PASS
	 auth_pass 123456
 }
 virtual_ipaddress {
 	10.10.0.100/24 dev enp0s6 label enp0s6:1
 }
 track_interface {
 eth0
 }

 track_script {
 	check_haproxy 			#调用上面定义的脚本
 }
}

Keepalived 脑裂问题的处理

脑裂在keepalived中时可能存在的,即两个节点实际都处于正常工作状态,但是无法接收到彼此的组播或者单播通知,这时两个节点均强行绑定VIP,由此产生脑裂现象。

脑裂问题的形成

脑裂的形成主要也是就是上述问题,组播或者单播接收不到导致的。产生的条件大概如下:

  1. 心跳线老化
  2. 心跳网口异常
  3. 防火墙规则导致无法接收到组播/单播
  4. 如果采用仲裁方案可能仲裁机器出现问题
  5. 配置文件问题:virtual_router_id, VIP绑定网卡等

脑裂的处理

采用上述的 VRRP Script 方案可以解决,原理 可以用 shell 脚本 ping 网关,如果网关不通则停止keepalived服务。

posted @ 2022-01-06 19:34  闫世成  阅读(2779)  评论(0编辑  收藏  举报