更改服务器-重定向到新IP =是否没有停机时间?


13

我正在更换网站服务器。旧服务器的IP无法移至新服务器。为了不造成停机,我计划执行以下操作,请确认此功能可以正常工作:

  1. 设置新服务器并侦听新IP
  2. 旧服务器将所有流量重定向到新IP
  3. 更改DNS记录以指向新IP

我的逻辑告诉我,当我从旧框重定向到新IP时,用户将不会在浏览器中看到域名,但会看到新IP。有没有一种方法可以重定向到新IP并与HOSTNAME一起发送,以便用户在浏览器中看到域名?

我这样做是因为该站点一直处于使用状态,并且仅更改DNS设置不会起作用,因为在传播过程中,新旧服务器之间不会同步数据库。


3
您可能已经想到了,但没有提及:别忘了减少相关DNS条目的TTL。
cjc 2012年

该网站仅由人类使用,还是有可能与之连接的应用程序?例如消耗网络服务?如果是这种情况,您可能仍会停机。Java会缓存DNS结果,并​​且可能在重新启动DNS结果之前不尊重新DNS条目。除非您可以长时间保持转发在线。另外,如果您使用加密重定向,则会涉及一些其他步骤。
Bram 2015年

您正在使用哪种数据库?您是正确的,因为更改DNS不会解决停机问题,我在工作中会一直这样做,并且可以为您提供详细的步骤,但是如果您将数据库放在同一服务器上,则确实会出现一个小问题,通常很容易解决来。
Anthony Fornito '16

另外,您有哪种服务器是Windows或linux,在阅读了一些答案后,它们都指向linux,但您的问题中我真的看不到您使用的是IIS vs linux风格
Anthony Fornito

Answers:


19

这是对我有用的方法:

  1. 将文件和数据库与新服务器同步。
  2. 切断前执行重新同步。
  3. 更改DNS指向新服务器。
  4. 将来自旧ip的请求转发到新服务器,直到DNS传播完成。

这是我执行步骤4的方法:

我们将在Linux服务器上配置IPTables,以将来自端口80(这是默认的Web服务器端口)的所有流量重定向到具有IP的服务器122.164.34.240。第一步是设置您的Linux机器,以允许进行这种转发。打开一个终端窗口,以root用户身份登录并运行以下命令:

# echo 1 >/proc/sys/net/ipv4/ip_forward

下一步是告诉IPTables将流量重定向到新服务器:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 122.164.34.240

这就是IPTables神奇之处。在第三步(也是最后一步)中,我们告诉IPTables重写到新服务器端口80的连接的源,看似来自旧服务器。

# iptables -t nat -A POSTROUTING -p tcp -d 122.164.34.240 --dport 80 -j MASQUERADE

最后一步是必需的,因为如果我们不告诉新服务器的Web服务器连接来自客户端计算机,它会认为它们来自旧服务器。

您可能还要对数据库和电子邮件服务器端口重复此操作。


您是说-A而不是-D吗?-D是删除规则,不是吗?无论如何,在我完成操作之后,旧的盒子肯定会尝试重定向,因为它不再加载Web,但是失败了,因为新的Web也没有显示,只是说连接超时。我还有其他设置吗?也许我的新盒子上有东西?
Denis Pshenov 2012年

没关系,我已经解决了!原来我的岸墙正在阻止重定向。我已经在规则中允许了。
Denis Pshenov 2012年

对此我感到抱歉。您是对的,它是-A,而不是-D。我已经更新了帖子。
肖恩·帕德玛詹

1
只是一个警告-使用iptables的方法会将所有流量转发到新站点,但是当到达该站点时,它似乎起源于您的旧服务器,而不是原始浏览器的实际IP地址。这将破坏诸如地理分析之类的东西。特别是,永远不要试图通过这种方式将端口25转发给电子邮件,否则您可能会意外地创建一个开放中继,因为通过旧服务器从垃圾邮件发送者那里收到的邮件将被您的新服务器当作您来自一台您自己的计算机的新服务器一样对待。值得信任,并可以中继。
加里·比尔库斯

@ShainPadmajan,尽管晚了,非常感谢,即使在2015
。– Abhishek Madhani

5

您也可以考虑添加多个A记录。例如,谷歌使用此方法,检查其nslookup输出:

Name:       google.com
Addresses:  209.85.148.101
            209.85.148.102
            209.85.148.113
            209.85.148.138
            209.85.148.100
            209.85.148.139

如果您将多个A记录添加到一个域中,则访问者将获得多个IP并按该顺序尝试。如果失败了,客户端将移至下一个尝试。

提前24小时将新IP设置为额外的A记录,启动新服务器,关闭旧服务器,删除IP。


除非在启动新服务器之前不要添加A记录。:)
亚伦·科普利2012年

@亚伦:为什么不呢?添加A记录需要几个小时(最多需要24小时才能完全激活),并且只要第二台服务器没有启动,客户端就会选择第一个。
JapyDooge 2012年

当区域的TTL过期时,将再次查询您的名称服务器以获取资源,它将获得两个答案。如果添加新的A记录并等待任意时间以启动服务器,那么人们很可能已经在解析到尚不可用的主机。如果新服务器已经启动,则不必担心。
亚伦·科普利2012年

1

另一种选择是使用VIP(虚拟IP)。因此,您的步骤将是:

  1. 设置新服务器并侦听新IP。
  2. 将VIP添加到旧服务器。
  3. 更改DNS记录以指向VIP IP。到现在,所有流量仍将使用VIP传送到旧服务器。
  4. 准备就绪后,将VIP移至新服务器。
  5. (可选)您可以将DNS更改为新的服务器IP,并从DNS中删除VIP(一段时间后)。

我喜欢你的解决方案。但是我不熟悉VIP和如何获得VIP。您能指出正确的方向吗?
Denis Pshenov 2012年

真的很简单。像这样的命令ifconfig eth0:0 <ip> <mask> up将创建一个配置了IP的子接口,ifconfig eth0:0 down足以将其禁用。
哈立德

0

好的,既然您提到了数据库复制,那么您必须执行以下操作。

  1. 在两个服务器中的数据库之间设置复制。
  2. 切换期间,将新服务器的数据库作为主服务器,将旧服务器作为只读。
  3. 将应用程序的数据库连接字符串指向新旧服务器上的新服务器。如果您的站点使用会话,请确保会话在数据库中保持不变。
  4. 将DNS中的IP地址更改为新服务器。
  5. 至少同时运行两个服务器48小时。

0
  1. 设置新服务器并侦听新IP
  2. 然后配置透明重定向。在旧服务器上安装rinetd。

在rinetd.conf中:

OLD_SERVER_IP 80 NEW_SERVER_IP 80
  1. 更改DNS记录以指向新IP

我做了apt-get install rinetd,将/etc/rinetd.conf更改为新设置,使用/etc/init.d/rinetd restart重新启动,但是它没有重定向。日志中也没有显示任何内容/var/run/rinetd.log
Denis Pshenov 2012年

显示你的iptables-savecat /etc/sysctl.conf | grep ip_forward请。
yadaya 2012年

0

您可以在Web服务器的前面使用HA-Proxy,当其中一台进入维护模式时,辅助服务器将接管。


-1

您的操作清单似乎很明智。

例如,假设您使用apache,则在旧服务器上的apache中执行以下操作时:

redirect permanent / http://newserver.example.com

当用户浏览到旧站点时,将在浏览器中看到新域。在这种情况下,只要浏览器正在运行,重定向也是永久的。

因此,除了其他更改之外,只要您在Web服务器中实现某种重定向,就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.