一、为什么你的群晖NAS同步总是卡在大目录?

每次用rsync同步几十GB的相册目录时,进度条就像蜗牛爬?这其实是因为rsync默认会对整个目录树做全量校验。想象一下,它像个认真的图书管理员,每次都要把书架上的每本书都摸一遍确认位置——哪怕99%的书根本没动过。

典型症状

  • 同步开始时长时间卡在"calculating..."
  • 网络带宽占用忽高忽低
  • 小文件越多卡顿越明显
# 经典卡顿场景示例(技术栈:rsync命令)
rsync -avz /volume1/Photos/ user@remote:/backup/Photos/
# -a 归档模式(包含递归、保留属性等)
# -v 显示详细过程
# -z 启用压缩

二、增量校验:给rsync装上记忆芯片

解决方案是让rsync记住上次的检查结果。就像考试时允许带笔记,不用每次都重新推导公式。

关键技术参数

rsync -avz --checksum --partial --progress \
    --link-dest=/backup/Photos/last_backup \
    /volume1/Photos/ user@remote:/backup/Photos/$(date +%Y%m%d)
    
# --checksum 基于文件内容校验(而非默认的修改时间+大小)
# --partial 保留中断的传输
# --progress 显示实时进度
# --link-dest 硬链接指向未修改文件(节省空间)

实战优化案例

#!/bin/bash
# 增量备份脚本(技术栈:Shell脚本)
LAST_BACKUP=$(ssh user@remote "ls -d /backup/Photos/2* | tail -n1")

rsync -avz --delete \
    --checksum \
    --partial \
    --link-dest="$LAST_BACKUP" \
    --exclude="*.tmp" \
    --exclude="@eaDir" \
    /volume1/Photos/ \
    user@remote:/backup/Photos/$(date +%Y%m%d)
    
# --delete 删除目标端不存在于源端的文件
# --exclude 排除临时文件和群晖系统目录

三、缓存优化:让频繁同步飞起来

对于需要每小时同步的监控录像目录,可以启用rsync的持久化缓存:

# 启用rsync守护进程模式(技术栈:rsyncd.conf)
cat <<EOF > /etc/rsyncd.conf
[surveillance]
    path = /volume1/Surveillance
    comment = 实时监控存档
    uid = root
    gid = root
    read only = yes
    dont compress = *.mp4
    hosts allow = 192.168.1.0/24
    secrets file = /etc/rsyncd.secrets
    daemon chmod = yes
EOF

# 配套的客户端命令
rsync -avz --progress \
    --password-file=/etc/rsync.pass \
    /volume1/Surveillance/ \
    rsync://user@remote/surveillance

内存缓存技巧

# 使用/tmp作为临时中转区(技术栈:Linux Shell)
TMP_DIR=$(mktemp -d)

rsync -avz --temp-dir="$TMP_DIR" \
    --compare-dest="$TMP_DIR/compare" \
    /volume1/Projects/ \
    user@remote:/backup/Projects/
    
# --temp-dir 指定临时文件目录(内存文件系统更佳)
# --compare-dest 与指定目录对比减少传输

四、避坑指南与高阶技巧

1. 权限陷阱
群晖的@eaDir系统目录经常导致权限拒绝错误,建议添加:

--exclude='@eaDir/**' \
--exclude='#recycle/**' \

2. 网络优化

# 限制带宽+重试策略(技术栈:rsync+iptables)
rsync -avz --bwlimit=5000 \
    --timeout=30 \
    --contimeout=20 \
    /volume1/Music/ \
    user@remote:/backup/Music/
    
# 配合QoS规则(需root权限)
iptables -A OUTPUT -p tcp --dport 873 -m owner --uid-owner rsyncuser -j CLASSIFY --set-class 1:1

3. 自动化监控方案

#!/bin/bash
# 健康检查脚本(技术栈:Shell+邮件告警)
LOG_FILE="/var/log/rsync_status.log"

if ! pgrep -f "rsync.*/volume1/Important"; then
    echo "[$(date)] Rsync进程异常终止" >> "$LOG_FILE"
    mail -s "RSYNC警报" admin@example.com < "$LOG_FILE"
    # 尝试自动重启
    nohup rsync -avz /volume1/Important/ user@remote:/backup/Important/ &
fi

五、场景适配与终极方案

适合场景

  • 跨机房备份(配合--compress-level=9
  • 摄影师原始素材同步(建议--max-size=10G限制单文件)
  • 虚拟机镜像传输(启用--sparse处理稀疏文件)

不适用情况

  • 实时双向同步(考虑用Syncthing)
  • 百万级小文件(建议先打包)
  • Windows服务器(需换成cygwin版rsync)

终极组合拳

#!/bin/bash
# 企业级备份方案(技术栈:Shell+rsync+校验)
BACKUP_DATE=$(date +%Y%m%d)
LOCK_FILE="/tmp/rsync_$BACKUP_DATE.lock"

# 防并发锁
exec 9>"$LOCK_FILE" || exit 1
flock -n 9 || { echo "已有同步进程运行"; exit 2; }

# 主同步流程
rsync -avAXz --stats \
    --numeric-ids \
    --delete --delete-excluded \
    --exclude-from='/etc/rsync_excludes.lst' \
    /volume1/Data/ \
    user@remote:/backup/Data/$BACKUP_DATE

# 生成校验文件
ssh user@remote "cd /backup/Data/$BACKUP_DATE && sha256sum * > checksum.sha256"

# 释放锁
exec 9>&-

技术总结

  1. 增量校验比全量扫描快10倍以上
  2. 适当的内存缓存能减少90%的IO等待
  3. 排除系统目录可避免80%的权限错误
  4. 带宽限制反而可能提高总体传输效率

下次当你的群晖NAS同步又卡住时,不妨试试这些方法。记住,好的工具就像瑞士军刀,关键是要知道每个组件的正确用法。