更新时间:2024-06-18 GMT+08:00

云硬盘快照

什么是云硬盘快照

云硬盘快照是指云硬盘数据在某个时刻的完整拷贝或镜像,是一种重要的数据容灾手段,当数据丢失时,可通过快照将数据完整的恢复到快照时间点。您可以通过管理控制台或者API接口创建云硬盘快照。

云硬盘快照简称为快照。

您可以创建快照,从而快速保存指定时刻云硬盘的数据。同时,您还可以通过快照创建新的云硬盘,这样云硬盘在初始状态就具有快照中的数据。

存量快照原理

快照和备份不同,备份是将数据在不同于云硬盘的存储系统中另存一份,而快照是建立一种快照与数据的关联关系。

以通过云硬盘v1在不同时刻创建快照s1和s2为例:
  1. 首先创建一个全新的云硬盘v1,没有任何数据。
  2. 在云硬盘v1中写入数据d1和d2,此时使用新的数据空间存储d1和d2。
  3. 为步骤2中修改后的云硬盘v1创建快照s1,此时并不会去另存一份数据d1和d2,而是建立快照s1与数据d1和d2的关联关系。
  4. 在云硬盘v1中新写入数据d3,并将数据d2修改成d4,此时会使用新的数据空间存储d3和d4,并不会覆盖原有的d2数据。快照s1到数据d1和d2的关联关系仍然有效,因此如果有需要,可以通过快照s1恢复原数据。
  5. 为步骤4修改后的云硬盘v1创建另一个快照s2,建立快照s2到数据d1、d3和d4的关联关系。
    图1 快照原理

标准快照原理

标准快照是以数据块作为快照数据备份的最小粒度,快照分为全量快照增量快照。为云硬盘创建的第一个快照为全量快照,全量快照包含创建快照时间点前云硬盘上的所有数据(数据块);后续创建的快照均为增量快照,增量快照仅存储较上一个快照有变化的数据块。

全量快照和增量快照的元数据文件中会记录快照创建时间点前的所有数据块信息,因此通过任何一个快照回滚数据至云硬盘时,均可以恢复创建快照时间点前的所有云硬盘数据。

图2 创建快照原理图

根据数据块的来源区分,快照元数据文件中包含三类数据块:继承数据块(继承于上一个快照的数据块)、修改数据块(较上一个快照有修改的数据块)、新增数据块(较上一个快照新增的数据块)。

快照的数据文件中只会存储较上一个快照有变化的数据块(修改数据块、新增数据块)。

如图所示,假设云硬盘在9:30和10:30均有数据写入,为了备份数据,在9:00创建快照1,在10:00创建快照2,在11:00创建快照3,创建快照原理如下:

  • 9:00首次创建快照,快照1中包含云硬盘的所有数据,其中的数据块有A、B、C,快照1为全量快照。快照1的元数据文件中会记录云硬盘全量的数据块A、B、C。
  • 随后写入数据,修改数据块A为A1,修改数据块B为B1,新增数据块D,10:00创建快照2,仅存储较快照1有变化的数据块A1、B1、D,快照2为增量快照。快照2的元数据文件中会记录云硬盘全量的数据块A1、B1、C、D,其中数据块C继承于快照1。
  • 随后写入数据,修改数据块A1为A2,修改数据块C为C1,新增数据块E,11:00创建快照3,仅存储较快照2有变化的数据块A2、C1、E,快照3为增量快照。快照3的元数据文件中会记录云硬盘全量的数据块A2、B1、C1、D、E,其中数据块B1、D继承于快照2。

标准快照容量计算原理

云硬盘的快照总容量以快照链(一块云硬盘中所有快照组成的关系链)为单位进行统计,统计当前云硬盘所有快照的数据块占用的存储空间。

  • 快照链增加快照容量计算
    图3 快照链增加快照

    图3中的场景为例,假设快照的数据块为固定大小2MiB,那么快照链增加快照后的容量计算如下:

    • 创建快照1时,云硬盘的快照链中仅有快照1,快照链容量 = 快照1容量 = 数据块A容量 + 数据块B容量 + 数据块C容量 = 6MiB
    • 创建快照2时,云硬盘的快照链中有快照1、快照2,快照链容量 = 快照1容量 + 快照2容量 = 6MiB + (数据块A1容量 + 数据块B1容量 + 数据块D容量)= 12MiB
    • 创建快照3时,云硬盘的快照链中有快照1、快照2、快照3,快照链容量 = 快照1容量 + 快照2容量 + 快照3容量 = 6MiB + 6MiB +(数据块A2容量 + 数据块C1容量 + 数据块E容量)= 18MiB
  • 快照链删除快照容量计算

    删除快照时,会遍历快照元数据文件中的所有数据块信息,遵循以下删除原则:

    • 数据块被下一个快照继承,该数据块不能删除。
    • 数据块没有被下一个快照继承:
      • 继承数据块:如果上一个快照未被删除,那么该继承数据块不能删除;否则可以删除。
      • 修改数据块:可以删除。
      • 新增数据块:可以删除。
    图4 快照中的数据块删除原则

    以下通过举例说明删除快照后快照链容量计算。

    图5 快照链删除快照

    图5中的场景为例,在14:00删除快照2,在15:00删除快照3,那么快照链删除快照后的容量计算如下:

    • 删除快照前,快照链容量 = 快照1容量 + 快照2容量 + 快照3容量 = 18MiB
    • 14:00删除快照2,遍历快照2元数据文件中的所有数据块信息:
      • 数据块A1:没有被快照3继承,且为快照1中的数据块A修改而来(修改数据块),因此数据块A1可以删除。
      • 数据块B1:被快照3继承,数据块B1不能删除。
      • 数据快C:没有被快照3继承,但继承于快照1(继承数据块)且快照1未被删除,因此数据块C不能删除。
      • 数据块D:被快照3继承,因此数据块D不能删除。

      删除快照2后,快照链容量 = 18MiB - 数据块A1容量 = 16MiB

    • 15:00删除快照3,遍历快照3元数据文件中的所有数据块信息:
      • 数据块A2:没有被下一快照继承,且为快照2中的数据块A1修改而来(修改数据块),因此数据块A2可以删除。
      • 数据块B1:没有被下一快照继承,但继承于快照2且快照2已被删除,因此数据块B1可以删除。
      • 数据快C1:没有被下一快照继承,且为快照2中的数据块C修改而来,因此数据块C1可以删除。
      • 数据块D:没有被下一快照继承,但继承于快照2且快照2已被删除,因此数据块D可以删除。
      • 数据块E:没有被下一快照继承,且为快照3新增数据块,因此数据块E可以删除。

      删除快照3后,快照链容量 = 16MiB - 数据块A2容量 - 数据块B1容量 - 数据块C1容量 - 数据块D容量 - 数据块E容量 = 6MiB