我计划将虚拟机从一个数据中心迁移到另一个数据中心。虚拟机有一个公共 IP 地址,该地址将在新数据中心更改为另一个公共 IP 地址。
我计划更改 VM 的 DNS 条目,以便它将反映新的 IP,但我想在 DNS 传播更改时保持机器可访问。
有没有什么方法可以配置一些路由或 iptables 规则,以便任何发往我的第一个(旧) IP 地址的数据包都会转发到我的第二个(新) IP 地址?
这样,用户通过第一个 IP 的缓存 DNS 条目仍然能够访问 VM。
过了一会儿(一两天),我可以安全地删除路由规则。
我对 IP 表了解不多,对路由更是一无所知。除了一些学术论文外,我无法在 Google 上找到任何关于此内容的线索...
答案1
我认为这是错误的解决问题的方法。
问题是您希望在 DNS 传播时维持服务,但是如果您有权访问 DNS,那么您可以简单地将 DNS 传播时间减少到几秒钟,无论您可以接受的中断时间是多少。
您的域名 A 记录如下所示:
<hostname> 14400 IN A <IP Address>
第二个值是 DNS 可以缓存的时间长度 (TTL)(以秒为单位)。将其更改为
<hostname> 10 IN A <IP Address>
现在每个人都可以在 10 秒内获取任何新更新。当然,在此更改期间,您的 DNS 负担会增加。
因此顺序是
- 确定当前 TTL 值并将其更改为较小的值
- 等到原始 TTL 时间过去,确保每个人都有缩短 TTL 的新记录
- 更改记录的 IP 地址(每个人都会在新的 TTL 持续时间内收到此更新 - 几秒钟)
- 将 TTL 改回更合理的值
“小事”的价值是你的服务在 SLA 范围内可以承受的任何中断
答案2
在两个虚拟机之间创建某种隧道链接 - OpenVPN、GRE,无论您喜欢哪种。
完成后,将旧虚拟机的 IP 分配给新虚拟机的隧道接口,并从旧虚拟机上当前分配给的任何接口中删除该 IP。
完成后,您需要做的就是在旧虚拟机上添加一条路由,以便将 IP 路由到隧道接口上的新虚拟机。
注意事项:根据虚拟机的类型(以及虚拟网卡),这可能无法实现。此外,如果新虚拟机的路径上有任何出口过滤,则带有旧虚拟机源地址的数据包将被丢弃;在这种情况下,当源地址是旧地址时,您需要将新虚拟机配置为通过隧道接口(以及旧虚拟机)进行路由。
至于实际命令,请阅读 iproute2 的手册页。