序言
首先,本文主要是基于代码层面来逐步分析如何创建云主机快照,并且参考的是Opanstack Mitaka/Pike版本的代码,另外默认环境glance、nova和cinder都是采用ceph
做后端存储。
一般情况下,云主机启动源分镜像启动(boot from image
)和卷启动(boot from volume
),而不同的启动源的云主机对应创建虚机快照的实现方式不同,另外,快照本身根据环境又分在线快照和离线快照两种。下面从两种不同启动源的云主机来分别讲述虚机快照具体的实现过程。
另外,Openstack创建的快照跟我们传统意义理解的快照是不一样的,当云主机出现故障时,它没法通过这种快照来进行回滚,不过却可以通过新建的快照来创建新的虚机。
镜像启动云主机快照
只对系统盘进行快照,不对其他挂载的磁盘快照;没法对内存及主机状态快照;没有快照链信息,不支持虚拟机回滚至某个快照点;
离线快照
- 核心代码逻辑可参见:
./nova/virt/libvirt/imagebackend.py
./nova/virt/libvirt/imagebackend.py
具体的流程大致解析一下:
- 复制image上传自Glance;
- 基于原先的image创建快照并对image进行clone;
- 执行flatten操作将新的image跟原先的image解耦;
- 对新image创建快照;
- 更新Glance image的location信息;
整个过程中主要开销在flatten操作,该操作需要和源rbd image合并,如果新image中不存在的对象,则需要从源镜像中拷贝,因此IO开销非常大,花费的时间也较长。
在线快照
标准快照是通过qemu-img
从RBD转换而来,目前条件下运行live_snapshot
不安全,因此采用CEPH为统一后端存储暂不支持这种方式的快照。
后端卷启动云主机快照
对于后端卷启动的云主机建快照,其主要工作其实是由Cinder来完成的,Cinder对系统盘及其他挂载磁盘快照,同时会上传一个image至Glance,而这个image没什么实质内容,不过image metadata会记录各个磁盘快照的信息。
- 具体的接口实现请参照:
./nova/compute/api.py
./nova/compute/api.py -
上传至Glance的image的属性信息:
image.png
最后,如果Openstack统一采用CEPH作为存储后端,建议上传的虚机镜像的格式都是RAW,这样创建虚机或者卷一般都可以实现秒级。
网友评论