我正在尝试在基于 ESXi 的设置上设置 keepalived,其中 2 个物理盒安装了 ESXi,每个物理盒都有一个使用 HAProxy 充当负载平衡器的节点。现在,为了实现高可用性,我想使用 KeepAlived,这样两个 HAProxy 实例都可以共享虚拟 IP,并且我可以将物理 IP 地址指向虚拟 IP 地址。我的实施面临的挑战是它有 2 个子网。
子网 A 上的 HAProxy:1.1.10.101 子网 B 上的 HAProxy:1.2.10.101
现在,当我尝试在两个实例上分配虚拟 IP 1.1.10.201 时,它将指向两个服务器上的本地实例。
我正在使用带有 HAProxy 和 KeepAlived 的 CentOS 7.x,主要用于平衡 HTTP 流量的负载,也可能用于数据库。
我不会发布配置文件,因为问题本身非常简单,但如果需要我可以这样做。
答案1
还有另一种方法。不同网络中的 2 个 keepalived 可以使用进行通信unicast_peer
(其工作原理与你有 VIP 但没有 VIP 的情况相同)
然后,您可以使用notify_script
移动 IP 故障转移(例如由您的主机提供)并向您的提供商发出 API 调用,以在 keepalived 转换到 MASTER 时告知将您的 IP 故障转移移动到另一个服务(有一条notify_master
规则)。
我的 keepalived 配置示例:
global_defs {
vrrp_version 2
vrrp_garp_master_delay 1
vrrp_garp_master_refresh 60
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/check_haproxy.sh"
timeout 1
interval 5 # check every 5 second
fall 2 # require 2 failures for KO
rise 2 # require 2 successes for OK
}
vrrp_instance lb-vips {
state {{KEEPALIVED_STATE}}
interface {{KEEPALIVED_INTERFACE}}
virtual_router_id {{KEEPALIVED_VIRTUAL_ROUTER_ID}}
priority {{KEEPALIVED_PRIORITY}}
advert_int 1
unicast_src_ip {{KEEPALIVED_UNICAST_SRC}}
unicast_peer {
X.X.X.X # here you have all ip of other keepalived
X.X.X.X
}
authentication {
auth_type PASS
auth_pass {{KEEPALIVED_AUTH_PASSWORD}}
}
track_script {
chk_haproxy
}
notify "/etc/keepalived/scripts/notify_script.sh"
}
相关变量:
# Keepalived Config
KEEPALIVED_STATE=MASTER
KEEPALIVED_INTERFACE=eth0
KEEPALIVED_VIRTUAL_ROUTER_ID=77
# For electing MASTER, highest priority wins.
# MASTER=101, SLAVES=100
KEEPALIVED_PRIORITY=101
# password: Only the first eight (8) characters are used.
KEEPALIVED_AUTH_PASSWORD=password
# Should be the public ip of the server
KEEPALIVED_UNICAST_SRC=X.X.X.X
# Keepalived Notify Script Config
OVH_ENDPOINT=ovh-eu
OVH_APP_KEY=X.X.X.X
OVH_APP_SECRET=X.X.X.X
OVH_CONSUMER_KEY=X.X.X.X
FAILOVER_IP=X.X.X.X
FAILOVER_SERVICE=X.X.X.X
答案2
不幸的是,keepalived 使用的 VRRP 只能在单个子网内工作。