下面是在主机中运行的我的备份脚本的简化版本:
# shutdown the guest to ensure its filesystem is in a stable state
virsh shutdown web --mode=acpi
sleep 20s # the real script uses a smarter method to wait for the guest shutdown to complete
# make a snapshot copy of the offline guest
lvcreate -n web-bsnap -L50GB -s /dev/vg0/web
# start the guest to minimize the offline time
virsh start web
# create the backup volume
lvcreate -n web-0 -L 193273528320B /dev/vg0
# make the backup by copying the offline snapshot
nice -n 19 dd if=/dev/vg0/web-bsnap of=/dev/vg0/web-0 bs=4K
# remove the snapshot
lvremove -f /dev/vg0/web-bsnap
备份需要 1 个多小时,但问题是,在此期间,客户机变得非常慢(有时也无法访问)。我不需要备份在 1 或 2 小时内结束,如果需要,它可以持续 10 个小时,但我希望它以最低优先级运行,这样它就不会干扰正常的客户机操作。该nice
命令就是为此而存在的,但它似乎没有任何区别。
主机系统是 Debian GNU/Linux 8 amd64,Linux 内核来自 sid (4.7)。客户机也是如此。主机和客户机上的 jessie 内核 (3.16) 都存在同样的问题。
主机硬件对于通常的客户工作负载来说太大了,拥有 256GB RAM、6 核 Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz 和 2TB RAID1 存储(企业级 SATA 磁盘),所有这些都是为单个客户机提供的,其网站平均每秒可处理 1 个网页。通常的服务器负载低于 1。
我该怎么做才能让备份不那么烦人?
答案1
事情是这样的 - nice 调整进程优先级。在 dd 的情况下 - 这主要是 IO 密集型,而不是 CPU 密集型,这就是为什么这种机制不适合您。
以下是我的做法
mkfs /dev/mapper/vg0-web-0
mkdir /mnt/websnap
mkdir /mnt/level0
mount /dev/mapper/vg0-web-0 /mnt/level0
mount /dev/mapper/vg0-web-bsnap /mnt/websnap
rsync -av --bwlimit=10000 /mnt/websnap/ /mnt/level0/
有了它,你将不再进行块复制(当你的卷未接近 100% 满时,这可能效率低下),而是基于文件的复制,此外你还可以使用 --bwlimit 来控制带宽
答案2
Dmitry Zayats 提出的解决方案非常有趣,但我最终采用了不同的解决方案,以保持脚本与客户分区无关:
dd if=/dev/vg0/web-bsnap of=/dev/vg0/web-0 bs=4K &
DDPID=$!
DDRUNNING=1
while [ $DDRUNNING -gt 0 ] ; do
kill -STOP $DDPID
sleep 3.875s
kill -CONT $DDPID
sleep 0.125s
DDRUNNING=$(ps -p $DDPID | grep $DDPID | wc -l)
done
对于 180GB 的客户映像来说,这需要大约 20 个小时,但对我来说,这不会影响系统性能。