AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 783194
Accepted
Karussell
Karussell
Asked: 2016-06-11 03:06:14 +0800 CST2016-06-11 03:06:14 +0800 CST 2016-06-11 03:06:14 +0800 CST

来自 Hetzner 的故障转移 IP 的 DNS 问题

  • 772

假设我们有两台服务器 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
ubuntu domain-name-system high-availability failover hetzner
  • 2 2 个回答
  • 3478 Views

2 个回答

  • Voted
  1. Best Answer
    gxx
    2016-06-15T14:26:57+08:002016-06-15T14:26:57+08:00
    • 正如所承诺的,这是我的答案:

    • 完全披露:我不是在 Hetzner 工作,而是在过去和现在为不同的公司工作,这些公司过去和现在都在 Hetzner 托管硬件。

    • 如果您的个人资料中的位置正确,并且您需要支持:我在同一个城市,可以提供一两个帮助。

    • 对于所有从未与 Hetzner 打过交道的人:他们正在过滤网络访问等,这意味着,特别是关于他们的故障转移 IP(可在不同机器上使用以提供某种高可用性的 IP),他们正在发送流量指向特定 IP 到特定 MAC。

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

    • 警告:尽管人们使用这些 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 和起搏器,这是在 Linux 下设置集群提供高可用性的事实标准。(另外,看看这个。)如果你想尝试后一种方式,Kumina 的优秀人员开发(并发布)了一个资源代理几年前,正是因为在 Hetzner 处理了这种情况。资源代理负责通过与 API 对话来更新路由信息。
    • 结束(暂时):我不完全确定你在追求什么。我试图描述您现在面临的问题的根本原因。此外,我试图提出一些可能的解决方案的想法。如果我没有得到您想要做的事情,有些事情尚不清楚或您还有其他问题:请提供反馈,我很乐意提供帮助(或至少尝试提供帮助)。
    • (此外:您能否将您的配置等移动到您的帖子中,以将所有东西保存在一个地方,所以这个问题将来可能对其他人有所帮助?)
    • 11
  2. nizam.sp
    2018-04-06T21:56:10+08:002018-04-06T21:56:10+08:00

    我们面临着与@gf_ 提到的完全相同的自循环问题。

    以下库完美地实现了同样的目标。

    https://github.com/mrkamel/heartbeat

    您可以使用上述库的 hooks/after 和 hooks/before 功能向远程节点添加和删除浮动 IP。

    示例hooks/before/sendmail脚本,它发送一个松弛通知并将浮动 ip 添加到它切换到的机器上。

    #!/bin/sh
    
    echo "? Switching to failover ip $1 from $2 to $3" | slacktee.sh  
    
    ssh -o StrictHostKeyChecking=no $3 'ip addr add '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'
    

    示例hooks/after/sendmail脚本,它发送一个松弛通知并删除它移开的浮动 IP

    #!/bin/sh
    
    ssh -o StrictHostKeyChecking=no $2 'ip addr del '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'
    
    echo "? Switch success for failover ip $1 from $2 to $3"| slacktee.sh
    

    注意:
    1.运行心跳的机器和分配浮动IP的机器应该首先使用ssh密钥交换无密码登录(检查id_rsa共享)。
    2. slacktee.sh 库用于简单地发送松弛通知。

    • 1

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve