rsync

快速起步

早期我在在哦目录同步的时候,常常要记住 rsync 的一长串参数,不过,其实最常用的参数已经浓缩成 -a 了。也就是说,通常只要使用 rsync -a 就足够了:

rsync -a <dir1>/ <dir2>

对比目录

rsync--dry-run 参数可以模拟对比,但不实际同步数据,通常用于对比两个目录差异:

使用rsync对比两个目录
rsync --dry-run --delete --recursive --links --checksum --itemize-changes /dir1/ xost:/rdir/

比较两个目录,差异部分复制到第三个目录

这个方法有点巧妙,但是在一次故障处理中发现,这个场景还是很有用的:

  • 有两个磁盘A和B,需要将A磁盘中数据备份出来,但是B磁盘空间比A小

  • 假设已经做过 A => B 的rsync,但是目标磁盘空间不足,或者随着业务增长,已经无法完全将A同步到B

  • 此时如果能把差异部分备份到C,则可以充分利用 B 和 C磁盘空间

备注

不过,这个方法有点小复杂,维护起来还是有点奇怪。通常在一个物理主机上,多块磁盘可以通过 条带化逻辑卷管理(LVM) 连接成一个大磁盘。同样可以使用 扩展LVM上的EXT4文件系统 扩展B+C磁盘的LVM。(推荐使用 XFS文件系统 扩展更方便成熟)

  • --compare-dest 提供了指定对比磁盘功能(但是复制到第三块磁盘上):

对比磁盘A和B,差异数据复制到磁盘C
# 数据模拟对比
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/

# 实际复制
rsync -aHxv --progress  --compare-dest=folder2/ folder1/ folder3/

并行rsync同步

企业级 NVMe存储 磁盘空间非常巨大,往往是数TB空间,对于海量小文件的备份和恢复,则非常具有挑战性。我个人经验是,要根据业务情况进行分目录并发进行:

  • 每个 rsync 在同步时会完全吃掉一个CPU core,所以要根据自己服务器的硬件情况(多少个CPU核心来决定并发数量)

  • 对于海量小文件的系统,通常业务也会通过哈希方式分布数据到大量的子目录中(甚至是层级的海量目录),所以要编写一个脚本来根据备份目录下的子目录进行划分给不同的 rsync 同时进行同步

  • 运行 rsync 时采用 screen终端多路复用管理器-dm 参数运行,并且采用 -av 参数以便记录同步进度方便检查

参考