Haproxy

HAProxy 退出時,keepalived track_script 為什麼不重新啟動keepalived?

  • February 2, 2018

更新:似乎需要一個自定義跟踪腳本來實際故障轉移並在 HAProxy 死亡時重新啟動。發佈為答案。

我使用網際網路上數十個範例中的相同跟踪腳本設置了 keepalived(加上 VIP)+ haproxy + galera_node(在同一主機上,配置如下)。我沒有得到的是當我終止haproxy在給定節點上執行的程序時,這就是顯示的內容/var/log/syslog

Keepalived_vrrp[29230]: VRRP_Instance(250) Entering MASTER STATE
Keepalived_vrrp[29230]: VRRP_Script(check_haproxy) failed

說得通。它確實失敗了。但奇怪的keepalived是既不是放棄 VIP 也不是進入 BACKUP 狀態,這是期望的行為(下圖,在 haproxy 離開後幾分鐘 VIP 仍然存在)。我是否誤解了keepalived設計的工作原理,或者我的配置中是否存在其他明顯錯誤?(在 Ubuntu 14.04 上 KA 版本為 1.2.7)

# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether 0e:02:c6:83:82:74 brd ff:ff:ff:ff:ff:ff 
   inet 10.10.10.202/24 brd 10.20.18.255 scope global eth0
      valid_lft forever preferred_lft forever
   inet 10.10.10.250/32 scope global eth0
      valid_lft forever preferred_lft forever 

keepalived.conf

global_defs
{
 router_id    mynode
}

vrrp_script check_haproxy
{
  script      "killall -0 haproxy"
  interval    1
  fall        2
  weight      2
}

vrrp_instance 200
{
  virtual_router_id 200
  advert_int   1
  nopreempt
  priority     90
  state        BACKUP
  interface    eth0
  notify       /etc/keepalived/log_status.sh

  virtual_ipaddress
  {
    10.10.10.250 dev   eth0
  }

  track_script
  {
    check_haproxy
  }
}

我現在正在使用自定義 track_script 來解決此問題。如果 haproxy 沒有執行,它會重新啟動 keepalived。似乎keepalived僅在啟動/重新啟動時使用預設跟踪腳本進入備份模式,而不是在它執行時¯_(ツ)_/¯

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

引用自:https://serverfault.com/questions/895246