假设我们有两台服务器 A 和 B,它们分别有“真实”IP 和外部 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 尝试此操作,则只会打印 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
答案1
正如承诺的那样,以下是我的回答:
全面披露:我不是为 Hetzner 工作,但过去和现在曾在不同的公司工作过,这些公司曾经在 Hetzner 共同安置硬件。
如果您个人资料中的位置正确,并且您需要支持:我位于同一个城市,可以提供一两点帮助。
对于所有从未与 Hetzner 打过交道的人来说:他们正在过滤网络访问等,这意味着,尤其是关于他们的故障转移 IP(可以在不同的机器上使用的 IP 来提供某种高可用性),它们将指向特定 IP 的流量发送到特定的 MAC。
如果想要更改流量定向到的目标(机器),则必须
POST
向API该服务通过 提供服务HTTPS
。然后,API 验证身份验证(即用户名和相应的密码)和请求,如果有效,则将此新配置传播到网络中的各个路由器。这种技术类似于法国大型提供商 OVH 使用的技术。- 警告:尽管人们使用这些 IP 为他们的机器/服务提供某种高可用性(如书面所述),但新路由配置的传播需要一些时间,有时长达约 60 秒。这意味着,例如,如果使用某种自动故障转移,如果当前路由流量的机器发生故障,并且持续一段时间,人们会注意到,那么流量就会被丢弃,因为机器已停机,直到新的路由配置到位为止。
- 到目前为止的介绍,让我们来看看您的具体问题:
- 正如评论/聊天中指出的那样,使用
auto eth0:0
将在网络启动后(通常是在启动时)在接口 上设置故障转移 IPeth0:0
。您有两台具有相同配置的机器,因此这会导致同一 IP 在两台不同的机器上处于活动状态(这不是不行,但会导致您当前正在处理的情况)。请注意:您使用的语法是多次将同一接口别名化,即已弃用(但仍有效)。Debian wiki(此链接)中也描述了“新方法”,它只是将多个 IP 分配给一界面。 - 因此:您同时将 IP 本地分配给两台计算机。
curl
测试用例内部执行以下操作:它将给定的域名解析为 IP,然后尝试在端口 443 上连接到此 IP。由于此 IP 无论如何都是本地分配的,因此可以访问,因此数据包永远不会发送到网络。如果nginx
(如您的测试用例中一样)此时不在本地运行,则您只会被拒绝连接,这完全正常且有效:“IP 是本地的,因此让我们将流量发送到那里”。它永远不会将数据包发送到某个路由器,这或许有以下信息:“指向该 IP 的流量应该流向这台机器”。 - 现在……实际上我并不完全确定你在追求什么。你只是想了解发生了什么吗?如果是这样,我试图描述这一点。你想找到/实施一种“解决”这种情况的方法吗?如果是后者,以下是一些想法:
- 解决方案 1:从 中删除指令
auto eth0:0
(但保留 的其余配置eth0:0
)/etc/network/interfaces
。这样做将不是为机器分配 IP。这是你的任务(脚本的任务),它确实ifup eth0:0
(并且,再次或许,与 API 对话以确保流量被路由到正确的机器)。 - 解决方案 2,又称“自动化所有事情”:不要进行手动故障转移,而是实现一个通过两台机器之间的心跳(检查健康状况)自动执行此操作的系统:对此存在多种解决方案,例如虚拟路由器冗余协议并且(全面披露:我个人最喜欢的,多年来我一直在生产中使用它来完成这样的任务):corosync 和 pacemaker,这是在 Linux 下设置提供高可用性集群的事实标准。(另请参阅这)如果你想尝试后一种方式,Kumina 的优秀人士开发(并发布)了一个资源代理几年前,Hetzner 就专门处理过这种情况。资源代理通过与 API 对话来更新路由信息。
- 结束语(暂时):我不太清楚你在找什么。我试图描述你现在面临的问题的根本原因。此外,我还试图提出一些可能的解决方案。如果我不明白你在做什么,有些事情还不清楚,或者你还有其他问题:请提供反馈,我很乐意提供帮助(或至少尝试)。
- (此外:您能否将您的配置等移到您的帖子中,将所有内容保存在一个地方,以便这个问题将来可以为其他人提供帮助?)
答案2
我们面临着与@gf_ 提到的完全相同的自循环问题。
以下库完美地实现了相同的目的。
https://github.com/mrkamel/heartbeat
您可以使用上述库的 hooks/after 和 hooks/before 功能向远程节点添加和删除浮动 IP。
例子钩子/之前/发送邮件发送松弛通知并将浮动 IP 添加到其切换到的机器的脚本。
#!/bin/sh
echo "