虚拟化技术是云计算的重要技术,主要用于物理资源的池化,从而可以弹性地分配给用户。物理资源包括服务器、网络和存储。但是计算资源的池化不一定要用虚拟化技术,金属裸机也能池化,比如 IBM 的 Softlayer 就是直接使用物理机来实现云计算的。
主机虚拟化的思想可以追溯到 IBM 机器的逻辑分区,即把一台 IBM 机器划分成若干台逻辑的服务器,每台逻辑服务器拥有独占的计算资源(CPU、内存、硬盘、网卡),可以单独安装和运行操作系统。IBM 机器价格昂贵,相对于当时的计算任务来说,机器的计算能力太过强大,所以需要划分为更小的计算单元。
后来随着个人计算机处理能力的不断发展,1998 年 VMware 公司成立,这家公司专注于机器虚拟化的软件解决方案。也就是说,对于不支持逻辑分区的计算机,可以直接通过安装 VMware 虚拟化软件来模拟更多的虚拟机,然后再在这些虚拟机里安装操作系统和应用软件,可以给虚拟机灵活配置内存、CPU、硬盘和网卡等资源,如图 1 所示。
在一台物理机上可以创建很多虚拟机,虚拟机里允许安装不同的操作系统,配置不同的网络 IP 地址。
可以动手做个实验:购买一台计算机(配置:双核 3.0GB CPU、4GB 内存、500GB 硬盘、1000MB 网卡),首先安装 Windows 8 操作系统,把所有的硬件驱动安装好,然后安装办公软件、QQ、音视频播放软件和 C 语言开发工具等。接下来安装 VMware Workstation 12.0 虚拟化软件,安装完成后重新启动计算机,并双击桌面上的“VMware Workstation”图标启动虚拟化软件,如图 2 所示。
在里面可以创建很多虚拟机,比如图 2 中就创建了 14 台虚拟机,虚拟机里安装的操作系统分别是 Windows 7、Windows 8、Windows Server 2012、Windows XP 和 Linux 的各种发行版。只要不启动虚拟机,就不会消耗内存和 CPU 资源,但是会占用硬盘空间。能同时启动的虚拟机数目与计算机的物理内存容量和 CPU 速度有关。另一款免费的桌面虚拟机软件是 Oracle 公司的 VirtualBox。
近几年来,很多大公司不断加入主机虚拟化软件市场,竞争异常激烈。排名靠前的有 EMC(收购 VMware)、微软、思杰、红帽、Oracle、Parallels。微软把虚拟机直接集成在操作系统里;红帽携 KVM 开源虚拟机一路攻城略地;Oracle 的虚拟机算是个小字辈;Parallels 公司的产品既支持虚拟机,也支持容器。
容器是一个轻量级的运行环境,在同样配置的物理机上,能同时运行比虚拟机多三倍的容器。VMware 的虚拟化产品受到微软 Hyper-V、红帽 KVM 及思杰 Xen 的强大冲击,其市场开始出现萎缩的征兆。
目前 CPU 发展到多核,且本身就支持虚拟化。虚拟化软件厂商直接推出了能运行在裸机上的虚拟化软件层,如微软的 Windows Hyper-v 2012、EMC 的 ESXi6、思杰的 XenServer、红帽的 RHEV-H等,然后在虚拟化软件层上直接创建更多的虚拟机,如图 3 所示。
虚拟化软件层消耗的计算资源很少,一般在 10% 以内,相比前面的方法,同一台物理机可以运行更多的虚拟机。
针对云计算方案,各虚拟化软件厂商还推出了云端虚拟机管理工具,实现虚拟机的创建、删除、复制、备份、恢复、热迁移和监控等统一管理。其中,热迁移就是在不关闭虚拟机的情况下,把虚拟机从一台物理机转移到另一台物理机上,而正在使用虚拟机的租户感觉不到虚拟机被移动了。一台虚拟机的计算能力目前还不能超过其所在的物理机的计算能力。
但是在每台虚拟机里都要安装和运行操作系统的做法,仍然浪费了很多计算资源。
举一个简单的例子:假如一台计算机的配置是双核 3GHz 的 CPU、8GB 的内存、500GB 的硬盘,现在在这台计算机上创建 6 台虚拟机,每台虚拟机分配 1GB 内存、64GB 硬盘、1GHzCPU,虚拟机都安装 Windows 7 操作系统。那么当全部虚拟机启动后,几乎就很难再运行应用程序了,因为内存和 CPU 资源都被操作系统本身消耗掉了。
为此,有公司专门推出了应用软件容器产品,即在操作系统层上创建一个个容器,这些容器共享下层的操作系统内核和硬件资源,但是每个容器可单独限制 CPU、内存、硬盘和网络带宽容量,并且拥有单独的 IP 地址和操作系统管理员账户,可以关闭和重启。与虚拟机最大的不同是,容器里不用再安装操作系统,因此浪费的计算资源也就大大减少了,这样同样一台计算机就可以服务于更多的租户,示意图如图 4 所示。
容器产品提供商 Parallels 针对 Linux 和 Windows 操作系统分别推出了两套应用软件容器产品:OpenVZ 和 Parallels Containers for Windows,其中 OpenVZ 是开源的,Windows 版是商用的,最新版 Parallels Containers for Windows 6.0 支持 Windows Server 2012 Data Center Edition。
开源容器项目 Docker 绝对是后起之秀,受到谷歌公司的大力推崇,发展迅速。微软目前也推出了两种容器产品:Windows Server Container 和 Hyper-V Container,后者的隔离效果介于容器和虚拟机之间。
应用软件容器与虚拟机的第二个不同是,容器里不能进行操作系统级的修改和配置。对于做驱动开发和 Linux 内核定制的人来说,就不适合租赁容器,而虚拟机则没有任何限制。
现在有企业推出了云计算一体机(或称为箱式数据中心),做一个大箱子,里面封装了几台服务器、磁盘柜、计算机网络设备、UPS(不间断电源)、制冷设备等,并且安装了虚拟化软件和云管理工具。微软的云计算一体机采用水冷系统,冷水进去,热水出来,如图 5 所示。
云计算一体机消耗的电能(3000W 以上)全部转化为热能被水带出,热水可以进一步利用,真正做到了节约能源,从而使云计算成为名副其实的绿色 IT。图 6 所示为华为的 FusionCube 一体机,不过里面没有制冷设备和 UPS,外表显得“傻大黑粗”。
电力使用效率(Power Usage Effectiveness,PUE)是目前国际上通行的用于衡量云端和云计算一体机能源效率的指标,它等于总能耗与 IT 设备能耗的比值。比值越小,表明能源利用率越高,绿色程度越高。
目前国外先进的数据中心机房 PUE 值通常小于 2,而我国的大多数数据中心的 PUE 值为 2~3。在云端,IT 设备主要指服务器、存储设备、网络设备,其他的诸如制冷设备、UPS、安防设备等属于非 IT 设备,其中制冷设备功耗几乎占到总功耗的一半。
出租虚拟机属于 IaaS 云服务,IaaS 的另一种产品是出租裸机,即直接把硬件服务器出租出去,通过服务器上的远程管理卡可以把配置、安装操作系统、开关机等功能整合到租户自助网站上。
最后,对主机虚拟化技术进行总结,如图 7 所示。
在图 7 中,“多用户”是实现远程桌面最轻量化的方案,即在操作系统里创建多个用户账号,然后让这些用户登录使用计算机。
目前微软的远程桌面服务和 Linux 多用户运行级别都是实现“多用户”的方法。最近有不少公司在多用户的基础上进一步做轻量化处理,推出应用程序虚拟化(vAPP),如微软的 APP-V、思杰的 XenAPP、VMware 公司的 ThinAPP、Ceedo 公司的 Ceedoclient 等。
应用程序虚拟化有一个好处,即使计算服务器按应用分工,比如使用一台服务器专门运行 Word 软件,第二台专门运行 Excel 软件,第三台专门运行 QQ,第四台运行 Photoshop,通过应用软件虚拟化技术把 Word、Excel、QQ、Photoshop 整合到用户的桌面上。
使用户桌面环境与应用程序分离有如下几个好处:
不同的应用软件,对机器配置的侧重点不同,比如图形处理软件对显卡要求较高、QQ 对网络要求较高,根据应用软件定制的服务器运行效率自然会提高不少。
一台服务器只运行一个应用软件,但同时服务多个用户,可以节约硬盘资源、节约内存资源、节约 CPU 资源,具体原因可以参考操作系统原理和计算机体系结构方面的书籍。
运行同一个程序,等于执行一份相同的软件代码,从而大大提高了各级缓存的命中率,也加快了进程的切换速度,提高了虚拟内存的换入、换出效率。
图 7 中的物理机(也称为裸金属机)是最重型的方案。同一台计算机上租户数越多,表明相应方案越轻量化,反之则越重型化。在实际方案中,要根据租户的需求来确定轻重级别。
目前一台虚拟机不能跨越多台物理机(只能在一台物理机上运行),这意味着虚拟机的运算能力不会超过一台物理机的运算能力,以后的技术能不能突破还很难下定论。目前通过集群联合多台物理机,对外呈现一致的寻址空间,对用户来说,似乎在使用一台超级计算机,但这是虚幻的,集群与虚拟化具有本质的不同。
但是目前主流的主机虚拟化技术都支持过度分配资源,即分配给同一台物理机上的虚拟机的资源之和大于物理机本身的资源数。比如物理机的计算资源是内存 4GB、CPU 8 核、磁盘 100GB,在这台物理机上创建 5 台虚拟机,每台虚拟机分配资源如下:内存 1GB、CPU 2 核、磁盘 30GB,显然 5 台虚拟机资源之和是内存 5GB、CPU 10 核、磁盘 150GB,超过了物理机的资源总数。
在虚拟机运行时,按其实际消耗的资源动态分配,但是不超过管理员给其分配的上限,一般计算机正常运行时资源耗费不会超过其总资源的 75%,这样过度分配资源就容易理解了。CPU 的过度分配率一般为 16 倍,内存的过度分配率一般为 1.5 倍。
接下来我们再来看看网络虚拟化技术。网络虚拟化技术主要用来对物理网络资源进行抽象并池化,以便于分割或合并资源来满足共享的目的。人们很早就意识到了网络服务与硬件解耦的必要性,先后诞生了许多过渡的技术,其中最重要的 6 种分别是虚拟局域网络(VLAN)、虚拟专用网络(VPN)、主动可编程网络(APN)、叠加网络(Overlay Network)、软件定义网络(SDN)和网络功能虚拟化(NFV),如图 8 所示。
APN 把控制信息封装到报文内部,路由器根据报文内的控制信息做决策。SDN 和 NFV 是目前最为热门的网络虚拟化技术,在云计算和大数据时代,其发展不可小视。
网络虚拟化技术已经出现了 20 多年,但是发展却一直不温不火,原因是缺少一个杀手级的应用。云计算的出现对于网络虚拟化来说是一次千载难逢的机会,可以说,有了云计算,网络虚拟化才变得如此热门,如果没有网络虚拟化,就没有大规模的云计算。
众所周知,一个计算机网络必须完成两件事:
这跟交通网络很相似,连接两个城市的交通网络具备的第一个功能就是汽车从一个城市到达另一个城市;第二个功能是控制到底走哪条线路最好。前者就是由公路组成的交通网络,后者就是交通控制系统。
下面我们再来看看传统的网络设备(比如一台路由器)的逻辑分层结构,如图 9 所示。
传统的网络设备包含了完整的三层,由厂商统一捆绑销售,第三方很难修改里面的软硬件结构,由此对用户来说有以下几个明显的缺点:
如今,SDN 是网络虚拟化技术当中最热门的技术。SDN 技术通过分离网络控制部分和封包传送部分来避免传统网络设备的缺点,处于数据通路上的网络设备蜕化为准硬件设备,网络中的所有网络设备的网络控制部分独立出来由一台服务器单独承担,示意图如图 10 所示。
把网络控制部分从各个网络设备中独立出来,统一由 SDN 网络控制器承担,这样做的最大好处是数据传送的路径是全局最优的。
SDN 网络控制器类似于 GPS 导航卫星,它存储了全局的网络拓扑图,俯视着整张网络,精确导航着每个数据包的流向。当某台网络设备收到一个数据包时,就会询问网络控制器:“这个包要往哪个口送出去?”SDN 网络控制器可能回答:“从 2 端口送出去。”
为了加快转发速度,SDN 网络设备会存储答案,即属于同一个会话的数据包直接从之前的出口送走,类似于现实生活中完成同一个运输任务的车队,在每个交叉路口,GPS 卫星只导航第一辆车,后面的车跟着行驶即可。SDN 网络设备和网络控制器之间采用 Openflow 协议进行通信。
云端一般采用 Open vSwitch 交换机,它是一款开源的网络虚拟化产品,是二层交换机,性能可以与硬件交换机媲美。利用它可以在虚拟机的下面构筑虚拟网络层,通过实时修改 Open vSwitch 的配置,可以组建变化灵活的局域网,使得一台虚拟机能快速地从一个局域网迁移到另一个局域网中,这是物理交换机所无法实现的,如图 11 所示。
不同物理机上的两台虚拟机之间的网络通路如图 12 所示。
使用过 Windows 操作系统的用户都知道,计算机启动完毕后看到的那个屏幕叫桌面,上面有很多小图标,包括此电脑、回收站,以及很多由用户自己创建的应用程序快捷方式。图 1 所示是我的 Windows 10 桌面。
图 2 所示是安装了 Linux 操作系统的桌面。
不同的用户登录计算机后看到的桌面是不一样的,每个用户都可以定制自己的桌面,而不会影响到同一台计算机上的其他人的桌面。
如果把桌面放在云端,就成了远程桌面,租户输入账号和密码就可以登录到云端的桌面,此后使用云端桌面与本地桌面一样,没有区别。有人喜欢把远程桌面称为虚拟桌面接口(VDI),这样学术性更浓厚一些。
使用云端桌面能实现移动办公,请看下面的情景描述:
李昭在一家公司做售后,主要工作是解决客户的问题,其活动范围包括家、公司、客户处。他经常出差,具体工作包括写文档、修改软件 Bug、管理问题库工具。李昭家里有台式机,公司有办公计算机,出差时携带笔记本电脑,公司还给他在私有云上创建了一个虚拟机。
李昭在虚拟机里安装了 Windows 8 操作系统,然后又安装了 Office 2013 办公软件、QQ、PDF 阅读器、暴风影音、Visual Studio 2012 开发工具、Photoshop CS5、Chrome 网页浏览器、问题管理工具等软件,最后开启了虚拟机的远程桌面。
这样,李昭就能在家里、公司和客户处登录到云端桌面了。云端桌面成了李昭唯一的办公桌面,如图 3 所示。他写的文档、修改的软件、设计的图片、下载的电影和歌曲等都在这里,不管李昭走到哪里,都可以随时随地访问其数据资料。
远程桌面协议是实现远程桌面应用的关键技术之一,协议规定终端与云端桌面如何通信。
目前的远程桌面协议有微软的 RDP10、EMC 公司的 EOP/PCoIP、思杰公司的 ICA/HDX、红帽公司的 SPICE,以及 Ericom 公司的远程桌面产品。
微软的 RDP10 客户端软件目前能运行在安装了 Windows10、Windows Server 2012 的计算机上,或者固化了相应操作系统内核(Windows Embedded Standard 10、Windows 10 IoT)的嵌入式终端上,同时发布了针对安卓和苹果操作系统的客户端软件。
而云端桌面的操作系统只能安装 Windows 8、Windows Server 2012 和 Windows Server 2016,比如图 3 就是在安装了 Windows 7 操作系统的计算机上登录到云端的 Windows 8 桌面所看到的开始菜单。
开源项目 FreeRDP 支持 RDP 协议,能在很多操作系统上运行,但是目前不支持 RDP 8.0。微软的 RDP 8.0 协议规范公开在官方网站上,预计不久后,FreeRDP 就会支持 RDP 8.0 了。而其他几个公司同时发布了能运行在 Windows、Linux、Adnriod 和 Mac OS 系统上的多个版本。
以下是实现远程桌面的 3 种方法:
1)基于 IaaS 云服务的虚拟机或裸机,租户租用云服务提供商的虚拟机或裸机,然后自己安装操作系统、应用软件并开启远程桌面,我们称这种远程桌面为 IaaS 云桌面。
2)IaaS 云服务的应用软件容器,租户共享底层的操作系统内核,单独安装应用软件和一些基础运行库,我们称这种远程桌面为 IaaS 容器桌面。比如 OpenVZ 和 Virtuozzo Containers 实现 Linux 的容器桌面,Windows Server Container、Hyper-V Container 和 Virtuozzo Containers 实现 Windows 的容器桌面。
3)基于半平台 PaaS 云服务,并为每个租户创建一个系统账户,其实就是利用了现代操作系统的多用户特点,即同时让许多人登录并使用计算机,我们称这种远程桌面为 PaaS 云桌面。
PaaS 云桌面在私有云中应用比较普遍,尤其是私有办公云。因为搭建 PaaS 云桌面具备很好的伸缩性,所以小的云端用一台计算机即可。一台配置高的台式机(4 核 3.0GB CPU、16GB 内存、1T 硬盘)就可以供 20 个左右的员工日常办公,以后随着公司的发展,员工不断增多,可以不断地增加云端计算机来构建更大的云端。
目前微软的终端服务技术就是典型的 PaaS 云桌面的解决方案,要求每个用户购买许可证,在正规的商业环境下建议购买正规许可证。
由于 IaaS 云桌面是每个租户单独使用一台云主机(虚拟机或裸机),所以租户间的隔离效果最好,IaaS 容器桌面的隔离效果次之,PaaS 云桌面的隔离效果最差。这里的“隔离”,是指一个租户的操作行为和私有数据资料对另一个租户的可见度。比如两个租户登录到同一台计算机的 PaaS 云桌面,那么他们之间是互相可见的:可以看到对方的进程、对方的数据文件,一方关机另一方就会被强行退出,具体内容可参阅后面教程。
在规划具体的云端方案时,要综合考虑到底采用什么类型的桌面,这里提供一些经验如下:
众多的租户通过计算机网络接入云端的计算机并使用里面的计算资源,这里有三点需要注意:
负载就是任务,即租户要在云端完成的任务。把众多租户要完成的任务如何合理地分配给云端的各个服务器并能快速处理完,就是负载均衡技术所要解决的问题。
理想的使用情景描述如下:
早上 8:30 前,微算公司云端只有 1 号服务器在开启状态,其他众多的服务器都处于睡眠状态。处于睡眠状态的服务器耗电极少,唤醒一台服务器的时间大概是 1 分钟。然后员工陆续到岗,最先来的 20 名员工登录到云端的 1 号服务器上的远程桌面,1 号服务器还可以接入 5 台终端,此时 1 号服务器唤醒 2 号服务器,接下来的 5 人仍然接入 1 号服务器,后面来的 30 人接入 2 号服务器。2 号服务器配置高一些,所以能接入 30 台终端,2 号服务器在适当的时候唤醒 3 号服务器,此后其他服务器的行为与 2 号服务器相同。
下午 18:00,员工陆续下班。下班时员工有两种做法:一是从云端注销出来,二是不注销而直接关闭终端。没有注销的远程桌面保留全部的工作任务状态,比如正在编辑的 PPT、打开的 QQ、还在播放的《少年派》等继续保持,第二天员工再登录时看到的桌面还是昨天下班前的状态,他可以继续编辑未完成的 PPT、浏览别人发过来的大量 QQ 消息,不过昨天还没看完的《少年派》快播放完了。由于云端检测到终端 30 分钟内没有输入,于是把其桌面转为睡眠,视频播放暂停。现在该员工需要倒回 30 分钟并继续观看。
云端没有活跃桌面的服务器在延时 10 分钟后主动睡眠。下午 19:00,还有员工在加班,云端还有 11 台服务器在工作,但是每台服务器只接了 1~5 个不等的活跃桌面。此时云端启动了活跃桌面合并程序,采用热迁移技术,把 32 个活跃桌面合并到 1 号和 2 号服务器上,其他服务器转为睡眠状态。云端服务器的唤醒、睡眠和活跃桌面合并都是自动完成的。
上面的情景中有一个关键的技术:租户登录时把其桌面分配到一台合适的服务器上,这就是负载均衡技术要解决的问题。对“合适”二字理解不同,实现负载均衡的策略也不同,但前提是保证不会降低租户的体验。下面是常用的负载均衡策略:
1)让唤醒的每台服务器承担尽可能多的活跃桌面。
2)使每台服务器消耗的计算资源的占比尽可能相等。如果全部服务器配置相同,那么本策略就是把活跃桌面尽可能地平均分配给所有的服务器。
3)应用软件相同的租户桌面尽可能地分配到相同的服务器上。同一部门的租户使用的软件差不多,所以相同部门的租户桌面尽可能地分配在相同的服务器上。例如,售后服务部的员工一般都使用客服软件、办公软件、邮件、问题库工具等,所以把售后服务部的员工的桌面放在同一台计算机上且作为半平台 PaaS 云桌面,从而节约很多内存。
4)同一个租户每次登录时,其桌面尽可能地分配到同一台服务器上。这样可以尽量减少桌面漫游次数,从而降低网络带宽的开销。
负载均衡任务由负载均衡器完成,目前既有纯软件的负载均衡器产品,如 LVS,也有厂家推出的硬件负载均衡器,如 F5、深信服、梭子鱼、Radware 等,F5 负载均衡器的价格都在 10 万元以上。
LVS 是开源软件,已经集成到了 Linux 内核,其性能优越,结合一台通用的物理计算机,完全可以搭建一台能与 F5 媲美的负载均衡器。直接采用 DNS 轮询或者 iptables 也可以实现简单的负载均衡任务。
负载均衡技术用于解决如何把许多互不相关的小型任务或中型任务合理地分配到不同的服务器上的问题。互不相关的小型任务或中型任务是指任务之间没有关联性,而且只用一台服务器就可以完成的任务。绝大多数个人租户的任务都属于这类任务。
对于大型任务,由于一台服务器无法按时完成,所以就要把大型任务拆分成许多中小型任务,然后再分配给多台服务器,由它们协同完成,这就是计算机集群技术所要解决的问题。
对租户来说,由很多台服务器组成的集群系统就像一台超级计算机,不管运行多么复杂、大型的任务,马上就能得到结果,如图 1 所示。而具备同样计算能力的超级计算机价格却异常昂贵,所以当 PC 服务器价格大幅度下降之后,人们热衷于采用廉价的集群系统来完成各种高性能的计算任务。
比较明显的例子就是,谷歌公司用几万台服务器组建搜索集群系统,而且服务器都是他们自己组装的。注意:本节讲述的集群是高性能计算集群,目的是完成大型的任务,下一节讲述的容错计算追求更好地完成任务。
显然,集群涉及两大技术:一是任务的拆分,二是任务的调度。
任务的拆分遵循的原则之一是尽量降低子任务之间的关联性,从而提高处理任务的并行度。最常见的关联性是任务处理的时间先后关系,比如子任务 A 一定要在子任务 B 完成之后才能开始处理,即 B 任务的输出作为 A 任务的输入。存在一类子任务无关联的大型任务,拆分这样的任务就很容易。
比如在全球上亿的网页中搜索关键词“云计算”,这个任务的拆分方法之一是按国家划分:A 子任务搜索中国的网站,B 子任务搜索美国的网站,C 子任务搜索英国的网站等,这些子任务之间没有关联性,可以并行处理,最终把全部子任务的搜索结果合并起来即可。
再比如中国的天气预报,可以按省份拆分。这类大型任务的拆分示意图如图 2 中的左图所示。
另外一类大型任务很难拆分成互不相关的子任务,如核爆模拟、战争推演模拟等,拆分出来的子任务之间一定存在关联性,即一些子任务之间开始或者结束的时间与其他一些子任务的起止时间存在前后关系,如图 2 中的右图所示。
任务的调度即如何把拆分出来的子任务合理地调度给云端服务器并让它们协同完成,这里的“合理”性与租户的要求密切相关。可以这样定义:最能满足租户要求的调度方法就是合理的。
租户的要求各种各样,有的希望任务完成得越快越好,有的要求在将来某个时间前完成任务即可,有的希望结果越精确越好,有的希望计算费用越少越好……根据租户的不同要求,人们提出了相应的任务调度方法。比如在满足租户预期目标的前提下,把任务分配给尽量少的计算机,从而满足“应用最少的计算机按时、按质完成任务”的要求,因为参与的计算机越少,通信的成本就越低。
例如,有一个 100 人日的任务,甲方要求在 10 天内完成。为了在规定的时间内完成任务,乙方更愿意安排 10 个人做 10 天,而不是安排 105 个人做1天。由于要管理 100 人,所以后者需要增加 5 个管理人员。
集群是一个复杂的工程,它涉及很多分布式方面的基础算法,如选举算法、一致算法、波算法、快照、故障检测等,感兴趣的读者可以参阅 Gerard Tel 著的《分布式算法导论》。Hadoop 就是一个集群系统,它负责分布式系统的基础算法,从而在 Hadoop 上编写分布式程序就简单多了,详细的介绍请参见教程后续章节。另外,OpenHPC 是一个基于 Linux 的开源集群项目。
容错计算,也有人称为高可用性计算和高可靠性计算,就是在系统存在故障的情况下,仍能正确地执行给定的算法。为了实现这一点,必须使系统具有故障检测与诊断、功能切换与系统重组(reconfiguration)、系统恢复与重新运行、系统的重构(reintegration)与可扩展等功能,而且这些功能不能影响系统的正常运行或至少不能使系统的性能下降到不能容忍的程度。
容错计算的重点是保证任务在被处理的过程中不会异常终止,以及任务完成后输出结果的正确性。
可靠性是指在规定的使用条件下和规定的时间内完成规定功能的能力,通常用多少个“9”来衡量。比如人们所讲的达到 4 个“9”的可靠性,就是说任务顺利完成的概率为 99.99%;同理,5 个“9”的可靠性就是 99.999%。
严格来讲,容错计算也属于集群的范畴,只不过参与集群的计算机处理同样的任务——并行或者接力。容错计算需要投入更多的计算资源,所以造价较高。对于一些非关键的任务,人们出于成本的考虑,一般较少采用容错集群系统。
接力容错又叫串行容错,由若干台计算机参与同一个任务的计算,但是同一时刻只由一台计算机处理任务,只有当这台计算机出现故障时,才由下一台计算机接力处理;类似,如果此台计算机又出现故障,那么继续由其他计算机接力;只有当全部计算机都出现故障时,任务处理才会被中断,示意图如图 1 所示。
其实我们可以及时维修故障计算机并让其再次加入容错集群参与下一次的接力活动,这样就能最大限度地保证任务顺利完成。只有在全部计算机同时出故障(或者几乎同时出故障以至于人们还来不及维修)的情况下,租户的任务才会被中断,如供电异常(断电、电压过高或过低等)、雷击都可能导致参与容错集群的计算机同时出故所以云端的建设,供电和防雷是重中之重。
在条件允许的情况下,应采用多路市电接入,每路市电分属于供电部门不同的变压器,甚至是不同的电网,机房配备不间断电源和发电设备,这样就形成了三级供电保障:市电、不间断电源、发电设备。
传统的民用接力容错集群多采用经典的“双机—双工”结构:两台服务器带一台磁盘阵列,如图 2 所示。
两台服务器都与磁盘阵列相连,同时通过心跳线互联,用来完成任务的软件和软件处理的数据放在磁盘阵列上,这样每台服务器都能访问这个软件,同时双方通过心跳信号感知对方的状态。
平时主服务器运行软件以处理任务,备服务器空转,一旦主服务器出现故障,其就不再向备服务器发送心跳信号,备服务器收不到主服务器发来的心跳信号就知道其出现了故障,此时备服务器会运行软件,从而继续处理任务。
然后机房管理人员对故障服务器进行维修,而租户并不知道负责任务处理的服务器发生了切换。这种双击容错集群系统被企业大量应用于数据库管理系统、邮件系统及一些诸如 ERP 等重要的业务系统,以保证关键应用的高可靠性。
另外,也有采用“双活”主机的方案——两台服务器平时都承担负载,当一台服务器发生故障时,负载才由另外一台服务器全部承担,应用不会重点,但是相应时间可能会延长。
也许有人会问:磁盘阵列坏了怎么办?
在图 2 中,磁盘阵列成了单点故障,为此有人采用存储局域网替换磁盘阵列,并在存储局域网中进行存储容错处理,这种方法成本很高。在以太网网速达到万兆甚至十万兆的今天,去掉磁盘阵列而对服务器上的硬盘直接做实时同步变得可行,可参考王良明的论文《存储寄存算法及其应用》。
主/备服务器的硬盘数据相互寄存的示意图如图 3 所示。
并行容错是指,参与容错的计算机同时处理相同的任务,输出相同的结果。可以在服务器内部的部件层次做并行,也可以在服务器层次做并行,前者主要由服务器生产厂商设计和完成。
现在的绝大多数服务器都或多或少地存在一些并行部件,如双电源供电、多网卡捆绑、RAID 1 支持等。至于在服务器层次做并行,普通民用领域很少采用,多见于航空、军事领域。并行容错的示意图如图 4 所示。
在 3 台计算机参与的并行容错集群系统中,不但可以容错,而且还可以纠错。比如在由 5 台计算机组成的并行容错集群系统中,有 4 台输出 A、1 台输出 B,那么根据少数服从多数的原则,最终的结果就是 A。
例如,由 5 台计算机组成并行容错集群系统,它们接受相同的输入信息并运行相同的决策软件。在运行的过程中,有 1 台计算机出现故障(如图 5 所示,中间那台计算机出现故障),最终有 4 台计算机输出结果,其中 1 台计算机给出“不按”下原子弹起爆开关的命令,其他 3 台输出“按”下起爆开关的命令,协商的结果是给机械手发出“按”下命令。
用户登录计算机后,首先进入的那个目录就是其家目录(也称为“主目录”)。例如,在 Windows 操作系统上,zsan 这个用户的家目录是 C:\Users\zsan。在 Linux 操作系统上,其家目录是 /home/zsan。
家目录下还有更多的子目录,如“电脑桌面”子目录、“我的文档”子目录、“下载”子目录、“我的音乐”子目录、“我的视频”子目录、“我的图片”子目录等。除非特别指定,否则用户的资料都保存在其家目录(或者家目录中的子目录)下。
租户每次登录云端,都可能被分配到不同的服务器上,比如某租户第一次被分配到三号服务器,并编辑了一份个人简历,过了几天,他再次登录云端时被分配到七号服务器,此时他的个人简历不见了,因为简历保存在三号服务器上。
为了解决以上这个问题,就引入了租户家目录漫游技术,即磁盘文件作为软件的输入/输出设备之一,与计算设备通过计算机网络分隔,这样计算设备与输入/输出设备就完全分离了,示意图如图 1 所示。
所有租户的家目录全部存放在网络中的存储设备里,在租户登录时自动触发一个动作:把此租户的家目录挂载到本服务器上来。租户退出登录时触发另一个动作:卸载家目录。这样不管租户登录到哪台服务器,他都能正确访问自己的家目录。存储设备在网络上,因此也可以把它当作云端,只不过这个云端的功能是提供存储服务,显然是属于 IaaS 云。
在网速足够快的情况下,建议由政府组建一个公共存储云,每个公民免费分配 1TB 的存储空间,存放个人的全部身份信息、档案材料和私有资料。计算服务云(IaaS、PaaS、SaaS)由企业或者行业主导,他们互相竞争,为租户提供各种各样的计算服务,而租户通过移动或者固定终端随时接入这些云端并获取相应的计算服务。这是一个庞大的系统,需要全社会参与,如图 2 所示。
租户隔离不是指隔离租户这些现实中的人,而是特指租户登录云端后,其操作行为和数据对于其他已登录云端的租户来说是不可见的。换句话说就是,每个租户都感觉不到他人的存在,似乎就是自己一个人在操作计算机。
租户隔离存在以下两个方面的隔离:
租户行为隔离是指一个租户操作计算机的行为,其他租户感知不到。
租户操作计算机的行为是通过消耗的计算资源(内存、硬盘、CPU 和网络)体现出来的,换句话说,一个租户消耗计算资源的变动不会引起其他租户计算资源的可感知变动,感知不到的变动除外。
例如,租户甲内存配额是 4GB,但是他最多也就使用了 2GB,另外 2GB 空闲。此时如果租户乙运行一个大型软件,消耗了很多内存,使得租户甲只剩下 1GB 的空闲内存,但是租户甲感知不到,因为他的软件运行照样流畅、响应速度照样快、网速不卡,一切如故。
现代很多虚拟机厂商倾向于采用如下的行为隔离原则:按实际使用量分配资源,但不超过租用上限。这里的“上限”是指租户租用的资源额度。
比如租户甲租用的内存额度是 2GB、硬盘额度是 20GB。如果他实际要消耗 1.5GB 的内存,就分配 1.5GB 给他,但是他最多只能用 2GB 的内存。这样,同样的一台服务器就能服务更多的租户。比如一台服务器拥有 64GB的物理内存,假设每个租户租赁 2GB,那么这台服务器很可能允许 45 个用户同时登录。
SaaS、PaaS 和 IaaS 模式都需要实施租户行为隔离。
在《云计算SaaS服务模式精讲》教程中,我们提到租户数据包括配置数据和业务数据。配置数据指租户选择的语言、设置的时区、桌面背景图片、屏幕分辨率、创建的快捷方式及各种软件的界面设置等,而业务数据就是日常操作计算机生成的数据,如个人简历、售前 PPT、邮件、音乐、视频、财务数据、库存记录、客户资料等。
租户数据一般保存在家目录或者数据库中,而家目录和数据库被保存在云端的磁盘中。
PaaS 型租户的数据隔离一般采用容器的形式或者操作系统的访问控制列表(ACL),主要在操作系统层设置。而 SaaS 型租户的数据隔离主要在应用软件层及以上展开,租户身份鉴别和权限控制策略由应用软件开发者负责。
比如一个 SaaS 型的 ERP 系统,账号、密码及权限都被登记在数据库中的一个表中,当租户登录 ERP 系统时,输入账号和密码并单击“登录”按钮后,软件要去查询数据库确认账号是否存在;如果存在,再核对密码是否正确;如果密码正确,再根据权限显示相应的模块菜单项。总之,租户的账户信息一定是租户数据记录的主索引的组成部分,这是实现数据隔离的必要条件。
SaaS 型租户数据一般全部保存在数据库中,对于同一个数据库管理系统的租户数据隔离有以下 3 种方法可选:
我们用图 1 来表示一个数据库管理系统、数据库、Schema、Login、User 的关系。
一个具备 Login 权限的人可以登录数据库管理系统(就好像进入了一个大院子),数据库管理系统里面有很多数据库(类似院子里的仓库),数据库被分割成许多个 Schema(类似仓库里的房间),只有持有 User(类似房门钥匙)身份的人才能进入属于自己的 Schema(房间)。Schema 里存放了很多对象(就像房间里存放的桌子、床铺、凳子、电视机等物品),这些对象指表、触发器、视图、存储过程等。
理解了数据库管理系统、数据库、Schema 的关系之后,我们再来看看前面讲的三种分离方法。
就是给每个租户单独创建一个数据库,数据库中只有一个 Schema,相当于在大院子里单独建一栋只有一个房间的仓库,仓库钥匙只给此租户一个人。
就是在一个数据库中单独为每个租户创建一个 Schema,相当于在一栋现存的仓库里隔一个房间出来并分配给租户,房间钥匙只给其一人。
直接给租户分配一个现存的 Schema,大家共享一个 Schema,即租户的数据保存在相同的表中,相当于配一把房间的钥匙给新来的租户,大家共用一个房间,每个人的物品上写上自己的名字,以免拿错东西。
上面三种方法中,分离数据库的隔离效果最好,但是成本也最高;共享数据库和 Schema 的隔离效果最差,但是成本也最低;共享数据库但分离 Schema 是一个折中的方法。可根据租户的需求确定具体采用哪种方法。
下面以云化的一个大型软件为例,来简单介绍一下 SaaS 型租户的数据隔离策略。
该软件原来是落地运行的,主要用于企业产品质量保证,由于价格昂贵,很难推广到广大的中小型企业,所以考虑云化,然后以 SaaS 形式出租。在云化方案中,关于租户数据隔离部分设计如下。
采取“独立数据库、共享 Schema”的混合方法,即每个行业对应一个独立数据库,同一个行业内的租户共享 Schema,如图 2 所示。
混合数据隔离方法具有如下好处:
每个数据库中包含两类数据:
共享数据即全部租户共享使用,如基础数据、全局参数、模型数据等,共享数据表不用改动。
这类数据与租户关联,不同租户的业务数据是不同的,由于租户的业务数据是共享表结构的,所以全部的业务数据表都需要添加一个租户字段 TenantID,且此字段作为主键之一。
同时,还要修改用户登录逻辑,在会话中记录用户所属的租户号和行业数据库,最后需要修改全部的 SQL 语句和存储过程,在 where 子句中都要加上“TenantID=xxx”过滤条件,其中“xxx”是具体的租户 ID 号。
如果出现下面的情况,则表明没有隔离:
IaaS 云服务(包括裸机、虚拟机和容器),平台软件层及以上都是由租户自己安装和管理的,所以 IaaS 云服务天生就具备了很好的隔离效果。
我们在搭建 PaaS、SaaS 云服务时,就要考虑租户隔离问题了,目前没有统一的隔离方法,需要根据租户的需求和性质综合考虑。但是租户隔离不是必需的,比如私有云可以不隔离,因为租户之间互相认识,或亲属,或同事,对于不应公开的资料,自己加密保存或者存储在 U 盘上,此方法既方便又可靠,且节约成本。
对于租户需要输入账号和密码才能登录的公共云服务,必须施行租户隔离。
转载于:http://c.biancheng.net/cloud_computing/