KeepAlived 和 HAProxy VIP 出现两次

KeepAlived 和 HAProxy VIP 出现两次
Linux Distribution: CentOS 9 Stream
Version of HA Proxy: HAProxy version 2.4.22-f8e3218
Version of KeepAlived: Keepalived v2.2.8 (04/04,2023

我正在使用 keepalived 在主/备份配置中保护 2x HAProxy 负载均衡器。我看到 VIP 出现在主服务器和从服务器上 - 我知道 VIP 应该只出现一次 - 并且应该在主服务器重新上线时转移回主服务器。我可以让主服务器发生故障,一切正常 - 并启动主服务器备份,操作不会受到影响。但我对配置是否正确并不满意

跑步时的大师

sudo ip a | grep ens192

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.17/24 brd 192.168.1.255 scope global noprefixroute ens192
    **inet 192.168.1.20/32** scope global ens192

运行 sudo ip a | grep ens192 时的备份

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.19/24 brd 192.168.1.255 scope global noprefixroute ens192
    **inet 192.168.1.20/32** scope global ens192

主配置如下所示:

global_defs {
  router_id LB-01
}
vrrp_script haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}
vrrp_instance 50 {
  virtual_router_id 50
  advert_int 1
  priority 150
  state MASTER
  interface ens192
  virtual_ipaddress {
     192.168.1.20
  }
  track_script {
      haproxy
  }
}

备份配置如下:

global_defs {
  router_id LB-02
}
vrrp_script haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}
vrrp_instance 50 {
  virtual_router_id 50
  advert_int 1
  priority 50
  state BACKUP
  interface ens192
  virtual_ipaddress {
     192.168.1.20
  }
  track_script {
    haproxy
  }
}

我读到过,主优先级和备份优先级之间必须相差 50 个点。我已确认两个系统上的路由器实例 ID 相同...

有什么想法吗?

答案1

事实证明需要软件更新。此外,SELinux 阻止脚本检查 haproxy,因此虽然可以检测到 LB 的总损失,但无法检测到 haproxy 服务的故障

答案2

我想分享一下我专门用于保护 HAproxy 的 KeepAlive.conf 设置。在此配置中,HAProxy 和 KeepAliveD 安装在 2 个 HProxy 实例上,以在 LB 层创建一定程度的容错能力

我设置了一个具有加权优先级的备份/备份系统,而不是主/备份系统,后者意味着自动“回退”到默认 LB。我更喜欢这样一种设置,其中具有最长且更稳定正常运行时间的 LB 是首选系统。

obal_defs {
  router_id LB-01
}
vrrp_script haproxy {
      script "/usr/local/bin/checkhaproxy.sh"
      interval 1
      timeout 5
      rise 3
      fall 3
}
vrrp_instance 50 {
  virtual_router_id 50
  advert_int 1
  state BACKUP
  priority 150
  nopreempt
  interface ens192
  virtual_ipaddress {
     192.168.1.22
  }
  track_script {
      haproxy
  }

关键是要有一种方式来检查 HAproxy 的状态,这种方式是 SELinux 可以接受的。因此,我们创建了一个 .sh 脚本,并使用 chmod +x 使其可执行

!/bin/sh
# restart keepalive if haproxy died
pid=`/bin/pidof haproxy`
test -z "$pid" && { service keepalived restart &>/dev/null; exit 1; }
exit 0

它存储在 /usr/local/bin/

在名为 LB-02 的备份 1 上,shame .sh 脚本在 /usr/local/bin 中创建,conf 文件如下所示:

global_defs {
  router_id LB-02
}
vrrp_script haproxy {
      script "/usr/local/bin/checkhaproxy.sh"
      interval 1
      timeout 5
      rise 3
      fall 3
}
vrrp_instance 50 {
  virtual_router_id 50
  advert_int 1
  state BACKUP
  priority 50
  nopreempt
  interface ens192
  virtual_ipaddress {
     192.168.1.22
  }
  track_script {
    haproxy
  }
}

这两个文件几乎完全相同,除了:

路由器 ID 主机名(验证 LB-01 能否 ping 通 LB-02,反之亦然)LB-02 上的优先级值较低,以确保如果它们同时出现,则其中一个在选举中获胜

陷阱 - 显然 VIP 是与您的网络相关的 - 并注意不同的 Linux 发行版如何枚举网卡 - 又名 ens192 和 eth0 等等......

相关内容