自互联网出现以来[1],云计算的概念已经提出了有50年。1957年,John McCarthy将计算机中的分时共享概念设计成了一种工具。从此以后,这个概念的名字经历过数次变化:从“服务中心(service bureau)”到应用服务提供商,到互联网即服务,到云计算,再到软件定义的数据中心,每个名字都有细微的差别。但是,核心概念没变:提供基于互联网(云)的IT服务。
美国国家标准与技术研究所(NIST)的云计算定义用的最多:云计算是一种模型,使用户可以随时随地、便捷地、随需应变地通过网络访问可配置的计算资源(例如,网络、服务器、存储、应用、及服务)共享池,池中资源可以快速分配及释放,并且只需要很少的管理工作量以及与服务提供商的交互[2]。
提供商使用三种众所周期的模型(见图1):IaaS(基础设施即服务)、PaaS(平台即服务)和SaaS(软件即服务)。这里,我们重点讨论IaaS。下一步是选定一种模型部署云服务。在公有云中,提供商向任意客户提供基础设施。私有云只提供给一个组织。在混合云中,公司组合使用公有云和私有云。
为了选出最适合组织的云计算模型,必须分析组织的IT基础设施、用途和需求。为了帮助完成这项工作,我们将在这里描绘一幅云计算的现状图。
云计算最佳实践
和每一种新的架构模式一样,重要的是在设计系统时考虑新技术的特性。 为了选出一个云提供商或技术,你应该了解自己的需求,以便列出需要的特性。下面是一些云迁移的最佳实践[3]。
弹性架构
IaaS提供了明确的可扩展性。云比传统物理硬件的缩放策略做得要好。为了从这种潜力中获得尽可能强的可扩展性,在设计系统和应用程序架构的时候应该尽可能的解耦,使用一种面向服务的架构,并在服务之间使用队列。
设计时为故障做好准备
高可扩展性有其局限性。IaaS技术和架构会导致系统不够健壮,因为用多个软件层替换硬件明显增加了复杂度和故障点。冗余和容错是主要的设计目标。
为了保证业务连续性,除了要建立备份策略外,还要确保系统做好了重启准备。借助服务器配置和部署步骤,部署实践自动化是必须的。自动化需要新的开发实践(开发和运维管理、持续集成、测试驱动开发等等)和新的工具,比如Chef、Puppet或Ansible。
高可用性
对任何企业而言,IT资源破坏都会产生巨大的负面影响。在迁移到云上后,会失去对底层基础设施的控制,而且服务水平协议(SLA)并不能涵盖所产生的所有费用,所以,在设计时要考虑到停机和高可用性。由于创建虚拟实例非常简单,所以部署服务器或服务集群成为一种受欢迎的方式。在这种场景下,负载均衡是一种被广泛认可的集群操作技术;在选择云提供商时,这是一个需要考虑的重要特性。
另外,还有一点也很重要,就是使用多个可用区域或者至少是不同的数据中心,从而确保系统尽可能地健壮。在2011年4月,Amazon Web Services(AWS)就经历过,其系统停止运行或者时断时续地运行了4天。将集群划分到不同的区域和数据中心可以提高资源弹性。
性能
需要考虑与技术有关的技术局限性——主要是缺少隔离性,没有健壮性。在任何多租户环境中,一个实例的性能可以影响相邻的实例。相邻实例使用率骤升会影响可用资源,特别是计算单元和磁盘的IOPS(每秒I/O操作次数)。架构应该处理这种变化。
另外,由于延迟问题,可能会出现瓶颈,即使是在同一个数据中心的实例中。云提供商提供了一些特性用于处理这种情况(比如,AWS placement groups)。不过,如果你的架构有服务器在不同区域的数据中心里,那么你应该考虑使用其它技术(比如,缓存)。
安全
由于公有云的开放性,设计和维持一个安全的基础设施在任何云部署中都应该是一种重要的目标。务必采用被广泛认可的安全实践:防火墙、最小化服务器服务以便减少攻击媒介、保持操作系统版本最新、基于密钥的身份验证等。但是,挑战可能来自于需要维护的服务器数量增加以及在不同的开发环境中使用云:开发环境、过渡环境和生产环境。在这种场景下,隔离以及保证每个环境的安全非常重要,因为原型服务器中的一个漏洞可以提供通过密钥访问整个基础设施的可能。
监控
新资源易于部署使得服务器数量呈指数增长。这提出了新的问题,监控工具对系统管理而言至关重要。首先,它们在周期性扩展和基于事件的自动扩展中发挥基础性作用。其次,它们是确保架构健壮性所需工具的一部分,就像Netflix Chaos Monkey那样。最后,它们对安全漏洞检测和事故调查非常重要,正如某些安全漏洞所表现的那样。