跳到主要内容

使用rsync进行服务器间数据同步

阅读需 6 分钟

记录一次将 Ubuntu 服务器 /data 目录(约 25.3T)通过 rsync 迁移至麒麟服务器的完整过程,供有类似需求的朋友参考。


环境信息

项目源服务器目标服务器
IP60.214.100.8060.214.97.69
系统UbuntuKylin Server V10 SP3
SSH 端口22221
数据目录/data(26T)/data(40T 可用)
rsync 版本3.1.23.1.3

一、为什么选择 rsync

  • 断点续传:中断后重新执行,自动跳过已传输文件
  • 增量同步:只传差异部分,不重复传输
  • 保留属性:权限、时间戳、软链接等完整保留
  • 跨平台:Ubuntu ↔ 麒麟(CentOS 系)完全兼容

二、安装 rsync

Ubuntu(源服务器)

# 先检查是否已安装
rsync --version

# 未安装则执行
apt update && apt install -y rsync

麒麟 Kylin Server(目标服务器)

麒麟是基于 RHEL/CentOS 的系列,使用 dnfyum

# 优先使用 dnf
dnf install -y rsync

# 或使用 yum
yum install -y rsync

两端版本小版本差异(如 3.1.2 vs 3.1.3)完全没问题,不影响传输。


三、配置 SSH 免密登录

由于传输时间较长(预计数天),配置免密登录避免人工干预。

1. 在源服务器生成密钥对

ssh-keygen -t rsa -b 4096 -C "rsync-transfer" -f ~/.ssh/id_rsa_rsync

提示输入 passphrase 时,直接按两次回车(不设密码),否则后台传输会中断。

2. 推送公钥到目标服务器

目标服务器 SSH 使用非标准端口 221,需加 -p 221

ssh-copy-id -i ~/.ssh/id_rsa_rsync.pub -p 221 root@60.214.97.69

执行过程中会出现:

The authenticity of host '[60.214.97.69]:221' can't be established.
Are you sure you want to continue connecting (yes/no)?

输入 yes 回车,再输入目标服务器密码即可。

3. 验证免密登录

ssh -i ~/.ssh/id_rsa_rsync -p 221 root@60.214.97.69

能直接登录(不提示密码)即为成功。

4. 配置 SSH config(简化后续命令)

cat >> ~/.ssh/config << 'EOF'
Host target-server
HostName 60.214.97.69
Port 221
User root
IdentityFile ~/.ssh/id_rsa_rsync
Compression no
EOF

chmod 600 ~/.ssh/config

配置后可直接用 ssh target-server 登录,rsync 命令也大幅简化。


四、预检(dry-run)

正式传输前务必预演,只模拟不实际传输:

rsync -avzn \
--stats \
--progress \
/data/ \
target-server:/data/

预演结果分析

Number of files: 190,061 (reg: 179,683, dir: 10,378)
Number of created files: 190,060
Total file size: 27,853,730,829,438 bytes # 约 25.3T
rsync error: some files/attrs were not transferred (code 23)

看到 code 23 说明有部分文件权限不足,需要排查:

rsync -avzn --stats /data/ target-server:/data/ \
2>&1 | grep -E "^rsync:|failed|permission"

输出结果:

rsync: opendir "/data/.Recycle_bin" failed: Permission denied (13)

检查该目录:

sudo du -sh /data/.Recycle_bin   # 输出:0
sudo ls -la /data/.Recycle_bin # 空目录

确认是空的回收站目录,传输时直接排除即可。


五、正式传输

启动后台传输

nohup rsync -avz \
--progress \
--partial \
--partial-dir=/data/.rsync-partial \
--stats \
--human-readable \
--exclude='.Recycle_bin' \
--log-file=/home/xfzd123/rsync-transfer.log \
/data/ \
target-server:/data/ \
> /home/xfzd123/rsync-output.log 2>&1 &

echo $! > /tmp/rsync.pid
cat /tmp/rsync.pid

关键参数说明

参数作用
-a归档模式,保留所有文件属性
-v详细输出
-z压缩传输,节省带宽
--partial支持断点续传
--partial-dir未完成文件单独存放,不污染目标目录
--exclude排除指定目录
--log-file记录完整传输日志
nohup + &后台运行,关闭终端不中断

⚠️ 注意日志路径:普通用户没有 /var/log/ 的写权限,应改用 ~/ 目录。


六、监控传输进度

查看实时日志

tail -f /home/xfzd123/rsync-output.log

确认进程存活

ps aux | grep rsync

查看目标服务器数据增长

# 单次查询
ssh target-server "du -sh /data"

# 循环查询(每 30 秒一次)
ssh target-server "while true; do du -sh /data; sleep 30; done"

⚠️ 不要在 SSH 非交互模式下使用 watch 命令,会报 Error opening terminal: unknown

实际传输日志示例

20180614/AVI/video.AVI
998.14M 100% 11.60MB/s 0:01:22 (xfr#3, ir-chk=1928/3455)

七、关于中途关机

由于使用了 nohup + &,传输完全在服务器后台运行:

  • ✅ 可以关闭 SSH 窗口
  • ✅ 可以关闭本地电脑
  • ✅ 网络断开后重连不影响
  • 不能关闭源服务器(进程运行在源服务器上)

重新连接后查看进度:

ps aux | grep rsync
tail -f /home/xfzd123/rsync-output.log

八、断点续传

如果传输意外中断,直接重新执行相同命令即可:

nohup rsync -avz \
--progress \
--partial \
--partial-dir=/data/.rsync-partial \
--exclude='.Recycle_bin' \
--log-file=/home/xfzd123/rsync-transfer.log \
/data/ \
target-server:/data/ \
> /home/xfzd123/rsync-output.log 2>&1 &

rsync 会自动跳过已传输的文件,从断点继续。


九、传输完成后校验

对比文件数量

# 源服务器
find /data -type f | wc -l

# 目标服务器
ssh target-server "find /data -type f | wc -l"

对比目录大小

du -sh /data
ssh target-server "du -sh /data"

用 rsync 做最终比对

rsync -avzn \
--checksum \
--stats \
/data/ \
target-server:/data/

输出显示 Number of regular files transferred: 0 即表示两端完全一致 ✅


十、耗时预估参考

网络带宽25T 预计耗时
100 Mbps约 25 天
1 Gbps约 60 小时
10 Gbps约 6 小时

实际耗时受文件数量、磁盘 I/O、网络质量影响,文件数量多(本次近 18 万个)会比纯带宽计算慢一些。


十一、踩坑记录

  1. 用户名拼写错误ssh-copy-id 时把 root 写成了 rootr,导致公钥推送到错误用户,免密登录失败。解决:重新用正确用户名推送一次公钥。

  2. 日志路径权限不足:将日志写入 /var/log/ 时报 Permission denied,普通用户无写权限。解决:改为写入 ~/ 目录。

  3. watch 命令在 SSH 非交互模式报错Error opening terminal: unknown。解决:改用 while 循环替代。

  4. passphrase 设置了密码:后台 rsync 执行时无法自动输入密码导致中断。解决:生成密钥时 passphrase 留空。


总结

rsync 是大规模文件迁移的最佳选择,配合 nohup 后台运行、--partial 断点续传、SSH config 简化配置,整个流程稳定可靠。跨系统(Ubuntu ↔ 麒麟)、非标准 SSH 端口均无障碍支持。

最核心的几个注意点:

  • 密钥生成时不要设 passphrase
  • 日志路径要有写权限
  • 源服务器不能关机
  • 传输完成后一定要做校验
Loading Comments...