我正在尝试优化大型MySQL数据库的LVM快照的每日备份。 当我只用cp文件(本地RAID到其他本地RAID),平均速度为〜100MB / s时,它工作得很好。 但是由于数据库文件(600GB,大部分是350GB和250GB的两个文件)在一天内没有太大变化,所以我认为只复制已更改的块会更有效率。
我在用着
rsync --safe-links --inplace -crptogx -B 8388608 /source/ /destination/
它确实工作,比简单的副本慢,我没有看到目标磁盘上的任何读取活动。 我的想法是,rsync会从源和目的地读取(8MB)块,比较它们的校验和,并且只在源文件块被更改时才将其复制到目标文件中。 我在这里弄错了吗? 为什么我没有看到rsync从目标读取,以确定块是否已经改变?
以下是一些图表:
磁盘使用情况 :你会发现rsync –inplace(仅在最后一天为更大的文件完成)减less了/ mnt / backup磁盘使用中的“凹痕”,这意味着它确实更新了现有的文件。

IO统计 :从sda到sdb进行备份。 不知何故,从源读取有一个巨大的高峰,其次是“正常”读取(源)+写入(目标)活动。 我期待从这两个设备同时读取,对目标写入活动很less。

你可能看到的是由于你的文件如何改变的方式以及rsync如何计算校验和。 关于–inplace的rsync手册页有一个基本的解释:
o The efficiency of rsync's delta-transfer algorithm may be reduced if some data in the destination file is overwrit- ten before it can be copied to a position later in the file. This does not apply if you use `--backup`, since rsync is smart enough to use the backup file as the basis file for the transfer.
所以你应该不要使用 – 放置或使用 – 备份来保存文件的旧副本。 这就是说,rsync似乎处理大文件,而不是有效的,所以它可能不是最好的工具。
如果您正在使用LVM并且真的想要传输快照数据,则可能不想运行rsync,这两者的计算量和I / O密集程度相当,而是使用lvmsync将快照的CoW数据复制到目标机器上 -以大概更大的传输大小的价格为您提供I / O和CPU周期。
解决这个问题的另一种方法是在这个答案上执行“哑”块设备校验和(例如使用MD5),并在这个答案中传递区分块, 在ServerFault或blocksync.py脚本中 (我已经链接了它最近的活动分支)。 它根本不依赖于快照,但显然你会想要在复制的时候创build一个,以确保数据的一致性得到维护。
如果您担心数据库的活动快照的写入性能,还可以查看一下ddsnap ,其中包含多个用于快照和卷复制的优化,可以有效解决您的问题。