oVirt虚拟化关键概念、组件与技术原理

oVirt虚拟化关键概念、组件与技术原理

云管理平台组-陈志安


1. 介绍

1.1. ovirt-engine

ovirt-engine为虚拟化环境提供了一个集中管理的平台,用户可以根据具体的需求选择使用不同的方式来访问ovirt-engine。

ovirt-engine架构图如下:

ovirt-engine架构图

  • 应用服务器(ovirt-Wildfly)

Wildfly是一个JavaEE应用服务器,但是需要注意的是部署ovirt-engine所需要的wildfly是特殊定制过的,因此您不能将其它应用部署在这个为ovirt-engine专门定制的wildfly上,为了便于与通用版本区分开来,本文档后续将定制版本统称为ovirt-wildfly。

  • 用户门户(User Portal)

桌面系统虚拟化为用户提供了一个近似于物理PC的桌面系统。用户可以使用网络浏览器来访问用户门户,并通过用户门户来访问分配给他们的虚拟桌面资源(SPICE/VNC)。系统管理员需要为每个用户设定他们可能访问的资源及相关权限。User Portal的用户有两种类型:标准用户、高级用户。标准用户可以启动、停止和使用分配给他们的虚拟桌面(无法编辑虚拟机配置),而高级用户则还可以执行一些额外的管理任务(如创建、删除、编辑虚拟机,管理虚拟磁盘和网络接口等)。

  • 管理门户(Admin Portal)

管理门户是ovirt-engine的一个图形管理界面。管理员可以通过该管理界面来监控、创建并维护整个ovirt虚拟环境中的所有资源(计算、网络、存储)。通过管理门户可执行如下操作:

  • 创建和管理虚拟基础架构(网络、存储域)
  • 创建和管理虚拟机
  • 创建和管理逻辑项(数据中心、集群)
  • 安装和管理计算节点(虚拟主机)
  • 用户权限管理

详细的使用文档请查阅官方文档

  • 目录服务(Directory Service)

目录服务提供了一个基于网络的、集中存储的用户与机构信息。这些信息包括应用程序的设置、用户档案资料、用户组数据、策略信息和访问控制信息。ovirt-engine支持Active Directory,Identity Management,OpenLDAP和Red Hat Directory Server 9所提供的目录服务。另外它还包括了一个本地内部域(internal),这个域只被用来进行系统管理,并只包含一个用户:admin。

  • 报表

ovirt-engine在安装时会同时安装一个数据仓库,它被用来收集监控主机、虚拟机和存储所产生的数据。ovirt-engine预先提供了一组报表,用户也可以使用任何支持SQL查询的工具来创建新的报表。

ovirt-engine在安装过程中会在Postgres数据库服务器上创建两个数据库:engine与ovirt_engine_history。

engine:它是ovirt-engine用来保存数据的主数据库,它保存了与虚拟环境相关的数据(如虚拟环境的状态、配置等数据)。

ovirt_engine_history:该数据库保存了配置信息和各种性能统计数据,这些数据是根据不同时从engine数据库中收集来的。系统在每分钟都会检查engine数据库中的配置,任何改变都会被记录在ovirt_engine_history数据库中。这些信息可以用来帮助管理员分析和提高ovirt虚拟化环境的性能及协助管理员解决存在的问题。

ovirt-engine的报表功能是通过ovirt-engine-dwhd服务实现的。

  • API

管理员除了通过管理门户来管理维护虚拟化环境外,还可以通过CLI-API或REST-API来与外部管理系统做进一步的整合:

  • 把虚拟环境集成到IT环境中
  • 与第三方虚拟化软件集成
  • 自动化维护和错误检查任务
  • 使用脚本执行重复性操作

1.2. ovirt-node

一个ovirt虚拟化环境包括一个或多个用于运行虚拟机的计算节点(我们通常称为虚拟主机、物理主机、主机或计算节点)。一个普通的物理主机要成为ovirt虚拟化环境的计算节点有如下两种办法:

  • 安装专门定制的操作系统:使用官方提供的安装镜像文件(ovirt-node-os.iso)
  • 在Redhat Enterprise Linux,Centos等操作系统上根据官方文档提示安装ovirt-node相关的组件包。

具体安装配置文件请参考官方文档

ovirt-node的主机核心架构图如下:

ovirt-node架构图

  • KVM(Kernel-based Virtual Machine)

KVM是一个可加载的内核模块,它通过使用Inter-VT或AMD-V等硬件虚拟化扩展技术来提供虚拟化功能。KVM本身运行于内核空间,而在它上面运行的虚拟机服务会作为独立的QEMU进程在用户空间中运行。KVM允许主机把它的物理硬件资源分配给虚拟机。

  • QEMU

QEMU是一个多平台的,提供全仿真功能的仿真器(emulator),它会仿真包括一个或多个处理器以及外设在内的整个系统。QEMU、KVM及带有虚拟化功能扩展的处理器组合在一起就可以提供虚拟化功能。

  • VDSM(Virtual Desktop Server Manager)

VDSM相当于ovirt-engine在ovirt-node上的一个代理服务进程。ovirt-engine通过VDSM暴露的API来管理ovirt虚拟化环境下的所有资源(计算、网络、存储),执行相关的监控配置任务、数据统计、日志收集。每个计算节点上都会运行一个VDSM服务(监听端口号默认为54321)来接收ovirt-engine发出的管理命令。

  • libvirt

libvirt是一个底层工具库,它被用来协调虚拟机及其相关虚拟设备的管理。即当ovirt-engine发出一个操作虚拟机相关的命令时(如启动虚拟机、停止虚拟机),VDSM会调用目标计算节点上的libvirt的相应指令来执行这个操作。

  • SPM(Storage Pool Manager)

SPM即存储池管理器,它是ovirt虚拟化环境中与存储管理相关的重要概念。SPM是分配给一个数据中心中某个主机(计算节点)角色,即一个数据中心中的所有主机中,具有SPM角色的主机只能有一个,我们称其为SPM主机。SPM主机全权负责数据中心中所有与存储、存储域管理相关的业务。SPM角色可以在同一个数据中心中的不同主机间进行迁移,同一个数据中心中的所有主机都必须能访问这个数据中心中定义的所有存储域。ovirt-engine会确保SPM一直处于有效的状态,如果SPM所在的主机出现问题,ovirt-engine会重新发起SPM选举确定新的SPM主机。

“数据中心”是ovirt虚拟化环境的重要概念,一个ovirt虚拟化环境中可以有多个数据中心。“存储域”则是ovirt虚拟化环境中存储资源管理的核心概念,下文会有专门的章节介绍。

1.3. 数据中心

数据中心是ovirt虚拟化环境中的根容器(最高一级的逻辑项),它包括以下三个子容器(子项):

  • 集群容器

集群容器用来保存与集群相关的信息。集群由一个至多个计算节点(主机)组成,这些主机具有相互兼容处理器内核。一个集群组成了一个虚拟机的迁移域,虚拟机可以被实时迁移到同一集群中的其它主机上。一个数据中心可以包括多个集群,一个集群可以包括多个主机。

  • 存储容器

存储容器用来保存存储类型、存储域的信息,以及存储域间的连接信息。存储域在数据中心一级上定义,并可以被数据中心的所有集群使用(即可以被集群中的所有主机挂载)。

  • 网络容器

网络容器用来保存与数据中心中的逻辑网络相关的信息,如网络地址、VLAN标签等信息。逻辑网络在数据中心一级上定义,并可以在集群一级上使用。

1.4. 存储简介

ovirt虚拟化平台使用一个集中的存储系统来保存虚拟磁盘镜像、模板、快照和ISO文件。存储被分为由各个存储域组成的存储池,一个数据中心只有一个存储池。存储域由一组存储空间和代表这些存储空间内部结构的元数据所组成。目前有三种存储域类型:数据存储域,导出存储域,ISO存储域,三种存储域的介绍见后续章节。

每个数据中心都必须包括一个数据存储域,而每个数据存储域也只能关联一个数据中心。存储域是用于提供资源共享的,因此数据中心的所有主机都必须能访问所有存储域。

1.5. 网络简介

ovirt虚拟化环境的网络架构提供该环境中不同对象间的网络连接,同时它还可以用来实现网络隔离。其网络架构图如下:

ovirt网络架构图

用来处理虚拟机间网络连接的逻辑网络是通过计算节点上的基于软件的网桥实现的。在默认情况 下,ovirt-engine在安装过程中会创建一个名为“ovirtmgmt管理网络”的逻辑网络。此外系统管理员还可以添加专用的存储逻辑网络和专用的显示逻辑网络。

2. 存储

在介绍ovirt虚拟化环境的存储相关内容前,我们需要简单了解下几种常见的存储服务类型:块存储,文件存储,对象存储。

下图是常见存储服务类型的系统层级分布图:

存储类型系统层级分布图

我们从底层往上看,最底层就是硬盘,多个硬盘可以做成RAID组,无论是单个硬盘还是RAID组,都可以做成PV,多个PV物理卷捏在一起构成卷组(VG)。接下来可以从卷组上切出很多个逻辑卷(LV)。到LV这一层为止,数据一直都是以块(Block)的形式存在的,这时候提供出来的服务就是块存储服务。你可以通过FC协议或者iSCSI协议访问LV,映射到主机端本地,成为一个裸设备。在主机端可以直接在上面安装数据库,也可以格式化成文件系统后交给应用程序使用,这时候就是一个标准的SAN存储设备的访问模式,网络间传送的是块

如果不急着访问,也可以在本地做文件系统,之后以NFS/CIFS协议挂载,映射到本地目录,直接以文件形式访问,这就成了NAS访问的模式,在网络间传送的是文件

如果不走NAS,在本地文件系统上面部署OSD服务端,把整个设备做成一个OSD,这样的节点多来几个,再加上必要的MDS节点,互联网另一端的应用程序再通过HTTP协议直接进行访问,这就变成了对象存储的访问模式。当然对象存储通常不需要专业的存储设备,前面那些LV/VG/PV层也可以统统不要,直接在硬盘上做本地文件系统,之后再做成OSD,这种才是对象存储的标准模式,对象存储的硬件设备通常就用大盘位的服务器。

物理卷(PV)、卷组(VG)、逻辑卷(LV)及LVM相关的介绍请查阅LVM文档

2.1. 什么是存储域

存储域就是一系列具有公共存储接口的镜像的集合,存储域中包括了虚拟机模板、快照、数据镜像、ISO文件以及存储域本身的元数据。一个存储域可以由块设备(块存储)组成,也可以由文件系统(文件存储)组成。

  • 文件存储:所有的NAS(NFS, GlusterFS, 或其它POSIX兼容的文件系统, 主机的本地存储)都属于文件存储,如果存储域由文件存储组成,则其上的虚拟磁盘、模板、快照都是文件。

一般情况下,ovirt虚拟化环境并不直接管理基于文件的存储(它们都由外部系统负责管理),如NFS存储由NFS服务器或其它第三方网络存储服务器来管理。主机则可以管理它自身的本地文件存储系统。

  • 块存储:在SAN(iSCSI, FCP)中的存储都属于块存储,如果存储域由块存储组成,则其上的虚拟磁盘、模板、快照都是一个逻辑卷(LV)。

块存储使用未格式化的块设备,这些块设备(相当于PV)被LVM合并为卷组,VDSM会通过扫描卷组来在LVM之上添加集群逻辑。当VDSM发现卷组变化时,它会通知相应的主机来更新它们的卷组信息。主机会把卷组分为不同的逻辑卷(LV),并在磁盘上保存逻辑卷的元数据。当在已存在的存储域中添加新的存储空间时,ovirt-engine会通知每台主机上的VDSM来更新卷组信息。

SPM主机上的LVM会处理块存储环境中发生的变化(如创建逻辑卷、扩展或删除逻辑卷、添加新的 LUN),然后SPM主机上的VDSM会将这些变化信息(元数据)同步至集群中的所有主机。

2.2. 存储域类型

ovirt虚拟化平台支持的存储域可以被分为以下几类:

  • 数据(Data)存储域:保存ovirt虚拟化环境中的所有虚拟机的磁盘镜像。这些磁盘镜像包括安装的操作系统,或由虚拟机产生或保存的数据。数据存储域支持NFS、iSCSI、FCP、GlusterFS或POSIX兼容的存储系统。

  • 导出(Export)存储域:它可以在不同数据中心间转移磁盘镜像和虚拟机模板提供一个中间存储,并可以用来保存虚拟机的备份。导出存储域支持NFS存储。一个导出域可以被多个不同的数据中心访问,但它同时只能被一个数据中心使用。

  • ISO存储域:用来存储ISO文件(也称为镜像,它是物理的CD或DVD的代表)。在ovirt虚拟化环境中,ISO文件通常代表了操作系统的安装介质、应用程序安装介质和guest代理安装介质。这些镜像会被附加到虚拟机上,并象使用物理安装介质一样启动系统。ISO存储域为数据中心中的所 有主机提供了一组共享的ISO文件,这样所有的主机就不再需要物理的安装介质了。

“导出存储域”在以后的版本中将可能被弃用,因为最新版本的ovirt虚拟化平台的“数据存储域”已经具备导出存储域的功能了(从一个数据中心移除并挂载到另一个数据中心)。

2.3. 虚拟磁盘镜像

2.3.1. 虚拟磁盘格式

  • QCOW2(QEMU copy on write V2)

QCOW2是虚拟磁盘镜像的一种存储格式,使用QCOW2格式可以把物理存储层和逻辑存储层分隔开。QCOW2为逻辑块和物理块之间创建了一个映射,每个逻辑块都会被映射到相应的物理块上;另外,QCOW2可以只保存物理存储上变化的数据。因为这个特性是存储空间“over-commitment”功能和虚拟机快照功能得以实现的基础。

初始的映射信息会把所有的逻辑块与物理文件系统或卷中对应的块相关联。在创建虚拟机快照后, 如果这个虚拟机需要向QCOW2卷写数据,系统会根据映射信息在物理存储中找到相应的块,并把新数据写到块中,然后只在新的快照QCOW2卷中记录数据的变化,并更新相应的映射信息。

  • RAW

当虚拟磁盘的镜像是RAW格式时,它上面的数据将没有特定的格式,对虚拟磁盘的操作也不需要主机进行特殊处理,因此使用RAW格式的虚拟机磁盘会比使用QCOW2格式的虚拟磁盘有更好的性能。当虚拟机向虚拟磁盘写数据时,I/O系统会在物理存储和逻辑卷中写相同的数据。RAW格式的虚拟磁盘在创建时就会被分配和所定义的镜像大小相同的存储空间(预先分配)。RAW镜像文件有很多优点,但它的一个非常大的缺陷就是不支持快照。

2.3.2. 磁盘镜像存储分配策略

  • 预分配存储(Preallocated Storage)

虚拟磁盘镜像所需要的所有存储空间在虚拟机创建前就需要被完全分配。如果虚拟机需要一个20GB的磁盘镜像,存储域中的20GB的存储空间就会被占用。因为在进行写操作时不需要进行磁盘空间分配的动作,所以预分配存储策略有更好的写性能。但是,预分配存储的大小不能被扩展,这就失去了一些灵活性。另外,它也会降低ovirt-engine进行存储“over-commitment”的能力。预分配存储策略适用于需要大量I/O操作(特别是写操作比较频繁时),并对存储速率有较高要求的虚拟机,一般情况下,作为应用服务器的虚拟机推荐使用预分配存储策略。

  • 稀疏分配存储(Sparsely Allocated Storage)

这种存储分配策略也叫存储精简配置策略。在创建虚拟机的时候,为虚拟磁盘镜像设定一个存储空间上限,而磁盘镜像在开始时并不使用任何 存储域中的存储空间。当虚拟机需要向磁盘中写数据时,磁盘会从存储域中获得一定的存储空间(默认为1G),当磁盘数据量达到所设置的磁盘空间上限时将不会再为虚拟磁盘增加容量。

如果ovirt环境底层的存储设备提供了精简分配(thin provisioning)功能,则我们创建虚拟磁盘时应该首选使用底层存储设备所提供的能力来实现精简配置。我们通过图形用户界面为虚拟机配置存储时,应该选择“预分配存储策略”,底层存储自己会实现精简配置的功能。

2.4. 存储元数据

存储元数据包括:存储域元数据,存储池信息,模板与虚拟机镜像元数据。

2.4.1. 元数据版本

ovirt虚拟化平台存储域元数据模型目录有三个版本(V1, V2, V3),当前使用的是V3版本。
元数据不同版本间的区别主要是:元数据格式,存储方式的变更。

  • V1元数据(ovirt-engine-2.x)

每个存储域的元数据包括:存储域本身的结构、所有被虚拟磁盘镜像使用的物理卷的名字。

主存储域(Master Storage Domain)的元数据还额外包括了存储池中的所有域和物理卷的名字。因为这个元数据的大小不能超过2KB,所以它限制了一个池中所能包括的存储域的数量。

模板和虚拟机的基本数据镜像是只读的。

V1元数据适用于NFS、iSCSI和FC存储域。

  • V2元数据(ovirt-engine-3.0)

所有存储域和池的元数据以逻辑卷标签的形式保存(不再被写到一个逻辑卷上)。而虚拟磁盘卷的元数据仍然以一个逻辑卷的形式保存在存储域中。元数据将不再包括物理卷名。

模板和虚拟机的基本数据镜像是只读的。

V2元数据适用于iSCSI和FC存储域。

  • V3元数据(ovirt-engine-3.1+)

所有存储域和池的元数据以逻辑卷标签的形式保存(不再被写到一个逻辑卷上)。而虚拟磁盘卷的元数据仍然以一个逻辑卷的形式保存在存储域中。

虚拟机和模板的基本镜像数据不再是只读的了。这使实时快照、实时存储迁移和快照克隆成为可能,支持unicode元数据,这样它就可支持非英文的卷名。

V3元数据适用于NFS、GlusterFS、POSIX、iSCSI和FC存储域。

2.4.2. 元数据存储目录结构

ovirt-engine在启动时会将每个数据中心中的存储域配置信息下发给各个主机上的VDSM实例,VDSM分根据接收到的存储域配置信息将相关存储域挂载至主机。挂载成功后,你将可以在每个主机的如下目录查看到存储域的相关信息(包括元数据):

1
2
# 元数据存储目录
/rhev/data-center/<storage_pool_uuid>

下图是V3版元数据存储目录结构示意图:

V3版元数据存储目录结构示意图

注意: 文件存储类型的存储域与块设备类型的存储域的元数据存储位置是不同的,块设备类型存储域的元数据是存放在主存储域(马上到!)对应的卷组(VG)的标签(Tag)中,而不是dom_md目录下的metadata文件中。dom_md/metadata存放的是该存储域下虚拟机磁盘镜像(LV)的元数据集,每个虚拟机磁盘镜像(LV)的元数据存放在metadata块设备存储空间的某一个索引位置上,该索引位置信息则保存在虚拟机磁盘镜像所在的逻辑卷(LV)的标签(Tag)上。

相关查询命令:vgs, lvs等,块设备存储域元数据的具体细节由VDSM负责维护,本文档不深入介绍。

2.5. 存储域自动恢复(激活)机制

主机根据其所在数据中心中的存储域元数据信息来监测存储域,当该数据中心中的所有主机都报告某个存储域无法访问时,这个存储域会被认定为“不活跃”。

但ovirt-engine监测到某个存储域不活跃时并不会断开与它的连接,而是会认为这可能是一个临时的网络故障导致的,engine会每隔5分钟尝试重新激活任何不活跃的存储域。

虽然系统管理员可能需要人为排除存储域连接问题的故障,但ovirt-engine会在连接问题解决后自动重新激活存储域。

2.6. SPM(Storage Pool Manager)

2.6.1. SPM简介

ovirt虚拟化平台使用元数据来描述存储域的内部结构。结构元数据会被写到每个存储域的一个数据段中,它被用来记录镜像和快照的创建删除,以及卷和域的扩展操作。所有主机会使用“一人写,多人读”的机制来处理存储域元数据。这个能修改存储域元数据的主机就是SPM主机(后面简称SPM)。

下图是存储域元数据读写数据流示意图:

存储域元数据读写数据流示意图

SPM负责协调数据中心内所有存储域元数据的变更操作,比如创建删除磁盘镜像、创建合并快照、在存储域之间复制镜像、创建虚拟机模板、块设备存储分配等。一个数据中心只能有一个SPM主机,数据中心中的其它主机对存储域元数据信息只有读权限。

一个主机(计算节点)有两种方式升级为SPM主机:

  • 人为通过管理门户直接将某主机设置为SPM(底层也是通过ovirt-engine下发命令)
  • 由ovirt-engine根据SPM选举机制确定SPM

当ovirt-engine通过上述任意一种方式设置某一主机为SPM时,ovirt-engine将向该主机上的VDSM发送一个spmStart的命令,其将尝试获取一个叫storage-centric的租约。如果成功获取到租约,则该主机就升级为SPM主机并一直持有该storage-centric租约,直到失去SPM角色或该SPM主机因为异常被ovirt-engine移出集群或数据中心。

拥有storage-centric租约的主机(肯定是SPM主机)对存储域元数据具有”写“权限。

该租约之所以被命名为storage-centric是因为该租约是直接被写入到主存储域(Master Storage Domain)上的一个特殊的名字叫leases的逻辑卷上(假设底层存储为块存储,文件存储则是写到一个名为leases的文件)。

主存储域(Master Storage Domain)简称马上到!,VDSM会把数据中心中第一个被创建的存储域(SD)作为马上到!。对于块存储来讲,磁盘镜像等虚拟机相关的元数据都存放在马上到!上。

2.6.2. SPM主机选举机制

当出现以下几种情况时,ovirt-engine将会发起新一轮的SPM主机选举:

  • SPM主机无法访问除了主存储域(马上到!)之外的其它存储域(SD)。
  • SPM主机无法连接至存储域导致租约更新失败。
  • 租约所在的LV空间满导致无法进行任何写操作。
  • SPM主机宕机。
  • 当前的SPM主机没有响应或无法完成正常的任务时。

如果没有主机被手工指定为SPM且出现上述任意一种情况时,ovirt-engine将会启动SPM选举过程:

Step 1: ovirt-engine会要求VDSM确认哪个主机已经拥有“storage-centric租約”。

Step 2: ovirt-engine会跟踪从存储域创建以来的SPM分配记录,并根据如下三个方面来判断主机是否可以作为SPM:

  • “getSPMstatus” 命令:ovirt-engine通过VDSM检查主机的SPM状态。它会返回以下3个状态之一:”SPM”、”Contending”、”Free”。
  • 存储域的元数据卷中包括了最后一个具有SPM身份的主机信息。
  • 存储域的元数据卷中包括了最后一个具有SPM身份的主机版本信息。

Step 3: 如果当前的SPM主机可以正常工作,这个主机就会继续持有“storage-centric租約”,同时ovirt-engine把这个主机标识为SPM,并退出选举过程。

Step 4: 如果当前的SPM主机没有响应,则它会被认为处于“无响应”状态。如果那个主机已经配置了电源管理功能,它会被自动隔离(fence)。如果自动隔离失败,就需要手工隔离;在当前的SPM被隔离前,SPM的角色不能分配给其它主机;如果隔离成功则进行下一步。

Step 5: 当SPM角色和storage-centric租約都空闲时,ovirt-engine会把它们分配给数据中心中的一个SPM权重高的主机,如果所有候选主机的SPM权重都一样,则会随机选取一个主机。分配成功后ovirt-engine会将该该主机标记为SPM并退出选举过程;否则进行下一步。

Step 6: 如果为一个新主机分配SPM角色的操作失败,ovirt-engine会把这个主机加入到一个列表(该列表包括了所有分配SPM角色失败的主机,这个列表中的主机被标记为本轮选举无法成为SPM。这个列表中的内容会在开始下一次进行SPM选举的过程前被清除,从而使这个列表中的主机又有机会成为SPM)。ovirt-engine会一直尝试把SPM角色和storage-centric租約分配给一个主机,直到有一个主机被成功选举为SPM。

2.7. 排他性资源与Sanlock

ovirt虚拟化环境中的一些资源具有排它性,每个排它性资源同时只能被一个线程访问。比如SPM就是一个具有排它性的资源。在一个数据中心中,同时只能有一个主机具有SPM角色,如果数据中心中存在多个具有SPM角色的主机,就会出现同一份数据同时被不同的主机修改的情况,从而造成数据被破坏(脏数据)。

在ovirt-v3.1之前,SPM的排它性是通过VDSM中的一个名为safelease的功能来实现的。这个租約被写到数据中心中的所有存储域中的一个特殊区域中,而数据中心中的所有主机都可以通过它来检查SPM的状态。VDSM的“safelease”的唯一功能就是来维持SPM的排它性。在3.1版本之后ovirt引入了Sanlock来实现资源互斥访问功能,它除了可以锁定SPM外,还可以“锁定”其它资源。因此,Sanlock具有更高的灵活性。

需要进行资源锁定的应用程序可以在Sanlock中进行注册,已经注册的应用程序可以请求Sanlock锁定某个资源,从而使其它程序无法访问被锁定的资源。例如,VDSM可以请求Sanlock锁定SPM资源,而不需要自己锁定它。

每个存储域都有一个lockspace区,锁定状态被记录在lockspace的磁盘中。因为SPM资源只能分配给一个“活跃的”主机,因此Sanlock就需要检查SPM主机是否是“活跃的”。当SPM主机连接到存储域时,它会更新从ovirt-engine获得的hostid,并且会定期在lockspace 中写一个时间戳(timestamp)。ids逻辑卷会记录每个hostid,并在每个主机更新它的hostid时进行相应的更新。Sanlock会根据主机的hostid和时间戳来决定它是否处于“活跃”状态。

资源的使用情况被记录在leases逻辑卷的磁盘中。当磁盘中代表某个资源的数据被更新为带有某个进程的id时,系统就认为该资源被这个进程所占用。具体到SPM角色资源,当它被占用时,它的数据会被更新为SPM主机的hostid。

每个主机上的Sanlock只需要检查资源一次来决定它们是否被占用。在初始的检查后,Sanlock只需要监测lockspaces中的相应主机的时间戳的状态。Sanlock需要监测使用资源的应用程序。对于VDSM,它会监测SPM的状态和hostid。如果主机无法从ovirt-engine重复获得它的 hostid,这个主机就会失去它所占有的、在lockspace中记录的所有资源的排它性。 Sanlock会更新相应的资源记录来标识这些资源不再被占用。

当SPM主机在一定的时间内无法更新存储域的lockspace中的时间戳时,这个主机上的Sanlock会要求VDSM进程释放它所占用的资源。

如果VDSM进程接受了这个请求,它将释放它所占用的资源(即lockspace中的SPM资源就可以被其它主机使用)。

如果SPM主机上的VDSM无法接受释放资源的请求,主机上的Sanlock就会使用kill命令来终止VDSM进程。如果kill命令运行失败,Sanlock会使用sigkill命令来终止VDSM进程。如果sigkill命令仍然无法终止进程,Sanlock将会通过watchdog守护进程来重启Sanlock所在的主机。

每次当主机的VDSM更新它的hostid并更新lockspace中的时间戳时,watchdog守护进程都会收到一个pet。 当VDSM不能进行这些操作时,watchdog守护进程将无法收到pet。如果watchdog守护进程在一定时间内仍然没有收到pet,它将会重启主机。这将保证SPM资源可以被释放,从而可以被其它主机使用。

有关Sanlock的详细原理请参考这里

3. 网络

ovirt虚拟化平台的网络可以从3个方面介绍:基本网络、集群网络和主机网络配置。

  • 基本网络:包括了实现网络功能的基本软件和硬件。
  • 集群网络:包括了集群资源间的网络连接(如主机、逻辑网络和虚拟机)。
  • 主机网络配置:包括了主机(计算节点)所支持的网络配置。

一个有良好设计的网络将会为用户提供一个高性能的网络,并可以顺利实现虚拟机的迁移。而一个没有经过良好设计的网络可能为系统的使用和维护带来许多问题(如网络响应速度太慢、虚拟机迁移和克隆失败等)。

3.1. 基本网络

ovirt虚拟化平台通过使用以下网络元素为虚拟机、主机、虚拟(逻辑)网络提供网络服务:

  • 网卡(NIC)
  • 网桥(Bridge)
  • 网络绑定(Bond)
  • 虚拟网卡(vNIC)
  • 虚拟局域网(VLAN)

网卡,网桥,虚拟网卡使得主机,虚拟机,本地网络,外部网络之间可以相互通信。而Bond与VLAN虽然是可选的网络元素,但它们可以增强网络的安全、性能及容灾能力。

3.1.1. 网络接口控制器(网卡)

网络接口控制器(Network Interface Controller),简写为NIC,通常被称为网卡,它是一个用于将计算机连接至网络的网络适配器。NIC工作在网络层和数据链路层来为所在的机器提供网络连接功能。在ovirt虚拟化环境中的主机都最少需要有一个NIC,但通常情况下主机都会有多个网卡。

一个物理网卡可以有多个虚拟网卡(vNIC)和它相连,而一个虚拟网卡可以看做是一个虚拟机的物理网卡。为了区分虚拟网卡和物理网卡,ovirt-engine会为每个虚拟网卡分配一个独立的MAC地址(在ovirt-engine可以配置MAC地址池)。

3.1.2. 网桥

网桥与NAT的关系?

网桥(bridge)是数据包交换网络中进行数据包转发的软件设备。通过使用网桥,多个网络接口设备可以共享同一个物理网卡的连接,而每个网络接口设备都会以独立的物理设备的形式出现在网络中。网桥会检查一个数据包的源地址来决定相关的目标地址,一旦获得了目标地址的信息,它会在一个表中添加这个地址以供以后使用。通过使用网桥,主机可以把网络数据重新定向到使用虚拟网卡的、相应的虚拟机上。

在ovirt虚拟化环境中,逻辑网络是通过网桥来实现的。一个IP地址会分配给网桥而不是主机本身的物理网络接口,这个IP地址不需要和连接到这个网桥上的虚拟机的网络处于同一个子网中。如果分配给网桥的IP地址和虚拟机处于同一个子网中,网桥所在的主机将可以被虚拟机直接访问,我们通常不推荐在主机上运行可以被虚拟机访问的网络服务。虚拟机通过它们的虚拟网卡连接到逻辑网络中,虚拟机上的每个虚拟网卡都可以通过DHCP或静态分配的方式来获得IP地址。如果有需要,网桥也可以连接到主机以外的系统。

网桥和以太网连接都可以设置自定义属性。VDSM会把网络定义和自定义属性传给设置网络的hook脚本。

3.1.3. Bond

绑定(bond)是由多个网卡组合成的一个单一的、由软件定义的网络设备。因为一个绑定(bond)是由多个网卡组成的,因此它可以提供比单一网卡更高的网络传输速度,并提供了更好的网络容错功能(绑定只有在所有的网卡 都出现问题时才会停止工作)。绑定设备有一个限制:绑定必须由相同型号的网卡组成,同时有些绑定。

绑定设备的数据包传输算法是由绑定的模式所决定的,绑定模式共有7种(mode-0 ~ mode-6),其中mode-1 ~ mode-4支持虚拟机网络(使用网桥)和非虚拟机网络(无网桥);mode-0、mode-5、mode-6只支持非虚拟机网络(无网桥)。

ovirt虚拟化平台默认使用的是mode-4。绑定模式详细介绍请看这里

3.1.4. 虚拟网卡

虚拟网卡是基于主机的物理网卡的虚拟网络接口。每一个主机可以有多个物理网卡,而每个物理网卡可以有多个虚拟网卡。

当我们为虚拟机添加一个虚拟网卡时,ovirt-engine会在虚拟机、虚拟网卡本身和虚拟网卡所基于的主机的物理网卡间创建一定的关联。当虚拟机第一次启动时,libvirt会为虚拟网卡分配一个PCI地址。这样,虚拟机就可以使用MAC地址和PCI地址(如eth0)指定虚拟网卡。

如果虚拟机是通过模板或快照创建的,分配MAC地址以及把这些MAC地址和PCI地址相关联的过程会有所不同。

  • 当模板或快照中已经包括了PCI地址时,通过这个模板或快照所创建的虚拟机上的虚拟网卡的顺序会基于这些PCI地址和MAC地址按顺序分配。
  • 如果模板中没有包括PCI地址,基于这个模板所创建的虚拟机上的虚拟网卡会根据虚拟机网卡的名称来分配新的MAC地址。
  • 如果快照中没有包括PCI地址,ovirt-engine会根据快照来为虚拟网卡分配新的MAC地址。

创建后,虚拟网卡会被添加到网桥设备中。网桥将用来处理虚拟机和虚拟机网络的连接。

在主机上执行ip addr show命令可以显示基于该主机物理网卡所创建网桥等信息,我们还可以用brctl show命令来显示网桥都包括哪些虚拟网卡。

3.1.5. 网络标签(Network Label)

如何理解有用户角色的逻辑网络,它与网络标签的关系是什么?

使用网络标签可以大大简化一些逻辑网络管理的工作,这些管理任务包括创建与管理逻辑网络,以及将这些逻辑网络与物理主机网络接口绑定等。

网络标签就是一个可读性强的纯文本,它的长度没有限制,但它只能包括大小写字母、下划线和分号,但不支持空格和其它特殊字符。它可以与逻辑网络或物理主机网络接口进行关联。

为逻辑网络或主机的物理网络接口加一个网络标签后,它们就可以和有相同网络标签的逻辑网络或主机的物理网络接口以下面的形式相关联:

网络标签关联关系
  • 当您为一个逻辑网络添加了一个网络标签后,这个逻辑网络将会被自动和有相同网络标签的主机物理网络接口相关联。
  • 当您为一个主机的物理网络接口添加了一个网络标签后,具有这个网络标签的所有逻辑网络都会和这个主机的物理网络接口相关联。
  • 修改已经被附加到一个逻辑网络或主机的物理网络接口的网络标签等同于:先删除了网络标签,然后再添加了一个新网络标签。附加了这个网络标签的逻辑网络和主机的物理网络接口之间的关联也会被更新。
网络标签和集群
  • 当一个有网络标签的逻辑网络被添加到一个集群中,它会被自动添加到在这个集群中的具有相同网络标签的主机物理网络接口上。
  • 当一个有网络标签的逻辑网从一个集群中删除后,在这个集群中的具有相同网络标签的主机物理网络接口与这个逻辑网络的关联会被自动取消。
网络标签和有用户角色的逻辑网络
  • 当一个有网络标签的逻辑网络被设为“显示网络”或“迁移网络”时,在主机物理网络接口中它的IP地址分配方式会被设置为DHCP。
  • 当为一个角色网络(如“一个迁移网络”或“一个显示网络”)设置网络标签时,会在所有主机上产生大量部署这个网络的操作。这些大量的网络添加操作是通过使用DHCP实现的,而不是通过输入静态地址实现的。这将节省很多人工工作量。

3.2. 集群网络

集群层的网络对象包括:集群、逻辑网络。常见的集群内网络拓扑图如下:

集群内的网络拓扑图

一个数据中心就是由多个集群组成的一个逻辑组,而一个集群则是由多个主机组成的一个逻辑组。上图中“集群内的网络拓扑图” 展示了一个集群中所包括的项。

在一个集群中的所有主机都可以访问相同的存储域,同时它们也在集群这一层来关联逻辑网络。对于一个虚拟机逻辑网络来说,为了使虚拟机可以使用它,它必须通过ovirt-engine在集群中的所有主机上定义并配置,而对于其它类型的逻辑网络,它们只需要在使用这些网络的主机上定义。

ovirt-engine中的数据中心支持多主机网络配置。当一个网络设置更新后,这个更新后的配置信息会自动应用到这个数据中心中所有分配了这个网络的主机上。

3.2.1. 逻辑网络

逻辑网络使得ovirt虚拟化环境可以根据网络数据类型对不同网络进行隔离。例如,在安装ovirt-engine时默认创建的ovirtmgmt网络则作为处理ovirt-engine和主机(VDSM)间的管理通信网络。一般情况下,具有类似要求和使用情况的多个网络通信可以组成一个逻辑网络。系统管理员通常会创建一个存储网络和一个显示网络来把这两种网络流量分离来,从而提高系统性能,以及便于故障排除。
逻辑网络的类型包括:

  • 用来处理虚拟机网络流量的逻辑网络
  • 不处理虚拟机网络流量的逻辑网络
  • 可选的逻辑网络
  • 必需的逻辑网络

所有逻辑网络都可以设置为“必需的”或“可选的”,二者选一。

逻辑网络在数据中心一级被定义,并被添加到主机上。为了使一个“必需的”逻辑网络可以正常工作,它需要被添加到相应集群中的所有主机上。

ovirt虚拟化环境中的每个虚拟机逻辑网络都必须由一个主机上的一个网桥设备支持。当为一个集群定义了一个新的虚拟机逻辑网络后,在这个集群的所有主机上都需要创建一个匹配的网桥设备,这样,这个新的虚拟机逻辑网络才可以被虚拟机使用。ovirt-engine会自动为虚拟机逻辑网络创建所需要的网桥设备。
ovirt-engine为虚拟机逻辑网络所创建的网桥设备需要和主机上的一个网络接口关联。如果和网桥相关联的主机网络接口已经被其它网络所使用,则新加入的网络接口将同样可以共享那些已经连接到主机网络接口中的网络。当虚拟机被创建并被添加到一个特定的逻辑网中时,它们的虚拟网卡会被添加到那个逻辑网所在的网桥中。这样,虚拟机就可以和连接到相同网桥中的其它设备进行网络通信。

不处理虚拟机网络流量的逻辑网络会和主机的网卡直接进行关联。

典型的逻辑网络拓扑如下图:

典型的逻辑网络拓扑图

Required网络

一个“Required”网络就是一个逻辑网络,它对一个集群中的所有主机都有效。当一个主机上的“Required”网络无法工作时,在它上面运行的虚拟机会被迁移到另外一个主机上,而具体的迁移过程取决于所选择的调度策略。这一点对于运行关键任务服务的虚拟机非常重要,其所依赖的逻辑网络必须设置为“Required”。

请注意,当创建一个逻辑网络创建并加入到集群后,网络类型默认为:“Required”。

Optional网络

除了“Required”网络外,剩下的就是“Optional”网络。Optional网络可以只在需要它的主机上有效。有或没有可选的网络不会影响到一个主机的“Operational”状态。当一个Optional网络无法工作时,使用它的虚拟机不会被迁移到另一个主机上。

虚拟机网络(VM network)

虚拟机网络是那些只处理虚拟机网络流量的逻辑网络。虚拟机网络可以是Required,也可以是Optional。使用一个Optional虚拟机网络的虚拟机只会在带有这个网络的主机上启动。

端口镜像(port mirroring)

端口镜像会把指定逻辑网络和主机上的第3层网络流量复制到一个虚拟机的虚拟网络接口上。这样,通过这个虚拟机就可以进行网络纠错、网络优化、网络入侵检测以及对在同一个主机和逻辑网络中运行的虚拟机进行监控。

端口镜像只复制一个主机和一个逻辑网络内部的网络数据,它不会增加这个主机以外的网络流量。但是,启用了端口镜像功能的主机会比其它主机消耗更多CPU和内存资源。

端口镜像可以通过逻辑网络的vNIC配置集被启用或禁用,但它具有以下的限制:

  • 不支持对在配置集中启用了端口镜像功能的vNIC进行“热插”。
  • 当vNIC配置集被附加到一个虚拟机时,端口镜像功能就无法改变。

鉴于以上限制,我们经常使用一个额外的专用的vNIC配置集,然后在其上启用端口镜像功能。

3.3. 主机网络配置

主机上常见网络配置类型包括:

  • 网桥和网卡配置。
  • 网桥、VLAN和网卡配置。
  • 网桥、网络绑定和VLAN配置。
  • 多网桥、多VLAN和网卡配置。

网桥配置

在ovirt虚拟化环境中最简单的配置为“网桥 + 网卡”的配置,如下图。它通过网桥将一个或多个虚拟机连接至主机的物理网卡。

网桥与网卡配置

这种配置的一个实例就是安装ovirt-engine时自动创建的ovirtmgmt网桥。在安装的过程中,ovirt-engine在主机上安装 VDSM,VDSM的安装过程中会创建ovirtmgmt网桥。ovirtmgmt网桥可以获得主机的IP地址来实现主机的管理网络功能。

VLAN配置

下图展示了基于VLAN的另一种可选配置:

基于VLAN的网桥与网卡配置

通过使用VLAN为这个网络中的数据传输提供了一个安全的通道。另外,使用多个VLAN还可以实现把多个网桥连接到一个网卡的功能。

网桥与Bond配置

下图所显示的配置中包括一个网络Bond,多个主机网卡通过Bond和同一个网桥和网络进行连接。

基于Bond的网桥与网卡配置

通过Bond创建了一个逻辑连接来把两个(或更多)物理网卡(NIC)连接起来。这种配置可以提供网卡容错、增加网络带宽等特性,具体取决于所配置的bond-mode。

多网桥、多VLAN与单网卡配置

下图所显示的配置把一个网卡连接到两个VLAN(这需要网络交换机的配合,相应的上联口需要配置为trunk模式)。主机使用两个独立的vNIC来分别处理两个VLAN网络数据,而每个VLAN会通过vNIC连接到不同的网桥中。在此基础上,每个网桥可以被多个虚拟机使用。

多网桥+多VLAN+单网卡配置

多网桥、多VLAN与单Bond配置

下图所显示的使用多个网卡组成一个Bond设备来连接到多个VLAN的配置视图。

多网桥+多VLAN+单Bond配置

这个配置中的VLAN通过Bond设备和网卡进行连接。每个VLAN连接到不同的网桥,每个网桥可以连接一个或多个虚拟机。

4. 电源管理

4.1. 电源管理和隔离介绍

当设置了电源管理和隔离(fence)功能后,ovirt虚拟化环境将会提供更好的灵活性和稳定性。电源管理功能将可以使ovirt-engine控制主机的电源操作,其中最重要的一点是可以在主机出现故障时重新启动主机。

隔离功能主要用于把出现故障的主机从ovirt虚拟化环境中分离出来,从而使整个虚拟化环境正常运行。当被隔离的主机的故障被排除后,它可以重新返回正常工作的状态,并被重新加入到原来的虚拟环境中。

电源管理和隔离功能需要使用独立于操作系统的专用硬件来实现。ovirt-engine使用电源管理设备的IP地址或主机名来访问它。在ovirt虚拟化环境中,电源管理设备和隔离设备是相同的。

4.2. 在ovirt虚拟化环境中使用代理进行电源管理

ovirt-engine不直接和隔离设备进行通讯,它使用一个代理来向主机的电源管理设备发送电源管理命令。ovirt-engine需要使用VDSM来操作电源管理设备,因此环境中还需要另外一个主机作为隔离代理。

我们可以选择:

  • 需要隔离功能的主机所在的同一个集群中的任何主机。
  • 需要隔离功能的主机所在的同一个数据中心中的任何主机。

隔离代理主机的状态有两种:Up和Maintenance。

4.3. 电源管理

ovirt-engine可以重启那些处于“无法正常工作(non-operational)”或“无响应(non-responsive)”状态的主机;或为省电关闭那些有低利用率的主机,但这些操作需要电源管理设备被正确配置。

ovirt虚拟化环境支持以下电源管理设备:

  • American Power Conversion(apc)。
  • Bladecenter。
  • Cisco Unified Computing System(cisco_ucs)。
  • Dell Remote Access Card 5(drac5)。
  • Dell Remote Access Card 7(drac7)。
  • Electronic Power Switch(eps)。
  • HP BladeSystem(hpblade)。
  • Integrated Lights Out(ilo、ilo2、ilo3、ilo4)。
  • Intelligent Platform Management Interface(ipmilan)。
  • Remote Supervisor Adapter(rsa)。
  • Fujitsu-Siemens RSB (rsb)
  • Western Telematic, Inc(wti)。

apc隔离代理不支持APC 5.x电源管理设备,我们需要使用apc_snmp隔离代理。

ovirt-engine使用隔离代理(fence agent)来和电源管理设备进行交流,系统管理员可以使用ovirt-engine配置电源管理的隔离代理(使用电源管理设备支持的参数)。对于简单的配置项可以通过系统提供的图形用户界面进行,而特殊的配置选项(只适用于特定隔离设备的选项)也可以通过这个界面被输入,但系统不会对它们进行任何处理,而直接把这些配置选项传递给隔离设备。

所有电源管理设备所支持的配置操作包括:

  • Status:检查主机的状态。
  • Start:启动主机。
  • Stop:关闭主机。
  • Restart:重启主机(实际上是通过执行 stop、wait、status、start、wait、status 操作实现的)。

作为一个最佳的实践规则,我们需要在初始化配置完成后马上测试电源管理功能,并定期对运行环境中的电源管理功能进行测试。

一个稳定的系统需要在环境中的所有主机上正确地配置电源管理设备。在出现问题的主机上,ovirt-engine可以使用隔离代理跳过操作系统来直接和主机上的电源管理设备直接进行交流,并通过重启主机来把有问题的主机从虚拟化环境中隔离。如果被隔离的主机上有运行着开启高可用特性的虚拟机,ovirt-engine可以安全地把这些高可用性虚拟机迁移到其它主机上;如果被隔离的主机是SPM,ovirt-engine可以把SPM角色分配给其它主机。

4.4. 隔离

在ovirt虚拟化环境中,隔离操作(fencing)就是由ovirt-engine通过使用隔离代理发起的、由电源管理设备负责执行的主机重启操作。隔离操作可以使集群对意料外的主机故障做出相应的响应;或根据预先设定的规则实现省电、负载均衡、虚拟机可用性策略等功能。

隔离功能可以保证SPM角色只属于一个正常工作的主机。如果被隔离的主机是SPM,这个SPM角色会被系统收回并分配给另外一台正常工作的主机。因为拥有SPM角色的主机是唯一一个可以修改数据域结构元数据的主机,所以如果作为SPM的主机没有配置隔离功能,当它出现故障时,环境中的所有需要修改数据域元数据的操作(如创建和销毁虚拟磁盘、进行快照、扩展逻辑卷等)都将无法进行。

当一个主机处于“无响应”状态时,在它上面运行的所有虚拟机也会处于“无响应”状态,而虚拟机对虚拟磁盘镜像操作所留下的“锁定”记录仍然会保留在主机上。这时,如果没有使用隔离功能,而直接在其它主机上重启那些无响应的虚拟机,并且对虚拟机有写操作权限时,虚拟机原来的磁盘镜像中的数据可能会被破坏。

使用隔离功能可以避免这个问题的出现。当主机被重启后,以前的”锁定“记录会被释放。ovirt-engine会使用一个隔离代理来确认出现问题的主机是否已经被重启。当ovirt-engine收到了主机已经重启成功的确认后,就可以在其它主机上重启这些虚拟机(它们之前运行在出现问题被隔离的主机上),而不会造成数据的破坏。隔离是实现高可用性虚拟机的基础,没有这个功能,高可用性虚拟机将无法在其它主机上运行。

当一个主机无响应时,ovirt-engine会等待30秒,然后再决定是否进行其它操作,这可以避免因为主机的临时性错误所可能引起的不必要的隔离操作。当等待超时后,主机仍然没有响应,ovirt-engine就会自动启动隔离操作。ovirt-engine使用电源管理设备的隔离代理来停止主机的运行;在确认主机已经停止后,再次启动主机,并确认主机已经被成功启动。当主机启动完成后,它会尝试重新加入到原来的集群中。如果主机的故障在启动后已被解决,它的状态会变为Up,并可以继续正常运行虚拟机。

4.5. Soft-Fencing主机

有些时候,一个主机会因为无法预见的问题造成它处于无响应状态。此时尽管VDSM对所做出的请求无法响应,但依赖于VDSM的虚拟机仍然可以被访问。在这种情况下,重新启动VDSM就可能解决这个问题。

“SSH Soft Fencing”是ovirt-engine试图通过SSH在一个没有响应的主机上重启VDSM的过程。如果ovirt-engine无法通过SSH重启VDSM,而且配置了外部的隔离代理,则隔离操作将由外部的隔离代理进行处理。

要使用soft-fencing over SSH功能,主机必须配置并启用了隔离,一个有效的代理主机(数据中心中的另外一个主机,它的状态是UP)必须存在。当ovirt-engine和主机的连接出现超时情况时,会发生以下事件:

  • 在网络出现第一次失败时,主机的状态变为”connecting”。
  • 然后ovirt-engine会尝试向VDSM询问状态(尝试3次),或根据主机的负载等待一段时间,这个等待的时间是通过以下公式计算的:

TimeoutToResetVdsInSeconds(默认值是 60 秒)+ [DelayResetPerVmInSeconds(默认值是 0.5 秒)](在主机上运行的虚拟机的数量)+ [DelayResetForSpmInSeconds(默认值是 20 秒)] 1(如果主机是 SPM)或 0(如果主机不是 SPM)。
为了留给VDSM尽量多的超时等待时间,ovirt-engine会选择以上两个操作所需的最长时间。

  • 如果过了最大的等待时间后主机还没有响应,ovirt-engine会通过SSH在目标主机上执行vdsm restart命令。
  • 如果vdsm restart命令无法执行或执行失败,主机的状态将会变为NonResponsive,如果配置了电源管理,外部的隔离代理将会进行相应的硬件隔离操作。

Soft-fencing over SSH可以在没有配置电源管理的主机上运行。这和通用的硬件隔离(fencing)有所不同:常见的硬件隔离只能在配置了电源管理的主机上运行。

4.6. 使用多个电源管理隔离代理

单一的隔离代理都会被看做为“主要的”代理。“次要的”隔离代理只有在有第二个代理存在时才有效,而多个代理可以是同一个类型,也可以是不同的类型。

如果一个主机上只有一个隔离代理,当这个代理出现问题时,主机在被手动重启前将会一直出于“无响应”的状态,而在它上面运行的虚拟机也将处于停止的状态。只有当主机被人工隔离后,这些虚拟机才会被迁移到另外的主机上运行。而如果一个主机上使用了多个隔离代理,当一个代理失败时,其它的代理就可以被使用,这样就可以提高隔离功能的稳定性。

当在主机上定义了两个代理时,这两个代理可以配置为并行(concurrent)或顺序(sequential):

  • 并行(Concurrent):要停止主机,主代理和从代理都需要响应ovirt-engine的Stop命令;要启动主机,只需要一个代理响应Start命令。
  • 顺序(Sequential):要停止或启动一个主机,主代理会优先启用,如果主代理失效,则从代理才会启用。

5. 负载均衡、调度和迁移

与调度相关的源码都在:<ovirt-engine源码库根目录>/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling这个包下面。

一个单独主机所具有的硬件资源总是有限的,同时这些硬件资源也会出现故障。要解决这些问题,我们可以把多个主机组成一个集群来,这样就可以在不同的主机间共享资源。ovirt虚拟化环境使用负载均衡策略、调度和迁移机制来协调主机资源,这样就可以应对各种资源需求的变化。ovirt-engine可以保证一个集群中的所有虚拟机不会都运行在同一个主机上;另外,如果集群中出现某个主机的利用率非常低的话,ovirt-engine还会把这个主机上面的所有虚拟机迁移到其它主机上,从而可以关闭这个低利用率的主机来达到省电节能的目的。

当发生以下三个事件时,系统会检查环境中的可用资源:

  • 启动虚拟机:系统会检查环境中的主机资源,并决定在哪个主机上运行这个虚拟机。
  • 迁移虚拟机:系统会检查环境中的主机资源,并决定把虚拟机迁移到哪个主机上。
  • 间隔一定时间:系统会定期检查环境中的主机资源,并决定每个主机是否符合预先设定的集群负载均衡策略。

当有效资源出现变化时,ovirt-engine会根据集群的负载均衡策略来调度虚拟机迁移操作。下面会对负载均衡策略、调度和虚拟机迁移做详细的介绍。

5.1. 负载均衡策略

负载均衡策略是针对集群设置的。集群由一个或多个可以带有不同硬件参数和可用内存的主机组成,ovirt-engine会根据集群的负载均衡策略来决定在集群中的哪个主机上运行虚拟机。另外,负载均衡策略还指定了ovirt-engine会在什么情况下把过高利用率主机上的虚拟机迁移到其它主机。
数据中心的每个集群每隔1分钟会进行一次负载均衡处理。它会根据系统管理员预先为集群设定的负载均衡策略来决定哪些主机处于过度利用的状态;哪些主机的资源没有被充分利用;哪些主机仍有足够的资源用来运行从其它主机上迁移过来的虚拟机。负载均衡策略选项包括:VM_Evenly_Distributed、Evenly_Distributed、Power_Saving、None、Cluster_Maintenance。

5.1.1. 负载均衡策略:虚拟机均匀分布(VM_Evenly_Distributed)

使用这个策略的集群会把需要运行的虚拟机根据数量平均运行在集群中的每个主机上。

系统管理员需要设置每个主机上最多可运行多少台虚拟机,如果某个主机上所运行的虚拟机数量超过了这个最大值,这个主机就被识别为过载(overload)。另外,系统管理员还需要设置一个参数来指定最高利用率主机上所运行的虚拟机数量和最低利用率主机上所运行的虚拟机数量间的最大差值。

以上的2个值决定了“虚拟机迁移阈值(threshold)”的范围。当集群中的每个主机上所运行的虚拟机数据都在这个阈值范围内时,系统认为集群处于“负载均衡”的状态。

除此之外,因为作为SPM的主机通常需要有较低的虚拟机负载,因此管理员还可以设置在SPM主机上能预留的虚拟机资源的数量,这个值决定了SPM主机可以比其它主机少运行多少个虚拟机。

当集群中的某个主机上所运行的虚拟机数量超过了配置的最大值(单机可运行的最大虚拟机数量),并且集群中有至少一个主机所运行的虚拟机数量低于“虚拟机迁移阈值”的下限时,这个主机上的一个虚拟机就会被迁移到有最低利用率的主机上。如果迁移一个虚拟机后集群还没有处于“负载均衡”状态,系统会重复以上过程来迁移另外一个虚拟机,直到这个集群达到了“负载均衡”状态。

5.1.2. 负载均衡策略:均匀分布(Evenly_Distributed)

Evenly_Distributed

Evenly_Distributed这个策略是指:ovirt-engine通过选择CPU的负载最低或可用内存量最大的主机来运行一个新的虚拟机的策略。具体选择哪个指标(CPU负载或内存可用量)及指标的值,则由该策略的配置参数决定。

另外系统还可以设置一个时间值参数,这个参数的意思是说集群中的主机的最大CPU负载或最低内存可用量能够持续的最大时间值。如果主机CPU或内存最在负载持续时间超过这个阈值,则ovirt-engine将发起虚拟迁移任务,这个主机上的一个虚拟机会被迁移到集群中的CPU或内存利用率最低的一个主机上。如果迁移完成后,原来的主机的CPU和内存利用率仍然高于所限定的值,则重复以上步骤迁移它上面的另外一台主机,直到主机的CPU和内存利用率降到所限制的范围之内。主机资源检测任务一分钟执行一次。

Evenly_Distributed策略与VM_Evenly_Distributed策略的区别是:前者基于CPU或内存利用率作为迁移的触发参考条件,而后者则以运行在主机上的虚拟机数量作为迁移的触发参考条件。

5.1.3. 负载均衡策略:节能(Power_Saving)

Power_Saving

这个策略会把新虚拟机运行在CPU和内存利用率最低的主机上。

系统管理员可以设置一个“最大服务级别”值,这个值代表了集群中的主机所允许的最大CPU和内存利用率,如果主机的CPU和内存利用率超过了这个值,整个环境的性能就会下降。

系统管理员还可以设置一个“最低服务级别”值,它代表了在主机的 CPU和内存利用率低于这个值时,从用电的角度来讲,继续运行这个主机将会被判断为是不符合“经济效益”的。

另外,系统管理员还需要为“最大服务级别”和“最低服务级别”设置一个时间值,它指定了主机的CPU和内存利用率低于“最低服务级别”值(或高于“最大服务级别”值)多长时间后,ovirt-engine才会对主机采取行动来解决这个不符合“经济效益”的问题。

当一个主机的CPU和内存利用率高于“最大服务级别”值,并且处于这个状态的时间超过了所设定的时间值时,这个主机上的一个虚拟机会被迁移到集群中的CPU和内存利用率最低的一个主机上。如果迁移完成后,原来主机的CPU和内存利用率仍然高于所限定的值,则重复以上步骤迁移它上面的另外一台主机,直到主机的CPU和内存利用率降到所限制的范围之内。

当一个主机的CPU和内存利用率低于“最低服务级别”值,并且处于这个状态的时间超过了所设定的时间值时,这个主机上的所有虚拟机会在“最大服务级别”条件许可的情况下迁移到集群中的其它主机上。然后,ovirt-engine会自动关闭这台主机。如果系统在以后的某个时间需要更多的主机资源时,这个被关闭的主机会被重新启动(配合电源管理实现)。

5.1.4. 负载均衡策略:None

如果没有选择任何负载均衡策略,新的虚拟机会在集群中的一个有可用内存,而且CPU利用率最低的主机上运行。其中的CPU利用率是通过一个算法对虚拟CPU的数量和CPU使用情况进行计算后得出的。如果选择使用这个选项,系统只有在要运行新虚拟机时才进行主机选择。另外,在主机负载增加时,系统也不会自动迁移虚拟机。

如果需要进行虚拟机迁移,系统管理员需要决定虚拟机要被迁移到哪台主机。另外,还可以使用固定 (pinning)功能把虚拟机和某个主机相关联。使用固定功能可以防止虚拟机被自动迁移到其它主机。对于需要消耗大量硬件资源的环境,手工迁移是最好的选择。

5.1.5. 负载均衡策略:Cluster_Maintenance

这个策略会限制集群内的一些活动(任务)。在这种策略下:

  • 除了启用HA特性的虚拟机外,将不会在该集群中的任意一台主机上启动虚拟机。(即:用户可以创建具有HA特性的虚拟机并人为启动该虚拟机)
  • 当主机异常时,具有HA特性的虚拟机将会重启,同时也能够迁移原来运行在该主机上的虚拟机。

5.2. 高可用性虚拟机资源预留

功能示意图

具有高可用性(HA)虚拟机资源预留策略可以使ovirt-engine监控集群资源的使用情况,从而可以保证在需要的时候为高可以性虚拟机提供有效的资源。ovirt-engine可以把虚拟机标识为“高可用性”,在需要的时候,这些虚拟机可以在其它主机上重启。在高可用性虚拟机资源预留功能被启用时,ovirt-engine会为高可用性虚拟机预留一些资源,以防在主机故障的情况下,这些高可用虚拟机需要进行迁移时,能保证集群中有足够的资源来完成迁移操作。

5.3. 调度机制

在ovirt虚拟化环境中,调度(scheduling)是指ovirt-engine在集群中选择一个主机作为新虚拟机或将要迁移的虚拟机的目标主机(宿主机)的过程。

作为一个可以运行新虚拟机或从其它主机上迁移来的虚拟机的主机,它需要有足够的空闲内存和CPU资源来运行这些虚拟机。需要注意的是虚拟机是无法在CPU过载的主机上启动的。默认情况下,主机的CPU利用率在5分钟内都维持在80%以上的话,该主机就会被标识为CPU过载。5分钟与80%这两个参数是可以在管理界面上进行修改的。如果有多个主机都满足这个要求,系统会根据集群负载均衡策略来选择一个主机。例如,如果使用“Evenly_Distributed”策略,ovirt-engine会选择有最低CPU利用率的主机。如果使用“Power_Saving”策略,在“最大服务级别”和“最低服务级别”范围内的、CPU利用率最低的主机会被选择。另外,SPM的状态也会影响主机的选择过程。一个非SPM主机比SPM主机有更大的概率被选中。例如,如果集群中有SPM主机和非SPM主机,第一个需要在集群中运行的虚拟机会在非SPM主机上运行。

5.4. 迁移

ovirt-engine使用迁移来实现集群的负载均衡策略,当集群中的主机负载处于一定状态时(超过最大值或低于最小值),虚拟机迁移操作就会被执行,从而可以保证主机负载满足集群的负载均衡策略。另外,虚拟机迁移操作还可以被设置为当主机被隔离(fence)或被设置为维护模式时自动进行。当需要进行迁移时,ovirt-engine会首先迁移CPU利用率最低的虚拟机(CPU利用率是一个百分比值,在计算这个值时不会考虑内存和I/O的使用情况,除非I/O操作会影响到CPU利用率)。当有多个虚拟机的CPU利用率相同时,ovirt-engine将根据SQL查询结果的列表顺序来决定第一个被迁移的虚拟机。

在默认情况下,虚拟机迁移有以下限制:

  • 每个虚拟机迁移的网络带宽被限制在52MBps(megabyte每秒)
  • 迁移有超时限制,超时的计算方法是:虚拟机内存的大小(以GB为单位)乘以64秒。
  • 如果迁移进程无任何响应(无任何进展)的时间达超过240秒,迁移也将终止。
  • 允许同时进行迁移的虚拟机数量被限制为:每个主机上的CPU内核数量,但最多不能超过2个。

6. 虚拟机快照、模板与虚拟机池

6.1. 虚拟机快照

快照就是一个存储功能,它允许管理员为一个虚拟机的操作系统、应用程序和数据在特定时间创建一个恢复点。快照会把虚拟机当前的磁盘镜像保存为一个COW卷,并可以在以后把虚拟机恢复到虚拟机创建快照时的状态。当快照创建完成后,一个新的COW层会在当前层上被创建,快照创建后的所有写操作都会在新的COW层上执行。

虚拟机的硬盘镜像实际上是由一个或多个卷组成的,而从虚拟机的角度来看,这些卷以一个单一的磁盘镜像形式呈现。
“COW卷”和“COW层”是同一个概念,它们可以被相互替代使用,但“层”更贴近于快照的本质。通过快照,管理员可以随时抛弃那些在创建快照后所做的变更,这和许多程序所提供的Undo操作类似。

快照包括 3 个主要操作:

  • 创建:为一个虚拟机创建一个快照。
  • 预览:预览一个快照,决定是否把系统恢复到创建这个快照时的状态。
  • 删除:删除一个不再需要的恢复点(快照)。

6.1.1. 实时快照

其它未正进行克隆或迁移操作的虚拟机都可以执行快照操作,此时的虚拟机的状态可以是运行、暂停或停止状态。

当对一个虚拟机进行实时快照时,ovirt-engine会要求SPM主机创建一个新的卷来给虚拟机使用。当新卷创建好后,ovirt-engine调用VDSM来和运行该虚拟机的主机上的libvirt和qemu进行交互,要求后续对虚拟机的写操作都新卷上进行。如果虚拟机可以在新卷上进行写操作,则认为快照已经成功完成,虚拟机将不再在旧的卷中写数据。如果虚拟机无法在新卷上进行写操作,则认为快照操作失败,新的卷会被删除。

在虚拟机快照开始后,直到快照完成前,虚拟机需要对当前卷和新创建的卷都进行访问,因此这两个卷都需要允许进行读和写操作。

安装了带有静止(quiescing)功能的guest代理的虚拟机可以保证文件系统在不同快照间的一致性。已经创建的Red Hat Enterprise Linux虚拟机可以安装qemu-guest-agent,这样就可以在进行快照前启用静止功能。

如果在进行快照时,虚拟机有支持静止功能的guest代理,VDSM会使用libvirt和代理进行交互来准备快照。 在实际进行快照前,没有完成的写操作会被完成,然后文件系统会被”冻结”。当快照操作完成后,libvirt会把对虚拟机的写操作切换到新的卷上,文件系统被“解冻”,对磁盘的写操作会被恢复。

所有的实时快照都会尝试使用静止功能。如果虚拟机因为没有安装支持静止功能的guest代理而造成快照失败,实时快照会重新运行,但不会使用use-quiescing标志(即不会再尝试使用quiescing特性)。当一个使用了静止功能的文件系统的虚拟机使用快照恢复到以前状态时,虚拟机在启动时不会对文件系统进行检查。如果被恢复的虚拟机上没有使用静止功能,在使用快照恢复系统后,启动虚拟机时就需要对文件系统进行检查。

6.1.2. 创建快照

在ovirt虚拟化环境中,第一次为一个虚拟机创建快照和以后为这个虚拟机创建后续快照的过程不同。虚拟机的第一个快照会保留镜像格式(QCOW2或RAW),它把当前存在的卷作为一个基础镜像(母镜像)。后续的快照只是一个附加的COW层,它只记录当前系统和前一个快照中的变化。
在ovirt虚拟化环境中,一个虚拟机通常使用RAW磁盘镜像(除非在创建时使用了“精简(thin)”镜像,或用户指定使用QCOW2格式)。下图所示,创建的快照会包括虚拟磁盘的镜像,它将作为后续快照的基本镜像。

第一次为VM创建快照

在第一个快照创建以后再创建的快照将只创建一个新的COW卷,这个卷包括了当前系统和前一个快照间的变化。每个新的COW层在开始时都只包括COW元数据,而后续使用和操作虚拟机所产生的变化数据会被添加到这个新的COW层中。如果虚拟机需要修改前一个COW层的数据时,相应的数据会从前一层中读出,并把变化的数据写到新的COW层中。虚拟机在定位数据时会以从最新到最老的顺序在各个COW中查找。

非第一次为VM创建快照

6.1.2. 预览快照

系统管理员可以通过预览以前创建的所有快照来决定把虚拟机恢复到什么状态。

管理员可以在一台虚拟机的所有快照列表中选择一个快照来查看它的内容。如下图“预览快照” 所示,每个快照都被保存为一个COW卷,当它被预览时,这个快照会被复制到一个新的预览层上。虚拟机将会和预览层进行交流,而不是直接访问实际的快照。

在管理员预览快照后,可以使用这个快照来把虚拟机恢复到快照创建时的状态。如果管理员使用快照进行恢复系统后,虚拟机将会被关联到预览层。

在快照预览完成后,管理员可以选择Undo来删除在预览过程中创建的预览层。这时虽然预览层会被删除,原来保存快照的层还会保留。

快照预览

6.1.3. 删除快照

当快照不再需要时,您可以删除它们。删除快照后,您将无法把虚拟机恢复到这些快照所包括的时间点上。删除快照并不一定会获得更多的可用存储空间,而这些快照的数据也不一定会被实际删除。例如,您的虚拟机有5个快照,如果您删除了第3个快照,第3个快照中的数据可能仍然会存在在系统中,因为第4和第5个快照可能会需要这些数据(只有第3个快照中已变更的数据才会被删除,已变更的数据存在于第4个快照或第5个快照)。一般情况下,删除快照通常可以提高虚拟机的性能。

快照删除

快照删除会被作为一个异步的块任务处理,VDSM会为虚拟机在恢复文件中维护一个操作记录,从而使此任务可以被跟踪,即使在进行操作期间VDSM被重启或虚拟机被关闭时任务也可以被跟踪。当操作开始后,正被删除的快照将不能被预览,或作为一个恢复点(即使删除操作失败或被中断)。

活跃的层(可读可写的COW层)被合并到它的上一层的这一个操作可被分为两个阶段:

  • 数据被从活跃层复制到它的上一层,对磁盘的写操作被同时镜像到活跃层和它的上一层。
  • 当镜像中的数据被合并到它的上一层快照中,VDSM把镜像链进行同步后,删除操作就被认为已经完成了。

6.2. 虚拟机模板

ovirt虚拟化环境为管理员提供了两种便捷的虚拟机创建工具:模板 (template)和虚拟机池(pool)。管理员可以通过使用模板来快速创建虚拟机。这个新虚拟机会基于一个已经存在的、并己经被配置好的虚拟机来创建,从而省去了手工安装操作系统和配置系统的步骤。模板功能对于需要创建多个相似虚拟机的环境非常有用。例如,我们需要使用多个虚拟机作为web服务器。我们可以首先在一台虚拟机上安装操作系统、安装web服务器软件并配置系统。然后,基于这个已经配置好的虚拟机创建一个模板。当您需要创建更多虚拟机来作为web服务器时,就可以使用这个模板来创建它们。

要创建一个模板,管理员需要先创建一个虚拟机,在新虚拟机上安装所需的软件包并进行相关的配置。对于即将作为模板的虚拟机来讲,其上面安装与配置的软件、应用、服务是比较通用的,以它作为模板创建的虚拟机基本不需要做太多的配置变更。另外,管理员可以执行一个可选的(但推荐使用)的动作:泛化(generalization)。泛化是指删除那些只与特定系统相关的、在不同的系统上会使用不同值的信息,如系统的用户名、密钥、时区。泛化对定制的配置不会有影响。 Red Hat Enterprise Linux虚拟机使用sys-unconfig进行泛化;Windows虚拟机使用Sysprep进行泛化。

sys-unconfig:请参考https://linux.die.net/man/8/sys-unconfig
sys-prep:请参考Sysprep

当一个准备被用来作为模板的虚拟机配置完成后(如果需要,进行了泛化操作),并被停止运行后,管理员就可以基于这个虚拟机创建一个模板。在模板创建的过程中,模板所用的虚拟磁盘镜像会被复制生成一个只读的镜像。这个只读的镜像就会作为所有基于这个模板所创建的虚拟机的母镜像。换个角度来说,模 板就是一个带有相关虚拟机硬件配置的、自定义的磁盘镜像。通过模板所创建的虚拟机的硬件配置可以再次修改。例如,基于配置了1GB内存的模板所创建的虚拟机的内存可以被配置为2GB。但是,母镜像本身不能被修改,这是因为对模板所做的修改将被影响到所有基于它所创建的全部虚拟机。

当一个模板被创建后,我们就可以使用它来创建多个虚拟机了。使用模板创建虚拟机有两种方式:精简(thin)模式和克隆(Clone)模式,ovirt-engine直接调用VDSM提供的两个不同的接口来实现。

  • 使用克隆模式所创建的虚拟机相当于母镜像完整的且可写的磁盘镜像备份。它的优点是所创建的虚拟机不再依赖模板(在模板不存在的情况下,仍然可以正常运行),而它的缺点则是会使用更多的存储空间。
  • 使用精简模式创建的虚拟机会使用模板中的只读磁盘镜像作为母镜像,同时要求该虚拟机镜像及其所依赖的模板母镜像都位于同一个存储域中。每个虚拟机都会有一个可写的磁盘空间来保存新增和修改的数据。因为所有基于这个模板所创建的虚拟机都共享模板的只读类型的母镜像,所以使用这个模式创建的虚拟机会节省存储空间。另外,因为共享的母磁盘镜像数据会被多次调用,所以它们会被缓存起来,这样就可以进一步提高网络传输效率。

6.3. 虚拟机池

虚拟机池就是一组基于特定模板创建的虚拟机,这些虚拟机可以快速地提供给用户使用。对虚拟机池中的虚拟机的使用权限是在虚拟机池一级来设置的。如果一个用户有对某个虚拟机池的使用权限时,这个用户就有权限使用这个虚拟机池中的任何虚拟机。因为用户每次从虚拟机池中获得的虚拟机可能并不是同一台虚拟机,所以虚拟机池并不适用于用户需要在虚拟机上保存数据的情况。虚拟机池适用于用户把数据保存在中央存储设备中的情况;或不需要存储新数据的情况。当虚拟机池创建完成后,组成这个虚拟机池的虚拟机会被创建,并处于“关闭”状态。当用户需要虚拟机时,虚拟机就会被启动。

虚拟机池可以快速地为用户提供相同的虚拟机(一般是虚拟桌面系统)。当一个有权限使用虚拟机池中的虚拟机的用户请求使用虚拟机时,用户的请求会被放置在一个“请求队列”中,系统会根据用户所提交的请求在“请求队列”中的位置来为用户分配一个可用的虚拟机。

当前的ovirt-engine版本(>=4.2)中,虚拟机池支持有状态与无状态两种类型。

  • 有状态的虚拟机池:它的有状态并不是指池中的虚拟机是与某一个具体用户有关联关系,而是指用户A对虚拟机1所做的操作数据将会保存,当用户B向池中申请虚拟机时,ovirt-engine是可能会将用户A曾经使用过的虚拟机1分配给用户B的,此时用户B将会看到用户A在虚拟机1上的操作结果。很少会使用这种有状态的虚拟机池。

  • 无状态的虚拟机池:虚拟机池中的虚拟机不具有数据持久性,这意味着每次用户使用虚拟机池中的虚拟机时,这个虚拟机都处于它的基本状态,而用户上次使用虚拟机时对虚拟机所做的更改不会被保留。这类虚拟机池适用于用户的数据被存储在一个中央存储的情况。

虚拟机池是通过模板创建的。池中的每个虚拟机都共享一个只读磁盘镜像,并使用一个临时的可写镜像用于保存虚拟机操作过程中可能需要持久化的数据。无状态的虚拟机池中的虚拟机和其它虚拟机不同,用户在使用它们时所产生的数据变化会在关闭虚拟机时被删除。这意味着虚拟机池所使用的存储较小(它只需要和模板相同的空间,再加上一些用来临时存储用户使用数据的存储空间)。使用虚拟机池来提供虚拟机比为用户提供单独虚拟机要节省更多的存储空间。