我运营一个大型网站(每天有 50 万个独立访问者),并且即将转移到另一个托管商。
我的新机器已经设置好并测试过了,所有文件都复制过来了,所以我几乎准备好在我的注册商处更改我的域名的 IP 地址了。
现在我想知道是否有办法尽量减少访问旧服务器的人数,因为他们的 DNS 信息尚未更新。
有时更新可能需要很长时间,而人们访问旧服务器会导致我的网站不同步。
有没有办法强制将人们从我的旧机器转发到新机器?
答案1
不,嗯,是的,但事实上并非如此。
在迁移之前将 DNS TTL 设置为非常低(例如 5 分钟),这告诉客户端只需缓存 DNS 5 分钟,然后刷新。理论上,在 DNS 中更改 IP 后,客户端只需 5 分钟即可开始访问新的服务器 IP。
不幸的是,理论并不现实。一些 ISP 和 DNS 提供商缓存的记录比设置的 TTL 更长(我见过一些 ISP 将 5 分钟的 TTL 缓存 48 小时),简而言之,从技术角度来看,你绝对无法阻止他们这样做,即使他们不应该这样做。唉,说服所有用户转向 OpenDNS 可能不是最好的主意。
当我之前迁移过较大的站点时,我通常会遵循这个流程;
设置两个(新旧)数据库服务器之间的同步。
如果您使用的数据库支持主主复制(即写入以太节点将传播到另一个节点),请同时运行旧服务器和新服务器,直到所有客户端都已更新。这意味着客户端可以访问以太服务器,并且站点将完全正常运行。
如果数据库仅支持主从/日志传送等,您唯一真正能保持网站正常运行的选择就是让旧服务器运行数据库的“只读”副本,它仍将拥有最新数据,但只能读取,而不能写入/更新。根据您的网站,这可能不是什么大问题。
另一个选择(可能也是最容易实现的)是在旧服务器上放置一个代理,将所有请求转发到新服务器。由于代理中的额外跳数,旧服务器上的用户会遇到一些延迟,但通过巧妙的缓存配置,您可以将延迟降到最低。
使用上述任何选项,监视旧服务器,当所有/大多数客户端都已正常停止使用时,即可停止使用。
当然,如果每个人都遵守应有的标准,所有这一切都可以避免。
答案2
想到了对 sam 的两个小补充:如果数据库访问可以容忍两个服务器之间的延迟,那么您也可以设置两者都使用新机器上的数据库。(如果您需要安全性,则可以使用 SSH 隧道或 VPN)。
另一种选择是将旧机器设置为使用临时 HTTP 重定向(307)回答所有到新 IP 的查询(或者您可以使用新 IP 设置一些临时域名,如 www1.yoursite.com,并在重定向中使用它)。
答案3
使用反向代理
如果您对两个系统都具有 root 访问权限,则可以使用 Apache 的 mod_proxy 将流量从旧服务器代理到新服务器。
使用 mod_proxy,您可以设置从旧服务器到新服务器的反向代理。这样,客户端的所有活动都发生在同一台服务器上。如果精心安排,您可以最大限度地减少停机时间(例如重新启动 apache 所需的时间)。
我喜欢这种方法,因为它可以让你测试一些东西前更改 DNS。最后一分钟的良好健全性检查。
如果您有需要该信息的工具,您可能还必须使用名为 mod_rpaf 的模块来获取访问者的真实 IP 地址。
有些网站使用规范 URL,这可能会导致问题。一个技巧是在旧服务器上的 /etc/hosts 文件中设置新服务器的 IP。然后,您可以在代理设置中输入类似以下内容:
ProxyPass / http://www.domain.com/
ProxyPassReverse / http://www.domain.com/
就是这样。您也可以对 HTTPS 执行此操作。
还要注意的是,许多 ISP 会忽略 TTL 值。Comcast、ATT 和其他公司每天只会刷新几次 DNS 缓存。