刺激的突发事件
在某个论坛买的年付便宜 VPS 突然收到发卡商的群发邮件,说由于上游机房问题,服务器可能在 48 小时后断网清退。机器上还挂着我好几个在跑的数据采集项目,大概有 100G 的碎文件。
如果用 scp 或者 sftp 慢慢拖,这破线路的速度估计传完机器都停机了。必须上增量同步神器:rsync。
为什么 rsync 这么神? 它在同步前会自动比对文件的修改时间和大小,只传输不一样的那部分。而且支持断点续传和保留文件的原始权限(这在迁移 Web 目录时极其重要,不然迁移过去全报 403 权限错误)。
实战迁移命令 在新服务器上,直接拉取旧服务器的数据:
1# 加上 -a 参数保留权限,-v 显示进度,-z 压缩传输
2# -e "ssh -p 2222" 指定自定义的 SSH 端口
3rsync -avz -e "ssh -p 22" root@旧服务器IP:/var/www/html/ /var/www/html_new/
遇到的巨坑:大量小文件导致内存 OOM
传输到一半的时候,连接突然断开,报错 connection unexpectedly closed。
一查发现,因为我某个目录里存了几百万张 KB 级别的图片,rsync 在构建文件列表时把那台小机器的 512M 内存直接吃光被系统杀了。
解决办法:不去跑全目录比对,写了个简单的 Shell 脚本,把目录遍历出来,挨个文件夹执行同步,并且加上了 --delete 参数保证两边文件绝对一致。
一晚上的折腾,赶在停机前 2 小时把环境无缝切过来了,DNS 甚至都没断流。