Hetzner 的故障转移 IP 存在 DNS 问题

Hetzner 的故障转移 IP 存在 DNS 问题

假设我们有两台服务器 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。

  • 如果想要更改流量定向到的目标(机器),则必须POSTAPI该服务通过 提供服务HTTPS。然后,API 验证身份验证(即用户名和相应的密码)和请求,如果有效,则将此新配置传播到网络中的各个路由器。这种技术类似于法国大型提供商 OVH 使用的技术。

  • 警告:尽管人们使用这些 IP 为他们的机器/服务提供某种高可用性(如书面所述),但新路由配置的传播需要一些时间,有时长达约 60 秒。这意味着,例如,如果使用某种自动故障转移,如果当前路由流量的机器发生故障,并且持续一段时间,人们会注意到,那么流量就会被丢弃,因为机器已停机,直到新的路由配置到位为止。
  • 到目前为止的介绍,让我们来看看您的具体问题:
  • 正如评论/聊天中指出的那样,使用auto eth0:0将在网络启动后(通常是在启动时)在接口 上设置故障转移 IP eth0: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 "

相关内容