数据保护
快照管理
- 集中式存储快照机制:本地存储/NFS存储/SAN存储使用QCOW2外部快照(External Snapshot),属于ROW快照机制的一种。
- 分布式存储快照机制:企业版分布式存储使用ROW快照技术。自研分布式存储使用COW快照。
集中式存储快照机制
关于QCOW2外部快照的说明。
- 快照链与快照树
通常一块磁盘对应一条快照链,支持对一块磁盘创建一棵快照树,快照树的每一个分支都是一条快照链。
如图 1所示:图 1. 快照树 
快照树包括以下信息:- 快照链:磁盘的一组快照组成的关系链,快照树的每一个分支都是一条快照链。
- 快照节点:快照链中的一个节点,表示磁盘的一份快照。
- 快照容量:快照占用的存储空间。支持查看快照树中所有快照的总容量,以及单个快照节点的容量。
Note:- 对于非分布式存储,系统默认每条快照链最多有128个节点。对于分布式存储,单盘最大快照数量为32,包括手动创建及自动创建的快照。
- 快照链长度达到上限后:
- 若继续创建自动快照,系统会自动删除最早的自动快照。
- 若继续创建手动快照,用户需手动删除不需要的快照。
- 在生产环境中,建议单台虚拟机的快照数量尽量控制在5以内,快照过多会影响虚拟机性能、数据安全以及数据存储容量。
- 创建快照
当一个外部快照被创建,实质是新建一个空白的qcow2文件,该空白文件的backing file指向旧qcow2文件,旧qcow2文件置为只读,于是旧qcow2文件自身成为一个快照,后续只对新qcow2文件写入数据。
- 基于backing file创建单条快照链。如图 2所示:
图 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创建多条快照链。如图 3所示:
图 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。
- 基于backing file创建单条快照链。
- 合并快照
外部快照之间互相依赖(每一个overlay依赖它的backing file),每个快照保存有相应数据,不可直接删除某个快照来缩短链长度。外部快照可通过向下合并(Blockcommit)或向上合并(Blockpull)两种方式来缩短链长度。
- 向下合并(Blockcommit)
在同一条快照链内,支持将overlays合并至backing files。
如图 4所示:图 4. 向下合并 
假定已有一个原始镜像(Base),基于Base创建虚拟机1,并对虚拟机1创建3个互相依赖的外部快照,即:快照1A、快照1B、快照1C。现将快照1A、快照1B向下合并至虚拟机1,于是快照1C(Active)的backing file直接指向虚拟机1,快照链缩短。快照1A、快照1B不再有用,删除即可。
- 向上合并(Blockpull)
在同一条快照链内,支持将backing files合并至overlays。
如图 5所示:图 5. 向上合并 
假定已有一个原始镜像(Base),基于Base创建虚拟机1,并对虚拟机1创建3个互相依赖的外部快照,即:快照1A、快照1B、快照1C。现将快照1A、快照1B向上合并至快照1C(Active),于是快照1C(Active)的backing file直接指向虚拟机1,快照链缩短。快照1A、快照1B不再有用,删除即可。
- 向下合并(Blockcommit)
分布式存储快照机制
企业版分布式存储使用ROW快照技术。自研分布式存储使用COW快照,详情参考:卷快照保护。
灾备管理
数据备份
支持基于 QEMU 块设备层的数据备份,各类型数据存储上的虚拟机均支持备份。备份类型可分为:全量备份、增量备份。全量备份包含完整的数据集合,增量备份仅包含自上一次备份后所有更新的数据集合。全量备份和增量备份均仅备份真实数据。
默认情况下,备份策略是在首次全量备份后,每 63 个增量备份的下一次备份就会自动执行一次全量备份。这是因为从备份数据恢复虚拟机,需要合并恢复点及之前的增量备份数据和全量备份数据。为保障数据安全,备份链最大长度为 64。实际上,系统内部有更智能灵活的应对策略来决定使用哪种合适的备份方式,以确保备份数据的安全可靠。
数据备份可分为三部分:数据复制、数据传输、数据保存。
数据复制
备份模块利用 QEMU 块设备层的脏数据跟踪功能(Dirty Bitmap)实现备份数据的导出。
虚拟机磁盘文件数据发生变化的位置被称为脏数据位置,Dirty Bitmap 记录自上次备份后,虚拟磁盘文件上产生脏数据的所有位置记录,根据位置记录,就可导出自上次备份后所有被修改过的数据,即增量的备份数据。
最终全量备份文件和各个增量备份文件会产生一个完整的备份链,保存完整的数据。Dirty Bitmap 存在于 QEMU 进程的内存中,虚拟机重启后就会丢失这部分信息,因此当虚拟机重启后的下一次备份,系统会自动选择全量备份。

数据传输
数据保存
备份存储支持多种存储介质,包括:SAN、NAS、磁盘阵列以及带库等。
备份数据在备份存储中是切片去重存放的,备份数据会被切分成 64MB 大小的数据块,然后计算 hash,建立索引。拥有相同 hash 的数据块不会被存储多份。

数据恢复
从本地备份数据恢复虚拟机,会把备份存储上的切片数据合并导入数据存储中,合并后的备份恢复数据会在非分布式存储上以磁盘链的形式存放,分布式存储上会把磁盘链合并成单个磁盘文件存放。 如果是新建恢复,则恢复到数据存储的磁盘数据会被当作镜像缓存来创建新虚拟机;如果是覆盖恢复,则会把恢复到数据存储的磁盘路径更新到当前虚拟机的数据库记录中,随后删除旧的虚拟机文件。



