《云计算应用架构》样章连载3
2.2 Amazon EC2
Amazon EC2
大多数人想到Amazon云时,想到的都是Amazon EC2。EC2是你的虚拟网络,里面运行着所有虚拟机。但是,EC2没法单独存在。用EC2时,需要用S3来存储EC2的机器映像(一会儿我们展开谈),也可以用S3来满足其他存储需求。如果你认为不需要了解S3而跳过了前面的章节,现在请翻回去补上。
2.2.1 EC2里的概念
EC2 Concepts
EC2比S3复杂得多。图2-1不仅显示了构成Amazon EC2的所有概念,还展示了这些概念之间是如何关联的。
主要的概念有:
实例
EC2的实例是虚拟服务器,克隆自机器映像,实例上运行何种访客操作系统取决于机器映像。
Amazon机器映像(AMI)
服务器的一份原始拷贝,可以用它来启动任意数量的实例。如果你熟悉ghosting这个概念,机器映像代表的就是ghost出来的映像,从该映像可以创建任意数量的服务器。机器映像至少应包含操作系统这个核心部分,除此之外,可以再预装些常用的工具。如果开发策略允许,也可以预先在其上装好Web应用程序。Amazon提供了些现成的AMI,刚接触EC2时可以从它们开始。值得一提的是,有很多第三方提供的AMI。当然,也可以建立你自己的AMI。
弹性IP地址
这是分配给你的静态IP地址(“弹性”这个词有点误导人,相信我,这个词指的就是静态地址,不是动态地址)。默认情况下,每个Amazon实例都有一个动态分配的IP地址,实例消亡后,该地址会分配给别的用户。弹性IP地址会为你保存下来,因此,对那些必须总是通过相同的静态IP地址来访问的实例来说很有意义。
地区
一组可用性区域,构成了单独一个地理上的集群。在本书出版时,Amazon EC2的服务水平协议(SLA)保证,在为期12个月的时间内,一个地区内至少有两个可用性区域,其可用性达到99.95%.
可用性区域
大致相当于数据中心。Amazon保证两个可用性区域不会有任何相同的故障点。当前,Amazon在美国有3个可用性区域,全都分布在东海岸。Amazon在欧洲有两个可用性区域。可用性区域还可以定义为:能启动实例,并能为应用程序创建某种地域冗余度的地方。
安全组
打个不太恰当的比方,安全组就相当于处于防火墙管理下的网段。实例启动后,可以加入安全组,安全组定义了谁能与新实例通话。
块存储卷
与SAN在概念上相似,它提供了块级别的存储,能从EC2实例上挂载。可以按照你的喜好来格式化卷,向卷中写任意数据,甚至可以将多个卷放到一起组建虚拟RAID。
快照
只要你愿意,任何时候都可以对块存储卷拍“快照”,用于备份或复制。这些快照存放在S3中,它们可以用来创建新的卷。
对比机器映像与实例
刚开始使用Amazon EC2进行云中的探索时,如果对机器映像(AMI)和实例的区别没法彻底弄明白,千万不要因此灰心。然而,弄清它们的区别非常重要,要想在云中获得长期收益,机器映像管理策略是关键。
机器映像是原型,根据它来创建虚拟服务器。要想对“什么是机器映像”获得直观的感觉,最好将它想象成服务器硬盘的拷贝,并且,只有新服务器启动时,该硬盘拷贝才被克隆过去。“新服务器”就是实例。每次启动一个实例,EC2都把机器映像拷贝到新实例的虚拟硬盘上,然后才开始启动实例。从一个机器映像可以创建任意数量的运行时实例。
用开发人员的术语来说,如果把机器映像想象成编程语言中的类,EC2实例就是对象实例。
2.2.2 访问EC2
EC2 Access
和S3一样,主要通过Web Services API访问Amazon EC2。在Web Services API之上,Amazon还提供了许多交互式工具,如:
l Amazon Web Services控制台(http://cosole.aws.amazon.com;见图2-2)。
l ElasticFox火狐插件。
l Amazon命令行工具。
一旦用熟了Amazon,你可能会选用一些更健壮的基础设施管理工具,如enStratus和RightScale。然而,刚开始时,可以多用用Amazon提供的各种工具。本章剩余部分的例子集中讨论命令行工具,该工具可从http://developer.amazonwebservices.com/connect/entry. jspa?externalID=351下载。下载完工具后,其他事情就简单了。不管最终用怎样的工具,命令行工具总是需要的。
2.2.3 建立实例
Instance Setup
在EC2里面,最简单的事就是启动一个实例。该动作动态地建立一台服务器,使其进入可用状态。
实例从存储在S3中的AMI启动。Amazon提供了一些预先建立好的机器映像,还可以买到一些商业映像。一旦用熟了EC2,甚至可以创建和注册自己的机器映像。
警告
由于机器映像存储在S3中,所以,如果Amazon S3无法访问,则无法启动新EC2实例。
可以通过命令行工具来查看有哪些机器映像已经准备就绪,可以使用:
ec2-describe-images -o amazon
-o amazon这个选项告诉命令行工具,寻找Amazon拥有的所有机器映像。刚开始时,你可能会选一个Amazon或别的供应商提供的标准映像来用。可以对这些标准映像进行定制,创建自己的映像并注册到Amazon中。要查看自己注册了哪些映像,可键入:
ec2-describe-images
输出大致会是:
IMAGE ami-225fba4b ec2-public-images/fedora-core4-apache-mysql-
v1.07.manifest.xml amazon available public i386 machine
输出的第二部分是映像ID。在所有其他场合中,不管用命令行工具还是用Web Services API,都要用这个值来代表映像。
第三部分是个S3对象,代表了机器映像的清单文件。清单文件向EC2描述了机器映像,ec2-public-images是存储映像的桶,fedora-core4-apache-mysqlv1.07.manifest.xml是代表映像清单文件的对象。
第四部分是机器映像的所有者——在此是Amazon。第五部分描述了映像的状态。第六部分标出映像是公开还是私有的。
第七部分,i386,标识了映像的目标架构。Amazon目前支持两种架构:Intel 32位(i386)和Intel 64位(x86_64)。
最后一部分标出了该映像的类型:机器、内存盘还是内核。目前我们只关心机器映像。
选择AMI
在EC2中选一个初学者使用的映像曾经很容易。现在的情况有所变化,有很多Amazon建立的AMI、第三方建立的AMI,你拥有广泛的选择空间。要说出哪个AMI名声好,哪个是垃圾,哪个又可能有木马或后门,这还真是件难事。幸运的是,Amazon在http://aws.amazon. com/amis上给出了一个目录,附带着评论和评级。通常会从选择你喜欢的Linux开始(虽然现在也可以选其他类型,如Unix,甚至是Windows)。需要先找一个由别人建立的AMI,它工作在你所希望的架构上,小巧精悍,只包含所需的最小特性集,同时又久经考验。这样一个AMI可以作为你进一步定制的基础。我个人喜欢由Eric Hammond创建的Ubuntu AMI。
不管选了什么,都应该从尽可能基本的东西开始,逐渐安装别的工具和服务。新工具和服务应该是支撑Web应用程序所必须的。在忙着安装东西之前,应该用诸如Bastille(http://www.bastille-unix.org)之类的工具加固服务器(译注1),安完定制的应用程序后,应再次加固。有关Amazon实例安全方面的细节,请参见第5章。
选好机器映像之后,下一步是启动基于机器映像的虚拟服务器实例:
ec2-run-instances AMI_ID
例如:
$ ec2-run-instances ami-1fd73376
EC2要么返回失败信息,要么返回新实例的“预订”信息:
RESERVATION r-3d01de54 1234567890123 default
INSTANCE i-b1a21bd8 ami-1fd73376 pending 0
m1.small 2008-10-22T16:10:38+0000 us-east-1a aki-a72cf9ce
ari-a52cf9cc
在这个例子中,情况很简单,预订和实例的区别体现得不明显,因为我只启动了一个实例。当启动实例时,不是只能一次启动一个——可以指定实例的最大和最小值。命令返回的预订信息中,描述了本次请求实际可以启动多少个实例。
例如,当到达一天的业务高峰时,可以启动新应用服务器来分散网站的压力。如果想启动10个实例来应对增加的负荷,有可能在你请求的那个特定时刻,哪个可用性区域中都没有足够支撑10个实例的资源。如果在没有10个实例资源的时候请求10个实例,请求会失败。然而,可以请求最小5个,最大10个实例。只要有足够支撑5个实例的资源,命令就能成功。预订信息会提供成功启动了的实例信息。
实例描述信息中,如下一些东西很重要,值得关注。
i-b1a21bd8
这是实例ID。在其他命令和Web Services API中,用这个来代表实例。
ami-1fd73376
AMI的机器映像ID,用来启动实例。
pending(挂起)
实例当前状态。其他可能的值还有running(运行中)、shutting down(关闭中)和terminated(终止)。
m1.small
运行的是哪类EC2实例。实例类型表明为实例分配了多少随机存取内存、磁盘空间和CPU。m1.small类型是最基本的类型。
us-east-1a
实例在哪个可用性区域中启动。因为我们在命令行上没有指定可用性区域,因此,EC2根据当前使用的状况挑选最合适的可用性区域。本章后面我会更深入地讲可用性区域。
现在的任务是等待。可能要过10分钟实例才能用。在等待的时候,Amazon在忙着为实例分配资源,然后启动实例。可以用ec2-describe-instance命令来检查实例的状态。
ec2-describe-instances [INSTANCE_ID]
例如:
$ ec2-describe-instances i-b1a21bd8
RESERVATION r-3d01de54 1234567890123 default
INSTANCE i-b1a21bd8 ami-1fd73376 ec2-75-101-201-11.compute-1.amazonaws.com
domU-12-31-38-00-9D-44.compute-1.internal running 0
m1.small 2008-08-11T14:39:09+0000 us-east-1c aki-a72cf9ce
ari-a52cf9cc
这个输出显示,实例现在已经处于“运行中”状态了。换句话说,可以访问它了,但是,还有一点小问题:你没有机器上的用户账号。
在听我告诉你如何取得机器的一个外壳账户之前,让我们先来看看,关于这个运行中的实例,你还应该了解些什么信息。
ec2-describe-instances命令的输出与ec2-run-instances的输出几乎完全相同。不同之处在于,因为实例现在处于“运行中”状态,所以,它还提供了实例的公共IP地址和私有IP地址。当实例启动时,Amazon会为其动态分配一个公共IP地址、一个私有IP地址。应该用公共IP地址来从云外访问实例,用私有IP地址在云内访问实例。