每个迁移翻车的故事,中间情节都一样:有人先改了 DNS,然后才开始复制数据。迁移时的停机几乎从来不是因为复制太慢,而是因为步骤顺序错了。
下面是行得通的顺序,不管你是从别的服务商迁过来,还是在我们的两个套餐之间迁移。
1. 提前两天:调低 TTL
找到你要修改的 DNS 记录(通常是 A、AAAA,以及指向它们的 CNAME),把 TTL 调到 300 秒。然后至少等待旧 TTL 那么长的时间。TTL 为一天的记录,意味着修改后部分解析器还会继续返回旧地址一整天,你在服务器上做什么都无法加快这一过程。
这是大家最常跳过的一步,也正是它把五分钟的切换变成了一整天:一半用户看到的仍是旧服务器。
2. 给旧服务器做一份清单
你要在别处重建这台机器,所以把它实际在做的事情写下来。不是你记得的,而是它真正在做的:
ss -tlnp # what is listening, and which process
crontab -l; ls /etc/cron.d # scheduled jobs
systemctl list-timers --all # the scheduled jobs people forget
systemctl list-units --type=service --state=running
再补充进清单:TLS 证书及其续期方式、存放密钥的环境变量文件、防火墙规则、用户和他们的 SSH 密钥、数据库及其大小,以及所有通过 IP 地址访问这台服务器的东西。最后这一类最容易被忽略:合作方的白名单、支付服务商的 Webhook 设置、某个监控检查。
3. 在旧服务器旁边搭建新服务器
订购新服务器,旧的先别动。从 VPS 列表 里选一个磁盘不小于你实际用量的套餐,而不是当初卖给你的容量。如果旧机器接收任何入站流量(网站、Webhook、API),新机器就需要独立 IPv4。NAT 套餐只在 SSH 端口上接受入站连接,一个转发端口能做什么、不能做什么 解释了为什么这一点很重要。
连上去,安装同样的软件包,重新创建用户和防火墙。密钥和首次登录见 连接指南。
4. 同步两次文件
第一次同步在旧服务器照常运行时复制全部内容。可能要好几个小时,没关系。
rsync -aHAX --numeric-ids --info=progress2 /var/www/ root@203.0.113.10:/var/www/
--numeric-ids 按数字保留文件属主,避免了两套系统用户创建顺序不同时那种经典的“所有文件都属于错误用户”的意外。如果你没用过基于 SSH 的 rsync,如何把文件传到 VPS 会一步步讲清楚。
第二次同步在切换前进行,只复制第一次之后有变化的部分,通常几秒钟就完成。
5. 慎重地迁移数据库
文件很简单。接收写入的数据库是唯一一个“不停机”需要要么做点小妥协、要么多花功夫的地方。
简单的办法:先导出、导入一次用于测试;切换时停写一分钟(把应用设为只读或停掉),重新导出一份,导入到新服务器,然后在新服务器上启动应用。对大多数小项目来说,这就是一两分钟的停顿,可以提前通知。
不停顿的办法:配置从旧数据库到新数据库的复制,等它追上进度,切换时把新库提升为主库。配置更多,但当哪怕一分钟的写入丢失都无法接受时,这是值得的。
6. 在别人看到之前测试新服务器
DNS 仍然指向旧服务器,所以你可以私下测试新服务器。把对真实域名的请求发到新地址:
curl --resolve example.com:443:203.0.113.10 https://example.com/health
如果证书还没配好,就用同样的方式走 HTTP 测试,或者在 hosts 文件里临时加一行,在浏览器里把网站点一遍。检查登录、上传、后台任务和外发邮件。这是发现缺少某个 PHP 扩展成本最低的时刻。
7. 切换,并让旧服务器继续运行
完成最后一次文件同步和数据库步骤,然后修改 DNS 记录。TTL 为 300 秒时,大部分流量几分钟内就会转过去。盯着旧服务器的访问日志:那些忽略 TTL 的解析器和客户端还会零星地发来请求。让它保持原样运行几天。之后更新所有指向旧 IP 的地方:合作方白名单、Webhook 地址,以及邮件相关的新地址反向 DNS(在我们的独立 IP 套餐上可以自己设置,见 反向 DNS)和 SPF 记录。
最常出问题的地方
大致按我们见到的频率排序:没人列进清单的 systemd 定时器、写死旧 IP 的配置文件、属于错误用户的文件、挡住应用自身端口的防火墙、在旧服务器上续期而新服务器上没续期的证书,以及因为新地址还没有反向 DNS 而被扔进垃圾箱的邮件。
这份清单不适用的情况
写入持续不断、完全不能停顿的繁忙数据库,需要的是正经的复制方案和一次彩排,而不是一篇博客清单。Windows 服务器的迁移工具和 rsync 不同。另外,如果迁移的真正原因是配置不够用,先看这一点:这里的套餐可以原地升级。升级到同一网络类型的更大套餐,只需重启一次就能增加 vCPU、内存和磁盘,完全不用迁移。只有降配才需要新服务器。如果你是因为不确定机器够不够用才想迁移,什么时候真的需要 64 GB 内存 也许能帮你省掉这趟折腾;如果你还不确定 VPS 是否适合你,可以看看 VPS、共享主机、独立服务器和云平台的比较。
评论
暂无评论。来做第一个吧。