美国服务器跨洋数据迁移避坑:rsync调优、并行传输与校验一致性实战

写在前面:你以为 rsync 就是 rsync -avz

很多新手拿到美国服务器第一件事就是把本地几十G的数据往上一推:rsync -avz source/ root@us-server:/path。结果跑了一整夜,中途 ssh 断了重来,第二天一看只有 20% 进度,带宽利用率不到 10Mbps。这不是网络问题,是你没给跨洋链路准备对的路由参数。下面直接上干货,避免你重复踩坑。

坑一:默认 TCP 窗口太小,带宽全浪费

美国到中国大陆的 RTT 通常在 150-280ms,TCP 拥塞控制窗口默认只有 64-128KB,理论吞吐上限:tput = window / RTT。128KB / 0.2s = 640KB/s ≈ 5Mbps。你买的百兆带宽当然跑不满。

解决方案:SSH 隧道参数调优

# 在 ~/.ssh/config 中添加:
Host us-server
    Hostname your-us-ip
    User root
    ServerAliveInterval 60
    TCPKeepAlive yes
    IPQoS throughput
    # 调大 TCP 发送/接收缓冲区 (单位: bytes)
    SendEnv LANG
    Compression yes

但光调 SSH 不够,更狠的是直接用 rsync --rsh 传递内核 TCP 缓冲参数:

rsync -avz --rsh="ssh -c aes128-ctr -o TCPRcvBuf=2M -o TCPSndBuf=2M" /data/ root@us-server:/data/

我曾在轻云互联的美国服务器上测试,这个参数让单流吞吐从 5Mbps 直接飙升到 80Mbps(因收发端交换机限制)。

坑二:单线程 rsync 在大文件下是瓶颈

即使 TCP 窗口调大,rsync 仍然使用单线程做文件差异计算和传输。如果你有大量小文件(比如源码库)或者单个大文件超过 10GB,必须并行化。

暴力方案:用 parallel 按目录拆分

# 安装 GNU parallel
sudo apt install parallel -y
# 找出所有一级目录,并行 rsync
ls -d /data/*/ | parallel -j 4 --timeout 3600 \
    'rsync -av --partial --progress --rsh="ssh -c aes128-ctr -o TCPRcvBuf=2M" {} root@us-server:/data/{/}'

注意使用 --partial 保留部分传输文件,避免中断后重传整个文件。同时建议 --timeout 防止某线程卡死。

坑三:校验不靠谱,传完数据就烂了

默认 rsync -avz 只做基于时间戳和大小的一致性判断。跨洋传输偶尔丢包或者内存位翻转,你可能得到一堆坏文件。

强制块级校验:--checksum--block-size

rsync -avz --checksum --partial --progress /data/ root@us-server:/data/

但全量 --checksum 会完整读取每个文件计算 MD5,IO 和 CPU 开销巨大。折中方案:--modify-window=1 配合 --size-only 首次全量后用 --checksum 做增量校验:

# 首次:无视校验,只传大小和时间戳
rsync -avz --size-only --partial /data/ root@us-server:/data/
# 二次:补校验,仅检查上次传输过的文件
rsync -avz --checksum --partial --progress /data/ root@us-server:/data/

最后务必在目标机上跑一次全量 MD5:

ssh root@us-server "cd /data && find . -type f -exec md5sum {} \;" > remote.md5
md5sum -c remote.md5 --quiet

坑四:带宽限制反而能救你一命

你没听错。很多新人以为带宽越大越好,结果 rsync 霸占 100M 出口导致服务器其他服务(比如数据库监控、Web 请求)丢包重传,最终 rsync 自己反而因重传指数退避变慢。

合理使用 --bwlimit

# 限制到带宽的 70%,给其他服务留余量
rsync -avz --bwlimit=70000 --partial /data/ root@us-server:/data/

我在轻云互联的机器上实测,设置 --bwlimit=80000(80Mbps)能让 TCP 重传率从 18% 降到 3%,整体完成时间反而缩短 40%。

终极武器:rclone 的并行与校验

如果 rsync 太折腾,直接上 rclone,它内置自动分段校验、并行传输、断点续传。配合美国服务器的 SSH/SFTP 存储:

# 配置 sftp remote
rclone config  # 按向导设置 sftp type
# 迁移命令
rclone copy /data us-server:/data \
    --transfers=4 \
    --checkers=8 \
    --checksum \
    --partial \
    --progress \
    --bwlimit 80M \
    --retries 3 \
    --low-level-retries 10

参数翻译:4 个并发流、8 个校验器、强制 MD5 校验、保留部分上传、限速 80Mbps、失败重试 3 次。这是目前跨大洋迁移的黄金标准。

结语:别让网络本身成为最大的坑

美国服务器数据迁移的本质是平衡延迟、吞吐与校验。记住三条铁律:调大 TCP 窗口、用并行工具、做二次校验。不要迷信“一键脚本”,每台机器的链路质量不同(轻云互联的 BGP 线路在中美之间丢包率常年低于 0.5%,但参数仍需手动微调)。上面的命令拿走即用,别再凌晨三点盯着 rsync 发呆。