大话云计算
最近两年,云计算这个名词在任何一家IT媒体几乎随处可见. 究竟什么是云计算, 难道没它就不行么? 回顾一下IT技术的发展历史, 再看看现状, "云计算"似乎还真是到了呼之欲出的阶段.
我个人很喜欢浏览一些电子产品网站, 前几天在一个小网站上一个很显眼的位置看到这么一个公告,大概意思是这样: 本网站不缺乏关注度,缺钱! 我个人认为这个网站的内容也不错, 几乎全都是原创, 固然吸引不少想我这样的gadget爱好者的眼球. 那为什么还缺钱呢? 所有的网站缺钱的原因无非是两种,"开源"和"节流"没做好, 换句话说,一方面是销售没上去, 一方面是成本没降下来. 但我毕竟是个技术人员, 不懂市场和销售, 只能在节流方面想想办法. 云计算就是个节约成本的办法. 为什么这么说呢?
(互联网网站大概分为两种, 一种是依靠租赁ISP服务的网站, 一种是靠自己组建网络中心和数据中心. 对于一些资金匮乏的中小网站, 一般都选择租赁或托管. 后者一般都是大型的互联网公司才有实力实施.)
对于互联网网站来说, 访问量提高, 关注度提高, 在一定程度上是一件好事. 但是如果访问量过大, 超出网站的承受能力, 就可能成为一场灾难. 具体来说, 一网站的访问量在短时间内急剧上升, 网站来不及做优化或增加服务器, 这时候网站的响应速度就会大打折扣, 用户发现网站越来越慢,等了很久都没响应, 用户就会失去耐心. 这时候网站只能投入更多的时间和资金, 优化网站架构, 增加新的服务器, 扩展网站的性能.周而复始,陷入了一个怪圈,. 这样的结果又会带来新的问题. 由于网站的访问量不稳定, 可能白天用户非常多, 晚上非常少. 这样在晚上的时候, 服务器的资源是白白浪费了. 这样用户越多, 投入的越多, 浪费的也越多, 在没有明确盈利模式的情况下, 亏损的也越多. 也正是因为这样, 很多很多人都说互联网是个"烧钱"的行业.
我们还是从技术的角度来看, 怎么样能尽量的少"烧钱"呢? 于是我们设想, 如果ISP能提供一种弹性的服务就好了. 这种弹性的服务可以根据用户的数量, 网站的流量, 服务器的压力等等指标来动态的提供服务器端的计算资源. 并且以网站流量或其他某种方式来计算网站所要支付的费用. 这个想法很好, 但同时对ISP提出了更高的要求. 于是我们先假设ISP(联通,电信)或大型的互联网公司解决了这些问题. 忽然有一天, ISP或大互联网公司发现自己的机器24小时待命, 但只有20%的时间机器的使用率达到80%, 其余时间也是白白耗电浪费了. 于是ISP或大互联网公司自己也希望想个办法省钱. 比如, Amazon想出了个办法, 能不能把我这些暂时空闲的机器租出去, 赚点小费呢. 嗯, 这是个不错的注意!(有点类似于银行家偷偷的把储户的钱借给贷款人, 等还款后再把贷款利息塞进自己钱包, 装作什么都没发生)但是对外租赁机器不像开张支票那么简单, 用户总不会上门来把你机房的机器搬回家, 用完再给你搬回来吧. 必须有一种非常简单的方式来快速地向用户交付我们机器的计算资源和能力. 于是Amazon想, 能不能开发一套API, 用户使用这个API就能远程操纵他们机房的VM DataCenter, 可以完成比如格式化虚拟硬盘, 拷贝实现制作好的镜像, Power on虚拟机等任务. 用户可以根据自己的需求, 购买一定数量具有特定配置的机器(其实是虚拟机), 调用API后, 可以直接登录到任意一台他们启动完毕的虚拟机上, 做任何操作, 用完后结账归还机器. 机器重新进入待命状态. 像Amazon提供的EC2这种提供虚拟计算资源的服务通常被称为IaaS(Infrastructure as a service), IaaS提供商的名单,可以参考这个http://en.wikipedia.org/wiki/Category:Cloud_infrastructure 关于EC2的详细介绍, 有兴趣可以参阅http://aws.amazon.com/ec2/
其实云计算的服务分为很多层次, IaaS只是其中一层而已, IaaS层主要是对虚拟化计算资源的管理, 在IaaS层以下,是云计算的server层, 包含物理的硬件设备, 和云计算的操作系统. 在IaaS层以上, 是Platform层, 简称PaaS(platform as a service), 它主要负责消费IaaS层所虚拟出来的计算资源, 同时维护和管理在这个平台所运行的application. 这一层的划分也满足了另一部分用户的需要. 有的用户可能根本就懒得去调用类似Amazon EC2的API, 也不想花费资金去雇网络管理员, 系统管理员维护,管理底层的硬件和操作系统, 甚至不想去使用租回来的一大批虚拟机. 只是希望开发人员开发出来的应用能够部署, 运行在一个快捷,高效,稳定,安全的"平台"之上, 就OK了. 至于这个"平台"的运行所有内幕, 细节, 以及一切跟开发没有关系的工作, 它都不想参与, 也不想知道. 于是, Google App Engine的出现正好满足了这部分用户需要. 在这个Engine上, 开发人员可以部署Java和Python开发的应用程序, 这些程序运行时不会受到Engine上的其他程序的干扰. 当然, 如果你的应用程序想调用其他运行在这个Engine上, 或Engine之外的Web Service应用, 也是可以的. AppEngine开发者上传的程序, 可以以web application或service的形式被浏览器, 以及其他形式的软件来消费.如果你想进一步了解Google App engine的信息, 可以访问http://code.google.com/appengine/docs/whatisgoogleappengine.html 更多的PaaS厂商, 请参阅http://en.wikipedia.org/wiki/Category:Cloud_platforms
还有一部分用户, 自己不想去开发什么应用, 不想去管什么部署, 甚至连安装都不想做. 只想用成熟的软件, 比如Salesforce的CRM系统. 它就通过浏览器来交付对用户的服务,当然最终交付的结果其实就是软件. 这就是所谓的SaaS(Software as a service). 这一层位于PaaS之上, 但PaaS层上运行的Application也可以被成为Application as a service, 遗憾的是没有AaaS这个名词, 取而代之的是SaaS. 更多的SaaS厂商, 请参阅http://en.wikipedia.org/wiki/Category:Cloud_applications
最后我们说一下云计算的"消费者", 或者说成客户端. 哪些客户端可以消费云计算呢, 比较有代表性的是iOS, Android这些移动客户端操作系统, 或者Chrome这样的浏览器, 或者其他形式的软件http://en.wikipedia.org/wiki/Category:Cloud_clients
前面我们讲的都是互联网行业对云计算的需求, 在企业计算领域, 也有类似的需求.在任何一家企业中, CIO都要面对有限的IT预算, 如何用更少的钱办更多的事, 对于所有企业来说都是个挑战. 同时, 企业计算对实时性, 安全性, 可靠性要求更高. 在没有云计算之前, 一个企业的每个部门都有自己的管理系统, 这些系统都被部署在企业的机房或是数据中心. 如果突然由于业务的变化,需要开发一套新的系统, 可是机房的机器已经都被各个部门"瓜分"了, 尽管这些部门的机器使用率可能只有百分之几, 也没人会把这些闲置计算资源像切豆腐一样"分割"出来给你,需要多少分你多少, IT部门不得不购置一批新的机器, 从布线到安装系统, 再到调试, 部署, 一系列的工作需要网络管理员, 系统管理员, 甚至到项目经理, 开发多方参与, 协同完成, 整个工程既费钱又费时间. 于是CIO们思考, 能不能对企业内部所有的机器, 包括全国各地, 甚至世界各地的机器统一管理起来, 采用网格计算(Grid Computing), 分布式计算(Distributed Computing), 并行计算(Parallel Computing), 效用计算(Utility Computing), 网络存储(Network Storage Technologies), 虚拟化(Virtualization), 负载均衡(Load Balance)等传统计算机和网络技术研发出一种新架构. 在这个架构中, 各个部门的系统所占用的计算资源是可以随需而变的, 在系统忙碌时, 可以扩展到更多机器上运行, 在系统闲暇时, 甚至可以只在一台机器上运行. 从而将其他机器让给"亟需"的系统. 所有新加入到这个架构的机器不属于任何个一个特定的系统, 而是可以在不同时间被这个架构安排去运行不同的系统.这个理想的架构也就是我们前面提到的"云". 企业内部的"云"我们通常叫做"私有云", 他主要服务于企业内部, 而前面互联网行业的"云"通常被称为"公有云". 在有些特定的情况下, 比如企业内的一个销售系统,根据业务需要,要连接Salesforce上的CRM.这样就出现了"混合云".
需要注意一点的是, 云计算带来好处并不意味着所有的公司都愿意将自己的系统放到"云"上. 这里的原因有很多, 有的可能认为将系统放到云上会不安全, 怕安全设施的不完善会导致敏感信息的泄露. 也可能因为不想重新用云平台所要求的某种特殊语言或开发规范重新开发一遍. 这些担心并不是没有道理, 但也一定有相应的解决方法. 比如对于敏感信息可以让用户自己选择存储在本地, 而不用必须放到云存储上.对于正在计划中的新系统, 可以考虑选择云提供商的开发平台, 开发完后放到云上. 对于没有放在云上的遗留系统, 我们仍然可以采用SOA的思想, 按照SCA的规范将这些新旧系统组合起来. SOA主要是对Application的一种架构思想, Cloud是应用所运行的Infrastructure的一种架构思想. 当然, Cloud也可以借鉴SOA思想来组织服务,比如松耦合, 但Cloud上的服务的处于Application的服务以下,或者说是为Application层的服务提供服务. Cloud的精髓在于伸缩性, SOA的精髓在于松耦合, 一个主要解决了性能问题, 让软件的"内功"深厚, 遇强则强, 另一个主要解决了松耦合问题,让软件达到了"招式"达到了"无招胜有招"的境界, 这两者结合起来, 可以说是相得益彰, 天下无敌.
杨晓明