↘亚马逊:“基础设施即服务”的先行者

李轶鹏 李雨航

亚马逊云计算概述

亚马逊(Amazon)公司成立于1995年,开始时主要经营网络书籍,其业务后来拓展到DVD、CD、衣物、家具和珠宝等其他网络销售领域,逐渐成为美国网上购物的首选网站。亚马逊在云计算领域走的是从“基础设施即服务”(IaaS)起家的道路。

亚马逊做云计算开始时是内部需求推动的。亚马逊有规模庞大的IT基础设施,以应付高峰时的网络流量(感恩节或圣诞节前后的网络流量可以是平常的许多倍)。但在其他时间,大部分的基础设施都处于闲置状态。为了有效使用所有的资源,亚马逊发现通过将其计算和存储能力以服务的方式提供给网络开发人员,可以达到双赢的局面:一方面,亚马逊避免了资源的浪费,开拓了新的利润增长点;另一方面,通过使用亚马逊提供的基础设施,开发人员就没必要在这些并非体现核心竞争力的方面投入大量的人力物力财力,从而可以把更多的注意力专注在提供优质的应用和完美的用户体验上。

亚马逊提供的“基础设施即服务”统称为亚马逊网络服务(Amazon Web Services,AWS)。自从2006年开始提供简单云服务以来,亚马逊在云计算上取得了长足的进展。亚马逊的网络服务可以分为两层:平台层和应用层。平台层提供网络应用所需要的计算、存储、数据库和网络通信能力,应用层则提供对网络应用的有效支持,比如应用程序间的通信、系统监控、网络付费等。表2-2给出了迄今为止亚马逊网络服务的主要服务和功能。

表2-2 亚马逊网络服务一览

在下面的篇幅中,我们将逐一讲解亚马逊的各项服务的基本概念和功能,以使读者对亚马逊提供的网络服务有一个基本的认识。我们还将介绍亚马逊网络服务的定价和若干应用实例,并讨论如何才能使网络应用变得更加可靠。

AWS的平台层服务

计算服务

亚马逊的计算服务为用户提供了网络应用所需要的计算环境。这个计算环境包括特定的硬件支持和基本的软件支持。用户可以根据网络的实际需求动态地调整所需的计算的多少,而按使用计费则可以使用户减少不必要的开支。

亚马逊的计算服务称为弹性计算云(Elastic Compute Cloud,EC2)。弹性计算云的核心概念是“实例”(Instance)。一个实例实质上是一个虚拟的服务器。它带有特定的计算能力,拥有虚拟的内存,运行特定的操作系统和应用程序。如果这个实例运行的是微软的操作系统,用户可以通过远程桌面的方式连接,然后就像是操作一台物理的服务器。如果是Linux操作系统,用户可用类似的方式连接和管理。

在设置实例的过程中,用户可以选择系统的软硬件配置。硬件的配置由实例类型(Instance Type)来控制。不同的类型代表不同的硬件配置。目前,亚马逊提供多种不同的实例类型来满足不同的需要。比如说,小号标准类型中的硬件配置包括等价于一个弹性云计算单元(EC2 Compute Unit,ECU;相当于一个1.0到1.2 GHz的2007 Opteron或是2007 Xeon的处理器)的处理器,1.7GB的内存和160GB的本地存储。而一个高处理性能超大容量的实例的硬件配置则包括等价于20个弹性云计算单元的带有8个虚拟核的处理器,7GB的内存和1690GB的本地存储。实例的软件配置由亚马逊机器映像(Amazon Machine Image,AMI)来决定。亚马逊机器映像相当于一个硬盘的映像,是操作系统及应用软件的一个套餐。用户可以选择亚马逊预先定制的机器映像,或是从亚马逊市场上购买其他用户创建的映像,也可以自己创建然后上载。用户一旦确定实例类型和亚马逊机器映像类型,亚马逊网络服务就可以创建一个虚拟的服务器。用户还可以方便地指定所需要的实例的数量。

实例还可以分为按需实例(On-Demand Instance)、预留实例(Reserved Instance)和竞拍实例(Spot Instance)。对于按需实例,用户按照需求动态地创建和使用,无须长期的承诺。用户也可以要求亚马逊为其预留一部分实例,一方面可以减少创建实例所需要的时间,另一方面也可以享受亚马逊为此提供的打折。亚马逊还提供了竞拍实例。用户通过竞拍的方式来获取亚马逊未使用的计算资源。如果用户对计算的时效性要求不高,竞拍实例是一个很好的选择,它可以显著地降低用户云计算的费用。

每一个实例都带有自己的本地存储。这种存储是和实例相关联的。当一个实例被终止,或是由于某些原因实例崩溃时,存储的内容就不复存在(不过当一个实例被重启时,存储的内容会被保留)。然而在大多数情况下,应用程序需要独立于实例的存储以保证数据不会丢失。亚马逊提供两种这样的存储。一种是简单存储服务(在下面的篇幅中会进一步讨论),另一种是弹性块存储(Elastic Block Storage,EBS)。弹性块存储上的数据可以长期保存而不依赖于某个特定的实例。用户可以在其上创建卷(Volume),每个卷可以被想象成移动硬盘。用户可以创建多个卷,然后挂载到实例上去。在卷上需要创建文件系统,这样实例上的应用程序才可以往卷上读写数据。在实例中,对卷的访问就像是一台物理服务器对其物理外设的访问。这种设计使得利用亚马逊的弹性计算云来实现各种网络应用十分自然。弹性块存储还提供一个非常有用的功能,那就是快照(Snapshotting)。它允许弹性块存储上的内容被完整地备份到其他地方。合理使用弹性块存储的快照功能可以有效地提高网络应用的可靠性。当弹性块存储上的内容变得不可用时,快照可以很方便地还原弹性块存储的状态。

亚马逊弹性计算云在创建每个实例时,会自动为其分配静态的IP地址,这样外界可以对其进行访问。如同实例自带的存储一样,这样的静态IP地址并不持久。当实例消失时,静态的IP地址就会变得不可用。由于域名服务器的更新需要时间,变化的静态地址会导致网络应用的暂时不可用。亚马逊的解决办法是弹性IP地址。这个地址与亚马逊网络服务的用户名相关联,然后映射到相关的实例上。由于亚马逊网络服务拥有系统的所有信息,当一个与弹性IP地址相对应的实例失效后,它可以在极短的时间里更新弹性IP地址和实例的映射关系,从而避免因实例失效而导致用户网络服务的不可用。

亚马逊弹性计算云提供了很多措施来保证用户的网络应用能够可靠地运行。这些措施中很重要的一条是提供地理上的冗余度。用户的实例都运行在可用区(Availability Zone)中,而每个可用区属于一个特定的区域(Region)。区域是地理上分开的计算设施,相当于一个个数据中心。一个区域可以包含一个或若干个可用区。可用区之间相互独立,通过高速和低延迟的网络相连接。当一个可用区中的实例失效时,其他可用区中的实例可以不受影响。如果用户希望其网络应用的停机时间尽可能短,那就应该考虑将实例部署在不同的可用区甚至是不同的区域中,以充分利用亚马逊网络服务所提供的冗余度。目前,亚马逊有7个区域,分布在世界各地(美国3个,欧洲1个,亚洲2个,南美洲1个)。

亚马逊弹性计算云还提供了自动规模调节(Auto Scaling)和弹性负载平衡(Elastic Load Balancing)的功能。在自动规模调节中,亚马逊根据网络需求的大小自动调整用户的网络应用所使用的实例的多少。这可以有效地帮助用户减少不必要的开支。而弹性负载平衡则可以自动地均衡服务器所处理的网络请求。

弹性大数据云(Elastic MapReduce)是弹性计算云的一个很重要的应用。云时代的大规模数据处理能力已经从可有可无变成必不可少。MapReduce是处理大规模数据的一套相对成熟的算法,但是它对基础设施的要求很高,需要有海量的计算和存储能力,以及相配套的文件系统。亚马逊的弹性大数据云有效地降低了处理大规模数据的门槛,使得中小型企业也有能力进行有效的数据分析。

表2-3所示的是亚马逊弹性计算云发展的时间表。从这个表可以看出亚马逊的弹性计算云走的是一条循序渐进的道路。亚马逊首先构建了弹性云的基础,然后在此之上提供更多的功能来满足用户更多的需求。

表2-3 亚马逊弹性计算云发展时间表

存储服务

亚马逊的存储服务是亚马逊网络服务的基础之一。其中最知名和应用最广泛的是简单存储服务(Simple Storage Service,S3)。简单存储服务是亚马逊的第一个公共网络服务,于2006年3月在美国市场投入运营。它可以单独使用,也可以和亚马逊网络服务的其他服务,比如弹性计算云,一起使用。简单存储服务是一种简单、持久且可靠的存储。

对于用户而言,简单存储服务是一个“桶”(Bucket)的集合。用户可以在简单存储服务中创建桶。桶的命名必须在整个简单存储服务中唯一,这样有助于简化桶在其中的全局共享。从逻辑上而言,简单存储服务采用的是一种简单的单层目录结构。它支持超大的对象,现在最大的对象可以达到5TB。这是云存储的一个典型的优势:它屏蔽了存储大数据的复杂性。如果用户想自己支持如此大的数据,他需要对分布式存储相当熟悉。每一个对象包含一个键(key),也就是其名字。键可以用来定位对象在简单存储服务中的位置。对象还包含数据、元数据(对数据的描述),以及访问控制数据。

简单存储服务为用户提供了可靠的云存储。这种可靠性主要是通过对象的冗余度来实现的。当用户存储一个对象时,这个对象会被复制到多个地方。一旦某个对象由于某种原因不能使用,简单存储服务就会用对象的一个副本来代替,同时增加一个副本。对于用户而言,这种替代是透明的,用户不会觉察到其中的区别。这种冗余措施使得数据的可靠性大幅度增强,不过会牺牲系统的响应速度以保持数据的一致性。

简单存储服务的另外一个设计目标是数据的安全性。由于存储的数据可能包括用户的个人信息和企业数据,安全性是重中之重。简单存储服务的安全性主要是通过基于数字签名的身份认证和访问控制列表(Access Control List)的双重访问控制来实现的。S3采用基于HMAC-SHA1的消息认证协议来验证用户的身份。经过身份验证的用户可以访问特定的对象,但只有当这个对象的访问控制列表允许其访问时。一个对象的所有者拥有对象的所有访问权限。对象的所有者可以通过改变访问控制列表的方式授权其他用户访问该对象。访问控制列表还指定用户对每个对象的读和写的权限。

简单存储服务可以用做亚马逊弹性计算云的持久存储。前面提到过,用户可以使用弹性块存储来实现类似的功能。不过两者有很大的区别:

1.简单存储服务可以独立于弹性计算云使用,而弹性块存储只能用于弹性计算云中。

2.弹性块存储能够存储的数据量比简单存储服务要小。

3.弹性块存储一次只能被一个弹性计算云的实例访问,而简单存储服务则可以被数个实例同时访问。

4.简单存储服务在写入数据时有延时,而弹性块存储则没有这个问题。

数据库服务

数据库在当今的网络应用中占有重要的地位。为了满足不同的需求,亚马逊提供了数种数据库支持,包括以下几点。

1.简单数据库(SimpleDB):适用于小型的、无模式的数据存储和查询。

2.DynamoDB:适用于大型的、无模式的数据存储和查询。

3.关系型数据库服务(Relational Database Service,RDS):目前广泛应用的关系型数据库,例如SQL等。

4.用户自己选择和管理的数据库。

简单数据库是一种广泛应用的数据库,它在亚马逊网络服务中占有重要的地位。它有以下几个重要的概念。

1.属性(Attribute):属性是对一个对象的某一方面的描述。如果这个对象是人,属性可以是名字、出生地,等等。

2.值(Value):值是某个属性的具体内容。如果属性是名字,值可以是张三、李四,等等;如果属性是籍贯,值可以是北京、上海,等等。

3.条目(Item):条目是对一个对象进行描述的所有属性和值的集合。

4.域(Domain):域是所有条目的集合。

简单数据库和关系型数据库有一个本质的不同,那就是它是无模式(Schemeless)的,也就是说用户无须事先定义一个条目所包含的属性。新的属性可以随时添加,同一个域里的两个条目可以包含不同的属性。比如说,张三的属性可以是名字、籍贯和工作单位,而李四的属性可以是名字、出生日期和电子邮箱地址。无模式型数据库的优点在于它的灵活性:它能迅速响应数据的变化而无须改变数据库的结构。

简单数据库一般和亚马逊网络服务的其他服务结合起来使用。一个典型的应用是为简单存储服务中的对象提供多元数据。比如说,用户在简单存储服务中存储一个视频对象,在简单数据库中创建一个相应的条目,这个条目中的一个属性说明这个视频在简单存储服务中的位置,而其他的属性则用来描述这个视频的其他方面,例如视频的介绍,用户的评论等。前面提到过简单存储服务中的对象也可以有用户定义的元数据,但是那里的元数据非常有限,其大小不能超过2KB。简单存储服务和简单数据库的结合使用反映了两个服务的不同特点:简单存储服务主要是用于可靠的存储,对数据的检索比较慢;简单数据库可以支持快速的检索,但是不适用于大型数据的存储。

简单数据库不适用于超大型非关系型的数据库,这是因为简单数据库对域的数量和同一个域中的数据大小有一定的限制(每个用户最多可以有250个域,每个域中的数据不能超过10GB)。它能够同时满足的服务请求的数量也是有限的(一般不超过每秒25次写操作)。而DynamoDB则没有类似的限制,DynamoDB也是无模式型的数据库,但是DynamoDB的可扩展性更好。它能够自动地对数据进行分区,对负载进行平衡,因此对域的大小和服务请求的数量都没有限制。它的响应速度更快(数据存储于固态存储器中)。

由于关系型数据库在企业中的广泛应用,对此类数据库的支持也是亚马逊云计算的重点之一。亚马逊这类的服务称为关系型数据库服务(Relational Database Service,RDS)。关系型数据库服务允许用户方便地设置MySQL、Oracle或SQL数据库引擎。这样用户可以使用已有的工具和代码。和简单数据库DynamoDB一样,使用关系型数据库服务可以大量减少烦琐但必需的数据库管理工作,例如数据库所需的软硬件的支持和维护、数据的备份,以及索引的生成,等等。用户从而可以将其注意力集中于对数据的操作。在亚马逊的云计算中创建关系型数据库十分简单。用户只要使用关系型数据库服务的程序接口来指定所需要的数据库类型,亚马逊网络服务就能够自动创建一个数据库实例(DB Instance)。然后用户可以像使用通常的数据库一样使用它们。

如果需要,用户还可以选择带有用户指定关系型数据库的亚马逊机器映像。这样,用户对数据库拥有完全的控制权。

网络互联服务

亚马逊网络服务的虚拟私有云(Virtual Private Cloud,VPC)允许用户在亚马逊的云计算中构造一个私有的网络环境。这个环境可以拥有和用户自己的网络类似的拓扑结构,同时用户对这个网络环境有完全的控制权,可以定义自己的IP地址的范围,创建子网等。虚拟私有云使得企业用户可以很方便地将其企业网扩展到亚马逊的云计算环境中去,这使得亚马逊网络服务可以吸引更多的企业用户。

亚马逊网络服务的另一个和网络互联相关的服务是Amazon Route 53(域名服务器使用端口53来响应用户的域名解析的请求,因而得名)。这是亚马逊提供的一个网络域名服务,它的一个突出特点是允许用户以编程的方式动态地更改域名和其与亚马逊网络服务资源的映射关系(这里所说的资源可以是弹性计算云中的机器实例或是简单存储服务中的桶,等等)。

AWS的应用层服务

应用程序服务

在一个分布式的网络应用中,不同的服务器经常被用于处理不同类型的任务。这样,不同的服务器之间需要通过交换信息来协调各自的任务。比如说,在一个搜索引擎的应用中,有些服务器会专门负责从网上获取网页,而另外一些服务器会负责对网页进行处理。处理网页的服务器需要知道什么网页已被获取从而能够开始其工作。亚马逊的解决方案,简单队列服务(Simple Queue Service,SQS),使得不同的虚拟服务器或是应用程序间的信息交换变得非常容易。

简单队列服务的两个基本概念是“队列”(Queue)和“消息”(Message)。一个发送方服务器首先向简单队列服务申请创建一个队列。队列申请成功后,发送方就可以向队列中发送消息,而接受方则可以向一个指定的队列请求信息。当一个信息处理完毕后,接受方可以发出请求来删除消息。简单队列服务还负责解决消息的同时性的问题,也就是一个消息同时被两个或两个以上的接受方处理的问题。当一个消息被处理时,它会被锁定,其他的接受方将不能对其再进行处理。但是如果这个消息没有被成功处理,在一定的时间之后,它会被解锁,从而使得其他的接收方可以继续尝试。这个简单的在服务器间传递消息的模型为服务器(或者是程序)之间的通信提供了巨大的便利。

亚马逊还提供简单通告服务(Simple Notification Service,SNS)来支持网络应用程序和订阅用户(Subscriber)的信息传送。通过简单通告服务,网络应用程序可以及时地将消息推送给订阅用户。简单通告服务的使用十分简单。开发人员只要通过给定的应用程序接口创建一个题目(Topic),设定权限和通告将使用的协议即可。当用户订阅这个题目后,一旦有新的内容出现,通告服务就会负责把消息推送出去。简单通告服务的一个典型的应用是比赛数据的实时更新。

云搜索(CloudSearch)是亚马逊网络服务的另一个十分有用的服务。搜索是一个应用程序需要支持的基本功能之一,但是搜索需要用户对索引和查询等技术有深入的了解。亚马逊的云搜索服务可以让用户很方便地支持基本的搜索服务。用户只需要创建一个搜索域,设置搜索选项和上载要被搜索的数据,云搜索就可以为此数据创建索引以满足搜索的需求。云搜索支持对自由文本的检索,用户还可以设置搜索的相关性和文本处理的选项,以达到最佳的搜索结果。

监控服务

在实际的网络应用中,对系统状态的密切监控具有举足轻重的作用。用户可以根据监控数据对系统做出及时调整。亚马逊的云监控(CloudWatch)和管理控制台起的正是这样的作用。云监控不仅可以监视亚马逊网络服务的资源使用情况(比如说弹性计算云中的计算实例或是关系型数据库服务中的数据库实例),它还可以监视用户的应用程序和服务所产生的数据。亚马逊的管理控制台(Management Console)是用户和亚马逊的网络服务以非编程方式交互的枢纽。通过管理控制台,用户可以很容易地得到自己所使用的亚马逊资源的概况,也可以很方便地用它来使用前面提到的亚马逊网络服务的所有服务。

部署服务

亚马逊提供的部署服务有两种。第一种是弹性豆瓣第三方应用管理(Elastic Beanstalk,EB)。用户首先在本地开发好应用程序,然后将其上载到简单存储服务中。这时用户就可以通过弹性豆瓣在云计算中来创建这个应用程序。弹性豆瓣会自动创建弹性负载平衡和弹性计算云的实例(实例的类型可以在弹性豆瓣的设置中指定),自动设置规模控制和云监控。最后用户就可以通过弹性豆瓣产生的域名来访问自己的应用程序。弹性豆瓣和其他云计算供应商所提供的平台即服务(PaaS)有共同之处,但是它给用户提供了更多的对底层软硬件资源的控制。

另一种亚马逊提供的部署服务是云程序服务(CloudFormation)。云程序服务提供了一个模板,用户只要描述所需要的资源,亚马逊网络服务会负责得到那些资源。模板还描述了资源之间的依赖关系,比如说一个弹性块存储的卷必须和使用它的弹性计算云的实例在一个可用区中。这样用户就不用去考虑这些系统设置的细节问题。云程序服务还可以帮助用户自动重复同样的部署。

支付服务

开发付(DevPay)和灵活支付服务(Flexible Payment Service,FPS)是亚马逊提供的两种支付服务。开发付主要是用于用户向开发人员购买基于亚马逊网络服务的应用程序的支付费用,而灵活支付服务则使得一个网络应用的开发人员可以方便向使用其服务的用户收取费用。通过灵活支付服务,一个开发人员无须处理和网络交易相关联的一系列棘手问题,比如信用卡信息的验证和保存,交易信息的存储和返回等。灵活支付服务同时还提供了许多灵活的支付手段,像一次性收费、周期性收费和三方付费等。

内容投递服务

现在越来越多的网络服务已经不再局限于某一个市场的用户。而要使全球的用户都有相同的用户体验,内容投递就变得极其重要。亚马逊的解决方案是云内容分发服务(CloudFront)。云内容分发服务使用亚马逊建立的分布在世界各地的边缘服务器的网络来进行内容的投递。用户首先指定数据源(可以是亚马逊网络服务中的资源,或是用户自己的服务器),然后在云内容分发服务中注册。注册的结果是一个分布(Distribution)的域名,同时数据源中的内容会被复制到亚马逊的边缘服务器中去。当用户使用新产生的分布域名来访问时,用户就会被自动地路由到离其最近的边缘服务器,从而减少网络延迟和提高用户体验。对于对延迟很敏感的网络应用,比如视频放送或是网络直播,云内容分发服务是一个很好的选择。在这种情况下,用户无须建立自己的边缘服务器就可以使自己的内容能够高效快捷地投送给用户。

亚马逊网络服务的定价策略

亚马逊网络服务的定价策略主要是按使用收费。根据每项网络服务所使用的资源不同,价格也有所不同,具体的定价信息可在亚马逊官方网站上查到。这里我们概括性地说明一下亚马逊的定价策略。

亚马逊网络服务的定价有以下特点。

1.绝大部分的网络服务按使用收费。亚马逊根据用户使用的实例的类型和多少、存储的大小、数据传输的规模等因素收费。但是弹性云中的保留实例以及关系型数据库服务中的数据库保留实例是按预留时间的长短来定价的。

2.收费的细分。亚马逊网络服务的定价的划分很细致。比如在弹性计算云中,根据使用的实例的类型(按需实例、保留实例和竞拍实例)、硬件配置(不同的ECU和内存)、软件设置(Linux或UNIX,Windows服务器)的不同,用户所付的费用也不同。在简单存储服务中,根据存储的大小的不同,单位收费也有所不同(如果用户使用不到1TB的存储,那每GB每月的费用大约是13美分;如果用户使用10TB的存储,那么后9TB的单位收费大约是11美分)。

3.亚马逊网络服务间的数据传输费用与服务器所在的区域和可用区有关。如果是在同一个可用区内,数据传输是免费的。如果是在同一区域但是不同的可用区之间,亚马逊收取区域数据传输费用。如果是在不同的区域间传输数据,亚马逊则要收取互联网数据传输费用。用户需要同时为数据从一个区域中传出和从另一个区域中接收付费。

4.亚马逊的弹性云单独收费,其他网路服务另外收费。

为了吸引开发人员使用亚马逊网络服务,亚马逊为新用户提供一个免费使用的套餐,其中包括每个月750小时的基于Linux和Windows服务器的微型实例,5GB简单存储服务的存储空间,等等。

5.为了简化用户计算所需的费用,亚马逊提供一个网络服务计算器(Simple Monthly Calculator)来方便用户估计每月所需的费用。

由于亚马逊网络服务的种类很多,而每个服务的定价又和许多因素有关,用户需要考虑如何选择才能在给定的预算下充分使用亚马逊的云服务。优化在亚马逊网络服务上的网络应用会成为一个重要的趋势。另外,亚马逊网络服务的定价还迫使用户考虑如何平衡网络应用的可靠性和费用。把服务器安排在不同可用区甚至不同区域固然可以提高网络应用在面临各种事故时的可用性,但是这会增加使用亚马逊网络服务的费用。所以用户需要在两者之间做出一定的妥协。

实例分析

为了使读者能得到感性的认识,我们介绍两个成功应用亚马逊网络服务的实例,一个是在短时间内取得巨大成功的新兴网络公司,另一个则是一个使用新兴技术来实现原来难以想象的海量数据处理的老牌出版企业。随后,我们分析一个亚马逊网络事故的案例,并探讨使网络应用更加可靠的可能方式。

Instagram和千万用户

Instagram是一个非常受欢迎的在移动设备上编辑和共享图片的网站。用户使用移动设备上的相机拍摄一张照片,然后上载到Instagram的服务器进行图片处理。处理完的图片可以很方便地共享到不同的社交网络。自从2010年10月Instagram在苹果的iOS平台上发布以后,它经历了爆炸式的增长:发布两个月后它的用户达到100万,半年之后达到500万;到2012年4月,已经超过3000万。当月,Facebook宣布以近10亿美元的价格收购Instagram,一夜间成为业界新星。

在用户量急剧增长的同时,用户上传的照片的数量也在迅猛增长。到2011年7月,用户上传了1亿张照片,而一个月后,上传的照片总数就达到了1亿5千万张。令人难以想象的是,在这千万用户、亿万照片的背后,是一个仅有13名员工的小公司!

Instagram的成功,固然要归功于其创始人的创意和执行力,但云计算提供的低廉、安全且可弹性扩展的资源,也功不可没。这里,Instagram用的正是亚马逊提供的网络服务:Instagram采用亚马逊网络服务的弹性负载平衡来平衡用户的请求。每一个编辑图片的请求由设置在弹性计算云中的应用程序服务器来处理。由于图片处理对CPU的要求远大于对内存的要求,Instagram使用数十个弹性计算云的高CPU特大型的计算实例(7 GB的内存,20个ECU的计算单元,1690GB本地实例存储)来满足用户的需求。Instagram使用PostgreSQL来存储用户账户、图片的元数据等。PostgreSQL被设置在弹性块存储上,在运行时,数据库中的所有数据被读到内存中,以加快访问速度(Instagram发现弹性块存储的访问磁盘的速度不够快)。由于这个原因,Instagram使用弹性计算云的高内存型的计算实例(High-Memory Quadruple Extra Large;68.4G的内存)来实现用户数据的管理。Instagram的海量数据(好几个TB)则存储在简单存储服务中。为了提高全球用户的体验,Instagram还使用亚马逊的云内容分发服务来实现内容的配送以提高响应的速度。Instagram还通过亚马逊网络服务的不同措施来实现服务的可靠性,比如说用弹性块存储的快照功能来经常性地备份PostgreSQL的数据,以防止其丢失。

Instagram体现了构筑在亚马逊网络服务上的网络应用的一般特点,那就是有效地结合使用亚马逊的不同服务来满足大量客户的网络请求。

纽约时报和4 TB数据

2007年,纽约时报决定将从1851年到1922年发表的1100万篇文章制作成PDF格式的文档放在网上让公众访问。每篇文章是由大小不等的TIFF图片组成,制作PDF文档时需要将这些图片拼在一起。这项任务的挑战在于如何存储海量的数据(4TB的数据)并且能够对此进行并行处理。纽约时报采用的方案是将数据上载到亚马逊的简单存储服务中,在弹性计算云中设置基于MapReduce的开源软件Hadoop,结合其他图片处理和PDF生成程序来实现海量数据的处理,然后将生成的PDF文件写回到简单存储服务中去。开发人员在本地调试好应用程序后,构造了自己的亚马逊机器映像,然后将其安装在亚马逊的机器实例中。整个开发过程由一个开发人员在很短的时间内来完成。所有图片的处理工作在不到24小时的时间内完成(100个亚马逊实例)。给人印象最深的是,这整个项目的计算费用只有区区240美元(不包括网络流量的费用)。这充分体现了云计算在扩展用户的计算能力方面的巨大帮助。值得注意的是,这个项目是在亚马逊发布弹性大数据云(2009年4月)之前完成的。现在用户可以更加方便地处理大规模的数据。

亚马逊网络服务事故

亚马逊网络服务的出现显著地减少了用户在构建自己的IT基础设施时所需的人力和物力,但是它同时成为了成千上万的网络应用的安全和可靠运行的基础。一旦亚马逊网络服务出现问题,那些构筑在其之上的网络应用就会受到严重的影响。虽然亚马逊在设计其各项网络服务时考虑了可能遇到的问题,并提供了大量的冗余措施来提高服务的可靠性,但是由于云计算的复杂性,亚马逊网络服务在运行上还是不可避免地会出现问题。在2011年间,就出现了好几次用户不能访问亚马逊网络服务的情况。其中最大的一次对于使用云计算有很大的借鉴价值。

2011年4月21号清晨(美国东部时间),由于一个错误的网络设置的改变,亚马逊网络服务在美国东区(US East Region)的一个可用区中的弹性块存储节点开始出现大量的问题,随之而来的结果是弹性计算云中的很多实例不能访问弹性块存储。基于弹性块存储的关系型数据库服务也受到很大的影响,很多数据库不能被访问,直到5天后亚马逊网络服务的所有服务才得以完全恢复。这次事故使得数千个网站不能有效地服务用户。许多知名和广受欢迎的网站,比如Foursquare(基于用户当前位置的社交网站)、Reddit(用户对其他用户提交的内容进行投票表示喜欢程度的社交网站),以及Quora(用户自组织的问答网站)都受到很大的影响。

这次事故暴露出亚马逊网络服务在实现上的一些问题:系统监测不够完善,对网络设置的改变缺乏足够的安全审查机制。但它也给构建基于云计算的网络应用的用户提供了宝贵的经验,其中最根本的经验就是:要达到零时间的系统停机,网络应用本身必须具有容错性。亚马逊的基础设施服务固然提供了一个简单可靠的软硬件环境,但这不意味着这个环境能够百分之百有效。网络应用的设计和实现必须考虑到其使用的软硬件环境有可能失效,并且在失效时必须有办法来保持其服务的连续性。基础设施有效性的问题不是云计算特有的。在传统的IT的体系结构中,负责自己的网络基础设施的用户也会碰到同样的问题。具体到如何保证网络应用在一个可用区且出现故障时仍然能够平稳运行,用户主要的选择是将网络服务部署于几个可用区中,当一个可用区出现故障时其他可用区中的服务器可以用来处理用户的服务请求。用户也可以将其网络服务部署在几个区域中以达到更高的容错性。这样当一个区域出现问题(比如自然灾害)时,网络应用仍然可以使用。但是亚马逊网络服务不支持跨区的部署,用户需要自己备份数据和提供冗余度。此外,如果用户熟悉亚马逊网络服务所提供的各项服务的利弊,就可以选择最合适的服务以避免特殊情况下的损失,例如Netflix(广受欢迎的在线视频网站)很早意识到弹性块存储存在的问题,从而选择了基于简单存储服务的方案,在这次的事故中受到的影响就很小。

值得注意的是,在这次事故中,亚马逊其实并没有违反其服务水平协议。亚马逊的服务水平协议只是保证弹性计算云外部连接的可用性(用户可以连接到所创建的实例),它并没有提供对弹性块存储和关系型数据库服务的可用性的保证。

总结和展望

亚马逊在云计算的“基础设施即服务”领域是无可争议的先行者,也是目前的成功者。这体现在技术上,更体现在商业上。亚马逊的CEO杰夫·贝索斯是一个“长期价值理论者”,当云计算起步时,面对质疑的他多次向投资者呼吁不要在意公司几个季度的得失,并表示“我们不排斥被误解,我们低头专注做认准的事、坚持我们的理念”。带着这样的执著和理念,亚马逊种下了亚马逊网络服务这粒希望之种。另一方面,由于零售商的出身,亚马逊在云商业模式上非常注重成本控制,量入为出,稳步发展。2011年,亚马逊网络服务成为世界上首个营业额超过10亿美元并赢利的云服务,是迄今为止最大的云服务提供商。当年的希望之种正逐渐长成参天巨树,亚马逊这个以零售为主业的电子商务公司也随之异军突起,成为全球瞩目的IT行业巨头,在云浪潮下IT产业大融合大变革的过程中扮演起举足轻重的角色。

放眼未来,云计算的大幕才刚刚拉开,云计算的技术变革、商务变革、标准体系的建立等,在世界和中国,都还是悬而未决的课题。随着越来越多的IT巨头,包括软件、硬件、互联网、运营商等各领域的霸主,纷纷全力进入云计算,也随着越来越多的国家纷纷把云计算升级到国家战略层面来布局,亚马逊将面临更大的机遇和挑战,它能否凭借现有的先发优势,探索引领潮流的更先进计算模式、经济模式和生产关系转型模式,让我们拭目以待!

参考资料

[1] What Powers Instagram: Hundreds of Instances, Dozens of Technologies: http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of

[2] http://aws.amazon.com/message/65648/