备份块存储服务磁盘¶
虽然您可以使用 LVM 快照来创建快照,但您也可以使用它来备份您的卷。通过使用 LVM 快照,您可以减小备份的大小;只有现有数据会被备份,而不是整个卷。
要备份一个卷,您必须创建它的快照。LVM 快照是逻辑卷的精确副本,其中包含处于冻结状态的数据。这可以防止数据损坏,因为在卷创建过程中无法操作数据。请记住,通过 openstack volume create 命令创建的卷存在于 LVM 逻辑卷中。
您还必须确保操作系统没有使用该卷,并且所有数据都已刷新到客户机文件系统上。通常,这意味着在创建快照期间必须卸载这些文件系统。一旦逻辑卷快照创建完成,就可以再次挂载它们。
在创建快照之前,您必须有足够的空间来保存它。作为预防措施,您应该至少有与潜在快照大小两倍的空间。如果可用空间不足,快照可能会损坏。
对于此示例,假设为实例创建了一个名为 volume-00000001 的 100 GB 卷,但仅使用了 4 GB。此示例使用以下命令仅备份这 4 GB
lvm2 命令。直接操作卷。
kpartx 命令。发现实例内部创建的分区表。
tar 命令。创建最小尺寸的备份。
sha1sum 命令。计算备份校验和以检查其一致性。
您可以将此过程应用于任何大小的卷。
备份块存储服务磁盘
创建已用卷的快照
使用此命令列出所有卷
# lvdisplay创建快照;即使卷已附加到实例,也可以执行此操作
# lvcreate --size 10G --snapshot --name volume-00000001-snapshot \ /dev/cinder-volumes/volume-00000001
使用
--snapshot配置选项告诉 LVM 您想要现有卷的快照。该命令包括为快照卷保留的空间大小、快照的名称以及现有卷的路径。通常,此路径是/dev/cinder-volumes/VOLUME_NAME。大小不必与快照的卷相同。
--size参数定义了 LVM 为快照卷保留的空间。作为预防措施,即使快照当前未使用整个空间,大小也应与原始卷相同。再次运行 lvdisplay 命令以验证快照
--- Logical volume --- LV Name /dev/cinder-volumes/volume-00000001 VG Name cinder-volumes LV UUID gI8hta-p21U-IW2q-hRN1-nTzN-UC2G-dKbdKr LV Write Access read/write LV snapshot status source of /dev/cinder-volumes/volume-00000026-snap [active] LV Status available # open 1 LV Size 15,00 GiB Current LE 3840 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 251:13 --- Logical volume --- LV Name /dev/cinder-volumes/volume-00000001-snap VG Name cinder-volumes LV UUID HlW3Ep-g5I8-KGQb-IRvi-IRYU-lIKe-wE9zYr LV Write Access read/write LV snapshot status active destination for /dev/cinder-volumes/volume-00000026 LV Status available # open 0 LV Size 15,00 GiB Current LE 3840 COW-table size 10,00 GiB COW-table LE 2560 Allocated to snapshot 0,00% Snapshot chunk size 4,00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 251:14
分区表发现
要使用 tar 命令利用快照,请在块存储服务服务器上挂载您的分区。
kpartx 实用程序发现并映射表分区。您可以使用它来查看实例内部创建的分区。不使用实例内部创建的分区,您将无法查看其内容并创建有效的备份。
# kpartx -av /dev/cinder-volumes/volume-00000001-snapshot
注意
在基于 Debian 的发行版上,您可以使用 apt-get install kpartx 命令来安装 kpartx。
如果工具成功找到并映射了分区表,则不会返回任何错误。
要检查分区表映射,请运行此命令
$ ls /dev/mapper/nova*
您可以看到
cinder--volumes-volume--00000001--snapshot1分区。如果您在该卷上创建了多个分区,您会看到多个分区;例如:
cinder--volumes-volume--00000001--snapshot2、cinder--volumes-volume--00000001--snapshot3,依此类推。挂载您的分区
# mount /dev/mapper/cinder--volumes-volume--volume--00000001--snapshot1 /mnt
如果分区成功挂载,则不会返回任何错误。
您可以直接访问实例内部的数据。如果提示您输入分区或无法挂载它,请确定是否为快照分配了足够的空间,或者 kpartx 命令是否未能发现分区表。
为快照分配更多空间并再次尝试该过程。
使用 tar 命令创建归档文件
创建卷的备份
$ tar --exclude="lost+found" --exclude="some/data/to/exclude" -czf \ volume-00000001.tar.gz -C /mnt/ /backup/destination
此命令创建一个
tar.gz文件,其中包含数据,仅包含数据。这可确保您不会通过备份空闲扇区来浪费空间。校验和计算
您应该始终拥有备份文件的校验和。当您通过网络传输相同的文件时,您可以运行校验和计算以确保文件在传输过程中未损坏。校验和是文件的唯一 ID。如果校验和不同,则文件已损坏。
运行此命令以计算文件的校验和并将结果保存到文件中
$ sha1sum volume-00000001.tar.gz > volume-00000001.checksum
注意
小心使用 sha1sum 命令,因为完成计算所需的时间与文件大小成正比。
根据您的 CPU,对于大于大约 4 到 6 GB 的文件,该过程可能需要很长时间。
工作清理后
现在您已经拥有高效且一致的备份,请使用此命令清理文件系统
卸载卷。
$ umount /mnt
删除分区表。
$ kpartx -dv /dev/cinder-volumes/volume-00000001-snapshot
删除快照。
$ lvremove -f /dev/cinder-volumes/volume-00000001-snapshot
对所有卷重复这些步骤。
自动化您的备份
由于可能分配给您的块存储服务越来越多的卷,您可能希望自动化您的备份。SCR_5005_V01_NUAC-OPENSTACK-EBS-volumes-backup.sh 脚本可以帮助您完成此任务。该脚本执行前述示例中的操作,但还提供邮件报告并根据
backups_retention_days设置运行备份。从运行块存储服务的服务器启动此脚本。
此示例显示邮件报告
Backup Start Time - 07/10 at 01:00:01 Current retention - 7 days The backup volume is mounted. Proceed... Removing old backups... : /BACKUPS/EBS-VOL/volume-00000019/volume-00000019_28_09_2011.tar.gz /BACKUPS/EBS-VOL/volume-00000019 - 0 h 1 m and 21 seconds. Size - 3,5G The backup volume is mounted. Proceed... Removing old backups... : /BACKUPS/EBS-VOL/volume-0000001a/volume-0000001a_28_09_2011.tar.gz /BACKUPS/EBS-VOL/volume-0000001a - 0 h 4 m and 15 seconds. Size - 6,9G --------------------------------------- Total backups size - 267G - Used space : 35% Total execution time - 1 h 75 m and 35 seconds
该脚本还允许您 SSH 到您的实例并在其中运行 mysqldump 命令。要使此工作,请启用与计算项目密钥的连接。如果您不想运行 mysqldump 命令,可以在脚本中添加
enable_mysql_dump=0以关闭此功能。