跨云厂商服务器迁移指南:从 A 厂商搬到 B 厂商的完整流程
换云厂商在实际运营中很常见——可能是价格因素、性能需求变化,或者被某家厂商的促销吸引。但迁移过程如果操作不当,可能导致网站长时间宕机甚至数据丢失。本文提供一套标准的迁移流程。
一、迁移前的准备
1.1 评估新旧环境差异
在做任何操作前,先对比新旧厂商的差异:
| 评估项 | 检查内容 |
|---|---|
| 操作系统版本 | Ubuntu 22.04 vs 24.04、CentOS 7 vs Rocky Linux 9 |
| 软件栈版本 | PHP/Node.js/Python/Java 版本是否一致 |
| 数据库版本 | MySQL/PostgreSQL 版本兼容性 |
| 系统架构 | x86 vs ARM(换架构可能需要重新编译应用) |
| 网络规划 | VPC 网段、子网划分、安全组规则 |
| 特殊服务 | 是否有使用厂商的托管服务(RDS、Redis、OSS 等) |
1.2 创建迁移清单
□ 列出所有服务器清单
□ 记录当前配置(CPU/内存/磁盘/带宽)
□ 导出安全组/防火墙规则
□ 收集数据库连接信息
□ 记录定时任务(crontab)
□ 备份 SSL 证书和私钥
□ 导出 DNS 记录
□ 整理环境变量和配置文件
1.3 规划迁移时间线
把迁移拆成可以回退的阶段,比"一次性搬完"安全得多。一个 3-7 天的典型时间线:
| 时间 | 任务 | 可回退? |
|---|---|---|
| T-7 天 | 盘点资产、评估差异、写迁移清单 | 是 |
| T-6 ~ T-2 天 | 新环境搭建、全量数据同步、功能预演 | 是 |
| T-1 天 | 降低 DNS TTL、最后一次增量同步 | 是 |
| T 日 | 低峰时段切换 DNS、灰度验证 | 切换后可回滚 |
| T+1 ~ T+7 天 | 监控、观察、稳定后下线旧机 | 保留旧机作备份 |
尽量把"切换"放在凌晨或周末等低峰时段,并提前通知相关同事,避免切换期间有人正在跑批任务。
二、数据迁移
2.1 文件迁移
使用 rsync 是最安全高效的方式:
# 全量同步
rsync -avz --progress /var/www/ user@new-server:/var/www/
# 增量同步(切换前最后同步一次)
rsync -avz --delete --progress /var/www/ user@new-server:/var/www/
2.2 数据库迁移
# 源服务器导出
mysqldump -u root -p --single-transaction --quick --all-databases > all-dbs.sql
# 导入到目标服务器
mysql -u root -p < all-dbs.sql
# 或使用管道直传
mysqldump -u root -p --single-transaction --all-databases | ssh user@new-server "mysql -u root -p"
2.3 配置迁移
复制以下配置文件到新服务器:
- Nginx/Apache 配置文件
- PHP-FPM 配置
- Redis/Memcached 配置
- Supervisor 进程管理配置
- 环境变量(.env 文件)
2.4 对象存储与增量同步
网站图片、附件如果存在 OSS/COS/S3 等对象存储,用 rclone 做增量同步比逐个下载再上传可靠得多:
# 阿里云 OSS -> 腾讯云 COS(rclone 配置好两端 remote 后)
rclone copy aliyun:my-bucket tencent:my-bucket --progress --checksum
# 只同步过去 7 天新增的文件
rclone copy aliyun:my-bucket tencent:my-bucket --max-age 168h
文件系统的最终同步建议在切换窗口内用 rsync -avz --delete 再跑一遍,并用 -c(checksum)按内容校验而非仅看时间戳;数据库则可以用 --single-transaction 加 --master-data=2 导出一致快照,切换前再补一次增量,避免"丢最后几分钟数据"。
2.5 数据校验
迁移后别急着切换,先在目标库上做一致性抽查:
# 对比表数量
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables;"
# 抽查几张核心表行数
mysql -u root -p -e "SELECT COUNT(*) FROM orders; SELECT COUNT(*) FROM users;"
# 文件数量与大小对比(先 dry-run)
rsync -avz --delete --dry-run /var/www/ user@new-server:/var/www/ | tail -5
三、环境重建
3.1 快速重建方法
方法一:手动安装(推荐)
在新服务器上重新安装软件栈,这样可以确保版本最新且配置干净:
# Ubuntu/Debian
apt update && apt install nginx mysql-server php-fpm redis-server
# 然后复制配置文件
scp old-server:/etc/nginx/sites-enabled/* /etc/nginx/sites-enabled/
方法二:配置管理工具
如果使用了 Ansible、Puppet 或 SaltStack,只需在新服务器上运行 Playbook 即可。
方法三:容器化
如果应用已容器化(Docker),迁移最简单——只需在新的服务器上运行 docker-compose up -d。
3.2 数据验证
迁移完成后,在新服务器上验证:
# 检查服务状态
systemctl status nginx mysql php8.1-fpm
# 检查数据库数据
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables;"
# 测试网站功能
curl -I http://localhost/
四、DNS 切换
4.1 降低 TTL
迁移前 48 小时将 DNS TTL 降至 300 秒(5 分钟),加速切换后的生效速度:
www.example.com. 300 IN A 123.456.789.0
4.2 切换 DNS
在域名注册商处将 A/AAAA/CNAME 记录指向新服务器 IP。
4.3 切换后的监控
切换后持续监控 24-48 小时:
# 检查 DNS 解析是否已更新
dig example.com +short
# 监测网站响应时间
curl -o /dev/null -s -w "HTTP %{http_code}, Time: %{time_total}s\n" https://example.com/
# 检查 SSL 证书
openssl s_client -connect example.com:443 -servername example.com
五、回滚计划
迁移完成后保留旧服务器至少 7 天。如果发现严重问题,回滚步骤:
- DNS 记录切回旧服务器 IP
- 确认旧服务器上的服务正常运行
- 排查差异并重新准备迁移
- 选择低峰时段再次迁移
六、常见云厂商迁移场景
阿里云 → 腾讯云
- 注意:内网 IP 会变化,检查配置文件中是否有写死的 IP
- 阿里云 RDS 用户需要先导出数据到本地,再导入腾讯云 CDB
- OSS 文件需要通过
ossutil下载到本地再上传到 COS
国内云 → 海外 VPS
- 注意:跨境网络延迟和带宽限制
- 使用国内中转服务器加速数据传输
- ICP 备案问题:海外服务器无需备案
传统 IDC → 云服务器
- 物理服务器需要先虚拟化或打包环境
- 评估迁移后的架构设计(是否需要拆分服务)
常见坑位与排错
下面这些是迁移里最常踩的坑,提前排查能省大量时间:
- 配置里写死 IP:数据库连接、白名单、回调地址里残留旧内网 IP,用
grep -rn "<旧IP>" /etc /app扫一遍; - 时区与字符集不一致:数据库默认时区、
utf8mb4字符集没对齐,中文乱码或时间差 8 小时; - 安全组/防火墙漏配:新机没放行 3306/6379 等端口,服务"看起来正常"却连不上;
- 缓存与队列数据:Redis 里的 Session、待处理任务不迁移,用户登录态和后台任务会丢;
- SSL 证书与密钥未同步:只迁了站点没迁证书目录,切换后 HTTPS 报错。
参考:rsync 手册 https://man7.org/linux/man-pages/man1/rsync.1.html、mysqldump 文档 https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html、rclone 文档 https://rclone.org/docs/
七、总结
跨云迁移是一项需要精细规划的工作。成功的关键在于充分的准备和验证。建议在低峰时段执行迁移,并在切换前进行完整的预演。大多数迁移问题都源于忽略环境差异和未做充分测试。保留旧环境和完整备份,是迁移过程中最重要的安全网。