我正在尝试在某个公共云中使用 Keepalived 主动-被动模式为 PostgreSQL 设置 VRRP 故障转移。此云的已知限制是它不能开箱即用地使用 VRRP(LAN 内的主机无法 ping 通安装在其他主机上的 VIP)。
最初,我的网络如下所示:
172.16.1.3 ---- | 172.16.1.4 | ---- | 172.17.1.4 |
IPSec gateway PG Primary PG Standby
(Keepalived) (Keepalived)
* Keepalived VIP = 192.168.2.100
* "--" is VPC LAN
Keepalived 在 PG Primary 上安装 VIP 192.168.2.100。如果 Primary 节点发生故障,VIP 将移至 Standby 节点。但是,VPC 网络中的任何主机都无法联系到此安装的 VIP(我收到确认,这是云提供商的限制)。
我认为使用 Strongswan 在 VPC 网络中安装 IPSec 覆盖可能有助于克服这一限制,因为 Strongswan 可以与虚拟 IP。现在网络看起来是这样的:
172.16.1.3 ==== | 172.16.1.4 | ---- | 172.17.1.4 | ==== 172.16.1.3
IPSec gateway PG Primary PG Standby IPSec gateway
(Keepalived) (Keepalived)
* Keepalived VIP = 192.168.2.100
* "--" is VPC LAN, "==" is IPsec over VPC LAN
IPSec 网关连接到两个 PostgreSQL 节点。
这是/etc/swanctl/conf.d/connections.conf
172.16.1.3 的摘录(省略了 conn-defaults 和 children-defaults)。
connections {
pg1 : conn-defaults, children-defaults {
remote_addrs = 172.16.1.4
remote {
id = pg1
}
children {
net-net {
local_ts = 172.16.1.3/32
remote_ts = 192.168.2.0/24
}
}
}
pg2 : conn-defaults, children-defaults {
remote_addrs = 172.17.1.4
remote {
id = pg2
}
children {
net-net {
local_ts = 172.17.1.3/32
remote_ts = 192.168.2.0/24
}
}
}
}
这是 172.16.1.4 和 172.17.1.4 上的 connections.conf(它们大部分相同):
connections {
gw : conn-defaults, children-defaults {
remote_addrs = 172.16.1.3
remote {
id = gw
}
children {
net-net {
local_ts = 192.168.2.0/24
remote_ts = 172.16.1.3/32
}
}
}
}
因此,我能够成功地从 Gateway 查询 VIP 上的 PostgreSQL(网关的客户端也可以这样做),但前提是 VIP 安装在 PG Primary(172.16.1.4)上。我猜那是因为在/etc/swanctl/conf.d/connections.conf
Gateway 上 pg1 连接是在 pg2 连接之前定义的。
如果我更改 .conf 文件中的连接顺序或终止与 pg1 的 IPsec 连接,我也能连接到安装在 PG Standby (172.17.1.4) 上的 VIP。如果它们共享相同的流量选择器 ( local_ts
),是否有任何方法可以在两个主机上查找 VIP 地址?