第 6 章 - 数据同步
第 6 章 - 数据同步
6.1 同步模式概述
Rclone 提供多种同步模式,适用于不同场景:
| 模式 | 命令 | 方向 | 删除多余文件 | 适用场景 |
|---|---|---|---|---|
| 复制 | copy | 单向 | ❌ | 增量备份 |
| 同步 | sync | 单向 | ✅ | 镜像同步 |
| 移动 | move | 单向 | ❌ | 数据迁移 |
| 双向同步 | bisync | 双向 | ✅ | 多端协作 |
6.2 单向同步(sync)
基本原理
源端 (Source) 目标端 (Destination)
┌──────────┐ ┌──────────┐
│ a.txt ✓ │ ──── 同步 ────▶ │ a.txt ✓ │
│ b.txt ✓ │ ──── 同步 ────▶ │ b.txt ✓ │
│ c.txt ✓ │ ──── 同步 ────▶ │ c.txt ✓ │
└──────────┘ │ d.txt ✗ │ ← 被删除
└──────────┘
基本命令
# 同步本地目录到 S3
rclone sync /data/project/ s3:my-bucket/project/ --progress
# 同步 Google Drive 到 OneDrive
rclone sync gdrive:Documents/ onedrive:Documents/ --progress
# 同步到 NAS
rclone sync /home/user/ sftp-nas:/backup/user/ --progress
⚠️ sync 的关键提醒
# sync 会删除目标端不在源端的所有文件
# 这是单向镜像,方向性非常强
# 🔴 务必确认:
# 1. 源端路径正确(不要搞反)
# 2. 目标路径正确(不要同步到错误位置)
# 3. 先用 --dry-run 预览
rclone sync /data/ s3:backup/ --dry-run -v
6.3 增量传输
Rclone 的 sync 和 copy 都是增量传输,只传输有变化的文件。
判断文件是否需要传输
Rclone 使用以下策略判断文件是否需要更新(按优先级):
| 策略 | 参数 | 说明 | 适用场景 |
|---|---|---|---|
| 修改时间 + 大小 | 默认 | 比较 modtime 和 size | 大多数场景 |
| 校验和 | --checksum | 比较 hash 值 | 需要精确校验 |
| 仅大小 | --size-only | 只比较文件大小 | 时间戳不可靠时 |
| 仅修改时间 | --ignore-size | 只比较修改时间 | 文件大小可能变化但内容未变 |
使用校验和同步
# 使用校验和比较(更精确但更慢)
rclone sync src dst --checksum --progress
# 查看远程存储支持的哈希算法
rclone backend features s3:my-bucket/ | grep -A5 "Hashes"
更新模式
# 只传输更新的文件(源端修改时间比目标端新)
rclone sync src dst --update --progress
6.4 检查策略
传输前检查
# 检查源端和目标端的差异(不传输)
rclone check /data/ s3:my-backup/
# 输出示例:
# 2026/01/01 00:00:00 NOTICE: S3 bucket my-backup: 2 differences found
# ERROR : file1.txt: hash differ
# ERROR : new-file.txt: file not found in source
# JSON 格式输出差异
rclone check /data/ s3:my-backup/ --combined check-result.json
传输后校验
# 同步后自动校验
rclone sync /data/ s3:backup/ --check-first --progress
# --check-first 先检查再传输,提高安全性
下载校验
# 最严格:下载文件内容进行逐字节比较
rclone check /data/ s3:backup/ --download
6.5 删除策略
默认行为
# sync 默认删除目标端多余文件
rclone sync src dst
# 使用 --delete-before:传输前删除
rclone sync src dst --delete-before
# 使用 --delete-during:传输过程中删除(默认)
rclone sync src dst --delete-during
# 使用 --delete-after:传输完成后删除
rclone sync src dst --delete-after
保护特定文件
# 同步但不删除目标端的 .md 文件
rclone sync src dst --filter "- *.md" --delete-excluded
# 使用 --backup-dir 保留被删除的文件
rclone sync src dst --backup-dir s3:backup/removed/ --progress
# 被删除的文件会移动到 backup-dir,而不是直接删除
删除策略对比
| 策略 | 说明 | 安全性 | 速度 |
|---|---|---|---|
--delete-before | 先删后传 | 低 | 快 |
--delete-during | 边传边删 | 中 | 中 |
--delete-after | 先传后删 | 高 | 慢 |
6.6 冲突处理
冲突场景
当源端和目标端文件都有修改时,就产生了冲突:
源端: file.txt (修改时间 2026-05-01, 内容: "Version B")
目标端: file.txt (修改时间 2026-05-02, 内容: "Version A")
# sync 会用源端覆盖目标端,目标端的修改丢失!
处理策略
策略 1:先备份再同步
# 先备份目标端的修改
rclone sync dst s3:conflict-backup/$(date +%Y%m%d)/ --progress
# 再执行同步
rclone sync src dst --progress
策略 2:使用 –backup-dir
# 被覆盖/删除的文件自动备份到指定目录
rclone sync src dst \
--backup-dir s3:backup/conflicts/$(date +%Y%m%d)/ \
--progress
策略 3:使用 –update 只更新较新的
# 只传输源端比目标端更新的文件
rclone sync src dst --update --progress
策略 4:使用 bisync 双向同步
# 使用 bisync 自动处理冲突(详见第 10 章)
rclone bisync src dst --resync
6.7 日志记录
基本日志
# 输出日志到文件
rclone sync src dst --log-file /var/log/rclone-sync.log --log-level INFO
# 日志级别:DEBUG / INFO / NOTICE / ERROR
日志格式
# 标准格式
2026/05/10 12:00:00 INFO : file1.txt: Copied (new)
2026/05/10 12:00:01 INFO : file2.txt: Deleted
2026/05/10 12:00:02 ERROR : file3.txt: Failed to copy: timeout
# JSON 格式
rclone sync src dst --log-file sync.log --log-format JSON
统计信息
# 定期输出统计信息
rclone sync src dst --stats 5s --progress
# 输出示例:
# Transferred: 1.234 GiB / 5.000 GiB, 25%, 50.000 MiB/s, ETA 1m20s
# Errors: 2
# Checks: 1234 / 1234, 100%
# Transferred: 100 / 500, 20%
# Elapsed time: 30.0s
日志轮转
# 使用 logrotate 管理日志
cat > /etc/logrotate.d/rclone << 'EOF'
/var/log/rclone-sync.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 root root
}
EOF
6.8 性能调优
并行传输
# 增加并行传输数(默认 4)
rclone sync src dst --transfers 16
# 增加并行检查数(默认 8)
rclone sync src dst --checkers 32
# 单文件多线程(大文件分块传输)
rclone sync src dst --multi-thread-streams 8
缓冲区大小
# 增大内存缓冲区
rclone sync src dst --buffer-size 64Mi
# 每个传输文件使用 64MiB 的内存缓冲
带宽限制
# 限制总带宽为 10MB/s
rclone sync src dst --bwlimit 10M
# 工作时间限制带宽,其他时间不限
rclone sync src dst --bwlimit "08:00,10M 23:00,off"
# 按星期限制
rclone sync src dst --bwlimit "Mon-08:00,5M Mon-23:00,off"
大量小文件优化
# 对于大量小文件,增加 transfers 数量
rclone sync src dst \
--transfers 32 \
--checkers 64 \
--low-level-retries 10 \
--retries 3 \
--retries-sleep 1s
大文件优化
# 对于大文件,增加单文件多线程
rclone sync src dst \
--transfers 4 \
--multi-thread-streams 8 \
--multi-thread-cutoff 256M \
--buffer-size 64Mi
6.9 完整脚本示例
每日增量备份脚本
#!/bin/bash
# daily-backup.sh - 每日增量备份
set -euo pipefail
# 配置
SOURCE="/data/important/"
DEST="s3:my-backup/daily/"
BACKUP_DIR="s3:my-backup/deleted/$(date +%Y%m%d)/"
LOG_FILE="/var/log/rclone-backup-$(date +%Y%m%d).log"
LOCK_FILE="/tmp/rclone-backup.lock"
# 加锁防止重复运行
exec 200>"$LOCK_FILE"
flock -n 200 || { echo "Backup already running"; exit 1; }
# 执行同步
rclone sync "$SOURCE" "$DEST" \
--backup-dir "$BACKUP_DIR" \
--transfers 8 \
--checkers 16 \
--progress \
--log-file "$LOG_FILE" \
--log-level INFO \
--stats 30s \
--exclude "*.tmp" \
--exclude "*.temp" \
--exclude ".cache/**" \
--exclude "node_modules/**"
# 检查结果
if [ $? -eq 0 ]; then
echo "Backup completed successfully" >> "$LOG_FILE"
else
echo "Backup FAILED" >> "$LOG_FILE"
# 发送告警
echo "Backup failed on $(date)" | mail -s "Backup Alert" [email protected]
fi
# 清理 30 天前的日志
find /var/log/ -name "rclone-backup-*" -mtime +30 -delete
灾难恢复脚本
#!/bin/bash
# restore.sh - 从备份恢复数据
set -euo pipefail
# 配置
BACKUP="s3:my-backup/daily/"
RESTORE_DIR="/data/restore/"
DATE="${1:-latest}"
if [ "$DATE" = "latest" ]; then
echo "Restoring from latest backup..."
rclone copy "$BACKUP" "$RESTORE_DIR" --progress --transfers 8
else
echo "Restoring from $DATE..."
rclone copy "s3:my-backup/daily/" "$RESTORE_DIR" \
--max-age "$DATE" --progress
fi
echo "Restore completed. Please verify the data."
注意事项
⚠️ sync 方向:
rclone sync A B让 B 变成 A 的镜像。永远先用--dry-run确认。
⚠️ 备份目录:使用
--backup-dir可以保留被覆盖/删除的文件,强烈建议在生产环境启用。
⚠️ 大目录首次同步:首次同步大量数据时,建议使用
--transfers和--checkers调优参数。
💡 增量传输:Rclone 天然支持增量传输,重复运行同步命令是安全且高效的。
💡 监控:使用
--log-file和--stats记录每次同步的详情,便于排查问题。
扩展阅读
上一章:← 第 5 章 - 文件过滤 下一章:第 7 章 - 挂载远程存储 →