【Ovirt 笔记】 Node/Engine 结构

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

Ovirt 简介

  • Ovirt 是一个基于 x86 架构上的 KVM 虚拟化技术的开源 IaaS 云服务解决方案。
  • 在架构设计上它使用了 Node/Engine 分离结构,以方便功能的划分与管理。
    • 节点端 ovirt-node,由 fedaro 16 订制而成。也可以在 Linux 系统上安装 vdsm 服务从而得到一个 Node。
    • 管理端 overt-engine 类似于 vmwarevcenter,基于 web 页面。
  • Ovirt 的目的是提供一套符合市场规范的 KVM 虚拟化管理软件,尽可能的开发和利用 KVM 的特点。

虚拟化

  • 虚拟化是一种技术,主要包含有 cpu/io/内存/网络 等虚拟化。

    • 在 x86 平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫做 Hypervisor
    • 虚拟机监控器的运行环境,也就是真实的物理机平台,称之为宿主机。
    • 而虚拟出来的平台通常称为客户机,里面运行的操作系统对应地也称为客户机操作系统。
    • 虚拟机监控器的主要职能是管理真实的物理硬件平台,并为每个虚拟客户机提供对应的虚拟硬件平台。
  • 实现虚拟化的重要一步在于虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重定向到虚拟资源池中。

    • " 截获并重定向 " 的实现方式为软件虚拟化和硬件虚拟化。
      • 软件虚拟化是纯软件的方法在现有的物理平台上实现对物理平台访问的截获和模拟。
        • qemu 是纯软件仿真,所有的指令都是软件模拟执行。
        • vmware 是动态二进制翻译,虚拟机监控器在可控制的范围内,允许客户机的指令在物理机平台上直接运行。但是,客户机指令在运行前会被虚拟机监控器扫描,其中突破虚拟机监控器限制的指令会被动态替换为可以在物理平台上直接运行的安全指令。
      • 硬件虚拟化是物理平台本身提供了对特殊指令的截获和重定向的硬件支持。
        • VMM 将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给 VMM。
  • 虚拟化模型的底层是整个物理系统,主要包括处理器、内存和输入输出设备。物理系统之上,与以往熟悉的操作系统模型不同,运行的是虚拟机监控器。

  • 虚拟化类型

    • 第一种,虚拟机是在系统上电之后首先加载运行 VMM。一般会提供一个具有一定特权的特殊虚拟机,由这个特殊虚拟机来运行需要提供给用户日常操作和管理使用的操作系统环境。(ESX/ESXi、Xen、Hyper-V)
    • 第二种,虚拟机监控程序,在系统上电之后仍然运行一般意义上的操作系统(俗称的宿主机操作系统)。MM作为特殊的应用程序,可以视作操作系统功能的扩展。(KVM、Virtual Box、VMware Workstation)
  • 虚拟化软件有 kvm/xen/lxc 等。

    • KVM(Kernel-based Virtual Machine) 是集成到 Linux 内核的 Hypervisor,是 X86 架构且硬件支持虚拟化技术(IntelVT 或 AMD-V)的 Linux 的全虚拟化解决方案。
      • 是 Linux kernel 的一个模块,利用 Linux 做大量的事,如任务调度、内存管理与硬件设备交互等。
      • 可以用命令 modprobe 去加载 KVM 模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去作事情,还必须有一个运行在用户空间的工具才行。这个用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 qemu
      • KVM 使用了 qemu 的一部分,并稍加改造,就成了可控制 KVM 的用户空间工具。KVM 是内核中对 CPU 的虚拟化,qemu 实现对其他设备的虚拟化,合并成为 qemu-kvm,支持全虚拟化。
      • KVM 打开并初始化系统硬件以支持虚拟机的运行。
        • 在被内载加载的时候,KVM 模块会先初始化内部的数据结构。
        • 做好准备之后,KVM 模块检测系统当前的 CPU,然后打开 CPU 控制寄存器 CR4 中的虚拟化模式开关。
        • 通过执行 VMXON 指令将宿主操作系统(包括 KVM 模块本身)置于虚拟化模式中的根模式。
        • 最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的命令(qemu)。
        • 虚拟机的创建和运行将是一个用户空间的应用程序 qemu 和 KVM 模块相互配合的过程。
    • qemu 是一套由 Fabrice Bellard 所编写的模拟处理器的自由软件。
      • qemu 本身可以不依赖于 KVM,但是如果有 KVM 的存在并且硬件(处理器)支持比如 Intel VT 功能,那么 qemu 在对处理器虚拟化这一块可以利用 KVM 提供的功能来提升性能。
    • xen 是直接运行在裸机上的虚拟化管理程序,所以它支持半虚拟化和全虚拟化。
    • lxc Linux Container 容器是一种内核虚拟化技术。
  • libvirt 是一套免费、开源的支持 Linux 下主流虚拟化工具的 C 函数库。主要用于提高硬件资源的利用率、提高运维、管理的效率。

    • libvirt 操作和管理 KVM 虚机的虚拟化 API,可以由 Python、Ruby、Perl、PHP、Java 等语言调用。可以操作包括 KVM、vmware、XEN、Hyper-v、LXC 等在内的多种 Hypervisor。
    • 主要由三个部分组成:API 库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。
  • OvirtOpen Stack

    • Ovirt 是提供私有云,Open Stack 都有。
    • Ovirt 是面向 KVM 的,虽然由于其支持 libvirt,理论上还支持 xen 和 virtualbox,但是目前社区内默认其主要针对 KVM,可以充分的利用 KVM 的特性。Open Stack 是面向多种系统来实现一整套数据中心方案。在对 KVM 的支持上,Open stack 不如 Ovirt。
    • Ovirt 部署简单,直接 rpm 包安装或者用定制化的 iso 安装即可。
    • Open Stack 采用了模块化,可以各个模块分开部署,方便第三方的定制和独立开发,具有标准的 API 接口。

Ovirt 的逻辑结构

【Ovirt 笔记】 Node/Engine 结构_第1张图片
Ovirt 逻辑结构图
  • 用户(管理员和用户)
    • 系统管理员通过网页可以创建、修改虚拟机及相关设备或用户权限。
    • 用户在拥有权限的情况下可以操作自己的虚拟机,并通过 VNC 或 SSH 登陆自己的虚拟机。
  • Engine
    • 提供内建的网页服务供用户和系统管理员使用。
    • 在整个系统中充当管理者的角色并对外提供管理服务,它挂载了自己的数据库记录整个系统中所有的虚拟机配置,各个节点的自身状态,系统的网络状态,存储器状态。
    • 管理的逻辑,状态及策略全部在 Engine 中设置与实现。
    • 向外提供 REST API 接口,用户可以调用这些 API 进行第三方程序的开发。
      • engine-Cli 命令行 API 使用的就是 REST API。
  • Node
    • 只负责功能上的实现,不进行任何状态的记录和任何策略的实现。
    • 仅仅负责实现虚拟机器与设备的创建与修改,资源的共享与保护,如何使用这些功能交给 Engine 处理。
    • 暴露基于网络的 XMLRPC API 与 Engine 交互。
    • Engine 通过这些接口控制各个 Node 上功能的使用。
    • Node 可以由一个普通的 Linux 上安装 VDSM(Virtual Desktop Server Manager 虚拟桌面服务管理)构成,也可以由一个专为 Ovirt 定制的 Linux 系统构成。
    • 在定制的情况下,Node 上的许多文件系统都是 ramdisk(基于内存的 Linux 磁盘设备),系统重启后其中的内容消失,从而保证了 Node 的无状态性。

VDSM 对存储器的管理

【Ovirt 笔记】 Node/Engine 结构_第2张图片
Node 上运行的主要组件
  • 每一个 Node 上都会运行一个 VDSM,实现网络、存储器、虚拟机的创建与修改的功能。
  • VDSM 的大部分代码实现用在了存储系统上,其功能包括数据的组织,集群下的数据共享与保护,故障恢复。
  • 通常情况下每一个物理机器当作一个 Node,运行一个 VDSM,Node 本身只携带少量存储器用以保存配置。
  • 一个集群中通常有一个 Engine 和数个 Node,这些 Node 通过网络连接到 SAN(Storage Area Network 存储区域网络)上,VDSM 把 Node 上运行的虚拟机存储数据保存在 SAN 上,Node 本身为无状态的节点,重新启动后状态消失,从而保证了系统整体的可用性,一般情况下不会因用户的操作而使 Node 失效。
  • 一旦问题发生,通常一次重启既可恢复工作状态。

VDSM 的功能

  • 负责 Node 的自动启动与注册。
  • 虚拟机的操作与生命周期管理。
  • 网络管理。
  • 存储管理。
  • Host 与 VM(Virtual Machine 虚拟机)状态监视与报告。
  • 提供对虚拟机的外部干涉功能。
  • 提供内存与存储的合并与超支功能(Over Commitment)。

Storage Domain(存储域)

  • 是 VDSM 中的最基本存储实体,简称 SD。
  • 所有的 virtual image 和 virtual image 对应的元数据都会保存在其中。
    • virtual image 表示的是虚拟机程序用到的虚拟磁盘数据,特指虚拟机程序最终能够操作的文件或设备文件对象。)
    • 元数据是描述 virtual image 相关数据大小、状态、锁等内容的一组数据集合。
  • Storage Domain 包括两种类型
    • File Domain 使用文件系统存储数据并同步操作,主要针对 NFS(Network File System)和 LOCALFS(Local File System)本地文件系统。
      • 在文件系统的帮助下,File Domain 拥有良好的 virtual image 操作能力,每一个虚拟机的存储数据(称为 Volume)和对应的元数据都以文件的方式保存。
      • 每一个 Domain 实际对应于 Host 文件系统上的一个目录,针对 NFS 文件系统 VDSM 还有额外的逻辑来处理相关意外与错误情况。
    • Block Domain 直接操作原始的块数据,使用 Linux 的 LVM(Logical Volume Manager 逻辑卷管理器) 功能来组织数据,主要针对 iSCSI(Internet Small Computer System Interface),FCoE(Fibre Channel over Ethernet )等块设备。
      • 目标设备上通常没有一个文件系统来保证访问的安全性,VDSM 使用了邮箱机制来保证任意时刻,只有一个 Node 可以修改 Block 上的内容,而其他 Node 则通过 Socket 邮箱发送自己的修改请求(Request Mail)。
      • 通常设备将使用 Linux 的 device mapper 机制进行一次映射,每一个 Domain 实际上是一个 Linux 中的 Volume Group,元数据保存在其中的一个 Logic Volume 及其 tag 上,虚拟机的 Volume 保存在另一个 Logic Volume 中。
      • 操作请求速度和监视功能都会比 File Domain 弱一些。

Storage Pool(存储池)

  • 简称 SP,是一组 SD 的组合,目标是管理跨越 SD 之间的操作,SD 之间互相的引用、备份、恢复,合并一般发生在一个 SP 之中。
  • 在数据中心里,一个 SP 抽象了一组 SD 的集合供外界的 Node 访问或者 Engine 管理,并且一个 SP 中的所有 SD 必须是同一类型,如 NFS 或者 iSCSI。
  • 为了保证 SP 中的数据安全,一组 SP 中需要选择一个 SD 作为 Master Domain。这个 Domain 的不同之处在于它会保存 SP 中 所有的元数据(Meta Data),保存一些 异步请求或者任务的数据,保存所在 SP 的 集群存储用到的锁

Data Center(数据中心)

  • Ovirt 中抽象出了 Data Center 概念,一个 Data Center 将拥有一组 Node Cluster 用来运行虚拟机,一个 Storage Pool 用来保存虚拟磁盘数据。
  • Node Cluster 是一组专门用来运行虚拟机的 Node 的集合,运行在其中的虚拟机可以动态迁移到 Node Cluster 中的另外一个 Node 上。
  • 一个 Data Center 是一个完成 Ovirt 所有功能的实体,在这个 Data Center 中用户可以创建虚拟机、备份虚拟机、配置虚拟机的 Storage Domain,动态迁移虚拟机。
  • Node/Engine 有一些算法在开启的时候可以自动平衡 Data Center 中的 Node 的负载。
  • 一个 Data Center 是一个管理 Node Cluster 与 Storage Pool 的集合。
【Ovirt 笔记】 Node/Engine 结构_第3张图片
Data Center 结构图
Storage Pool Manager(存储池管理者)
  • 由于 Data Center 中所有的 Node 都拥有对 Data Center 中的 Storage Pool 的访问权限,因此 VDSM 实现了一个称为 SPM(Storage Pool Manager)的功能角色。
  • 在一个 Data Center 中,所有的 Node 启动后会自动选举出一个 Node 充当 SPM 的角色,被选举者将运行 VDSM 上的 SPM 逻辑,负责完成以下功能:创建 / 删除 / 缩放所在 Data Center 中的 Image,快照,模板。
  • 这些操作的共同点是会影响 Storage Pool 中的元数据,如 SAN 上松散块设备的分配。
  • 为了保证元数据不被多个 Node 同时修改,SPM 拥有对 Storage Pool 中元数据的排它性操作权限,SPM 使用集中式邮箱接受其他 Node 的相关请求,其他 Node 只能通过给 SPM 发送操作请求的方式修改元数据,最终的操作都由 SPM 线性完成,从而避免了存储器操作竞态的出现。
  • 为了兼顾效率,不修改元数据的普通操作,如数据读写,Node 可以不同过 SPM,自己直接访问 Storage Pool 完成。
  • 由于 SPM 是由一个普通 Node 选举出来的,因此当它因为外部原因失效后,系统将会选举出另外的 Node 充当 SPM,从而保证系统能继续运行。

Storage Image 和 Storage Volume

  • Storage Image 和 Storage Volume 则是 VDSM 抽象出来以方便给虚拟机使用的概念。
  • Storage Image 和前面所描述的 virtual image 不同,virtual image 是虚拟机程序看到的虚拟磁盘,一个 Storage Image 中往往包含很多 Storage Volume,每一个 Storage Volume 都可以作为一个 virtual image 传递给虚拟机作为虚拟磁盘使用。
  • 同一个 Storage Image 中的多个 Storage Volume 往往存在相互备份,相互引用等关系。
  • 当几个 Storage Volume 之间是引用的关系时,这几个 Storage Volume 集合成为一个 virtual image 传递给虚拟机,在虚拟机看来它操作的就是一个虚拟磁盘只不过数据分布在一系列的 Storage Volume 上(这时把最外层的 Storage Volume 作为参数传递给虚拟机启动程序 )。
  • Storage Image 用来管理这样一组含有内在联系的 Storage Volume。在 Storage Domain 和 Storage Pool 建好后,VDSM 便可以通过 SPM 在指定的 Storage Domain 里创建 Storage Image 与 Storage Volume。创建虚拟机的时候需要 Storage Volume 做为参数。
【Ovirt 笔记】 Node/Engine 结构_第4张图片
VM 使用 Storage Volume 示意图

Storage Over Commitment(存储超支)

  • Storage Over Commitment 是一个允许管理者分配比实际存储空间大的虚拟存储器给用户使用的技术。
  • 一个虚拟机所占用的实际存储空间可以比它所定义的存储空间小的多,只有当其中的存储数据真正增长时,其实际存储空间才会动态增长。
  • 如管理员定义 VM1 拥有 12G 的 Image,但系统启动后这个 Image 实际只占用了 10M 的存储空间。
  • 当用户在虚拟机安装软件后,Image 实际占用的空间才会增长。
  • 这种技术允许虚拟机不需要考虑实际机器的物理存储能力,做到存储器的共享与使用效率最大化。
  • Qemu 的几种存储格式都能提供这种动态伸缩能力,如 QCOW2 格式。
  • VDSM 使用了 Qemu 的存储缩放功能,当使用的 Storage Domain 为 Logic Volume 时,VDSM 将会监视 Qemu 所标记的写入上限位置。
  • 当发现越界时,VDSM 将会请求 SPM 扩展 Logic Volume 大小,从而完成空间的动态增长。
【Ovirt 笔记】 Node/Engine 结构_第5张图片
VDSM 对 LV 的动态扩展

参考资料

https://www.ibm.com/developerworks/cn/cloud/library/1209_xiawc_ovirt/

你可能感兴趣的:(【Ovirt 笔记】 Node/Engine 结构)