发新话题
打印

深入浅出云计算之IaaS篇(持续更新)

深入浅出云计算之IaaS篇(持续更新)

缘起
近来经朋友推荐,帮忙为某公司内部作一次关于云计算的基本入门布道,当时彼此沟通时,我并没有任何的蓝图或原有的经验,就直接答应了,对方的要求似乎听起来也很简单,就是为对云计算领域不怎么熟悉的入门者讲解一下,时间为6个小时。当然,答应人家的事情,硬着头皮也要完成的,于是,我就开始作演示文稿,长达6个小时的培训,大约有6、7年的时间没有再做过了,最长的一次培训大概还是在作红旗作技术支持的时候为河南邮政作了整整一周的课程。如此的时间间隔以及培训内容的不同,我并没有十足的把握去讲解那么的多,于是乎,我干脆将这个演示文稿转换为博文,一来是衡量一下时间,心里又个数;二来也是整理下知识点,进一步加深印象。当然,这和我的另外一篇文章:为什么基于成功的开源项目的商业产品会失败?的过程是相反的。

内容提要给非IT相关的技术人员讲授什么是云计算,个人的经验要退回到5年前了,在这5年当中不知道有多少次被问及,我本人也似乎的渐渐麻木了,对解释似乎已经失去了热情,尽管我在招聘的面试中,一般会问及的一个问题是:如何给你的几乎是文盲的老人解释什么是关系型数据库,时间是8分钟。直到我接到这样一个题目。我意识到了,装作自己懂是没有任何用处的,你得想办法把一个事物讲清楚了。这才是真正的挑战所在。于是我并没有一上来就开始讲概念、定义之类的内容。而是先来谈谈方法论。

接下来,是由外而内的,从事物的表象谈起,看看当人们提到云计算这个词的时候,是一个什么样的说法来形容的。

然后,开始看看来自学术和企业的各种对于云计算的定义,最后做个简单的总结。当然,必要的追溯历史过程是应该的,谁是第一个说到这个术语的?是谁又让这个术语传播开来的?谁又是此领域的始作俑者?到现在有哪些发展?最后放眼未来,应该持何种观点?

当然,最后我以实际用户使用当前最为广泛的云计算产品AWS来做一次实际的操作,为什么选择AWS是因为今天的Gartner的一份魔力象限报告。

接下来的内容,也是技术人员们最为关注的焦点,那就是云计算IaaS的技术平台,让我们作一次由内而外的理论课,从技术栈的角度细化IaaS所涉及到的技术。这也会是此次培训或文章的重中之重。

虚拟化、虚拟化管理平台、IaaS平台,是最为让人们迷惑的事情,也是绝大多数入行未久的人们的困惑,也是我个人多年以来不遗余力的为人们解释的事情,为此我还专门的翻译了一本书。《云落谁家-基于场景的OpenStack架构设计》。希望这次的内容,更具说服力。

云计算能作什么?适用于什么样的场景?使用云计算又何好处?相信这是任何革命性事物对于传统的冲击所带来的问题,让我们娓娓道来。

在最后,谈谈除了哪些个大型厂商的所运营的之外的,能够让我们自行搭建、练习、求证的开源项目平台,诸如CloudStack、Eucalyptus、OpenNebula、OpenStack等项目的介绍。

另外,说到底,我仍然代表我自己,一家之言,不足为重,授人以渔方是正道。为大家推荐了几本我认为较好的书籍。

谈谈方法1、为什么要谈方法?
除了在上面提及的理由,即很多的问题不是技术或知识问题,而是一个思路的问题。之外,我还是坚定的“守、破、离”原则的执行者,举个生活中的小例子,每每买到一个新的电器或新鲜东西,拿到手之后,我会首先去阅读用户手册。也就是说,对于陌生的东西,最起初我是以信任前人的,熟悉了之后,然后开始寻找不合理之处,如果属于我能够驾驭的东西,我就会Hack它。这样可能在最初会失去一些探索的乐趣,但是可以节省时间将精力放到后面更为重要的“破”和“离”。
所以要谈谈方法。
2、“大处着眼,小处着手”
在今年暑期大卖的好莱坞大片《复仇者联盟2:奥创纪元》中美国队长有这样一句对白:“The World is a big place,start it making smaller。”我想翻译成中文,总是太直白,没有什么实际的意义,似乎是一个人人皆知的道理。直到我看到一篇文章,谈到了胡适先生的治史方法论,于是就翻译为:“大处着眼,小处着手”。虽然是为历史学者提供的方法论,但我以为对于一些专业的科学事物也是同样适用的,比如我们今天要谈到的云计算。按照排列组合,大、小处与着手着眼是有四种组合的,也就是说我们去认识云计算只能通过宏观的、高度的、大的视野去认识,从微小的、细节的、局部的小地方去入手,任何其他的组合,都难以很好的认识它。
另外,在这点上也衍生一下,为此所造成的沟通问题。因为大处着眼是非常难的,所以团队中大多是从小处出发,如果不能做到局部精深,就很难和团队成员沟通,但是也不能一味的讲解大处的内容。当然,遇到“坐井观天”的员工或同事,非得和你天天谈细节,以为是古代哪些铁匠/茶壶的工艺精神为标榜,细到某个函数/类,通信方式,那么,对不起,如果和ta交换岗位不成功的话,你们两的合作可能就到此为止了。
3、驾驭事物的两个途径
“由现象而本质”或者叫“由外而内”;亦或是“由理论而实践”。举个非IT从业人员的例子,你是怎么认识汽车这个物品的?驾驶?修理?改装?调优?还是“机电一体化、模具、工艺”等理论知识学习个遍,然后再去认识?顺便向大家推荐一本书:



我们作为云计算的从业人员,尽可能的做到二者的整合,让我们先从直觉上去看下云计算,清空自己的知识,当然做到这点有难度,但是也要尽力的去做,然后我们再从理论出发,最后将之归纳总结。

在书中,作者分析斐德洛(其实是作者精神分裂的另外一个人)的理论,将不同的人对于摩托车的理解,理性还是感性,古典还是浪漫,分析的头头是道,不可多得的醍醐灌顶之作。

4、切忌“盲人摸象”

这是很多人容易犯的错误,正如那个著名的故事:一位路过正在忙着修建建筑的工地,遇到第一位,问:“你在干什么?”这位不耐烦的回答道:“你眼瞎啊,没看到我正在搬砖吗?”;然后接着问第二位,这位回答:“我在工作,家里上有老,下有小”;最后问到第三位,你在干什么?这位对答:“我在修建一座伟大的艺术品。”。现实中的我们大多是第一位,由于项目工程的浩大,传统组织管理方法的使用,多数人只能看到自己所从事的那部分。这种思路要有意识的屏蔽掉,尝试着去提出问题,质疑,充满好奇心的去探索。

我们可以问问周边的人,是如何回答什么是云计算的?一定有回答的是网盘,云里雾里,或者有的更为狂傲的声称:哪有什么云计算,无非是传统的应用放在Web端。等等不一而足。

要立体的、抬高自己的视野去正视云计算。

5、“认识你自己”

云计算所涉及的技术是庞杂的,需要巨大的社会工程来完成它,那么对于我们个人而言,一定要准确的定位到自己的角色,比如云计算的用户、开发人员、产品经理、运维人员、架构师、业务人员?以运维人员为例,自己需要修炼什么样的内功?DevOps的文化能否接受?Infrastructure as a Code到底为何物?软件的交付周期要从原来的购买光盘转变为直接从CI/CD的仓库中获取是否习惯?分布式系统的架构该了解到何种程度?

这个可能将这句哲理解读的太过于狭隘了,其实我要说的就是准确的定位自己的兴趣和能力。是否具备学习的或愿意学习的态度。是打算道听途说还是自己深入探求?先不要去给自己或者他人设定界线,不要去干先入为主这种事,害人不浅。要虚心的去学习。

一些直觉上的认识1、水

这个著名的论调要数曾任职美国的政府高管的Vivek Kundra一次访谈中谈及的:
在过去很长一段时间内,人们在自己的家里、或是小镇、或是农场、亦或是村庄,都会自己打水井。但是在今天,共享的公共设施让我们只需要拧开水龙头就可以用上清洁的水;云计算也是以相同的方式来为我们提供服务的。就像你的厨房中水来自一些管道一样,云计算服务也可根据需要来打开和关闭。就像哪些自来水公司,拥有专业的团队来让所提供的服务安全、可靠且全天候的可用。当你关闭水龙头时,不仅仅是你在节约用水,还有当你不是真正需要的时候是无须付费的。
此段论非常的精辟。水是我们生活中不可或缺的东西,随着人类的群聚,干净、无污染的水是我们生命的保证,而现代城市的供水系统是非常的成熟的了,我们每天烧水、洗衣、饮用等所做的工作就是一个拧水龙头的动作,而隔三差五自然有人来上门“查水表”,交付相应的费用即可。那么随着人类科技的进步,计算将无处不在,那么所需要的计算、存储、网络资源,就可以类比于水。

2、电

相比于可见的水,大自然的恩赐,电则要抽象的多,不过这也正好贴切了科技的概念。电是无形的,要使用电须有相应的电器设备,比如电灯,电冰箱、洗衣机、电视、电脑等等。下面我们来引用一段形象的类比于电来形容/描述:

  • 电的资源的生成和以电网的方式交付非常的类似于云计算的资源生成和以互联网交付。
  • 按需付费的价格模式
  • 伴随着大规模的集中电/云资源的生成和交付,节省了巨大的成本。(形成规模经济)
---------
好,浪漫的读者可以将云计算想象为水或电,在某种程度上,我们绝大多数人不是工作在水厂或电网的人,也是这么感性的去认识自来水和电网的。
---------

3、共享经济
2015年的中国被O2O折腾的够呛,我们来看看《the prehistory of Cloud》的作者是如何描述的吧:

不要在将云视为一个名词了,应该将其理解为“clouding”这个动词,现下任何东西都可以被云化,Airbnb就是现代版的房子云,将房子作为服务来交付;同样的,ZipCar和Uber是汽车云。
这就是云发展到今天,已经不在局限于计算机资源本身来,我们身边的任何可共享的都有可能成为云。当然类似“天云聚合”这样的公司就算了,警惕我们身边的那些二愣子。

4、非技术
在《The Practice of Cloud system Administration》一书中,作者如是说:
云计算并非是一个技术名词,而是市场术语。
这是销售人员、文艺青年喜欢的词汇。正如摩托车一样,工程师看到的是发动机、火花塞、轮胎、刹车等等,而人家看到是公路文化、永远在路上、扑面而来的自由的气息。云计算是一个商业术语,就如各种西药,有一个品牌名,而不是枯燥的有机化学名称。

浪漫的思维在此就打住了,接下来,我们会以一章的篇幅来过渡一下,然后就进入工程师的思维来,寻找到的美感是各种指令、协议、算法、系统。


企业、学术界的各种定义1、AWS的定义
云计算就是通过互联网按需交付IT资源和应用程序,基于使用后付费的价格模式,云计算提供了一种通过互联网非常容易访问服务、存储、数据库以及一堆应用服务的方式。
企业的定义特点也是非常的浪漫的,一如那些汽车、摩托车、电视等广告一样,不妨看下它官方站点的视频,


这里也不妨看一个宝马摩托车的介绍:

http://live.community.bmw-motorrad.com/acdn/tcms/us/BMW_MakeLifeARide.mp4

2、来自NIST的定义:

NIST描述了云计算的下面几个特征:

  • 按需、自服务
  • 广泛的网络接入
  • 资源池
  • 快速伸缩
  • 可量化的资源
这里我就不细细的去解释这些具体的特征了,有心的读者可以参考其发布的paper

3、在Buyya等人发表的一个paper:Cloud computing and emerging IT platforms: Vision, hype, and reality fordelivering computing as the 5th utility 中,他们是这样对云计算作了定义的:
云是一个并行的、分布式的计算系统,其由一组内部彼此连接的和虚拟化的计算资源组成,这些虚拟化的计算可以动态的部署并看起来像一个整体,或者说是统一的计算资源,基于服务供应商和消费者之间达成的服务水平协议(SLA)而运作。
此处的定义已经是非常的学术化了,强调了分布式系统,虚拟化等核心组件。但是这个定义依然有从用户/消费者的角度的视野存在,不仅仅是单纯的工程师视野。

4、在由Vaquero 等发表的另外一篇paper:A Break in the Clouds: Towards a Cloud Definition 对云计算作了如下定义:
云就是一个可以轻松访问和使用的巨大的虚拟资源(诸如硬件、开发平台和服务)池。这些资源是可以动态调整配置的,从而达到一个 可变的负载(伸缩),达到最佳的资源利用率。这些资源池通常使用按次付费的使用模式,由基础设施供应商来担保,并承诺服务水平协议。
此定义囊括了所有的云计算类型,即IaaS、PaaS和SaaS。

5、然后我们再来看上一组企业界的定义,来自McKinsey 的定义
云就是基于硬件的服务,能够提供计算、网络、存储能力的具有下面特征的:

  • 从消费者的角度讲,硬件管理变得高度抽象
  • 消费者所承担的技术设施成本转变为是可变的OPEX
  • 基础设施具有高度灵活的容量能力(扩张或缩小)


虽然这篇报告综合了20几家的各种论文,但是它毕竟还是一个企业,倾向于基础设施即服务这样一个形式的云平台。

6、最后一组学术界的定义,我们来看著名的加利福尼亚大学伯克利分校的定义: Above the Clouds: A Berkeley View of CloudComputing
  • 无限资源的错觉。
  • 打消用户前期的一些疑虑。
  • 按需付费。
这样看来似乎都不是大名鼎鼎的伯克利的定义。其实,即使再学书的定义,也免不了兼顾市场和商业的考虑,更何况是IT界。

7、最后我们自己总结一下上述的定义,以不用等视野来对比一些,看下面等表格:

用户(浪漫)视野工程师内部(古典)视野
按需付费虚拟化(硬件、操作系统、网络、存储)
可伸缩SOA、Web2.0、Web Service
无限资源运维自动化/DevOps
自主服务分布式系统
资源是抽象过的API可编程接口
轻松可访问的网络SDN,NFV,SR-IOV

将两种不同的视野对比的来看,似乎也能够做到足够的理性分析。因为作者是一个人,多少都会在二者之间来回的游荡。但是作者尽力,也请读者给予积极的反馈。

简短的历史阐述讲述一部IT或某种技术的历史,大概不是一个技术人员出身的人所擅长的事情,基本上是以几个标志性的事件,然后记下流水账。我虽然也是个读历史、也非常喜欢读历史的人,甚至也会读一些研究历史的方法和观点,但真要挖掘其偶然性和必然性,还真超出了目前的能力范围。

但是我也不会以历史唯物论去擅自讲述,就像大多数书或媒体所报道的那样,xx技术和变革成就了xx技术的宿命论。这里我只想让大家记住几个名字、公司或者是某些标志性的技术、项目。

亚马逊的CEO杰夫贝佐斯,在2006年推出了其对外开放的web service EC2和S3。
同年,当时任Google CEO的施密特在一次技术会议上率先使用了云计算这个词汇,开始让云计算变的流行起来了。
2011年7月,NASA和Rackspace联合推出了开源的IaaS云平台,OpenStack!

更多详情,请大家参考我在演讲的幻灯片里提到的那些个资料。

AWS的入门演示在所有的AWS的文档中,首先让读者做的就是去注册一个账号,然后绑定信用卡。请注意保护好这个账户,例如有人将此账号原封不动的放在了Github源码中,被人盗用,一天损失了好几万美元。

选择公有云的产品,需要你首先明确自己需要的是什么?无限的对象存储?某种规格的计算资源(如8CPU,64GB内存)?公网IP地址?DNS解析?是多个人使用还是就一个人使用?是否需要数据库?

由于我们是Demo,我们就从两方面入手,申请计算资源,(当然AWS是以虚拟机+操作系统来提供的),申请对象存储资源,并上传一些内容。
(文章中难以体现,日后有机会录视频了补上。)

关键组件、概念

“罗马不是一日建成的”,云计算的出现是多种技术积累的结果,廉价PC X86服务器虚拟化技术的成熟、带宽的日渐加大、容器技术大放异彩、分布式集群系统的成熟、Web技术的变革、运维自动化/DevOps的壮大、网络存储虚拟化的形形色色,这些都是云计算能够为我们提供方便、优质的服务,改变者我们生活方方面面的必要条件。

让我们彻底的进入工程师视野,来看这些组件的细节,其实也不能说是最为细节的,若是从源头讲起,每一行代码的美感都不放过,那么本书将是无穷无尽的。其实,也就是大体的讲到主要的躯干部分,若是将云比喻为一个生物体的系统的话。下面看下笔者画的草图:






作为计算机的从业人员,一定知道下面三位先驱:
  • 阿兰.图灵
  • 冯诺伊曼
  • 香农
思考题:如何将他们的成果变成一种按需使用的资源?


0、X86虚拟化技术

Gear,打开引擎盖,能看到什么?云计算的核心和基石就是构建在X86虚拟化技术之上的。


大家都知道虚拟化技术早在上世界60年代就已经实现了,还是分时系统,那时候IBM就曾豪言:“全球只需要5台计算机。”但是,我们考证不了那么久远的技术。我们仅就现代的技术而考察。

在2003年,来自剑桥的Ian Pratt,领导着发布了论文《Xen-The art of virtualization》,彻底颠覆了以二进制翻译的虚拟化世界,以半虚拟化大大改进了虚拟化一直让人所诟病的性能问题。之后,虚拟化一路高歌猛进,VMwareESXi、Hyper-V,乃至后来者居上的硬件辅助虚拟化技术KVM。当然,VirtualBox就是个玩具了,它依然是需要寄宿在其他操作系统之中作二进制翻译,只是也引入了硬件辅助的技术,使之不至于跑得太慢而挑战用户的耐心。
我们就来谈谈Xen、KVM以及VIrtualBOx的技术原理或架构,至于VMwareESX和Hyper-V,限于篇幅,笔者就不在这里谈及,有兴趣的读者可以到其官方网站看看白皮书之类的。

Xen作为Hypervisor,会在其中启动一个称之为Dom0的虚拟机,用来管理其它的DomU的虚拟机,而运行在DomU的虚拟机,内核须是修改过的,受Dom0控制的,若要运行未经修改的虚拟机,则须启动HVM模式,即打开硬件辅助虚拟化。来看下面示意图:

而KVM是一种硬件辅助虚拟化技术,也就是说必须是硬件的处理器支持虚拟化指令集和内存管理技术,KVM才能够正常运行,其用户态程序使用的是著名的二进制翻译项目QEMU,经过修改的QEMU程序,除模拟冯诺伊曼体系架构的外设之外,在需要指令集和内存调用的时候就交给了KVM的接口/dev/kvm文件。下图是KVM的架构示意图:


至于VirtualBox,则是一种需要寄宿在其它操作系统之上才能运行的虚拟机管理器,目前支持的操作系统由Windows、Linux、MacOSx、Salaris等,


这就是所谓的模拟硬件的虚拟化,将一台服务器可以分割为多台独立的计算单元,拥有机会完全独立的计算环境,拥有完整的计算机体系结构、以及操作系统。

1、容器及其编排工具

容器技术要从操作系统层的虚拟化谈起,简而言之,就是使用同一个操作系统内核,但是可以有多个用户空间且相互隔离的运行应用程序。Linux内核的Namespace和CGroup就是实现这个的,Namespace是实现用户态不可见彼此,如进程树、网络、用户ID、挂载的文件系统;而CGroup是实现了资源的隔离,如CPU、内存、网络、块设备I/O等。

Docker的崛起着实是让Linux容器技术火了起来,2015的技术热点一定包含微服务和Docker,那么Docker是什么了呢?我们要先看看LXC,这个很久以前古老的容器技术。

LXC介绍,
简单的描述一下,LXC就是Linux内核容器特性的用户空间的工具,可以将一些Linux的应用程序容器化了。社区发展一直不温不火,直到2014年2月才发布第一个可用的版本1.0。目前只有Ubuntu在支持它,并持续的开发着,包括新版的LXD等。

以下一张架构图,说明了容器的核心技术仍然在Linux内核,至于用户空间的实现,各家自有个家的看法。Docker在0.9版本之后舍弃了LXC,而自行开发了libcontainer,CoreOS后来也放弃了Docker,自行开发了rkt,使用systemd-nspawn来和内核进行对话。


其实容器本身的历史很悠久了,如BSD的Jail,Salaris的Container,Linux的OpenVZ等,Docker等横空出世是因为它换了一种使用方式,构建了更加丰富的生态环境。比如Docker Hub这个发展迅速的仓库。

单个的容器,所体现出来的优势,如快速的部署,还不足以吸引人们的眼球,能让人们引起兴趣的,还是微服务的兴起,伴随着成长起来的容器的编排框架,例如开源的有Kubernetes、Mesos、Swarm、Fleet等,而商业的工具有AWS ECS和Google的GKE。这里笔者近期翻译了一篇关于开源的工具对比情况,请移步这里:不同的容器编排工具对比

2、SDN/NFV/SR-IOV

说到这些技术,首先要回答一个问题,那就是“传统”网络出了什么问题?需要这些新技术的支撑,云计算、物联网等的发展,导致网络的配置成为瓶颈,而且不断在变化。传统的网络就是不断往3层添加各式各样的配置:OSPF、BGP、组播、NAT等等,臃肿而性能低下。

谈到SDN,大概人们首先要想到的就是OpenFlow通信协议了。但是不要误认为SDN就是OpenFlow,OpenFlow只是实现SDN的一种方式,不过是最为流行罢了。

具体OpenFlow 的协议定义,请参考:openflow-spec-1.4

SDN的目的是提供开放的接口,以实现基于软件的开发方式,从而可以做到控制由一组网络资源所组成的连接以及通过它们的网络流量流向。

下面示意图是ONF发布的SDN架构图:
早期发布的是这样子的:




现在是这样的,SDN也在不断的演化着。

我们不妨来解析一下各个组件:

  • SDN应用(SDN App):顾名思义,就是一些可以明确的、直接的、以编程的形式的程序,能够按照它们的需要和想要的网络行为和SDN控制器进行通信,当然是通过NBI驱动来实现的。此外,它们为了内部的决策目的,可以获得网络的抽象视图。一个SDN应用由SDN应用逻辑和若干NBI驱动构成,SDN应用会将它们自己暴露给网络控制的抽象层,从而通过若干NBI代理来提供高层次的NBI。
  • SDN控制器:是一个逻辑上集中的控制中心,掌管着1)来自上层SDN应用的需求到下层的SDN Datapath的传送,2)为SDN应用提供网络的抽象视图(包括状态和事件)。
  • SDN Datapath:这是一个逻辑上的网络设备,其抛出可见性,然后非竞争的控制着广播转发和数据处理能力。逻辑上代表着物理资源的所有子集。
  • SDN控制器到Data-Plane接口(CDPI):这是SDN控制器和SDN DataPath之间的所定义的接口,有这么几种功能:1)编程控制所有的转发操作。2)广播能力。3)静态报告。4)事件通知。
  • SDN北向接口(NBI):这是为SDN应用和SDN控制器之间所定义的一种接口。提供网络的抽象视图,直接传送网络的需求和行为,这可能发生在任何水平的抽象(东西)和跨不同功能的集合(南北)。
  • 接口驱动&代理:每个接口的实现都是由驱动-代理来完成的。代理代表了“南向的”、底层的、面向基础设施的,而驱动则代表了“北向的”、上层的、面向应用的。
  • 管理:覆盖了静态的任务,这要比应用、控制和数据掌控的更好一些。

记住,SDN一个很重要的理念就是将控制和数据分离。无论那个具体的网络设备厂商,基本上都受上述的架构约束。

笔者在这里给大家分享下,比较知名的开源项目OpenDaylight发布的最新版的架构图,聪明的读者往上述的架构图套用即可:



至于NFV,这是近来非常热门的技术,各个厂家都在争这块蛋糕。

NFV和SDN的关系,有关但是针对的不同的问题。NFV可以独立于SDN而工作,我们完全可以利用现有的网络设施来完成网络功能虚拟化的过程。

有人这么总结NFV,就是将哪些原来在网络设备上跑的路由啊、负载均衡、以及其它网络设备(VPN等)统统运行在廉价的PC硬件上就是网络功能虚拟化。

来看一张图:



SR-IOV,全名是single-root input/output virtualization,是属于网络虚拟化的一种,类似于Hypervisor中的硬件辅助虚拟化,就是在虚拟化的环境中,虚拟机可以直接使用物理主机上的PCI网卡,这大大提高了虚拟机的网络I/O性能。主要是一些硬件厂商在做,比如Intel近年来一直都在主导和积极的发展此技术。

3、编程接口和数据交换格式

谈到此,我们需要聊下10年前的技术Web2.0,其实也不是去聊其全部的内容,主要是AJAX,让浏览器更加能够替代传统的客户端应用成为了可能。

局部刷新,而不是载入整个页面,这是AJAX的最大贡献,它让浏览器中能够表达更多的内容和形式成为了可能。典型的应用如Gmail、Google Docs。

我们知道SOA中的最为常见的方式是SOAP,但是在互联网上更加的倾向于RPC,如常见的XML-RPC、JSON-RPC,但是,由于HTTP的成熟,大家逐步的让RESTfull更加的流行了起来,RESTfull能够以HTTP的典型动作如PUT、GET、DELETE、POST等来传递数据,主要是用的URI(统一资源标志符)为对象。关于表述性状态转移的论文,请阅读 Roy Thomas Fielding经典的文章:“架构风格和基于网络的软件架构设计”。

RESTful现在的应用已经非常的广泛了,尤其是在云计算环境中,特别强调可编程这一项功能中,实现的项目如OpenStack、oVirt对外只有RESTful这样的API,相应的SDK也是。

再回到开始时提到的AJAX中的X,即XML,XML对于HTTP传输数据以及浏览器的解析,虽然功能很强大,但是显得有些过度和臃肿,于是人们又祭出了JSON这个开放标准格式,即javascripts对象符号,一种由属性-值对组成的便于人类阅读的数据传输对象,那么AJAX就顺利成章的变为AJAJ。目前主流的浏览器引擎均支持内置的编解码,如webkit、Blink、Mozilla firefox等。一些Javascripts库也本身支持JSON,如JQuery等。

这里最后给大家提到的一点是,服务器上使用JavaScripts,尤其是node.js的崛起,使用Google 的V8 javascripts引擎,添加包管理器,是个非常值得关注的开发框架。

4、对象存储

在很多时候,查阅整理知识点的过程中,发现了他人更好的之后,自己就有无从下笔的感觉,关于什么是对象存储,DDN这篇入门文档讲解的已经非常的详细了。我就不参合了,或许除了他们的广告之外,颇有翻译的意图。国内的7牛也无法解释的如此清楚。

对于浪漫的认知,对象存储就是云计算最为直接的感受,想想国内前两天充斥的各种网盘吧,百度、金山、等等之类的吧。不提也罢。

我们来看下对象存储的几种实现方式吧:

  • 基于对象的存储设备。就是在标准的SCSI协议中加入“基于对象存储设备命令”OSD,目前似乎只有希捷的Kinetic开放存储平台实现了产品化。
  • 基于对象的文件系统。这点分类可能和我们对对象存储的概念有点颠覆,它首先是文件系统,只是具体实现的时候,将存储服务器区分为元数据服务器和数据服务器,具体的项目实例就是鼎鼎大名的Lustre文件系统。(注意,是实现方式借鉴了对象存储的理念,并不能当作对象存储来使用,依然是古老的客户端-服务器网络文件系统。)
  • 对象存储系统,天生就是为对象存储所设计的,如代理、账户、分发份数、负载均衡、RESTful API等,具体的项目开源的有OpenStack Swift,商业的有AWS s3等。
  • 混合存储,一些网络文件系统如Ceph、GlusterFS是支持统一文件和对象(UFO)的存储的,允许一些客户端写入对象文件和其它类型的文件一起写入到相同的系统中。虽然这是人们并不接受混合存储这个术语,但是以兼容性接口出现于市场。

这里我们就以OpenStack中存储最为流行的两个项目Swift和Ceph为例,谈谈它们二者的架构实现方式。

先来看看Swift的架构:



代理服务负责来自客户端Http的请求,并将之转发给后端的实际的存储,Swift使用rsync来同步文件,可以将一个对象复制多份。

然后来看Ceph的架构:



Ceph的设计就很复杂了。我们可以在上图中看到,对于对象存储只是它所支持的文件系统、块设备并列的一种而已。为此专门写了一个客户端RADOSGW。其内部的工作原理,我们可以参考weil的博士论文。是如何实现将传统的NFS、Lustre等网络文件系统改造为分布式的支持多种形式的存储系统的。

(这个课题是我自己欠自己的,要追述到2013年了,一直没有机会去研究。好吧,以后有空补上。)


最后需要和大家解释的一个事情就是,对象存储和键/值存储有何区别。

这得从块设备的寻址说起,我们知道每个块都需要一个逻辑块号才能找到相应的数据。而键/值存储,就是一种映射关系,键可以是任意的字符,而值即数据,可以是任意的大小,这在编程语言里可以找到,如Python中的字典,Perl语言中的Hash,Java,C++叫做Map等,而对象存储类似与键/值存储,只是键是一个正整数,数据可以是任意的大小。

5、块存储

块设备,也就是我们通常见到的物理设备,如磁盘、软盘等,是目前计算机持久化存储使用最为广泛的形式,块设备常被上层的文件系统或关系型数据库来使用。

使用SCSI或光线来将存储和服务器连接起来,以加大存储的容量和性能。而所谓的SAN,常使用的协议有iSCSI、AoE等。

6、分布式系统

谈到分布式系统,就要解释什么是分布式系统。通俗一点理解,就是不再是单机的时候的服务,而是要多个甚至是成千上万个节点共同为某一个服务来提供环境,那么涉及到的就是协作、一致性、可用性、以及网络分区性,就是著名的CAP法则:

三者只能择其一,具体情形要视自己的业务应用而定。

分布式系统是个巨大的课题,研究者颇多,随意一个子课题的论文、书籍多的也让人读不过来,于是有人做了这么一件事:如何学习分布式系统。也可以译作“学习分布式系统那点事”。
我们可以将分布式归为几个类:

  • 分时模式
  • 进程间通信
  • 失效模式
  • 失效发现
  • 决策者选举
  • 共识
  • 法定数量
笔者这里推荐两个算法,分别是:PaxosRaft,其对应的软件实现分别是ZooKeeper和etcd。

下面笔者带领大家看下软件应用架构的演变:
单机-》三层架构-》四层架构-》






中间加负载均衡层,从单机演变为集群的方式。若是静态的内容,或者是命中率较高的数据,同样可以加缓存层来缓解。

某些观点上来说,云计算提供商使用的即是SOA架构的web服务,比如AWS的名字都是这样,只是使用了REST的方式而不是全栈的SOAP,那么比如ESB、消息队列等均是特别重要的组件了。这二者之间难以严格的划分,你中有我,我中有你这样。


7、自动化/DevOps

其实,这一节的内容,主要是文化上的问题,技术反而是次之的了。

云计算相关的技术,给运维,系统管理员的岗位职责带来非常大的变化,尤其是技能方面。我们来看下rockwood在2014年的LISA会议上的分享 所做得角色变化的对比:


云计算的背后,是数不清的物理服务器、网络、存储和机架,要在苛刻的SLA下为用户提供优质的服务,首先,就得能够做到自动化,自动化大致的方法可以划分为下面三种:

  • 自动化一切能够自动化的!
  • 将人工的和自动化的分离,自动化之前要比较人工的是不是更好?
  • 以长期的观察和实践来考虑人和机器之间的互补。
至于如何自动化,笔者在这里无法给出具体的环境的自动化之路,只能给大家一个向导型的思路:自动化哪些你自己手动需要完成的任务,分步进行,确保每一步骤都能够做到自我包含,然后将之组合起来,最后形成一套整体的自动化系统。

在开始讲述DevOps之前,我们来看看一名运维人员(系统管理员)需要掌握的技能集合:
  • 要去写代码,不写代码你几乎什么也做不了。
  • 尽可能的去利用公有云去学习。
  • 容器技术,将会带来更大的挑战,所谓的微服务。
  • 要去了解分布式系统架构。
  • RESTful API,消息队列(ZeroMQ,RabbitMQ)、服务协作和发现(Zookeeper、etcd、Consul)
  • 不仅仅是只懂脚本就够了,需要学习的语言有:python&&Ruby, Go,Node.js&&JavaScripts、
  • Splunk、ELK、Logstash、NoSQL的键值存储
  • 版本控制Git,因为要做的是Infrastructure as code!
  • 持续集成、持续部署
  • 文档的标准化
  • 分享、扁平的组织
DevOps,顾名思义,就是打破传统组织架构中的开发部门和运维部门之间的壁垒,解决二者之间的矛盾,即开发者要求快,运维人员希望稳定。世界变化快,业务就得跟着运转。也就是说不再有着严格的界限,运维可以看到开发的代码,单元测试的结果,持续集成的构建结果,而开发者也可以看到运维的日志记录、监控窗口、持续部署的结果。相互共享知识,协调一致,为了对付变化的业务。


在这里给大家介绍几个号称有DevOps的配置管理工具,当然是开源项目了。商业的请读者根据自身需求向厂家索取。尤其注意的是Ansible的崛起。

在本章的最后,笔者谈论下自己的观点,云计算改变了一切,也在颠覆传统的独立软件提供商,这一点在DevOps中表现的尤为重要,如果作为用户拿不到源码,何来的自动化?持续集成?持续部署?等待ISV一年半载发布一个版本?还是订阅他们的更新,几周更新一次?所以,无论是自己提供公有云平台,还是内部搭建私有云,都得小心所谓的厂商锁定,限于被动的局面,有劲没地方使。这一切都是需要以开放源代码为前提的。所以我坚持套用马克安德森的哪句经典的话:“开源软件正在吞噬世界!”


8、多租户

多租户的技术主要用于SaaS平台,但是IaaS的Console又何尝不是一个多租户的平台了呢?例如定制Branding、不同的工作流、扩展的数据模式、以及访问控制等等。

那解决的技术,如web应用层的路由、关系型数据库的多视图、或者是多个数据库等等,但这样就产生了另外的问题,那就是随着时间的增长和规模的扩大,原来的关系型数据库架构难以满足需求,那么就相应的就如NoSQL的键值对存储、容器技术等,例如Oracle12C这样的多租户架构

关于多租户的论文,读者可以参考:Architectural Concerns in Multi-Tenant SaaS Applications。包括其所引用的研究论文,都应该仔细的深入理解。

虚拟化管理平台、IaaS平台之间的区别

这是个令人困惑的问题,解释起来也比较困难。难处有两点,太过于纠缠于技术细节,会让读者失去耐心,尤其是不愿意扎入细节的人,而不用技术来诠释的话,一般就是打比喻,那么一旦做出比喻的话,就会丢失很多理性的内容。
先来看下我是怎么和人们解释的吧:我会列出一个表格,如下:

虚拟化平台IaaS平台
statefull VMs:应用定义虚拟机Stateless VMs:分布式应用
应用程序SLA = 虚拟机的SLA应用程序的SLA并不依赖于VM
SLA要求虚拟机保证高可用需要的时候建立和删除
虚拟机scale up: add vCPU,vRAM 等应用程序scale out: 添加更多的VMs
上线时间按年来计算上线时间按小时和天/月计算
适用于传统的应用程序更改应用程序适应cloud

我见过很多人对于上述表格的茫然和不屑。那么好了,找个实际的产品对比一下吧,比如oVirt vs OpenStack;VMware vSphere vs VMware vCloud;Hyper-V vs Azure ;前者更加注重的是传统的应用,是资源的简单分隔,而后者也是很多人不喜欢虚拟化的原因。

对于虚拟化的技术栈,我们可以概括为如下,聪明的读者可以对比下我们前面列出的IaaS平台的技术栈。




不过,我还是要做一个比喻,尤其是针对浪漫类型的人们,这个有时候能让他们直观的理解二者之间的区别,如我的slide中的演示:



能干什么?有何好处?回到水和电的比喻,云计算本质上是提供一种计算机使用的资源,如计算、存储,那么既然是一种资源,只要其交付/运送的介质-互联网存在,剩下的就是终端如何去消费/使用它们的事情了,正如水有水龙头、电有各种电器一样。

那么问题就很容易的去解答了:只要是程序需要的,几乎都可以使用云计算资源。

其实,云计算资源已经深入到我们的日常生活当中了,只要你是使用的智能手机、智能穿戴设备、智能家电,以及现在比较讨论流行的物联网、大数据,后端支撑的都是云计算资源。举个例子:照片的存储。健康数据的存储和分析。

这里我给大家列一下,(非个人直觉,而是提供服务的厂商)适用的场景:

  • 启用了数字业务
  • 敏捷IT项目
  • 传统的IT数据中心替代
  • 批处理等计算
好处的话,给个人带来的便利,这里就不再提及,而是使用云计算资源来为人们提供新的业务方式的那些个企业和厂商。这里暂时列个提纲,详细阐述可能要等到有时间再来做。如果这是一段程序的话我会加上。/* TODO */
  • 创业公司
  • 需要批处理的业务
  • 全球迅速扩张
  • 那些个电商高峰(双11或黑色星期五)过后的资源去向
原文:http://www.ocselected.org/planet/

TOP

发新话题