云里雾里的云计算 【9】-转载自邓侃博士的博客

【结束语】
什么是云计算?说白了,就是把一堆廉价PCs捆绑在一起,统一管理,使用起来如同一台超级大型机(Mainframe)一样。
与大型机相比,云计算平台不仅价格便宜,稳定性不差,而且便于不断扩张其计算能力和存储空间。
云计算的意义在于,
1. 让社会普遍获得超大规模的数据处理和存储能力。而过去,只有少数机构拥有这些能力。

  譬如,客户可以无限量地在网上存放文章,照片和视频等等。一个普通动画工作室,可以制作好莱坞水准的动画片。
2. 进一步降低了传统行业使用IT技术的门槛,有利于改进其生产和经营方式。
  譬如,小摊贩可以在Amazon平台上开设网络商店。
3. 对于那些已经拥有IT技术的企业来说,或许把数据存储和程序运行外包给云计算平台,以便降低企业的IT开支。
  前提条件是,1. 如果云计算供应商能够保障客户的数据和程序不被偷窥,包括云计算供应商自己,即便想看也看不到客户的数据和程序。2. 网络带宽不会出现拥堵。
  对于一部份IT从业人员和DBA,这个前景不一定是美妙。但是社会分工越来越细,这是大势所趋。
4. 形成一个新的IT价值链。
  从Data-Storage-as-a-Service(dSaaS),到Infrastructure-as-a-Service(IaaS),到 Platform-as-a-Service(PaaS),到Software-as-a-Service(SaaS),处处是商机。
对于应用开发商来说,传统的终端产品,将向“前店后厂”的模式演化,形成有纵深的产品。
新浪的MusicBox,可以视为大纵深产品的一个雏形。它不仅仅是一个单薄的MP3 Player,而且集搜索,编辑,推荐等等功能为一体。这些功能的实现,依托于“后厂”,也就是依托于产品这个表象的背后,那个云计算平台来实现。
“前店后厂”的产品模式,不仅适合于PC和互联网产品,而且适合于手机业务。下一个系列,我们将讨论如何给手机应用做个“前店”。说得专业些,下一个系列的题目叫,“移动互联网时代的手机应用架构设计”。

云里雾里的云计算 【8】-转载自邓侃博士的博客

【9】赚钱才是硬道理
本系列开篇时说到,Google开放云计算平台的目的是为了赚钱。接下去我们分析了云计算的功能以及技术实现。
现在终点回到起点,在我们了解了云计算的功能和技术以后,最后的问题是如何借用云计算平台赚钱?
黄 兄推荐了一篇参考文献,题目是“Cloud computing with Linux”(http://www.ibm.com/developerworks/linux/library/l-cloud-computing /index.html)。这个题目有点推销Linux的倾向,但是仔细看正文,发现这是一篇好文章。好在三个方面,
1. 它把云计算能够提供的服务分成了4类。各个服务层面针对需求不同的目标客户群。
2. 在这4类服务内,列举了各个参与竞争的公司。战场的形势一目了然。
3. 如果你想参与云计算,从中获利。仔细琢磨这篇文章,你将对自己的产品的定位有一个比较清晰的理解。

云里雾里的云计算 <wbr>【8】

Cloud computing layers
Courtesy http://www.ibm.com/developerworks/linux/library/l-cloud-computing/figure4.gif
这篇文章把云计算的目标客户分成四类。从最底层说起,
1. Data-storage-as-a-Service(dSaas),说白了就是把云计算包装成一个巨大的网盘,客户想保存什么文件,不论是什么格式的,统统可以上传到这个网盘里。
云 计算的网盘有一个优势,是PC的硬盘无法媲美的。譬如,你在办公室里写了一个文件,晚上回家想接着写。文件存放在办公室的PC里,想调用这个文件,你先得 设置VPN,才能访问你办公室的PC,比较麻烦。如果你下班前,把文件上传到云计算的网盘里,你回家后想调用这份文件就容易得多。
如果把云计算和房地产开发相比较。盖了一栋空房子,没有装修,也没有通电通水通气,如何赚钱?最简单的办法是把空房子出租,给客户做仓库用。网盘就相当于仓库。
2. Infrastructure-as-a-Service(IaaS),是指提供计算能力,就像提供标准厂房,供电供水供气。
客户租用标准厂房,是为了组装一个生产车间。所以,客户光租了标准厂房还不够,他们还得自己动手,购置机器,雇用工人。
把云计算包装成IaaS,目标客户是动画制作商,数据挖掘商,天气预报局等等。他们编写自己的程序,自己负责运行和分析结果。之所以借助云计算IaaS服务,主要是借重云计算的平行计算的能力。
把云计算IaaS与标准厂房做个逐项类比,云计算的IaaS类似于标准厂房,天气预报局编写的程序就像是客户购置的机器,天气预报分析师就像是车间里的工人。
3. Platform-as-a-Service (PaaS)。类似于开发商盖了一栋商厦,里面分割成很多摊位,把摊位出租给各个小摊贩,卖衣服鞋帽等等。
PaaS针对的客户是各种传统行业的服务提供商,他们想建一个网站,开设网络商店,但是他们不太了解IT技术,他们开设网络商店所需要做的,基本上只是上传内容。
4. Software-as-a-Service (SaaS)。类似于开发商不仅建了房子,而且装修成酒店,聘用了酒店管理人员。
酒店面向是两类客户,1. 最终消费者,他们来酒店吃饭和住宿。2. 服务提供商,譬如婚庆代理公司,他们租用餐厅和客房,为新婚者承办婚宴。又譬如会议承办机构,他们利用酒店的会议室等等设施,代办各种会议。
SaaS也一样,它可以给企业提供ERP之类的服务,也可以给其它网站提供Gadgets,譬如地图指南,或者日历等等。

云里雾里的云计算 <wbr>【8】

Amazon Web Service bandwidth
Courtesy http://aws.typepad.com/photos/uncategorized/2008/05/16/aws_bandwidth.gif
云计算的商务做得最好的,当属Amazon.com。
Amazon发轫于网络书店,后来业务扩展到卖电子产品,甚至服装,玩具,家具以及食品等等。再后来,Amazon不满足于零售业,而是想着开商厦,吸引各色摊贩借用Amazon的平台,营销各自的产品和提供各自的服务,而Amazon坐收摊位费。
尝到甜头后,Amazon干脆进军房地产,构建自己的云计算平台,提供相应的基础服务,犹如供电供水供气。所谓基础服务,严格定义不容易,但是举几个例子反而容易理解。
1. 系统整合类,
Amazon Simple Queue Service (SQS),负责数据信息的交互。
Amazon Mechanical Turk (Mturk),负责工作流程的组织。
Amazon Flexible Payments Service (FPS),小额支付服务。
Amazon DevPay,记账和会计服务。
Amazon AWS,客户身份认证服务。
2. 统计类,
Alexa Web Services,流量分析。
Amazon Historical Pricing,查看历史记录。
AWS Management Console (AWS Console),监控客户租用的计算资源的使用情况。
再来看看Google的情况。
Google 的抱负很大,dSaaS,IaaS,PaaS和SaaS,各个市场层面,它都想参与。但是奇怪的是,最容易做的网盘,即dSaaS业务,Google没有 开展。IaaS不容易找到客户,暂时也无可奈何。针对PaaS,也就是针对想建网站的那一批客户,Google的对策是AppEngine,但是受限于 AppEngine本身的不完善,目前似乎也没有吸引太多客户。Google做得最好的,是SaaS。不仅有Gmail,Google Docs,还有Maps,Picasa,YouTube,Orkut,Reader等等。
最后谈谈Microsoft的情况。
Microsoft的决心也很大。像Amazon,Yahoo,IBM等等企业,都在借用开源项目,如Hadoop,Xen等等,迅速构建自己的云计算平台,尽早占领市场。而Microsoft的战略是不用开源项目,从头构建自己的云计算平台,Azure。
Microsoft把自己的云称作“云端”。这个“端”字很有意思,强调的是Microsoft不仅有网络端的云计算平台,而且这个平台与各种Window OSes,以及Window OSes上各种终端产品紧密结合,形成大纵深的终端产品。
什么叫大纵深的终端产品?

云里雾里的云计算 <wbr>【8】

Sina Music Box
Courtesy http://lh4.ggpht.com/_cz82pwdvhmg/SZWnlHyixeI/AAAAAAAAAYw/EusY1wBeFJY/s640/SinaMusicBox.PNG
拿新浪的音乐盒做个例子。它不仅仅是一个简单的MP3播放器,而且用户可以搜索音乐,音乐盒也可以根据用户以前听过的音乐,推荐音乐,用户还可以组建自己的专辑,在播放MP3的时候,音乐盒还搜索相应的歌词,配合着播放的节奏,滚动地显示歌词。
也就是说,用户电脑上显示的是终端播放器,但是提供搜索,推荐,专辑和歌词等等的各项功能,依托的是网络端的云计算平台。
如果Microsoft想大力拓展“云端”服务,或许新浪的音乐盒是一个很好的启发。

KVM架构及其优点

Linux 既有良好的灵活性,在虚拟化方面同样出色。但是最近,随着内核虚拟机(KVM)的出现,Linux 虚拟化的前景发生了变化。KVM 是构成主流 Linux 内核(V2.6.20)一部分的第一个虚拟化解决方案。KVM 支持 Linux 客户操作系统的虚拟化 —— 甚至支持其硬件对虚拟化敏感的 Windows 系统的虚拟化。了解 Linux KVM 的架构并了解它与内核的紧密集成为何会改变您使用 Linux 的方式。
简介
虚拟化 概念很早就已出现。简单来说,虚拟化就是使用某些程序,并使其看起来类似于其他程序的过程。将这个概念应用到计算机系统中可以让不同用户看到不同的单个系 统(例如,一台计算机可以同时运行 Linux 和 Microsoft Windows)。这通常称为全虚拟化(full virtualization)。
虚拟化也可以使用更加复杂的格式,其中单个计算机看上去具有多个架构(对于一个用户 来说,它是一个标准的 x86 平台;对于另外一个用户来说,它是 IBM Power PC 平台)。这种虚拟化形式通常被称为 硬件仿真。
最后,更加简单的一种虚拟化是操作系统虚拟化,其中一台计算机可以运行相同类型的多 个操作系统。这种虚拟化可以将一个操作系统的多个服务器隔离开来(这意味着全都必须使用相同类型和版本的操作系统)。
虚拟化和准虚拟化(para-virtualization)
虚拟化最常使用的两种方法是全虚拟化 和准虚拟化。使用全虚拟化,在虚拟化的操作系统和硬件之间存在一个层,用于决定访问。这个层称为系统管理程序 或虚拟机监视器(VMM)。准虚拟化与之类似,但是系统管理程序会以一种更具协作性的方式进行操作。这是因为每个客户操作系统都了解自己正在虚拟化模式中 运行,因此每个系统都与系统管理程序协作,来实现底层硬件的虚拟化。
全虚拟化的例子包括商业虚拟化解决方案 VMware,以及商业 IBM zSeries 计算机上使用的 IBM System z9 Virtual Machine(z/VM)操作系统。准虚拟化的例子有 Xen 和 User-Mode-Linux (UML)。 KVM 也被认为是一个全虚拟化解决方案,不过我们稍后再介绍这个问题。
虚拟化的工作原理
我们首先简要介绍一下虚拟化技术及其涉及的元素。虚拟化解决方案的底部是要进行虚拟 化的机器。这台机器可能直接支持虚拟化,也可能不会直接支持虚拟化;那 么就需要系统管理程序 层的支持。系统管理程序,或称为 VMM,可以看作是平台硬件和操作系统的抽象化。在某些情况中,这个系统管理程序就是一个操作系统;此时,它就称为主机操作系统,如 图 1 所示。
图 1. 虚拟化的分层抽象
系统管理程序之上是客户机操作系统,也称为虚拟机(VM)。这些 VM 都是一些相互隔离的操作系统,将底层硬件平台视为自己所有。但是实际上,是系统管理程序为它们制造了这种假象。
目前使用虚拟化解决方案的问题是,并非所有硬件都可以很好地支持虚拟化。较老的 x86 处理器根据执行范围对特定指令会产生不同结果。这就产生了一个问题,因为系统管理程序应该只能在一个最受保护的范围中执行。由于这个原因,诸如 VMWare 之类的虚拟化解决方案会提前扫描要执行的代码,从而将这些指令替换为一些陷阱指令(trap instruction),这样系统管理程序就可以正确地处理它们。Xen 可以支持一种协作的虚拟化方法,它不需要任何修改,因为客户机知道自己正在进行虚拟化,并已经进行了修改。KVM 会简单地忽略这个问题,如果您希望进行虚拟化,就强制必须在更新的硬件上运行。
刚开始会觉得这有些不方便,但是考虑到目前上市的较新机器都可以支持虚拟化(例如 Intel VT 和 AMD SVM),用不了多久,这将成为标准方法而不是少数例外情况。
KVM 系统管理程序
考虑到虚拟化技术的发展时间并不长,KVM 实际上还是一种相对来说比较新的技术。目前存在各具功能的开源技术,例如 Xen、Bochs、UML、Linux-VServer 和 coLinux,但是 KVM 目前正在被大量使用。另外,KVM 不再仅仅是一个全虚拟化解决方案,而将成为更大的解决方案的一部分。
KVM 所使用的方法是通过简单地加载内核模块而将 Linux 内核转换为一个系统管理程序。这个内核模块导出了一个名为 /dev/kvm 的设备,它可以启用内核的客户模式(除了传统的内核模式和用户模式)。有了 /dev/kvm 设备,VM 使自己的地址空间独立于内核或运行着的任何其他 VM 的地址空间。设备树(/dev)中的设备对于所有用户空间进程来说都是通用的。但是每个打开 /dev/kvm 的进程看到的是不同的映射(为了支持 VM 间的隔离)。
KVM 然后会简单地将 Linux 内核转换成一个系统管理程序(在安装 kvm 内核模块时)。由于标准 Linux 内核就是一个系统管理程序,因此它会从对标准内核的修改中获益良多(内存支持、调度程序等)。对这些 Linux 组件进行优化(例如 2.6 版本内核中的新 O(1) 调度程序)都可以让系统管理程序(主机操作系统)和 Linux 客户操作系统同时受益。但是 KVM 并不是第一个这样做的程序。UML 很久以前就将 Linux 内核转换成一个系统管理程序了。使用内核作为一个系统管理程序,您就可以启动其他操作系统,例如另一个 Linux 内核或 Windows 系统。
KVM
安装 KVM 之后,您可以在用户空间启动客户操作系统。每个客户操作系统都是主机操作系统(或系统管理程序)的一个单个进程。 图 2 提供了一个使用 KVM 进行虚拟化的视图。底部是能够进行虚拟化的硬件平台(目前指的是 Intel VT 或 AMD-SVM 处理器)。在裸硬件上运行的是系统管理程序(带有 KVM 模块的 Linux 内核)。这个系统管理程序与可以运行其他应用程序的普通 Linux 内核类似。但是这个内核也可以支持通过 kvm 工具加载的客户操作系统。最后,客户操作系统可以支持主机操作系统所支持的相同应用程序。
图 2. 使用 KVM 的虚拟化组件
记住 KVM 只是虚拟化解决方案的一部分。处理器直接提供了虚拟化支持(可以为多个操作系统虚拟化处理器)。内存可以通过 kvm 进行虚拟化(这在下一节中将会讨论)。最后,I/O 通过一个稍加修改的 QEMU 进程(执行每个客户操作系统进程的一个拷贝)进行虚拟化。
KVM 向 Linux 中引入了一种除现有的内核和用户模式之外的新进程模式。这种新模式就称为客户 模式,顾名思义,它用来执行客户操作系统代码(至少是一部分代码)。回想一下内核模式表示代码执行的特权模式,而用户模式则表示非特权模式(用于那些运行 在内核之外的程序)。根据运行内容和目的,执行模式可以针对不同的目的进行定义。客户模式的存在就是为了执行客户操作系统代码,但是只针对那些非 I/O 的代码。在客户模式中有两种标准模式,因此客户操作系统在客户模式中运行可以支持标准的内核,而在用户模式下运行则支持自己的内核和用户空间应用程序。客 户操作系统的用户模式可以用来执行 I/O 操作,这是单独进行管理的。
在客户操作系统上执行 I/O 的功能是由 QEMU 提供的。QEMU 是一个平台虚拟化解决方案,允许对一个完整的 PC 环境进行虚拟化(包括磁盘、图形适配器和网络设备)。客户操作系统所生成的任何 I/O 请求都会被中途截获,并重新发送到 QEMU 进程模拟的用户模式中。
KVM 通过 /dev/kvm 设备提供了内存虚拟化。每个客户操作系统都有自己的地址空间,并且是在实例化客户操作系统时映射的。映射给客户操作系统的物理内存实际上是映射给这个进程 的虚拟内存。为了支持客户物理地址到主机物理地址的转换,系统维护了一组影子页表(shadow page table)。处理器也可以通过在访问未经映射的内存位置时使用系统管理程序(主机内核)来支持内存转换进程。
实例化新客户操作系统
新客户操作系统的实例化是由一个名为 kvm 的工具提供的。这个工具可以与 kvm 模块协同工作,使用 /dev/kvm 来加载客户操作系统,将它与虚拟磁盘(主机操作系统中的一个普通文件)关联起来,然后启动客户操作系统。
通过一组在 /dev/kvm 设备上执行的 ioctls 可以提供控制支持。当第一次打开这个特殊文件时,就会创建一个新的 VM 对象,它与一个虚拟 CPU 关联在一起。您然后可以使用几个 ioctls 来创建一个虚拟 CPU,检查 kvm 版本,创建内存区域,然后启动一个虚拟 CPU。您可以使用 kvm 命令实现这种功能。在接下来的几节中,我们将介绍 kvm 命令,并给出几个受支持的 ioctls 的示例。
使用 KVM
如果硬件支持的话,使用 KVM 实际上非常简单。您需要一个具有虚拟化支持的处理器。通过查看 /proc/cpuinfo 可以知道系统是否支持虚拟化。这个文件指定了是否支持 vmx(Intel)或 svm(AMD)扩展。
接下来,您需要一个启用了 KVM 支持的 Linux 内核。您可以在 Device Drivers > Virtualization 下的内核配置中完成这种配置。还必须启用处理器对环境的支持。另外,还必须具有 kvm 和 qemu 用户空间应用程序。
有了启用了虚拟化支持的引导内核,接下来的一个步骤是为客户操作系统创建一个磁盘映 像。您可以使用 qeumu-img 来完成此操作,如下所示。注意这个映像的大小是 4GB,但是使用 QEMU 的写时复制格式(copy-on-write,qcow)时,整个文件将根据需要增长,而不是完全占据这 4 GB 的空间。 $ qemu-img create -f qcow vm-disk.img 4G
复制代码在创建虚拟磁盘之后,就可以将客户操作系统加载到其上。下面的例子假设客户 操作系统是在 CD-ROM 上。除了使用 CD-ROM ISO 映像来填充虚拟磁盘之外,还必须在结束时启动这个映像。 $ kvm -no-acpi -m 384 -cdrom guestos.iso -hda vm-disk.img -boot d
复制代码Ari Kivity 已经编写了一组测试工具来测试 KVM,而不需要全部的设备模型。下面的代码片断(来自于 kvm-12/user/main.c)从较高的层次上查看了 VM 的启动(请参见 清单 1)。控制特性是由内核中的 ioctls 提供的(具体来说,在 ./linux-2.6.20/drivers/kvm/kvm_main.c 文件中)。
对 kvm_init 的调用会打开 /dev/kvm 设备,检查版本号(由 KVM 内核模块导出),然后分配一个 KVM 上下文对象并填充一些回调函数。kvm_create 函数会建立并映射两个内存区域,然后使用 ioctl(KVM_CREATE_VCPU)创建一个虚拟 CPU(VCPU)。
load_file 函数然后会将映像加载到给定的 VM 的地址空间中,然后调用 kvm_run 执行该 VM(使用 ioctl KVM_RUN)。尽管这个过程非常简单,但是它解释了如何使用 KVM 实例化新客户操作系统。
清单 1. 测试 KVM 系统管理程序的应用程序片断 int main()
{
void *vm_mem;
kvm = kvm_init(&test_callbacks, 0);
if (!kvm) {
fprintf(stderr, “kvm_init failedn”);
return 1;
}
if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) { kvm_finalize(kvm); fprintf(stderr, “kvm_create failedn”); return 1; } if (ac > 1)
if (strcmp(av[1], “-32”) != 0)
load_file(vm_mem + 0xf0000, av[1]);
else
enter_32(kvm);
if (ac > 2)
load_file(vm_mem + 0x100000, av[2]);
kvm_show_regs(kvm, 0);
kvm_run(kvm, 0);
return 0;
}
KVM 是解决虚拟化问题的一个有趣的解决方案,但是由于它是第一个进入内核的虚拟化解决方案,很难想象它会很快用于服务器虚拟化。还有其他一些方法一直在为进入 内核而竞争(例如 UML 和 Xen),但是由于 KVM 需要的修改较少,并且可以将标准内核转换成一个系统管理程序,因此它的优势不言而喻。
KVM 的另外一个优点是它是内核本身的一部分,因此可以利用内核的优化和改进。与其他独立的系统管理程序解决方案相比,这种方法是一种不会过时的技术。KVM 两个最大的缺点是需要较新的能够支持虚拟化的处理器,以及一个用户空间的 QEMU 进程来提供 I/O 虚拟化。但是不论好坏,KVM 位于内核中,这对于现有解决方案来说是一个巨大的飞跃。