基础设施即服务(InfrastructureasaService,IaaS)是一个极好的概念:您使用计算资源并支付费用。需要的资源越多,支付的费用也就越高。这个模式的不足之处在于,您看不到正在使用的计算机,您对那些计算机真的知之甚少。但一旦克服这一点,使用IaaS可以带来很多好处。
由于IaaS模式与传统的购买服务器的模式差别很大,因此您管理您的虚拟计算机的方法也随之发生改变。这还意味着,您在云中运行应用程序的方式也发生了改变。以前想当然的东西,比如服务器之间无足轻重的延迟,现在不再理所当然。
本文章将跟随一个Web应用程序从一个单一物理服务器到AmazonElasticComputeCloud(AmazonEC2)的迁移过程。途中,您将了解如何调整您的应用程序以适应云环境,以及如何利用云提供的特性。首先,您将看到从一个物理服务器到一个云服务器的直接迁移。
使用AmazonEC2
AmazonEC2允许拥有信用卡的任何人按小时支付服务器费用,通过一个应用程序编程接口(API)来打开和关闭服务器。您可以选择各种各样的服务器—取决于您的主要考虑因素是内存、磁盘还是CPU—以及从永久性磁盘到负载平衡器的一套附件。您只需为使用的资源付费,这使得Amazon服务成为您的应用程序的一个颇具吸引力的选择。
与AmazonEC2产品一起提供的还有其他一些服务,它们向您提供付款处理、数据库和消息排队等功能。在本文中,您将使用AmazonSimpleStorageService(AmazonS3),该服务基于即用即付模式提供磁盘空间访问。
应用程序
本系列用作示例的Web应用程序是一个称为SmallPayroll.ca的工资表服务,使用RubyonRails框架和一个PostgreSQL后端编写。它是一个典型的Web应用程序:拥有一个数据库层、一个应用程序层、以及一组静态文件,比如层叠样式表(CSS)和JavaScript文件。用户导航各种表单以输入和操作数据,这些表单将用于生成报告。
使用的各种组件是:
?Nginx。静态文件和中间层的平衡器的前端Web服务器。
?Mongrel。应用程序服务器本身。
?Ruby。用于编写应用程序的语言。
?Gems。您将使用第三方插件和库完成从数据库加密到应用程序级别监控的所有任务。
?PostgreSQL。StructuredQueryLanguage数据库引擎。
站点的使用已经超越了现在托管该站点的单个服务器的能力。因此,需要迁移到一个新环境,这是迁移到云的最好时机。
理想的改进
从一个服务器迁移到基于云的少量服务器不能自动利用云的功能,也不会达到令人兴奋的读取效果。在迁移过程中,您需要进行一些改进,有些改进只有在云环境中才可能实现:
?提高的可靠性。由于可以选择在云中运行的服务器的大小,因此可运行多个小服务器以留取冗余空间。
?上下缩放能力。随着服务增长,服务器也逐渐被添加到池。但是,服务器的数量也可以增加以应对短期流量剧增,或在一定的间歇期间减少。
?云存储。应用程序数据备份将使用AmazonS3完成,消除了磁带存储的必要性。
?自动化。Amazon环境中任何事物—从服务器到存储再到负载平衡器—都可以自动化。管理应用程序需要的时间更少,这意味着可以花费在其他生产力更高的任务上的时间更多。
测试和迁移策略
当您第一次部署一个应用程序时,您通常拥有能够测试和调整应用程序而免受生产流量干扰的便利。相比之下,迁移则拥有用户这个增加的元素,这些用户正在站点上放置一个负载。一旦新环境接收生产流量,用户将期待一切运转正常。
迁移并不一定意味着零停机。如果允许服务离线一段时间,那么迁移将更容易。您将使用这个停用窗口来执行最终数据同步并允许任何网络更改趋于稳定。这个窗口不应用于执行对新环境的初始部署—即,新环境在迁移开始前应该处于操作状态。记住这一点,关键问题是环境与网络更改之间的数据同步。
当您准备制定您的迁移策略时,首先检查一下您的当前环境是很有帮助的。回答以下问题:
服务器上使用什么软件来运行这个应用程序?
服务器上使用什么软件来管理和监控应用程序和服务器资源?
所有用户数据存储在什么地方?数据库和文件呢?
静态文件(比如图像、CSS和JavaScript文件)存储在其他位置吗?
要进入其他系统,应用程序需要什么样的接触点?
所有资料最近都备份了吗?
通知用户
通常,在迁移之前最好先通知用户,即使您预计不会出现停机。在SmallPayroll.ca应用程序案例中,用户通常以一致的间隔定期使用站点,这个间隔对应于他们的双周发薪周期。因此,提前两星期的通知将是个合理的周期。GoogleAdWords(这是Google广告平台的管理界面)这样的站点提供提前一周的通知。如果您的Web站点主要是一个新闻站点,停机一小时不会对用户造成太大的影响,那么您可以选择停用当天再通知用户。
根据您的站点性质以及当前与您的客户的沟通方式,通知的形式也会有所不同。对于SmallPayroll.ca,在用户登录时显示一条显眼的消息就可以了。例如,这条消息可能是“系统将于东部时间2010年6月17日12:01a.m.至1:00a.m.之间停用。在此时间前输入的内容将被保存。要了解更多信息,单击此处。”这条信息提供用户需要了解的三点关键信息:
停用将发生的时间,包括时区。
保证他们的数据将是安全的。
了解更多信息的联系方式。
如果可能,避免使用12:00a.m.或12:00p.m.之类的时间,包括词汇midnight。这些时间和词汇可能会使人们感到困惑,因为许多人不能确认6月17日midnight指的是凌晨(12:01a.m.)还是午夜(11:59p.m.)。同样,许多人也搞不清noon指的是12a.m.还是12p.m。最好添加一个分钟,使时间更清楚。
您的详细信息可能会不同,特别是您预期停用期间的部分功能时。如果您决定您只需在停用期间张贴通知(比如对一个新闻站点而言),那么上面的信息仍然有用。我最喜欢的停用屏幕显示的消息是“本站点将停用以进行维修,请在3p.m.EST左右进行备份。等待期间可以玩玩Asteroids游戏!”
也不要忽略您的内部用户。如果您拥有客户代表,则需要通知他们,以免他们的客户提出问题。
DNS考虑事项
域名系统(DNS)负责将www.example.com这样的名称转换为192.0.32.10这样的IP地址。您的计算机连接到IP地址,因此这种转换很重要。当您从一个环境迁移到另一个环境时,几乎肯定要使用另一个IP地址(惟一的例外是您仍处于相同的物理建筑内)。
计算机将这个名称缓存到IP映射一段时间,这个时间段称为timetolive(TTL),以减少总响应时间。当您从一个环境切换到另一个环境时—因此也是从一个IP地址切换到另一个IP地址—缓存了这个DNS条目的人将继续尝试使用原来的环境。应用程序的DNS条目及其关联TTL必须小心管理。
TTLs通常位于1小时和1天之间。但是,为准备一次迁移,您需要TTL处于较短的时间段,比如5分钟。在您打算更改地址之前,必须提前至少1个TTL时间段执行更改,因为计算机将把TTL以及名称缓存到IP映射。比如,如果www.example.com的TTL设置为86,400秒(一天),那么您需要至少在迁移之前一天将TTL重置为5分钟。
解耦合新旧环境
在迁移之前全面测试您的新环境很关键。所有测试都应该与生产环境隔离,最好使用一个生产数据快照,以便您能够更好地测试新环境。
使用一个生产数据快照来执行一个全面测试有两个目的。第一,使用真实数据更容易定位错误,因为真实数据比开发期间使用的测试数据更难预测。真实数据可能指您在测试过程中忘记复制或需要某些配置而您又忘记了的文件。
第二,您可以在加载数据的同时练习您的迁移。您应该能够对迁移计划的大多数方面胸有成竹,除了环境的实际切换。
即使您能像生产环境一样模拟您的新环境,但只有一个环境可以与应用程序的主机名关联。绕过这个要求的一种最简单的方法是覆盖您的主机文件中的一个DNS。在UNIX?中,这个文件位于/etc/hosts中;在Windows?中,它位于C:\windows\system32\drivers\etc\hosts中。只需遵循现有DNS行的格式,添加一个条目以将您的应用程序的主机名指向它的未来IP地址。不要忘记对任何映像服务器或要迁移的任何对象执行相同的操作。您可能必须重新启动您的浏览器,此后,您将能够输入您的生产URL并转到您的新环境。
AmazonEC2入门
AmazonEC2服务允许您按小时支付一台虚拟机(VM)费用。Amazon提供几种不同类型的机器并根据它们的CPU、内存和磁盘配置文件分类。Amazon按照GB计量内存和磁盘,按照AmazonEC2ComputeUnits(ECU)计量CPU。1ECU基本等同于1.0到1.2GHzAMDOpteron或Intel?Xeon?处理器(2007era)。例如,标准小型实例提供1.7GB内存、160GB磁盘空间和1ECUCPU。本文撰写之时,最大的机器是High-memoryQuadrupleExtraLarge,它拥有68.4GB内存,1.7TB磁盘空间和26个ECU(跨8个虚拟核心分割)。价格从最少的每小时8.5美分到最多的每小时2.40美元。
AmazonEC2实例从一个AmazonMachineImage(AMI)开始执行其任务,AMI是您用于构建任意数量的VMs的模板。Amazon发布一些AMIs,您也可以构建自己的AMI并与他人共享。一些用户创建的AMIs可以免费使用;而另一些AMIs则在Amazon小时收费的基础上按小时计费。例如,IBM发布了几个收费AMI,允许用户按小时付费获取许可。
当您想要启动一个VM时,您选择机器类型和一个AMI。AMI存储在AmazonS3中并在您启动实例时复制到您的VM的根分区。根分区的大小总是10GB。与机器类型关联的存储空间称为实例存储(instancestorage)或临时存储(ephemeralstorage),并作为一个单独的驱动器呈现给您的VM。这种存储之所以称为临时存储,是因为当您关闭您的实例时,信息将永远消失。您需要定期备份您的数据以免损失。这还意味着如果运行您的实例的物理主机崩溃,您的实例将关闭,临时磁盘将丢失。
AmazonMachineImage
所有AMIs都由Amazon分配一个标识符,比如ami-0bbd5462。Amazon提供一些公共AMIs,其他人公开他们自己的AMIs。您可以选择从一个公共AMI开始并进行自己的修改,也可以从头开始构建自己的AMI。无论何时您对一个AMI的根文件系统进行修改,都可以将其保存为一个新AMI,这个过程称为重新绑定(re-bundling)。
在本系列中,您将从一个可公用的CentOS映像开始,当然您也可以选择另一个映像。明智的做法是花点时间仔细检查您使用的映像,确保没有额外帐户且包已更新。也可以从头开始构建自己的AMI,但这超出了本文的范围。
