声明:
本博客欢迎转发,但请保留原作者信息!
作者:华为OpenStack团队 吴江
内容系作者及作者团队学习、研究和总结,如有雷同,实属荣幸!
——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团队 吴江
内容系作者及作者团队学习、研究和总结,如有雷同,实属荣幸!