服务器跨机房迁移,网站不停机搬迁方案
服务器跨机房迁移时,如果直接关停旧服务器再在新机房部署,网站必然中断。
要做到不停机,核心思路是让新旧服务器同时在线,通过数据同步和流量切换实现平滑过渡。
本文将一步步带你完成整个迁移过程,适合零基础运维人员,最终实现用户几乎无感知的搬迁。
迁移前必须确认的几件事
开始操作前,先检查以下条件是否满足:
- 新服务器已就绪,操作系统、Web环境(如Nginx、PHP)、数据库版本尽量与旧服务器一致。
- 旧服务器有公网IP,新服务器也有公网IP,且能互相通信(建议先测试SSH和端口连通性)。
- 网站域名DNS的TTL值已提前调低(例如300秒),以便快速切换解析。如果TTL是86400,建议提前一天改小。
- 准备好数据库账号密码、网站根目录路径、SSL证书文件等。
注意:如果网站有用户上传文件、订单等动态数据,迁移期间必须保证数据一致性,不能只同步一次。
数据同步与实时增量备份
不停机迁移的关键是让旧服务器和新服务器的数据保持同步。
推荐用rsync做全量+增量同步,数据库用主从复制或定期导出导入。
网站文件同步
在旧服务器上执行以下命令,将网站目录同步到新服务器(假设网站目录为/www/wwwroot/example.com):
rsync -avz --delete /www/wwwroot/example.com/ root@新服务器IP:/www/wwwroot/example.com/
第一次全量同步后,每隔几分钟再执行一次,或使用--exclude排除缓存目录。
如果文件量很大,可以先用tar打包再传输,但rsync更灵活。
数据库同步
如果数据库不大,可以定期导出导入:
mysqldump -u root -p --all-databases > /tmp/all.sql
scp /tmp/all.sql root@新服务器IP:/tmp/
然后在新服务器导入:
mysql -u root -p < /tmp/all.sql
迁移期间旧服务器数据库仍在写入,所以切换前需要再导出一次增量。
更稳妥的方式是配置MySQL主从复制,但配置较复杂,新手可先用导出导入+短暂只读。
流量切换与DNS解析调整
当数据同步到接近实时后,选择一个访问量低的时段进行切换。
- 在旧服务器上暂时将网站设为维护模式或只读,防止新数据写入。
- 再次执行一次rsync同步文件和数据库导出导入,确保数据完全一致。
- 修改DNS解析,将域名A记录指向新服务器IP。如果使用CDN,则在CDN控制台修改回源地址。
- 等待DNS生效(根据TTL,通常几分钟到几小时)。可以用
dig 域名或在线工具检查解析是否生效。
关键点:DNS切换后,部分用户可能仍访问旧服务器,所以旧服务器不能立即关闭,应保持运行至少一个TTL周期。
验证与回滚准备
切换完成后,立即验证新服务器上的网站是否正常:
- 访问首页、内页、登录、支付等关键功能。
- 检查数据库连接、图片加载、SSL证书是否生效。
- 查看新服务器日志,确认没有大量报错。
如果发现严重问题,快速回滚:将DNS改回旧服务器IP,并恢复旧服务器对外服务。
因此,在迁移后至少24小时内,旧服务器应保持可随时启用状态。
常见问题与避坑指南
问题1:迁移后部分用户看到旧内容?
这是因为DNS缓存。可以告知用户刷新DNS,或等待TTL过期。如果用了CDN,记得刷新CDN缓存。
问题2:数据库同步时出现主键冲突?
如果新旧服务器都有写入,可能产生冲突。建议在切换前将旧服务器设为只读,或使用主从复制并设置新服务器为从库。
问题3:SSL证书需要重新申请吗?
不需要,直接把旧服务器的证书文件复制到新服务器相同路径即可,但注意证书绑定的域名必须一致。
避坑:不要在新服务器上直接修改代码,迁移期间任何修改都可能导致两边不一致。
所有变更应在迁移完成后进行。
迁移后的收尾工作
确认新服务器稳定运行一周后,可以逐步下线旧服务器。
先停止旧服务器的Web服务,观察几天,确认无异常后再释放资源。
同时更新监控和备份策略,将新服务器纳入日常运维。
整个迁移过程的核心是数据同步和流量切换两个环节,只要保证数据一致、切换平滑,网站就能实现不停机搬迁。