跨云厂商服务器迁移指南:从 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 天。如果发现严重问题,回滚步骤:

  1. DNS 记录切回旧服务器 IP
  2. 确认旧服务器上的服务正常运行
  3. 排查差异并重新准备迁移
  4. 选择低峰时段再次迁移

六、常见云厂商迁移场景

阿里云 → 腾讯云

  • 注意:内网 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/

七、总结

跨云迁移是一项需要精细规划的工作。成功的关键在于充分的准备和验证。建议在低峰时段执行迁移,并在切换前进行完整的预演。大多数迁移问题都源于忽略环境差异和未做充分测试。保留旧环境和完整备份,是迁移过程中最重要的安全网。