虚拟机的Shelve/UnShelve

声明:

本博客欢迎转发,但请保留原作者信息!

作者:华为OpenStack团队 吴江

内容系作者及作者团队学习、研究和总结,如有雷同,实属荣幸!


BP:https://blueprints.launchpad.net/nova/+spec/shelve-instance
功能:将长时间不使用的VM从底层释放,从而节约服务器资源。用户要使用时可再次恢复。

——Make Nova Stop/ Start operations release physical

现状

l  用户对暂时不使用的VM进行停止操作,以节省费用。

l  对于长时间未使用的VM,管理员想要从hypervisor层面上清除它们从而节省主机资源。

l  但之前的停止VM,VM仍旧会占用hypervisor上的资源,并且还需要在主机上占用CPU/内存配额来保证重启动的成功。

l  以上问题当然也可以通过先做一个快照镜像并且重创VM来解决,但是它会重新分配一个IP,并且之前的VM仍旧存在,而快照、IP资源也同样会计费。

场景

周末关机、用户休假、长时间不使用VM等。

限制

l  所有卷数据(包括启动卷场景) 都会保留。

l  虚拟机名、metadata、IP、AZ等基本设置保持不变。

l  VM之前的scheduler_hint不可用。

l  内存中数据会丢失。

l  交换盘中数据会丢失。

l  主机可能更换。

l  unshelve 时不如之前启动VM时速度快。

操作:

shelve (搁置)、shelve-offload (强制搁置)、unshelve (解搁置)。

shelve-offload 操作仅允许管理员调用。


设计

l  未新增数据表。

l  instance_system_metadata 表中,key值新增shelved_at、shelved_image_id、shelved_host 三项,用来记录shelve过程中的对应信息,以备恢复。

l  VM状态新增SHELVED、SHELVED_OFFLOADED。

    *  前者表示VM已被搁置,但在hypervisor上VM尚处于shutdown状态,暂未删除;

    *  而后者表示VM已从hypervisor上释放。

l  任务状态中,新增SHELVING、SHELVING_OFFLOADING、UNSHELVING三种中间状态。

l  新增两个配置项:shelved_poll_interval、shelved_offload_time。

    *  前者表示新增的定时任务 _poll_shelved_instances()的运行间隔。

    *  后者表示当一个VM处于SHELVED状态多久后,状态会被系统变迁到SHELVED_OFFLOADED状态。一共有三种取值:

        *  若为正数,则表示超过该时间间隔后,该VM会被 shelve_offload;

        *  若为0,代表shelve 时立即进行shelve_offload;

        *  若为-1,则代表从不进行offload检查。

l  新增定时任务_poll_shelved_instances(),用来根据配置项shelved_poll_interval 定期将SHELVED状态的VM 向 SHELVED_OFFLOADED状态迁移。注:该任务仅当 shelved_offload_time> 0 时才会实质执行。


流程:

分四个主要部分来分别介绍:

1.      首先来看对一个VM执行shelve操作。大致步骤如下:

l  只有ACTIVE、STOPPED、PAUSED、SUSPENDED状态的VM能够进行shelve操作。

l  对于非后端卷VM,会先根据当前VM信息创建一个镜像待用。

    * 之后消息会直接发到VM所在的节点上去。

    *  在manager层会根据hypervisor类型,调用具体Driver的关机+快照操作,image_id使用上一步已创建好的镜像。

    *  同时在 instance_system_metadata表中添加 shelved_at、shelved_image_id、shelved_host三项内容。

    *  VM状态变为SHELVED。

    *  对于shelve_offload_time =0 时,直接对VM进行shelve_offload,无需定时任务再计时。

l  而对于后端卷,将直接进行shelve_offload 操作。

 

2.      而对于shelve_offload操作:

l  只有SHELVED状态的VM能够进行shelve-offload操作。

l  且该对外接口需要管理员角色。

l  实质操作仅为调用Driver的删除VM接口,释放hypervisor层面上资源而已。

l  VM状态变迁为SHELVED_OFFLOADED。

 

3.      对于unshelve操作来说,需要考虑VM分别处于SHELVED、SHELVED_OFFLOADED状态两种情况。

l  消息会首先发送给nova-conductor中在H版新增的ComputeTaskManager 统一跟踪处理。  

l  若VM状态为SHELVED 时:

    *  说明VM还未从hypervisor上释放。因此,直接调用启动VM即可。

    *  若之前快照镜像已做好,还需要删除该快照。

l  若VM状态为SHELVED_OFFLOADED 时:

*  先查看之前shelve时创建的快照镜像是否存在,不存在则报错。

*  重新选择合适的主机后,开始对SHELVED_OFFLOADED状态的VM 执行unshelve的具体操作。

*  实质是根据原有参数重新创建VM。

*  key_data、auto_disk_config 参数会重新更新。

*  之后删除之前预留的快照镜像。

*  将VM状态修改为ACTIVE。

l  以上两条分支执行完毕后,都会删除该VM在之前shelve时添加到instance_system_metadata表 中的shelved_at、shelved_image_id、shelved_host三项。

 

4.      对于定时任务_poll_shelved_instances():

l  以配置项shelved_poll_interval 的时间间隔,进行定时检查:

l  当配置项shelved_offload_time <= 0 时,说明无需执行检查,直接跳过。

l  当shelved_offload_time > 0 时,对于处于SHELVED状态且shelved_at 时间超过shelved_offload_time 的VM,该线程会逐个主动的调用manager层的shelve_offload 接口,将它们逐个从hypervisor上释放 (即将VM状态向SHELVED_OFFLOADED状态迁移)。

 

遗留:减低恢复时间。目前暂无CLI


再次声明:

本博客欢迎转发,但请保留原作者信息!

作者:华为OpenStack团队 吴江

内容系作者及作者团队学习、研究和总结,如有雷同,实属荣幸!



你可能感兴趣的:(openstack,nova,shelve)