写点什么

"伤得起"的云计算应用——对云端应用之架构的思考

  • 2012-02-07
  • 本文字数:4144 字

    阅读完需:约 14 分钟

天有不测风云

云计算是一种新型的计算模式。其显著优势之一是云计算用户可以随时随地的使用来自互联网的服务,并且按使用量付费。在需要增加(或减少)计算能力时,可立即获得(或释放)资源,而在传统数据中心(非私有云环境)中,用户却需要采购硬件,安装配置操作系统和中间件软件,再部署应用。两种方式在运维工作上的差异一目了然,这正是云计算能够受到业界热捧和追逐的主要原因之一。那么,云计算是完美无缺的么?不尽然如此。在云计算的世界里,运维工作不再由云计算用户承担,转而交给虚拟化和自动化技术以及云计算提供商来承担。同时,云计算用户在享受弹性资源扩张或收缩的同时,也在一定程度上失去了对其使用资源的控制权,而如果云服务供应商的服务出现故障,或者云服务供应商由于商业运作的失败或其他原因而关门倒闭时,云计算用户就可能会面临巨大的风险。

2011 年 4 月 21 日至 22 日是值得云计算从业者纪念的日子。Amazon 的 IaaS 服务出现故障,导致许多商业网站的服务中断,影响非常严重。据 Amazon 官方网站称,受影响最严重的网站中有 Reddit , Foursquare Quora 等。此事件发生后,人们一时陷入慌乱,对云计算可用性的担心骤然升温。同时,也有人乘机夸大云计算的弊端,并宣称“云计算已死”(这让笔者想起当年关于“ SOA 已死”的论战)。炒作行为是可以理解的,我们自然不用去理会。但是,作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

“4- 21”事故分析

Amazon 将其基础设施划分为“区域(Region)”,这些区域好比一个个数据中心。例如,US-East-1 是 Amazon 位于北弗吉尼亚的数据中心,而 US-West-1 则是位于硅谷的数据中心。每个数据中心又被划分成多个可用分区(后简称为 AZ),AZ 就好比资源池,它由一组物理和逻辑资源组成。

Amazon 的提供的虚拟机是 EC2(Elastic Compute Cloud)。而其存储服务是 EBS(Elastic Block Storage)。EBS 是基于网络高性能且高可用的块(block)级别的持久化存储服务。EBS 可以挂接到某一个 EC2 实例上作为其文件系统使用。

当用户获得一个 EC2 分区实例时,同时会得到一块存储区。不过,该存取区是透明的,而且其生存周期与 EC2 实例是同步的。当 EC2 实例销毁时,该存储区也一同销毁,基于此,需要持久化的用户数据是不应该放在该存储上。

一般而言,运行网站和产品的云计算用户至少需要申请一个 EC2 实例和一个 EBS 存储。在 EC2 上运行应用和数据库,而数据则存储在 EBS 中。但是,若要将 EBS 存储挂接到 EC2 实例上,二者必须在同一 AZ 中(如图 1.a 所示)。用户也可以直接使用 Amazon 提供的 RDS(Relational Database Service),它是一个运行着 MySQL 的 EC2 实例,此时应用和数据就可分别位于不同的 AZ 中(如图 1.b 所示)。当然,将应用和存储分开还有其他方法,本文不再赘述。

“4-21”事故中,位于 US-East-1 区域的 EBS 存储和 Amazon RDS 服务都出现了问题。表现出来的现象是:不在 US-East-1 区域的用户未受影响,未使用 EBS 和 RDS 的用户不受影响。一般情况下,使用 EBS 或 RDS 是非常普遍的现象,因为大多数软件或网站都依赖于数据存储,所以,即便运行应用的 EC2 未受影响,也会由于应用需要访问已出现问题的 ESB 或 RDS 上的数据,仍然会导致服务不可用或服务变慢的问题。

Amazon 事故的的发生加速了人们对云可用性的思考,也进一步凸显了好的应用架构的优势,多家企业纷纷通过博客分享了他们使用 Amaozon AWS 的经验,对云计算用户端架构的建议。接下来,我们看看他们是怎么做的。

来自一线的经验

早在 2010 年 12 月,在线影片租赁提供商 NetFlix 的技术博客上就发表了文章《使用 AWS 的 5 大经验》。在这篇文章中,他们给出了以下 5 条建议:

  1. 云环境和传统数据中心不同,需改变思考问题的方法
    许多传统数据中心的应用部署和运维经验在云中不再适用,所以不能用传统的解决方法去解决云中出现的问题。比如,在自己的数据中心里,使用基于内存的 session 管理就是很好的方法,因为每个硬件实例出现故障的可能性微乎其微。然而,AWS 实例的出错率却高很多,所以需要不同高可用方案。

  2. 共租是难以实现的
    在云环境中设计面向用户的软件时,主要工作是降低整体上响应的延时。由于 AWS 是基于资源(硬件、网络、存储等)共享模式构建的,共租会引起各个层次上吞吐量的波动。或者你放弃任何特殊的操作,或者在 AWS 里管理好资源,这等于放弃了共租。

  3. 避免失败的最好方法是不停地出错
    Netflix 的技术人员喜欢将自己的软件架构称之为兰博架构,不论在何种情况下,每个系统必须靠自己存活。他们在设计分布式系统时考虑了其所依赖的其他系统的故障并且能够容忍故障。

他们在 AWS 中创建了一个被称为“捣乱猴”的系统。该“捣乱猴”的任务就是随意杀死软件架构中的任意实例和服务。他们的原则是,即便局部出错了,他们的系统和架构仍然要整体上保持正确,只有这样,才能躲过预料之外的故障。

  1. 测试就要做真实情况的模拟,不能儿戏!
    在完全依靠 AWS 之前,他们就使用真实数据对 AWS 上的系统做测试。他们模拟所有发往数据中心的请求,然后发送到 AWS 做实测。

测试能够发现架构的瓶颈,有些架构决定和设计决定,在图纸上看似完美,但是一旦应用到大规模的实际情形,就不那么奏效了。

  1. 坚韧与信念,永不言弃
    你会碰到许多问题!毕竟云计算的发展也没有几年,许多方面仍在不断完善之中。用户需要改变过去的观念,放弃过去的固定模式。关键是要保持坚忍不拔地战胜一切困难的意志力,坚定对胜利的信念。

Coding Horror 博主 Jeff Atwood 非常赞同“捣乱猴”的思路。他在博文中分享了他的团队花好几个月解决一个诡异问题的经历。为了跟踪该问题,他们分析和尝试了可能导致该问题的所有原因,但是仍然未找到其根本原因。每隔几天,就会有服务器(不知道是那台)从网络中脱离,他们称此现象为“捣乱猴”又发怒了。他们被此问题困扰数月之久,团队曾陷入崩溃,但是即便在最困难的时期,他们仍然采取了积极的行动:

  • 但凡某关键功能现在由一台服务器负责,就切换成两台。
  • 但凡发现哪里缺乏可靠性,就建立其可靠性。
  • 消除所有的依赖,一步一步,直到依赖减到不能再少。
  • 设计替代方案,使我们的服务始终保持运行,即便我们先前认为关键的服务突然失效。

SmugMug 也分享了他们的经验,他们网站未受影响的原因在于以下四点:

  1. 部署在 AWS 中的服务分布在多个 AZ 中。所以,一个 AZ 出问题,就可以切换到另一个 AZ。
  2. 其架构从设计之初就考虑了故障。他们的每个实例,或一个 AZ 中的任意一组实例,可以瞬间倒下,系统会很快恢复。
  3. 在这次事故中,他们没有使用 EBS。因为他们一直不放心 EBS 的性能和持久性,所以一直没有使用它。基于同样的原因,他们也没有使用 RDS。
  4. 他们尚未达到 100% 的云计算。

此外,对于 100% 纯度的云应用,作者给出以下建议:

  • 分散到多个 AZ。
  • 分散到多个区域(Region)。
  • 分散到多个云计算供应商。
  • 意识到分散带来的附加工作和复杂度,始终保持清醒认识。
  • 从架构上考虑故障。
  • 熟知应用的哪些地方可能会出现故障。
  • 系统组件化。
  • 对组件进行测试。
  • 保持放松的心态——故障是常有的事情,泰然处之。
  • Twilio 也针对 AWS 给出了自己的云架构原则,如下:
  • 将故障单元限定在单台主机上。
  • 设定较短超时时间,快速重试。
  • 保持服务接口的幂等性。
  • 服务细粒度,无状态。
  • 宽松的一致性要求。

云端应用架构设计的建议

结合上文对 Amazon 事件的分析以及众多来自一线工作人员的经验和分享。我们不难看出,对于云计算用户来说,单纯地祈祷云计算供应商提供 100% 可靠的云服务不是解决问题的根本所在。相反,云计算用户应该从其应用和架构本身寻找解决问题的根本方法。简单总结如下:

  1. 充分理解云计算供应商的服务可用性,在条件允许的情况下准备相应的对策。
  2. 以 AWS 服务为例,若用户对 Amazon 的 EC2,EBS,RDS 等服务的可用性及其依赖关系有充分的了解,就可以根据自己的实际需要为自己的服务架构不同级别的可用性。在多个区域(Region),AZ(可用分区),和 EC2 上分别实施的高可用方案的可用性级别是不同的,在不同区域上建立的高可用方案的可用性级别最高,基于 AZ 的次之,EC2 上的最低。但是,高可用性越高,其复杂度和成本越高,反之亦然。用户可根据不同的业务需求为系统中的不同功能提供不同级别的高可用性方案。
  3. 在架构设计中考虑故障的可能性。
  4. 不论在传统的数据中心还是在云环境中,设计软件架构师都需要考虑到故障。不同的是,传统方式下,从软件到硬件,架构师都是可控的,而在云计算环境中,使用的云中服务确实是不可控的。这就需要在做架构设计,或采用云服务时,充分了解云服务的可用性,并将此知识作为架构设计的输入之一。
  5. 应用系统的组件化和服务化。
  6. 使用 SOA 架构方法构建应用系统,将应用功能划分成细粒度、无状态的组件,并将组件封装成服务,将同一服务的不同实例分散到多个实例中运行,从而提高服务整体的可用性。
  7. 在条件允许的情况下,使用多个云服务提供商。
  8. 在云计算标准尚未成熟的大环境下,实现这一理想是困难的。但是,随着云计算标准逐渐成熟,在设计云端应用软件的架构时,就可考虑在多个云服务供应商之间实现高可用性,但是就目前而言,由于各个云计算供应商的服务的功能和接口缺乏一致性和标准型,完成可用性的设计和实现是需要付出代价的。路漫漫其修远兮,但希望总在前方。

小结

云计算是当前的 Bizzword,但是我们需要清楚的认识,和当年的 SOA 一样,云计算也不是银弹,不能解决所有问题。它的好处多,坏处也不少(除了本文提到的可用性不可控之外,还有许多不好的地方,如数据的安全性、云端应用整合的复杂性等),只有清楚地地认识它,还能更好地避开其劣势,发扬其优势。本文结合 Amazon“4-21”事故,谈到了如何从架构的角度思考云端应用,解决因所使用云服务的可用性问题导致云端应用不可用的问题,以期即享受云计算带来弹性扩展、自动供应等优势,又避免因云服务不可用而导致的用户体验的下降。希望能给读者带来一些参考,也欢迎读者给出批评建议。


感谢金明对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-02-07 00:0010436
用户头像

发布了 184 篇内容, 共 79.5 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

《你不知道的JavaScript(上卷)》PDF

程序员李木子

区块链游戏NFT合约钱包铭文开发搭建

V\TG【ch3nguang】

解决海外直播卡顿的方法

Ogcloud

海外直播专线 海外直播 海外直播网络

口腔专科医院实时数据中心:如何高效拆除数据烟囱,建立患者360视图,助力智慧医疗?

tapdata

电商云服务器配置怎么选择?

百度搜索:蓝易云

基于LangChain手工测试用例转接口自动化测试生成工具

霍格沃兹测试开发学社

面向AI之海,行业智能化需要一座“运力灯塔”

脑极体

AI 网络

ONES 王颖奇:关于 ONES V6 发布的解读

万事ONES

研发管理工具 企业服务 AI工具

Go语言中如何扫描Redis中大量的key

左诗右码

Go 语言

信创环境:鲲鹏ARM+麒麟V10离线部署K8s和Rainbond信创平台

北京好雨科技有限公司

kubernete rainbond 信创云 企业号 8 月 PK 榜 国产化平台

一次性揭秘 IoTDB 端边云同步的 7 大特性!

Apache IoTDB

docker镜像配置mysql、redis

百度搜索:蓝易云

结构仿真分析公司 多行业CAE仿真咨询服务

Geek_2d6073

90 分钟带你玩转知识库应用

Baidu AICLOUD

数据库 向量数据库

开源管理工具大比拼:哪个最适合您的团队?

爱吃小舅的鱼

开源 开源项目管理

Linux下常用的压缩格式

百度搜索:蓝易云

零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?

北桥苏

Python 爬虫 GitHub Pages Github Actions

提升游戏直播平台用户参与度的关键,开发游戏社区论坛模块

软件开发-梦幻运营部

理性看待、正确理解 AI 中的 Scaling “laws”

Baihai IDP

AI LLMs 企业号 8 月 PK 榜 Baihai IDP GenAI

10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战

我再BUG界嘎嘎乱杀

Python 数据挖掘 编程 数据分析 后端

NFT智能合约线上藏品交易元宇宙区块链链游开发

V\TG【ch3nguang】

一图读懂 | ONES V6 大版本,助力企业更快更好发布产品

万事ONES

企业服务 研发管理工具ONES Jira迁移

Git忽略文件的几种方法,以及.gitignore文件的忽略规则

百度搜索:蓝易云

鸿蒙Next开发训练营-毕业总结

keke

PSD文件用什么打开?免费白板软件在线查看设计文件!

职场工具箱

效率工具 职场 ps 在线白板 办公软件

2024年必试的顶级项目管理软件盘点

爱吃小舅的鱼

项目管理 Worktile

创业过去1024天,我后悔了吗?

Apache IoTDB

Jmeter是用来做什么的?

百度搜索:蓝易云

大疆 DJI Osmo Action 4 灵眸运动相机 怎么样

妙龙

大疆

数字藏品二级市场中的链上铸造合成开发

V\TG【ch3nguang】

知网状告AI搜索:搜到我家论文题目和摘要,你侵权了!

Openlab_cosmoplat

人工智能

"伤得起"的云计算应用——对云端应用之架构的思考_亚马逊云科技_马国耀_InfoQ精选文章