快照原理

非Ceph存储 QCOW2外部快照原理

对于非Ceph存储(本地存储/NFS/Shared Mount Point/Shared Block),ZStack Cloud采用QCOW2外部快照(External Snapshot)机制。

  1. 快照链与快照树

    通常一块磁盘对应一条快照链,ZStack Cloud支持对一块磁盘创建一棵快照树,快照树的每一个分支都是一条快照链。

    Figure 1所示:
    Figure 1. 快照树


    快照树包括以下信息:
    • 快照链:磁盘的一组快照组成的关系链,快照树的每一个分支都是一条快照链。
    • 快照节点:快照链中的一个节点,表示磁盘的一份快照。
    • 快照容量:快照占用的存储空间。支持查看快照树中所有快照的总容量,以及单个快照节点的容量。
    Note:
    • 对于非Ceph存储,系统默认每条快照链最多有128个节点,用户可在全局设置中,通过修改云盘快照增量的最大数目自行设置快照链的最大长度。对于Ceph存储,单盘最大快照数量为32,包括手动创建及自动创建的快照。
    • 快照链长度达到上限后:
      • 若继续创建自动快照,系统会自动删除最早的自动快照。
      • 若继续创建手动快照,用户需手动删除不需要的快照。
    • 在生产环境中,建议单块磁盘的快照数量尽量控制在5以内,快照过多会影响云主机/云盘的IO性能、数据安全以及主存储容量。如需长期备份,建议使用灾备服务。
  2. 创建快照

    当一个外部快照被创建,实质是新建一个空白的qcow2文件,该空白文件的backing file指向旧qcow2文件,旧qcow2文件置为只读,于是旧qcow2文件自身成为一个快照,后续只对新qcow2文件写入数据。

    • 基于backing file创建单条快照链。
      Figure 2所示:
      Figure 2. 创建快照 单链


      假定已有一个原始镜像(Base),以该原始镜像为模板创建云主机1,对云主机1依次创建快照1A、快照1B。
      • 原始镜像:一个已制作好的磁盘镜像文件,包含完整的操作系统以及引导程序,作为Base(只读)。
      • 云主机1:新建空白文件Overlay-1,backing file指向Base,Base保持为只读,于是Base成为一个快照,后续只对Overlay-1写入数据。
      • 快照1A:新建空白文件Overlay-1A,backing file指向Overlay-1,Overlay-1置为只读,于是Overlay-1成为一个快照,后续只对Overlay-1A写入数据。
      • 快照1B:新建空白文件Overlay-1B,backing file指向Overlay-1A,Overlay-1A置为只读,于是Overlay-1A成为一个快照,后续只对Overlay-1B写入数据。云主机1使用的是快照链内最后一个快照1B对应的磁盘文件,快照1B为Active。
    • 基于backing file创建多条快照链。
      Figure 3所示:
      Figure 3. 创建快照 多链


      假定已有一个原始镜像(Base),以该原始镜像为模板创建云主机1、云主机2、云主机3,对云主机1依次创建快照1A、快照1B,对云主机2创建快照2A,对云主机3创建快照3A。
      • 原始镜像:一个已制作好的磁盘镜像文件,包含完整的操作系统以及引导程序,作为Base(只读)。
      • 快照链1:
        • 云主机1:新建空白文件Overlay-1,backing file指向Base,Base保持为只读,于是Base成为一个快照,后续只对Overlay-1写入数据。
        • 快照1A:新建空白文件Overlay-1A,backing file指向Overlay-1,Overlay-1置为只读,于是Overlay-1成为一个快照,后续只对Overlay-1A写入数据。
        • 快照1B:新建空白文件Overlay-1B,backing file指向Overlay-1A,Overlay-1A置为只读,于是Overlay-1A成为一个快照,后续只对Overlay-1B写入数据。云主机1使用的是快照链1内最后一个快照1B对应的磁盘文件,快照1B为Active。
      • 快照链2:
        • 云主机2:新建空白文件Overlay-2,backing file指向Base,Base保持为只读,后续只对Overlay-2写入数据。
        • 快照2A:新建空白文件Overlay-2A,backing file指向Overlay-2,Overlay-2置为只读,于是Overlay-2成为一个快照,后续只对Overlay-2A写入数据。云主机2使用的是快照链2内最后一个快照2A对应的磁盘文件,快照2A为Active。
      • 快照链3:
        • 云主机3:新建空白文件Overlay-3,backing file指向Base,Base保持为只读,后续只对Overlay-3写入数据。
        • 快照3A:新建空白文件Overlay-3A,backing file指向Overlay-3,Overlay-3置为只读,于是Overlay-3成为一个快照,后续只对Overlay-3A写入数据。云主机3使用的是快照链3内最后一个快照3A对应的磁盘文件,快照3A为Active。
  3. 合并快照

    外部快照之间互相依赖(每一个overlay依赖它的backing file),每个快照保存有相应数据,不可直接删除某个快照来缩短链长度。外部快照可通过向下合并(Blockcommit)或向上合并(Blockpull)两种方式来缩短链长度。

    • 向下合并(Blockcommit)

      在同一条快照链内,支持将overlays合并至backing files。

      Figure 4所示:
      Figure 4. 向下合并


      假定已有一个原始镜像(Base),基于Base创建云主机1,并对云主机1创建3个互相依赖的外部快照,即:快照1A、快照1B、快照1C。现将快照1A、快照1B向下合并至云主机1,于是快照1C(Active)的backing file直接指向云主机1,快照链缩短。快照1A、快照1B不再有用,删除即可。

    • 向上合并(Blockpull)

      在同一条快照链内,支持将backing files合并至overlays。

      Figure 5所示:
      Figure 5. 向上合并


      假定已有一个原始镜像(Base),基于Base创建云主机1,并对云主机1创建3个互相依赖的外部快照,即:快照1A、快照1B、快照1C。现将快照1A、快照1B向上合并至快照1C(Active),于是快照1C(Active)的backing file直接指向云主机1,快照链缩短。快照1A、快照1B不再有用,删除即可。

Ceph存储快照原理

对于Ceph存储,ZStack Cloud采用Ceph存储自带的快照功能,当下业界分布式存储主流采用ROW(Redirect-On-Write,写时重定向)快照机制。