3.1 虚拟化技术
虚拟化技术(Virtualization)是伴随着计算机技术的产生而出现的,在计算技术的发展历程中一直扮演着重要的角色。从20世纪50年代虚拟化概念的提出,到20世纪60年代IBM公司在大型机上实现了虚拟化的商用,从操作系统的虚拟内存到Java语言虚拟机,再到目前基于x86体系结构的服务器虚拟化技术的蓬勃发展,都为虚拟化这一看似抽象的概念添加了极其丰富的内涵。近年来随着服务器虚拟化技术的普及,出现了全新的数据中心部署和管理方式,为数据中心管理员带来了高效和便捷的管理体验。该技术还可以提高数据中心的资源利用率,减少能源消耗。这一切使得虚拟化技术成为整个信息产业中最受瞩目的焦点。
3.1.1 虚拟化的定义
3.1.1.1 走进虚拟化
虚拟相对于真实,虚拟化就是将原本运行在真实环境上的计算机系统或组建运行在虚拟出来的环境中。一般来说,计算机系统分为若干层次,从下至上包括底层硬件资源、操作系统、操作系统提供的应用程序编程接口,以及运行在操作系统之上的应用程序。虚拟化技术可以在这些不同层次之间构建虚拟化层,向上提供与真实层次相同或类似的功能,使得上层系统可以运行在该中间层之上。这个中间层可以解除其上下两层间原本存在的耦合关系,使上层的运行不依赖于下层的具体实现。
由于引入了中间层,虚拟化不可避免地会带来一定的性能影响,但是随着虚拟化技术的发展,这样的开销在不断地减少。根据所处具体层次的不同,“虚拟化”这个概念也具有不同的内涵,为“虚拟化”加上不同的定语,就形成不同的虚拟化技术。目前,应用比较广泛的虚拟化技术有基础设施虚拟化、系统虚拟化和软件虚拟化等类型。虚拟化是一个非常宽泛的概念,随着IT产业的发展,这个概念所涵盖的范围也在随之扩大。
比如,操作系统中的虚拟内存技术是计算机业内认知度最广的虚拟化技术,现有的主流操作系统都提供了虚拟内存功能。虚拟内存技术是指在磁盘存储空间中划分一部分作为内存的中转空间,负责存储内存中存放不下并且暂时不用的数据。当程序用到这些数据时,再将它们从磁盘换入到内存。有了虚拟内存技术,程序员就拥有了更多的空间来存放自己的程序指令和数据,从而可以更加专注于程序逻辑的编写。虚拟内存技术屏蔽了程序所需内存空间的存储位置和访问方式等实现细节,使程序看到的是一个统一的地址空间。可以说,虚拟内存技术向上提供透明的服务时,不论是程序开发人员还是普通用户都感觉不到它的存在。这也体现了虚拟化的核心理念,以一种透明的方式提供抽象了的底层资源。
3.1.1.2 虚拟化的定义与目标
“虚拟化”是一个广泛而变化的概念,因此想要给出一个清晰而准确的“虚拟化”定义并不是一件容易的事情。“虚拟化”有很多定义,下面就给出了一些这样的定义。
“虚拟化是以某种用户和应用程序都可以很容易从中获益的方式来表示计算机资源的过程,而不是根据这些资源的实现、地理位置或物理包装的专有方式来表示它们。换句话说,它为数据、计算能力、存储资源以及其他资源提供了一个逻辑视图,而不是物理视图。”——Jonathan Eunice,Illuminata Inc。
“虚拟化是表示计算机资源的逻辑组(或子集)的过程,这样就可以用从原始配置中获益的方式访问它们。这种资源的新虚拟视图并不受实现、地理位置或底层资源的物理配置的限制。”——Wikipedia
“虚拟化:对一组类似资源提供一个通用的抽象接口集,从而隐藏属性和操作之间的差异,并允许通过一种通用的方式来查看并维护资源。”——Open Grid Services Architecture Glossary of Terms。
IBM对虚拟化的定义:虚拟化是资源的逻辑表示,它不受物理限制的约束。
在这个定义中,资源涵盖的范围很广。资源可以是各种硬件资源,如CPU、内存、存储、网络;也可以是各种软件环境,如操作系统、文件系统、应用程序等。
虚拟化的主要目标是对包括基础设施、系统和软件等IT资源的表示、访问和管理进行简化,并为这些资源提供标准的接口来接受输入和提供输出。虚拟化的使用者可以是最终用户、应用程序或者服务。通过标准接口,虚拟化可以在IT基础设施发生变化时将对使用者的影响降到最低。最终用户可以重用原有的接口,因为他们与虚拟资源进行交互的方式并没有发生变化,即使底层资源的实现方式已经发生了改变,他们也不会受到影响。
虚拟化技术降低了资源使用者具体实现之间的耦合程度,让使用者不再依赖于资源的某种特定实现。利用这种松耦合关系,系统管理员在对IT资源进行维护与升级时,可以降低对使用者的影响。
3.1.2 虚拟化的常见类型
从被虚拟的资源类型来看,一般可以将虚拟化技术分成软件虚拟化、系统虚拟化和基础设施虚拟化三类。
(1)软件虚拟化 软件虚拟化很显然是针对软件环境的虚拟化技术,应用虚拟化就是其中的一种。应用虚拟化分离了应用程序的计算逻辑和显示逻辑,即界面抽象化,而不是在用户端安装软件。当用户要访问被虚拟化的应用程序时,用户端只需要把用户端人机交互的数据传送到服务器,由服务器来为用户开设独立的会话去运行被访问的应用程序的计算逻辑,服务器再把处理后的显示逻辑传回给用户端,从而使用户获取像在本地运行应用程序的使用感受。
(2)系统虚拟化 是指使用虚拟化软件在一台物理主机上虚拟出一台或多台相互独立的虚拟机。服务器虚拟化就属于系统虚拟化,它是指在一台物理机上面运行多个虚拟机(Virtual Machine,VM),各个虚拟机之间相互隔离,并能同时运行相互独立的操作系统,这些客户操作系统(Guest OS)通过虚拟机管理器(Virtual Machine Monitor,VMM)访问实际的物理资源,并进行管理。服务器虚拟化技术具有诸多优点,基于服务器虚拟化搭建的云计算平台有着很多良好特性。
(3)基础设施虚拟化 一般包含存储虚拟化和网络虚拟化等。存储虚拟化是指为物理存储设备提供抽象的逻辑视图,而用户能通过这个视图中的统一逻辑接口去访问被整合在一起的存储资源。网络虚拟化是指将软件资源和网络的硬件整合起来,为用户提供虚拟的网络连接服务。网络虚拟化的典型代表有虚拟专用网(VPN)和虚拟局域网(VLAN)。
3.1.3 服务器虚拟化
3.1.3.1 服务器虚拟化的技术方法
服务器虚拟化是指在一个物理机器上面虚拟出很多个虚拟主机(Virtual Machine),并且各个虚拟主机之间是相互隔离的,它们可以同时运行彼此独立的操作系统,所有的客户操作系统(Guest OS)都能借助于虚拟机管理器(Virtual Machine Monitor)去访问实际存在的物理资源,并对其进行管理。该技术的原理就是同一组物理资源能够被很多的虚拟主机重复使用,而底层资源的策划以及共享功能的实现都交由虚拟机管理器去完成,然后将虚拟的计算资源提供给上层设备。如今,一个标准的虚拟机系统,内存的虚拟化通常是使用划分的方式实现的,该方式也被运用于一些能够被划分的输入/输出设备的虚拟化,如常见的磁盘设备;但CPU的虚拟化和一些支持共享的设备虚拟化却是使用共享的方式来实现的。
服务器虚拟化将系统虚拟化技术应用于服务器上,在一个服务器上创建出若干个可独立使用的虚拟机服务器。根据虚拟化层实现方式的不同,服务器虚拟化主要有两种类型:寄宿虚拟化和原生虚拟化,如图3-1所示。
图3-1 服务器虚拟化的实现方式
服务器虚拟化必备的是对三种硬件资源的虚拟化:CPU、内存、设备和I/O。此外,为了实现更好的动态资源整合,当前的服务器虚拟化大多支持虚拟机的实时迁移。
(1)CPU的虚拟化 在x86的架构里,CPU有着4个运行级别,分别为Ring 3、Ring 2、Ring 1和Ring 0,这其中的最高级别为Ring 0,它能够运行所有的系统指令。操作系统的内核就是运行于Ring 0级别的,而应用程序一般都是运行在Ring 3级别的,不可以执行特权指令。要想在x86的架构里去实现虚拟化,就必须在客户操作系统层之下加入虚拟化层,由于虚拟化层要在Ring 0运行,因此客户操作系统只能够运行于Ring 0级别以上,但是客户操作系统中的特权指令又需要在Ring 0级别来执行,所以就产生了矛盾。解决这一矛盾的方法有两种途径:全虚拟化和半虚拟化。
全虚拟化是一种采用二进制代码翻译技术。即在虚拟主机运行的时候,将陷入指令(访管指令)插入到特权指令的前面,把执行陷入到虚拟主机的监视器里面去,然后虚拟主机监视器动态地把这些系统指令转换成为能够实现相同功能的指令的序列之后再去执行。不用修改客户操作系统就能实现全虚拟化技术,但是动态转换指令的步骤将需要使用一定量的性能开销。
半虚拟化则是通过修改客户操作系统实现的,把虚拟化层的超级调用作为特权指令,以此来解决虚拟主机运行特权指令的相关问题。
半虚拟化和全虚拟化都属于CPU虚拟化技术,不论是超级调用还是二进制翻译都将产生一定的性能开销。而伴随着虚拟化技术的不断应用,AMD和英特尔都已经分别推出了自己的硬件辅助虚拟化技术AMD-V和Intel VT,通过在CPU里面加入新的指令集和处理器运行模式去完成CPU虚拟化的一些功能。因此,客户操作系统可以直接在硬件辅助虚拟化技术基础之上运行,这样大大减少了相关性能的开销。
(2)内存的虚拟化 它是将服务器的物理内存进行统一管理,为每个虚拟机提供了彼此隔离而连续的虚拟化内存空间。虚拟机监视器则利用一个虚拟机内存管理单元来维护物理主机内存与虚拟主机逻辑内存之间的映射关系。
物理主机内存和虚拟主机逻辑内存之间的映射关系是内存虚拟化管理单元来负责的,主要可以分为影子页表法和页表写入法。
在影子页表法里,如果客户在操作系统中维护自己页表时,该页表将维护虚拟主机物理内存和虚拟主机逻辑地址之间的映射关系。虚拟机监视器则是为每一台虚拟主机维护着一个与其相对应的页表,这张页表里面保存着物理主机的内存和虚拟主机的物理内存之间的映射关系。现有的VMware ESX Server和KVM都是采用这种方法的。
在页表写入法里,若客户操作系统要创建一个全新页表的时候,必须向虚拟机监视器去注册要创建的新页表。虚拟机监视器会维护该新页表,并记录着物理主机地址和虚拟主机逻辑地址之间的映射关系。在客户操作系统想对该页表进行更新的时候,虚拟机监视器会对该页表进行修改。即实现页表写入法就必须修改客户操作系统,现在流行的Xen虚拟化则是采用这种方法。
(3)设备和输入/输出的虚拟化 除了CPU和内存以外,服务器的重要部件还有设备与输入/输出。设备和输入/输出的虚拟化将物理机器的真实设备进行统一管理,将其包装成多个虚拟化的设备提供给多台虚拟主机去使用,并能响应每台虚拟主机的设备访问及输入/输出请求。现在比较常见的输入/输出和设备虚拟化基本都是用软件的方式去实现的。虚拟化设备的标准化使虚拟主机不需要再依靠底层的物理设备去实现,也便于进行虚拟机的迁移工作。
3.1.3.2 服务器虚拟化的特征
通过上述讨论与分析,我们可以看出服务器虚拟化有以下几方面的明显特征。
(1)隔离性 服务器虚拟化能够将运行于同一个物理主机上的多个虚拟机完全隔离开,多个虚拟机之间的关系就如同是多台物理主机之间一样,每一台虚拟机有着自己相对独立的内存空间。当一台虚拟机崩溃的时候,不会直接影响到其他虚拟机的正常工作。
(2)多实例 一台物理主机通过服务器虚拟化技术的处理之后,能够运行很多个虚拟服务器,不仅支持多个客户操作系统,而且物理系统的资源还能以可控的方式被分配给各个虚拟机。
(3)封装性 通过服务器虚拟化处理以后,一个完整的虚拟机环境对外表现为一个单一的实体,这样方便于在不相同的硬件设备间进行复制、移动和备份操作。同时,服务器虚拟化技术将物理主机的硬件封装成标准化的虚拟硬件设备,提供给了每一台虚拟机的操作系统和应用程序,这在很大程度上提高了系统的兼容性。
基于上述的这几种特征,服务器虚拟化技术也带来了如下优点。
(1)快速部署 在传统的数据中心里面,一般都要耗费十几个小时甚至是好几天的时间去部署一个应用。需要做的工作十分繁杂,如安装操作系统、安装中间件、安装应用、系统配置、系统测试、运行等多个步骤,在部署的过程中还很容易产生错误。但在通过服务器虚拟化技术处理之后,要部署一个应用就相当于部署一个封装好操作系统和应用程序的虚拟机一样,部署的过程只用简单的几个操作就可以完成,如拷贝虚拟机、启动虚拟机和配置虚拟机即可。这个过程通常只需十几分钟即可,并且部署过程都是自动化的,不容易出现安装错位的问题。
(2)较高的资源利用率 在传统的数据中心里面,由于对管理性、安全性和性能的考虑,绝大多数的服务器上面往往只运行一个应用,这导致了许多机器的CPU使用率非常低,平均下来一般不到20%。当采用了服务器虚拟化技术以后,能够将原来大部分服务器上的应用整合到一台服务器上,很大程度地提高了服务器资源的使用率,而且由于服务器虚拟化所固有的隔离性、多实例和封装性也保证了应用原来所具有的安全性和性能特征。
(3)实时迁移 它是指当虚拟机处于运行的时候,将一台虚拟机的运行状态快速、完整地从一台宿主机迁移到另一台宿主机上去,整个迁移过程都是平滑的,而且对于用户是透明的。由于服务器虚拟化有封装性,所以实时迁移能够支持原宿主机和目标宿主机之间的硬件平台异构性。若一台物理服务器的硬件需要更新或者是维护的时候,实时迁移可以在不宕机的情形之下将其上的虚拟机顺利地迁移至另一台物理服务器上去,这大大提高了系统的可用性。
(4)动态资源调度及高兼容性 依据虚拟机内部资源的使用情况,用户能够自由调整所使用虚拟主机的资源配置,如虚拟机的内存和CPU等资源,而不用像物理主机那样去变更硬件设备。服务器虚拟化技术的封装性和隔离性也使得物理底层与应用程序的运行平台彼此分离,这大大提高了系统的兼容性。
3.1.4 云计算与虚拟化
在搭建云计算平台的时候,使用了虚拟化和没有使用虚拟化的基础设施层有着非常大的差别,前者的资源部署更多的是对虚拟机的部署和配置的过程,而后者的资源部署的主要过程则涉及的是从操作系统至上层应用程序整个软件堆栈的部署以及配置。因此,相对于传统的方式而言,基于虚拟化技术搭建的云平台有着相当大的优势,体现在以下几个方面。
(1)易伸缩 可伸缩性是指系统通过对资源的合理调整去应对负载变化的特性,以此来保持性能的一致性。对基于虚拟化技术的云计算平台来说,能够通过对虚拟机资源的适度调整来实现系统的可伸缩性。相比较于传统的方式而言,新的调整虚拟机映像资源的方式远比调整物理主机资源的方式要快速得多、灵活得多,从而易于实现软件系统的可伸缩性。
(2)高可用性 可用性是指系统在一段时间内正常工作的时间与总时间之比。在云计算环境里,节点的失效是一种比较常见的情况,所以就需要有一定的保障机制去保证系统在发生故障之后还能够迅速恢复过来,从而可以继续提供服务。传统方式实现高可用性需要引入灾难和冗余备份系统,但是这样却带来了冗余备份数据一致性等相关问题,而且管理和采购所需的开销很大。相对而言,基于虚拟化技术的云计算平台可以借助于虚拟机的快速部署和实时迁移等优点,方便和快捷地提高系统的高可用性。
(3)负载均衡 在云计算平台之中,可能在某个时刻有的节点负载特别高,而其他节点负载过低。当某一节点的负载很高,将会影响到该节点上层应用的性能。若采用了虚拟化技术,则能够将高负载节点上的部分虚拟机实时迁移到低负载节点上面去,从而使整个系统的负载达到均衡,也保证了上层应用的使用性能。同时,因为虚拟机也包括了上层应用的执行环境,所以进行实时迁移操作的时候,对上层应用并无影响。
(4)提高资源使用率 对于云计算这样的大规模集群式环境来说,任何时刻每一个节点的负载都将是不均匀的。若过多的节点负载很低,会造成资源的严重浪费。但是基于虚拟化技术的云计算平台而言,能够将多个低负载的虚拟机合并至同一个物理节点上去,并且关闭掉其他空闲的物理节点,从而大大提高了资源的利用率,同时还能够达到减少系统能耗的目的。