无需停机即可将一台机器的 IP 分配给另一台 Linux 机器

无需停机即可将一台机器的 IP 分配给另一台 Linux 机器

我有一台有 IP 地址的机器。我正在升级我们的服务,我们正在启动另一个虚拟机。一旦我们验证了新虚拟机,我们就想分配与旧机器相同的 IP 并终止旧虚拟机。只有验证正确,我们才能分配这个 IP。这必须在没有停机的情况下进行。有人能建议如何做到这一点吗?VM1:Docker Swarm VM2:K8S

答案1

如果你的网卡是eth0,请尝试:

sudo ip addr add 1.2.3.4/24 dev eth0

将旧 IP 1.2.3.4 添加到新服务器,尽管这会中断 tcp 连接,因为新服务器无法识别它们。

另外,这在重新启动后不会持久,并且无法从原始系统中删除 IP 或连接将导致 IP 地址冲突。

答案2

您无法做到零停机时间。第一个接口需要先断开网络,然后新接口才能启动。当 IP 添加到网络接口时,它会发送 arp 请求以查找具有相同 IP 的另一个接口。如果它得到响应,则会抛出错误。

就我个人而言,如果我们只讨论两台服务器,我会打开两个窗口并编写命令脚本,这样您就可以关闭一个窗口,然后立即切换到另一个窗口并打开另一个窗口。不过,您需要记住以下几点:

1)您需要有一种方式来在 IP 发生变化时保持连接,例如有另一个 IP 以便您在切换时可以保持 ssh 状态或通过物理控制台以传统方式进行操作。

2) 您可能必须关闭所有应用程序服务才能进行切换,否则应用程序的客户端将失去连接并可能丢失交易数据,除非您在服务器前面有某种高可用性解决方案(如负载平衡器)。如果是静态 Web 服务器,则这一点并不重要,但如果您的客户端正在向中间件或数据库提交交易数据,那就不好了。

3)如果您正在运行依赖于时间戳数据的应用程序,请确保两个服务器的时钟同步,否则当您的DBA看到他的事务时间戳相差几秒钟时,他会大发雷霆!

答案3

以下内容可能是保留相同 IP 的想法的替代方案,并假设它基于 HTTP。

您可以设置一台新服务器,模拟配置并将应用程序部署到该服务器上。您可以通过调整/etc/hosts(或操作系统相关的等效项)并摆弄它直到一切正常来测试。

然后,您可以在原始应用程序的 Web 配置中定义proxy_pass(nginx) 或ProxyPass(Apache)(请先阅读有关代理的内容,其中有一些注意事项)。一旦您重新加载 Web 服务器,应用程序将立即在新服务器上运行。然后,您可以更改 DNS 记录,人们将慢慢从使用代理版本迁移到新版本。

我已经通过这种方式迁移了许多 Web 应用程序,并且没有丢失任何请求。

相关内容