大型网站技术之虚拟化
牛人就不要看了~
1.引言
先举个例子,一台物理主机有16G内存,用户A的程序只需要2G内存,用户B的程序只需要4G内存,如果没有用虚拟化技术,他们的解决方案如下:
- 两用户程序放到同一台物理机器上,各自配置运行环境。资源都能满足了。问题是,程序的运行环境一个是Linux,一个是windows呢?如何防止用户A的程序不会窃取用户B数据呢?
- 再买一台2G的物理主机,这样就解决了上面两个问题,呵呵。问题是,好浪费啊!如果再有个需要1G内存的用户来了,就买个1G的物理主机?如果老板有的是钱,没问题~
有个更加省钱的方法:采用虚拟化的技术,在那台物理主机上生成两个操作系统出来,一个4G内存,一个2G内存,操作系统的类型任选,虚拟化能够提供资源隔离的功能。这样就完美解决了上述的问题。对普通人来讲,可能VMware虚拟计算机是最了解的吧。
2. 虚拟化是什么?
虚拟化是云计算技术的基础。
百度百科上说:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
维基百科上说:In computing, virtualization refers to the act of creating a virtual (rather than actual) version of something, including virtual computer hardware platforms, operating systems, storage devices, and computer network resources.
因为虚拟化本质不是对硬件的改变,而是用软件的方法抽象,虚拟出的IT资源与底层硬件相隔离,所以虚拟化技术能够实现IT资源的自动化分配、调度、共享、迁移、监控。这种特性对于大型网站运维来说非常有用,谁不想啥事都是自动化的?人总是比较容易马虎出错。另外,有些业务是IO密集型,有些业务是计算密集型,需求各有不同,虚拟化可以让IT资源按需分配。虚拟IT资源与硬件无关,所以当需要更多的资源的时候,只需要增加一些物理计算机即可,小型机与普通机器可以混合使用。
服务器虚拟化主要有以下四方面的功能:
3.虚拟化的好处
效率:将原本一台服务器的资源分配给了数台虚拟化的服务器,有效的利用了闲置资源,确保企业应用程序发挥出最高的可用性和性能。
隔离:虽然虚拟机可以共享一台计算机的物理资源,但它们彼此之间仍然是完全隔离的,就像它们是不同的物理计算机一样。因此,在可用性和安全性方面,虚拟环境中运行的应用程序之所以远优于在传统的非虚拟化系统中运行的应用程序,隔离就是一个重要的原因。
可靠:虚拟服务器是独立于硬件进行工作的,通过改进灾难恢复解决方案提高了业务连续性,当一台服务器出现故障时可在最短时间内恢复且不影响整个集群的运作,在整个数据中心实现高可用性。
成本:降低了部署成本,只需要更少的服务器就可以实现需要更多服务器才能做到的事情,也间接降低了安全等其他方面的成本。
兼容:所有的虚拟服务器都与正常的x86系统相兼容,他改进了桌面管理的方式,可部署多套不同的系统,将因兼容性造成问题的可能性降至最低。
便于管理:,提高了服务器/管理员比率,一个管理员可以轻松的管理比以前更多的服务器而不会造成更大的负担。
通过实现 IT 基础架构的虚拟化,可以降低 IT 成本,同时提高现有资产的效率、利用率和灵活性。在全世界,各种规模的公司都享受着服务器的虚拟化带来的好处。数千家组织都在采用服务器虚拟化解决方案。
4.虚拟化技术分类
网上盗个图
-
全虚拟化(Full Virtulization)
简介:主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行,速度会根据不同的实现而不同,但大致能满足用户的需求。这种方式是业界现今最成熟和最常见的,而且属于 Hosted 模式和 Hypervisor 模式的都有,知名的产品有VirtualBox,KVM,VMware Workstation和VMware ESX(它在其4.0版,被改名为VMware vSphere),Xen(也支持全虚拟化)。
优点:Guest OS无需修改,速度和功能都非常不错,使用非常简单。
缺点:基于Hosted模式的全虚拟产品性能方面不是特别优异,特别是I/O方面。
2. 半虚拟化或者叫准虚拟化(Para-virtualization)
它与完全虚拟化有一些类似,它也利用Hypervisor来实现对底层硬件的共享访问,但是由于在Hypervisor 上面运行的Guest OS已经集成与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hypervisor来实现虚拟化。通过这种方法将无需重新编译或捕获特权指令,其最经典的产品就是Xen,而且因为微软的Hyper-V所采用技术和Xen类似,所以也可以把Hyper-V归属于半虚拟化。
这种虚拟技术以Xen为代表,其特点是修改操作系统的内核,加入一个Xen Hypervisor层。它允许安装在同一硬件设备上的多个系统可以同时启动,由Xen Hypervisor来进行资源调配。在这种虚拟环境下,依然需要模拟硬件设备,安装Guest操作系统,并且还需要修改操作系统的内核。Xen相对于传统的Virtual MachineMonitor,性能稍有提高,但并不十分显著。为了进一步提高性能,Intel和AMD分别开发了VT和Pacifica虚拟技术,将虚拟指令加入到了 CPU中。使用了CPU支持的硬件虚拟技术,将不再需要修改操作系统内核,而是由CPU指令集进行相应的转换操作。
优点:这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势。
缺点:需要对Guest OS进行修改,所以在用户体验方面比较麻烦。
在完全虚拟化模式中,hypervisor必须模拟设备硬件,它是在会话的最低级别进行模拟的(例如:网络驱动程序,磁盘,显卡等等).尽管在该抽象中模拟很干净,但它同时也是最低效,最复杂的.在半虚拟化中,来宾操作系统和hypervisor能够共同合作,让模拟更加高效.缺点是操作系统知道它被虚拟化,并且需要修改才能工作.
3.硬件辅助虚拟化(Hardware Assisted Virtualization)
Intel/AMD等硬件厂商通过对部分全虚拟化和半虚拟化使用到的软件技术进行硬件化(具体将在下文详述)来提高性能。硬件辅助虚拟化技术常用于优化全虚拟化和半虚拟化产品,而不是独创一派,最出名的例子莫过于VMware Workstation,它虽然属于全虚拟化,但是在它的6.0版本中引入了硬件辅助虚拟化技术,比如Intel的VT-x和AMD的AMD-V。现在市面上的主流全虚拟化和半虚拟化产品都支持硬件辅助虚拟化,包括VirtualBox,KVM,VMware ESX和Xen。
优点:通过引入硬件技术,将使虚拟化技术更接近物理机的速度。
4. 操作系统级虚拟化(Operating System Level Virtualization)
这种技术通过对服务器操作系统进行简单地隔离来实现虚拟化,主要用于VPS,以SWsoft的Virtuozzo/OpenVZ和Sun基于Solaris平台的Container技术为代表,其中Virtuozzo是商业解决方案,而OpenVZ是以Virtuozzo为基础的开源项目。他们的特点是一个单一的节点运行着唯一的操作系统实例。通过在这个系统上加装虚拟化平台,可以将系统划分成多个独立隔离的容器,每个容器是一个虚拟的操作系统,被称为虚拟环境(即VE,VirtualEnvironment),也被称为虚拟专用服务器(即VPS,Virtual Private Server)。如下图所示:
在操作系统虚拟化技术中,每个节点上只有唯一的系统内核,不虚拟任何硬件设备。此外,多个虚拟环境以模板的方式共享一个文件系统,性能得以大幅度提升。在生产环境中,一台服务器可根据环境需要,运行一个VE/VPS,或者运行上百个VE/VPS。所以,操作系统虚拟化技术是面向生产环境、商业运行环境的技术。
优点:因为它是对操作系统进行直接的修改,所以实现成本低而且性能不错。
缺点:在资源隔离方面表现不佳,而且对Guest OS的型号和版本有限定。
5. 硬件分区技术
硬件分区技术如下图所示:硬件资源被划分成数个分区,每个分区享有独立的CPU、内存,并安装独立的操作系统。在一台服务器上,存在有多个系统实例,同时启动了多个操作系统。这种分区方法的主要缺点是缺乏很好的灵活性,不能对资源做出有效调配。随着技术的进步,现在对于资源划分的颗粒已经远远提升,例如在 IBM AIX系统上,对CPU资源的划分颗粒可以达到0.1个CPU。这种分区方式,在目前的金融领域,比如在银行信息中心得到了广泛采用。
6. 容器虚拟化Docker
现在docker内部使用的技术是Linux容器(LXC技术),运行在与它宿主机同样的操作系统上,准许它可以和宿主机共享许多系统资源,它也会使用AuFS作为文件系统,也为你管理网络。AuFS是一个层状的文件系统,因此你可以有一个只读和一个只写部分,二者结合起来,可以使系统的共同部分用做只读,那块被所有容器共享,并且给每个容器自己的可写区域。
让我们假设你有一个容器镜像(image)容量是1GB,如果你想用一个完整的虚拟机来装载,你得需要容量的大小是1GB乘上你需要虚拟机的数量。但使用Linux容器虚拟化技术(LXC)和AuFS,你可以共享1GB容量,如果你需要1000个容器,假设他们都运行在同样的系统影像上,你仍然可以用稍微比1GB多一点的空间来给容器系统。
docker相比完全的虚拟机,可以实现基础共享,一个完整的虚拟化系统得到了分给它的自有全部资源,只有最小的共享。你获得了更多的隔离,但是这是很庞大的(需要更多的资源)
5.Hypervisor位置
Hypervisor安装在宿主操作系统上,
Hypervisor安装在宿主操作系统上,通过宿主操作系统使用硬件,如VirtualBox、VMWare Workstation等。在Host系统上,加装了Virtual MachineMonitor,虚拟层作为应用级别的软件而存在,不涉及操作系统内核。虚拟层会给每个虚拟机模拟一套独立的硬件设备,包含CPU、内存、主板、显卡、网卡等硬件资源,在其上安装所谓的Guest操作系统。最终用户的应用程序,运行在Guest操作系统中。如下图所示。
这种虚拟机运行的方式有一定的优点,比如能在一个节点上安装多个不同类型的操作系统;但缺点也非常明显,虚拟硬件设备要消耗资源,大量代码需要被翻译执行,造成了性能的损耗,使其更合适用于实验室等特殊环境。
安装在硬件层上:
由Hypervisor直接管理硬件,如VMWare ESX、微软、KVM、XEN等
安装在内核上:
Hypervisor安装在宿主操作系统内核上,客户操作系统调用宿主操作系统内核。
6. 虚拟机架构
目前分为两种,寄居架构(Hosted Architecture)和裸金属架构 ("Bare Metal" Architecture),如图所示。
寄居架构就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理;
裸金属架构就是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。
优点 |
缺点 |
举例 |
|
寄居架构 |
简单,便于实现 |
安装和运行应用程序依赖于主机操作系统对设备的支持,性能有损耗。 |
GSX Server, VMware Server, Workstation |
裸金属架构 |
虚拟机不依赖于操作系统,可以支持多种操作系统,多种应用,更加灵活 |
虚拟层内核开发难度较大 |
VMWare ESX Server |
裸金属架构
寄居架构
裸金属架构
7. KVM
Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为的主流VMM之一。
Kvm仅仅是一个linux内核的模块,当在linux中安装了kvm后,linux会变成了hypervisor,即VMM,进行CPU和内存的虚拟管理,而qemu工具,实现虚拟机的创建管理,monitor管理各个IO设备。
虚拟化方式:完全虚拟化
架构:寄居架构(linux内核);祼金属架构RHEV-H
特点:祼金属架构RHEV-H或在关键的硬盘和网卡上支持半虚拟化VirtIO,达到最佳性能。
I/O协议栈:KVM重用了整个Linux I/O协议栈,所以KVM的用户就自然就获得了最新的驱动和I/O协议栈的改进。
架构图:
8.XEN
XEN是一个开放的源代码虚拟机监视器,有剑桥大学研发。它打算在单个计算机上运行多达128个满足特征的操作系统,操作系统必须进行显示地修改("移植")以在Xen上运行(但是提供对用户应用的兼容性)。这使得无需特殊硬件支持,就能达到高性能的虚拟化。
XEN虚拟化分类
- (1)完全虚拟化:DomU中的各个硬件都是由VMM和Dom0虚拟和模拟实现;
- (2)半虚拟化:DomU中的CPU、Memory有VMM模拟实现,IO等设备分为前端(Front)和后端(Back),前端工作在DomU中,而后端工作在Dom0中;
DomU中的网卡eth0与Dom0中的viif#中的设备对应,不再由Dom0模拟,这大大提升了IO性能 - (3)借助于硬件设备的半虚拟化;例如Intel的vt-d技术
Xen由三部分组成:
- 第一部分:Xen Hypervisor,又称虚拟机监控程序(Virtual Machien Monitor简称VMM),VMM工作原有linux系统内核位置,替代了linux系统内核,用于虚拟CPU、Memeory等;
- 第二部分:Xen Dom0,又称特殊区域;为vmm提供硬件驱动程序,用于协助vmm驱动各个底层硬件,同时又为Xen DomU提供模拟IO等功能;由于特殊原因Linux-2.6.37以后的内核才支持Xen Dom0,建议大家在使用xen时使用linxu-3.0以后的内核;
- 第三部分:Xen DomU,非特权区域;实际生产中的操作系统
虚拟化方式:半虚拟化(linux安装linux);全虚拟化(linux安装windows),硬件辅助虚拟化
架构:裸金属架构
I/O协议栈:Xen选择了可维护这条道路,它将所有的I/O操作放到了Linux guest里面,也就是所谓的domain-0里面。重用Linux来做I/O, Xen的维护者就不用重写整个I/O协议栈了。但不幸的是,这样就牺牲了性能:每一个中断都必需经过Xen的调度,才能切换到domain 0, 并且所有的东西都不得不经过一个附加层的映射。架构图:
9. VmWare ESX或vSphere
虚拟化方式:完全虚拟化
架构:裸金属架构
I/O协议栈:VMware选择性能,但是把I/O协议栈放到了hypervisor里面。不幸的是,VMware kernel是专有的,那就意味着VMware不得不开发和维护整个协议栈,会导致开发速度会减慢,你的硬件可能要等一段时间才会得到VMware的支持。
架构图:
论文:https://www.usenix.org/legacy/events/osdi02/tech/waldspurger/waldspurger.pdf