我需要更换一台运行繁忙网站的老旧网络服务器。我已经安装了新硬件并开始运行,所有软件都已安装完毕。只剩下一个问题需要解决:
当我在 DNS 中更改域的 A 记录时,由于 DNS 缓存,更改需要一段时间才能通过互联网传播。在此期间,一些用户将访问新服务器,一些用户将访问旧服务器,导致数据不一致,因为现在有两个数据库。我如何才能立即切换所有人?我没有运行 DNS 服务器,除了 A 和 CNAME 记录之外无法更改任何内容,但如果有帮助的话,我可以设置自己的服务器。
在夜间搬家时我可能会有一两个小时的停机时间。
谢谢,西蒙
编辑:感谢您的所有回答。我接受 SmallClanger 的答案,因为这是一个可行的解决方案,我赞成 Brian,因为他的答案给了我一个新想法:按照 SmallClanger 的解决方案进行数据库迁移,然后用 HTTP 代理替换旧的 apache,该代理将所有请求代理到新服务器。我会将代理配置为通过 IP 地址寻址新服务器,并且它不涉及临时子域,该子域可能(尽管有 302 代码)最终出现在某些书签目录、社交网络或浏览器缓存中。
答案1
你面临的根本问题是在切换过程中保持数据库一致性。零停机,您别无选择,只能在主动/主动集群中设置两台服务器。(即使暂时假设集群设置本身不涉及停机,这有点牵强。)
鉴于你无法更改 TTL,最好的办法是最小化停机时间:
- 在第二个域名上设置新网站(例如
www2.example.com
:),但也要使其响应www.example.com
。仅将 DNS 指向www2
新服务器。 - 复制站点文件并锁定以防止双方编辑。
- 然后在公布的维护窗口中,用“关闭升级”通知替换实时网站。
- 根据需要同步或复制数据库,然后启动新服务器。
- 然后(且只有这样)对记录进行 DNS 更改
www
。 - 将旧网站配置替换为简单的 302 重定向至
www2.example.com
- 等待整个 TTL 过期(然后再过一段时间)再关闭旧服务器。
这将确保在 DNS 传播期间所有流量都转到新站点,无论它们最初转到哪个服务器,但它假定您的站点能够同时从多个域名提供服务。
对于单服务器 LAMP 堆栈(如果您拥有的话),这是实现最少(但不是零)停机时间的途径。
答案2
您可以配置旧的 Web 服务器以将所有请求重定向到新 IP。这可以使用 apache 中的 mod_rewrite 来实现。
答案3
您可以在迁移前一两天将区域的 TTL 降低到一个较小的值。更改 A 资源记录后,您可以将 TTL 再次提升到旧值。
答案4
降低 TTL,并在旧页面上放置维护标志?