驱逐
- Launchpad 条目: NovaSpec:rebuild-for-ha
- 创建时间:2012年8月1日
- 贡献者:Alex Glikson, Oshrit Feder, Pavel Kravchenco
目录
总结
虚拟机的高可用性可以最大限度地减少 nova-compute 节点故障的影响。在检测到故障后,如果其他节点可以访问虚拟机的存储(例如共享存储),则可以重建并在目标节点上重新启动虚拟机
发布说明
检测到计算节点故障的管理员可以撤离节点的虚拟机到目标节点
原理
在通用硬件上,故障很常见,应将其考虑在内以提供高服务水平。借助 VM HA 支持,管理员可以从故障节点撤离虚拟机,同时保留虚拟机的特征,例如身份、卷、网络和状态,以确保虚拟机在一段时间内的可用性
用户故事
- 管理员希望从故障节点撤离并重建虚拟机
前提条件
- 由于节点故障,要撤离的虚拟机已停止,处于启动/关机状态
- 虚拟机的存储可以从其他节点访问(例如共享存储),如果不能 - 则执行重建(从镜像重新创建磁盘)
- 管理员选择了一个有效的目标节点来重建虚拟机
- 撤离并在目标节点上重建后,管理员负责可能在突发节点故障期间发生的任何虚拟机不一致性(例如部分磁盘写入)
从计算节点故障中恢复
通过一些更改,现有的重建实例功能可以扩展以支持 HA 场景。
当管理员检测到计算节点故障时,所有在其上运行的虚拟机现在都已停止,新引入的撤离 REST API 可以被调用,以将选定的虚拟机撤离到指定的正在运行的目标计算节点。
撤离与重建的区别在于使用专用的管理员 API,因为重建会刷新虚拟机的磁盘,旨在在希望使用重置磁盘重新启动的同时保留相同的身份时使用。
此操作的确切语义取决于实例的配置和底层存储拓扑。例如,如果这是一个常规的“临时”实例,调用将在另一个节点上从相同的镜像重新生成,同时保留相同的身份和配置(例如相同的 ID、flavor、IP、附加卷等)。对于在共享存储上运行的实例(即目标主机上可访问相同的实例文件),虚拟机将被重新创建并指向相同的实例文件,同时保留身份和配置。对于从卷启动的实例,虚拟机将被重新创建并从相同的卷启动。
nova.compute.api 将暴露一个撤离方法。目标计算节点接收撤离请求,并调用修改后的重建方法 (nova.compute.rpcapi),不带 image_ref,并设置 recreate 标志。重建在设置 recreate 标志时执行几个额外的测试:1. 确保没有同名的虚拟机存在。 2. 验证共享存储(如果实例的磁盘不在共享存储上,image_ref 将使用镜像更新,并且过程将继续作为纯重建)。此外,设置该标志后,虚拟机的记录将使用新的主机更新,并且由于虚拟机是主机上的新虚拟机,因此只需要创建,而无需在从镜像重建场景中销毁和重新创建。接下来,重建流程重新连接卷和网络,确保状态并启动实例。
当/如果故障节点恢复在线时,将在 compute.init_host 中执行进一步的自我清理(清理 virt 中的陈旧实例及其网络),以确保恢复的节点了解撤离的虚拟机,并且不会重新启动它们。在撤离过程中锁定被撤离的虚拟机,以确保单个处理程序,因为故障节点的恢复可能在撤离进行时发生(例如,虚拟机尚未在目标节点上重建)。
REST API
Admin API: v2/{tenant_id}/servers/{server_id}/action
其中 {server_id}=要撤离的服务器,参数:action=evacuate, host=重建服务器的目标计算节点
代码变更
代码变更应包括需要更改的内容的概述,并且在某些情况下甚至包括具体细节。
相关条目
https://wiki.openstack.org/Rebuildforvms
测试/演示计划
这不必在规范接近 Beta 之前添加或完成。
未解决的问题
这应该突出显示需要在进一步的规范中解决的任何问题,而不是规范本身的问题;因为任何存在问题的规范都无法获得批准。
- 能够撤离处于暂停、关机、挂起等状态的实例。
- 如果未指定主机,则自动检测能够撤离到的主机,使用调度器自动选择最佳主机,否则使用指定的主机。我认为让用户决定这一点对用户体验不好。我们应该让他们能够决定,但我认为不应该要求这样做。