假设我们有两台服务器 A 和 B 具有“真实”和外部 IP,我们可以切换所谓的“故障转移 ip”(WXYZ)以指向 A 或 B 的特定外部 IP。这从“外部”工作并且是很容易做到。作为背景:故障转移 ip 配置为 /etc/network/interfaces 中的新条目:
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
现在让我们假设 WXYZ 被动态配置为使用硬件 A。现在我从 B 调用“curl domain.com”,它使用正确的故障转移 ip WXYZ,但随后以某种方式解析为错误的外部 IP B(或本地主机?)而不是使用配置的一个 A:
Trying W.X.Y.Z ...
* connect to W.X.Y.Z port 443 failed: Connection refused
* Failed to connect to domain.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to domain.com port 443: Connection refused
当我启动本地 nginx 时,它可以成功 curl domain.com
我是否需要以某种方式在本地配置 DNS?如何找到有关 DNS 链的更多信息?
如果从服务器 B 尝试,使用mtr只会打印 domain.com
这与这个问题有关吗?
The failover IP is W.X.Y.Z and is also the A record of domain.com
The /etc/hosts file for both nodes serverA and serverB looks like:
127.0.0.1 localhost
127.0.1.1 luminarhost
xxx serverA
xxx serverB
The /etc/network/interfaces of serverA
### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback
# device: eth0
auto eth0
iface eth0 inet static
address xxx
broadcast xxx
netmask xxx
gateway xxx
# default route to access subnet
up route add -net xxx netmask 255.255.255.224 gw xxx eth0
iface eth0 inet6 static
address xxx
netmask xxx
gateway xxx
# failover ip
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
and of serverB it is:
### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback
# device: eth0
auto eth0
iface eth0 inet static
address xxx
broadcast xxx
netmask xxx
gateway xxx
# default route to access subnet
up route add -net xxx netmask 255.255.255.192 gw xxx eth0
iface eth0 inet6 static
address xxx
netmask xxx
gateway xxx
# failover ip
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
正如所承诺的,这是我的答案:
完全披露:我不是在 Hetzner 工作,而是在过去和现在为不同的公司工作,这些公司过去和现在都在 Hetzner 托管硬件。
如果您的个人资料中的位置正确,并且您需要支持:我在同一个城市,可以提供一两个帮助。
对于所有从未与 Hetzner 打过交道的人:他们正在过滤网络访问等,这意味着,特别是关于他们的故障转移 IP(可在不同机器上使用以提供某种高可用性的 IP),他们正在发送流量指向特定 IP 到特定 MAC。
如果想要更改流量指向的目标(机器),则必须向API
POST
发送请求,该API通过. 然后 API 验证身份验证(即用户名和相应的密码)和请求,如果有效,则将此新配置传播到网络中的各种路由器。这种技术类似于法国的大型供应商 OVH 使用的技术。HTTPS
auto eth0:0
, 将在接口设置您的故障转移 IPeth0:0
,一旦网络启动,通常在启动时。您有两台机器,具有相同的配置,因此这会导致相同的 IP 在两台不同的机器上处于活动状态(这不是不行,但会导致您当前正在处理的情况)。请注意:您正在使用的语法,多次为同一个接口起别名,已被弃用(但仍然有效)。Debian wiki(此链接)中也描述了“新方式”,它只是将多个 IP 分配给一个接口。curl
在您的测试用例中执行以下操作:它将给定的域名解析为一个 IP,然后尝试在端口 443 连接到该 IP。由于此 IP 在任何情况下都是本地分配的,因此可以访问,因此数据包永远不会发送到网络。如果nginx
(就像在您的测试用例中)此时没有在本地运行,您只是被拒绝连接,这完全没问题且有效:“IP 是本地的,所以让我们在那里发送流量”。它永远不会将数据包发送到某些路由器,该路由器可能具有以下信息:“定向到此 IP 的流量应该流向此机器”。auto eth0:0
:eth0:0
从/etc/network/interfaces
. 这样做不会将 IP 分配给机器。这样做将是您的任务(脚本的任务),它确实ifup eth0:0
(并且可能再次与 API 对话以确保流量被路由到正确的机器)。我们面临着与@gf_ 提到的完全相同的自循环问题。
以下库完美地实现了同样的目标。
https://github.com/mrkamel/heartbeat
您可以使用上述库的 hooks/after 和 hooks/before 功能向远程节点添加和删除浮动 IP。
示例hooks/before/sendmail脚本,它发送一个松弛通知并将浮动 ip 添加到它切换到的机器上。
示例hooks/after/sendmail脚本,它发送一个松弛通知并删除它移开的浮动 IP
注意:
1.运行心跳的机器和分配浮动IP的机器应该首先使用ssh密钥交换无密码登录(检查id_rsa共享)。
2. slacktee.sh 库用于简单地发送松弛通知。