1.
迁移前的总体规划与风险评估
- 确定迁移窗口:选择业务低峰期;准备沟通通知、回滚计划和快照。
- 评估数据量:网站文件大小、数据库大小、附件和异步任务队列。
- 决定迁移方式:全量停机、rsync+最终切换、或主从复制(MySQL replication)实现零停机。根据流量与可接受停机时间选择。
2.
- 选提供商(例:Viettel IDC、VNET、云服务商如AWS ap-southeast-1/SG近越南或本地机房)。
- 带宽与网络优化:选择至少与当前站点相当的带宽与峰值bps;支持IPv4/IPv6。
- 确认线路延迟与PPS,必要时申请弹性公网IP或浮动IP以便切换。
3.
DNS策略与提前设置(关键步骤)
- 在迁移前48-72小时将涉及域名的TTL调低到300秒(或更低),例如在域名注册商或DNS服务修改。
- 在新VPS上预配置站点,先不改DNS,使用临时域名或hosts文件测试。
- 准备好新IP的A/AAAA记录、必要的子域和MX、TXT(SPF)记录;切换时只改A记录最小化改动。
4.
在新VPS上搭建基础环境
- 更新系统并安装常用工具:apt update && apt upgrade;apt install nginx php-fpm mariadb-client git unzip rsync certbot -y。
- 配置防火墙(ufw allow 22,80,443; ufw enable),禁用默认弱口令,并设置SSH密钥认证与非标准端口。
- 创建部署用户,设置磁盘分区和挂载(对大附件建议独立分区或LVM)。
5.
应用与依赖部署
- 将代码clone到/var/www/yourshop,安装依赖(PHP: composer install;Node: npm ci & build)。
- 配置环境变量(.env)指向新数据库或占位符;不要在此阶段启用生产数据库写入。
- 配置缓存(Redis/ memcached)、队列(RabbitMQ/Redis),确保服务能启动。
6.
静态文件与媒体文件的初次同步(rsync)
- 首次全量同步:在源服务器执行rsync到目标(或反向拉取):rsync -avz --delete /path/to/uploads/ user@new-ip:/var/www/yourshop/public/uploads/。
- 使用 --bwlimit= 参数在高峰期控制带宽。完成后再次运行增量同步,直至接近切换时间。
7.
数据库迁移策略
- 小型站点可用 mysqldump:mysqldump --single-transaction --quick --routines -u root -p dbname > dump.sql,然后在新VPS导入 mysql -u root -p dbname < dump.sql。
- 大型或需零停机:搭建临时MySQL主从(源为主new为从),在新VPS配置作为从后让数据复制完成,切换写入点时把新VPS提升为主。使用 --master-data=2 导出,或配置GTID。
- 对于InnoDB表,优先使用 --single-transaction;对大表考虑使用Percona XtraBackup进行热备份恢复。
8.
实时同步与最终一致性方案
- 推荐做两轮rsync:第一次在迁移前进行全量,第二次在切换前执行短时间差的增量,最后停止应用写入后做一次快速db dump导入或使用binlog增量。
- 若使用mysql replication,切换步骤:停止源写入(maintenance mode)、确认binlog同步到latest,设置新server为master并把应用指向新IP。
9.
SSL证书与HTTPS处理
- 推荐使用Let’s Encrypt。若切换DNS后再申请可用HTTP挑战:certbot certonly --nginx -d example.com。
- 若需提前申请证书,使用DNS-01挑战(需要能修改域名的DNS TXT记录),例如使用acme-dns或域名解析商API。
- 配置nginx强制HTTPS、HSTS并测试证书链:openssl s_client -connect new-ip:443 -servername example.com。
10.
配置Web服务器与性能优化
- nginx示例server块:监听80/443,root指向public目录;配置fastcgi_pass到php-fpm。
- 调整php-fpm的pm.max_children, pm.start_servers等以适应内存。开启gzip、静态文件缓存和适当的expires头。
- 如使用CDN,提前更新回源到新IP或使用CNAME指向域名,避免每次切换都改CDN配置。
11.
测试步骤清单(切换前)
- 使用hosts文件指向新IP进行完整功能测试(登录、下单、支付回调、文件上传/下载、队列处理)。
- 验证数据库数据一致性(行数、常用表检查)、日志没有错误,检查外部依赖(第三方API回调IP白名单)。
- 性能压测(轻量):ab或wrk做并发测试,确保响应在可接受范围。
12.
切换DNS与监控
- 切换步骤:在预定时间将域名A记录指向新VPS IP(TTL已提前调低),确认正确后观察DNS传播(使用dig +trace或whatsmydns)。
- 切换后保持实时监控:nginx logs, app logs, mysql error log;使用curl -I 验证返回头、监控订单/支付流程是否正常。
13.
回滚与应急方案
- 回滚最简单:将DNS A记录改回旧IP(TTL短的情况下几分钟生效);同时恢复旧数据库为可写状态。
- 保留旧VPS快照和数据库备份24小时或更久;确保旧服务在切换后至少短时间内仍可上报和接受连接。
14.
迁移完成后的收尾工作
- 将TTL恢复到原值(例如3600或更高)。清理临时迁移脚本与权限,删除不再需要的快照。
- 更新运维文档:新IP、监控项、备份策略(建议每日数据库备份并异地存储)。
15.
常见问题与优化建议
- 若支付回调失败,确认回调URL解析到新IP且防火墙放通入口IP;若第三方有IP白名单,提前添加新IP。
- 对于大附件库,考虑使用对象存储(S3或本地兼容S3)以减少迁移复杂度;以后只需更改回源配置即可。
16.
问:迁移要多长停机时间?
答:取决于策略:全量停机(停写)模式通常在数据库导入与DNS传播阶段需要几十分钟到几小时;采用主从复制或双向同步可把停机时间降到几分钟(只在最终DNS切换或提升主库时短暂停写)。提前降TTL和预同步文件能显著缩短切换窗口。
17.
问:如何保证迁移后支付与第三方回调正常?
答:提前通知支付方并在其管理后台更新回调URL/IP或白名单;在切换前使用hosts绕过DNS做回调测试;切换后立即验证一次真实支付流程并查看回调日志,若失败可临时回滚DNS。
18.
问:最实用的零停机迁移组合是什么?
答:常见且实用的组合是:先用rsync做文件全量与增量同步,使用MySQL主从复制保持数据实时同步;在切换窗口将应用置为只读、执行最后一次binlog或dump差量,提升新从为主并修改DNS。这个方案在大多数中大型电商场景可实现几分钟内切换并保证数据一致。
来源:越南vps 电商站点迁移实操步骤从DNS到数据同步全流程