备份块存储服务磁盘

虽然您可以使用 LVM 快照来创建快照,但您也可以使用它来备份您的卷。通过使用 LVM 快照,您可以减小备份的大小;只有现有数据会被备份,而不是整个卷。

要备份一个卷,您必须创建它的快照。LVM 快照是逻辑卷的精确副本,其中包含处于冻结状态的数据。这可以防止数据损坏,因为在卷创建过程中无法操作数据。请记住,通过 openstack volume create 命令创建的卷存在于 LVM 逻辑卷中。

您还必须确保操作系统没有使用该卷,并且所有数据都已刷新到客户机文件系统上。通常,这意味着在创建快照期间必须卸载这些文件系统。一旦逻辑卷快照创建完成,就可以再次挂载它们。

在创建快照之前,您必须有足够的空间来保存它。作为预防措施,您应该至少有与潜在快照大小两倍的空间。如果可用空间不足,快照可能会损坏。

对于此示例,假设为实例创建了一个名为 volume-00000001 的 100 GB 卷,但仅使用了 4 GB。此示例使用以下命令仅备份这 4 GB

  • lvm2 命令。直接操作卷。

  • kpartx 命令。发现实例内部创建的分区表。

  • tar 命令。创建最小尺寸的备份。

  • sha1sum 命令。计算备份校验和以检查其一致性。

您可以将此过程应用于任何大小的卷。

备份块存储服务磁盘

  1. 创建已用卷的快照

    • 使用此命令列出所有卷

      # 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
      
  2. 分区表发现

    • 要使用 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--snapshot2cinder--volumes-volume--00000001--snapshot3,依此类推。

    • 挂载您的分区

      # mount /dev/mapper/cinder--volumes-volume--volume--00000001--snapshot1 /mnt
      

      如果分区成功挂载,则不会返回任何错误。

      您可以直接访问实例内部的数据。如果提示您输入分区或无法挂载它,请确定是否为快照分配了足够的空间,或者 kpartx 命令是否未能发现分区表。

      为快照分配更多空间并再次尝试该过程。

  3. 使用 tar 命令创建归档文件

    创建卷的备份

    $ tar --exclude="lost+found" --exclude="some/data/to/exclude" -czf \
      volume-00000001.tar.gz -C /mnt/ /backup/destination
    

    此命令创建一个 tar.gz 文件,其中包含数据,仅包含数据。这可确保您不会通过备份空闲扇区来浪费空间。

  4. 校验和计算

    您应该始终拥有备份文件的校验和。当您通过网络传输相同的文件时,您可以运行校验和计算以确保文件在传输过程中未损坏。校验和是文件的唯一 ID。如果校验和不同,则文件已损坏。

    运行此命令以计算文件的校验和并将结果保存到文件中

    $ sha1sum volume-00000001.tar.gz > volume-00000001.checksum
    

    注意

    小心使用 sha1sum 命令,因为完成计算所需的时间与文件大小成正比。

    根据您的 CPU,对于大于大约 4 到 6 GB 的文件,该过程可能需要很长时间。

  5. 工作清理后

    现在您已经拥有高效且一致的备份,请使用此命令清理文件系统

    • 卸载卷。

      $ umount /mnt
      
    • 删除分区表。

      $ kpartx -dv /dev/cinder-volumes/volume-00000001-snapshot
      
    • 删除快照。

      $ lvremove -f /dev/cinder-volumes/volume-00000001-snapshot
      

    对所有卷重复这些步骤。

  6. 自动化您的备份

    由于可能分配给您的块存储服务越来越多的卷,您可能希望自动化您的备份。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 以关闭此功能。