1.
迁移前准备与风险评估
- 确认当前业务峰值时间窗口,选择低峰期操作时间并提前通知相关人员。
- 列表化:应用版本、依赖(语言、库)、端口、证书、计划任务、日志路径、数据库版本及数据量。
- 评估网络带宽(出/入流量)、目标轻量实例规格(CPU/内存/磁盘)是否能满足负载,必要时提前升级或预留弹性伸缩策略。
- 将 DNS TTL 调低到 60 秒或更短(建议提前 24-48 小时设置),并确认域名提供商支持短 TTL。
2.
创建并配置目标轻量服务器
- 在阿里云控制台选择“轻量应用服务器(Singapore)”新建实例,选择相同或更高的操作系统镜像与节点规格。
- 配置安全组规则:开放必要端口(80/443/22/3306/应用端口),并设置来源 IP 白名单(临时运维使用)。
- 配置 SSH 密钥或密码登录,创建与源服务器相同的系统用户、用户组及目录权限(www-data 或自定义)。
- 安装基础依赖:示例(Debian/Ubuntu)sudo apt update && sudo apt install -y nginx mysql-client rsync tar git。
3.
代码与静态文件初次同步
- 推荐使用 rsync 做初次全量同步(减少中间态差异):在目标机执行接收命令前,先在源机安装并允许 SSH 登录。
- 示例命令(在目标机上拉取源数据):rsync -azP --delete --exclude='tmp/' --exclude='cache/' user@源IP:/var/www/ /var/www/。
- 验证文件权限、符号链接、crontab、systemd 服务文件已经在目标机上正确配置并可启动(但暂不启动生产进程)。
4.
数据库迁移策略选择(推荐零宕机方法)
- 对于 MySQL 类数据库,推荐使用主从复制:在目标机上部署 MySQL(版本应与源接近),在源上创建复制账号:CREATE USER 'repl'@'目标IP' IDENTIFIED BY 'pwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'目标IP';。
- 在源上执行 FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 记录 File/Position。随后在目标上执行 CHANGE MASTER TO MASTER_HOST='源IP', MASTER_USER='repl', MASTER_PASSWORD='pwd', MASTER_LOG_FILE='文件', MASTER_LOG_POS=位置; START SLAVE;。
- 验证 SHOW SLAVE STATUS\G 中 Seconds_Behind_Master 接近 0。复制稳定后可以持续异步同步写入,达到零宕机切换。
5.
实时文件变更同步(增量同步)
- 初次 rsync 后使用增量工具保持文件同步:可用 rsync 的定时任务或 lsyncd(基于 inotify)实现近实时同步。
- lsyncd 简单配置:安装 lsyncd,配置 /etc/lsyncd/lsyncd.conf.lua 指向 /var/www 到目标机,通过 SSH key 免密登录。
- 保持同步窗口至少 1 小时,观察同步延迟,确保静态文件与上传文件在切换时一致。
6.
会话与缓存处理(避免用户丢失)
- 如果使用本地会话(文件或本地 Redis),推荐将会话迁移到分布式存储(Redis/Aurora/数据库),或者在切换时把旧实例的会话数据导出/同步。
- 对于 Memcached/Redis,可开启主从复制或使用阿里云 Redis 代替轻量内置实例,保证切换后会话仍有效。
- 对于上传文件(头像/附件),确保目标机与源机共享同一对象存储(OSS),或在切换前完成 OSS 同步并将应用指向 OSS。
7.
最终切换(切换窗口内的零宕机步骤)
- 切换前 60-120 秒:把业务设置为只读或在应用层临时禁止写操作(如果可行)。
- 最后一次增量 rsync:rsync -azP --delete user@源:/var/www/ /var/www/。
- 对数据库:在源上执行 FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 记录位置;在目标上执行 STOP SLAVE; CHANGE MASTER TO ... 根据最新 File/Pos;START SLAVE; PROMOTE(如果使用双向或需提升为主库)并确保主从同步完毕。
- DNS 切换:修改域名 A 记录指向目标轻量实例公网 IP(或解绑/绑定弹性公网IP)。由于已将 TTL 设低,生效时间应在数十秒内。并持续监控访问和错误日志。
8.
健康检查与回滚验证
- 切换后立即验证:站点可访问性、API 响应、写入能力、数据库主从状态、队列消费情况。
- 监控日志(nginx/access.log、error.log、应用日志)和应用性能指标(响应时间、错误率)。
- 回滚方案:若发现严重故障,立即把 DNS 指回源 IP,或解绑/绑定弹性公网 IP 回源机;如果使用只读标记,解除只读并继续在原环境运行,审查问题后再重试迁移。
9.
迁移后清理与优化
- 迁移稳定 24-48 小时后,清理源服务器临时标识、减少权限、关闭不再使用的服务。
- 将 DNS TTL 恢复到原值,记录迁移过程中的所有变更作为文档。
- 做一次完整快照(阿里云轻量应用服务器支持快照),并计划周期性备份与备灾演练。
10.
问:如何保证数据库在切换时零数据丢失?
11.
答:通过主从复制+最后一致性检查实现零丢失
- 使用 MySQL 主从复制,确保 Seconds_Behind_Master 为 0 后再切换;在最终窗口执行 FLUSH TABLES WITH READ LOCK 并记录 Master 状态,完成最后一次二进制日志定位和同步。若需要强一致,可在目标上执行校验(如 pt-table-checksum 或对比行数/校验和)。
12.
问:DNS 切换无法立即生效怎么办?
13.
答:使用弹性公网 IP 或负载均衡作为替代并预设低 TTL
- 如果 DNS 生效慢,预先准备弹性公网 IP(EIP)或阿里云负载均衡,将 EIP 解绑绑定可实现快速切换;同时迁移前 24-48 小时把 TTL 降至 60s,减少缓存影响。
14.
问:如何验证迁移是否完全成功与回滚条件是什么?
15.
答:验证指标与明确回滚触发条件
- 验证点:页面/接口响应正常、错误率回落到基线、数据库读写正常、队列消费无积压、监控无异常告警。回滚触发条件:关键接口错误率持续高于阈值(如 >5%)、主库写入失败、数据不一致或流量大幅下降。明确回滚负责人和操作步骤,保证能在预定时间内恢复到旧环境。
来源:阿里云新加坡轻量服务器迁移方案详解零宕机切换步骤解析