资讯专栏INFORMATION COLUMN

新版CloudFoundry揭秘

tianlai / 2801人阅读

摘要:上面主要是将新的多了些什么。在新版本的设计中,他们使用脚本来代替原先的脚本。可以看到在新的架构中多出了很多组件。他究竟是如何操作的呢首先,我们必须准备好系统例如。当刚刚推出的时候,包含了应用运行时启动,停止等简单命令。

CloudFoundry距离发布已经一年多了。在这一年里CloudFoundry不论是社区还是代码日臻成熟,拥有了众多合作伙伴。现在他迈开了更大的脚步,新的CloudFoundry已经逐渐浮出水面。

新版的CloudFoundry对于开发者来说,除了可以支持给多的Framework,提供更多类型的Service之外,没有太多变化。但是CloudFoundry本身的架构做了很多改进,可靠性,扩展性和安全性都有了质的提升,而所有的一切都发生在背后。

一、新的功能

CloudFoundry提供了一些开发者们期冀的新功能。

可以和Service直接通信的Tunnel。作为开发者的我们往往希望可以使用客户端工具直接连接到DB上调试。但是在CloudFoundry将DB作为Service隐藏在背后,这样可以提供了诸多方便服务,却让我们无法直接连接到DB。CloudFoundry已经解决了这个问题,可以使用vmctunnel工具,直接访问云后的服务。

遗留系统的接入支持。如果你有自己的DB或者已经有一个遗留系统不想让CloudFoundry托管,但是又想获得CloudFoundry的PaaS服务。现在有了一个完善的解决方案。开发者可以将DB或者遗漏系统包装成一个Service。然后可以在CloudFoundry中注册,这样就可以自由的访问了。

更多的Framework支持。CloudFoundry之前已经支持很多的框架。有Spring forJava, Rails and Sinatra for Ruby, and Node.js。现在CloudFoundry将支持更多的Framework。有

o-> Java平台

> Grails模仿Rails的Java平台实现

> Java_web 普通Java web程序

> Lift基于Scale的web框架

> Spring 流行的Java框架

o-> Ruby平台

> Rack 最小化的Ruby Web框架

> Rails3 一站式的Ruby Web框架

> Sinatra 极简主义的Ruby Web框架

o-> Python平台

> Django 最流行的PythonWeb框架

> Wsgi Python的CGI

o-> 其他平台

> Static page 静态页面

> node.js 异步Web框架

> Erlang

> php

> standalone 独立的程序

随着时间的推移,支持的框架将越来越多。你也可以自定义自己的框架,只需要实现不多的代码。其中Standalone是比较特殊的。开发者的程序只要能启动并监听一个端口,就可以作为一个程序运行在CloudFoundry上。提供了非常大的灵活性。

更多的Service支持。除了更多的框架 支持,CloudFoundry增加了更多的服务。现在除了支持MySQL, MongoDB 和 Redis外。还支持很多服务。

×-> DB

- Mongodb 最流行的NoSQL数据库

- Mysql传统开源关系数据库

- Neo4j图数据库

- PostgreSQL Mysql的有力竞争者

- Redis极快的内存KV数据库

×-> 存储

- Atmos EMC专业存储

- FileSystem 远程NFS支持

- Vblob 提供Amazon S3支持

×-> 其他

- RabbitMQ 出色的Erlang队列系统

现在服务逐渐完善,覆盖主流的数据库和存储。也可以通过上文提到的ServiceBroker来接入任何一个外部服务。没有做不到,只有想不到。

上面主要是将新的CloudFounry多了些什么。事实上,新的版本80%的工作在于对基础架构的改进。下面仔细阐述,CloudFoundry做了什么让他的架构更可靠。如果不熟悉前代的架构的话,可以参见《深入Cloud Foundry》

二、ROUTER

上个版本中。Router作为一个nginx脚本存在。所以的请求都必须经过Ruby代码,然后加以转发。这个设计干净利落,不过Ruby也因此转发了大量的数据,容易引起性能问题,所以下个版本中做了如下的改进。

在新版本的设计中,他们使用Lua脚本来代替原先的Ruby脚本。而Lua脚本会对请求加以分析,转发给Ruby程序,然后Ruby程序再将分析的结果返回。这样一来,proxied request已经不再经过Ruby代码。逻辑和数据完美分离。性能和稳定性都大幅提高了。

在前版设计中,当Router接收到请求后,会随机分配一个Droplet来处理这个请求,这种方式使得用户没有办法使用Session,因为连续的HTTP请求会被分发到不同的应用实例上处理。新版本设计中增加了对SESSION的支持,当Router发现用户的请求中带了cookie信息,它会在Cookie里暗藏一个Droplet的host,port地址。当有新的请求进来,Router通过解析Cookie得到上次的应用实例,然后尽量转发到同一台Droplet上。

三、STAGE

下面的新版CloudFoundry的架构图。

可以看到在新的CloudFoundry架构中多出了很多组件。新架构中将用户验证从Controller中剥离,提供更好的验证服务。同时多出了一个多带带Stager。

在原有的架构中,用户上传代码后,Cloud Control会将这部分代码结合CloudFoundry打包成DEA可以运行的格式,并上传到一个NFS中,当DEA启动的时候,会从NFS取到需要相应的包,然后再运行。

由于打包(Stage)的过程,比较复杂还需要操作大量的文件,需要的时间比较长,单薄的CloudController不堪重负,所以将其移出,成为一个多带带的进程。每当CloudController需要打包的时候,就会向Stage队列中发送一个请求,Stage收到请求后,逐个处理之。

众所周知,不管是Java,Python还是Ruby程序都会有一系列的依赖,例如Ruby的Gem。每次打包的时候,都需要下载很多Gem,这是费时费力不讨好的。所以开发了PackageCache模块来缓存常用的依赖包。这样的话,打包的过程会顺畅很多。

原先性能问题算是解决了。但CloudFoundry还是个注重高可用的系统,按照原先的设计,存放运行包的NFS是一处单点,一旦Crash,整个CloudFoundry的部署功能都将瘫痪。这是不能容忍的,而且越来越大的规模,一台机器迟早无法容纳全部的运行包。所以使用了BlobStore模块,来替代原先的NFS,提供高可用可扩展的存储服务。

四、SERVICE BROKER

Service Broker可以让Cloudfoundry轻松的支持遗留系统或者不愿意让CloudFoundry托管的系统。他究竟是如何操作的呢?

首先,我们必须准备好系统,例如postgress。我们配置好程序和防火墙,让CloudFoundry能通过类似

postgres://xyzhr:secret@db.xyzcorp.com:5432/xyz_hr_db 的URL来访问到服务。

然后,调用create service,系统会在ServiceBroker中记录你的配置信息。这样就算大功告成了。Bind和其他的过程都有ServiceBroker完成,其实仅仅就是记录信息,没有实际操作。使用这个新的Service的时候和使用CloudFoundry的内部Service没有两样,配置参数都会通过环境变量传入。所以当App访问Service的时候,就与ServiceBroker无关了。

五、DEA

DEA是App的运行环境,全称是DropletExecution Agent。一台虚拟机上会运行一个或多个DEA。一个DEA可以启动多个App(又称Droplet)。所以我们大家的App都会由DEA启动并管理。

当CloudFoundry刚刚推出的时候, Droplet包含了应用运行时启动,停止等简单命令。用户应用可以随意访问文件系统,也可以在内网畅通无阻,跑满CPU,占尽内存,写满磁盘。你一切可以想到的破坏性操作都可以做到,太可怕了。CloudFoundry显然不会放任这样的情况太久,现在他们开发出了Warden,一个程序运行容器。这个容器提供了一个孤立的环境,Droplet只可以获得受限的CPU,内存,磁盘访问权限,网络权限,再没有办法搞破坏了。

Warden在Linux上的实现是将Linux 内核的资源分成若干个namespace加以区分,底层的机制是CGROUP。这样的设计比虚拟机性能好,启动快,也能够获得足够的安全性。在网络方面,每一个Warden实例有一个虚拟网络接口,每个接口有一个IP,而DEA内有一个子网,这些网络接口就连在这个子网上。安全可以通过iptables来保证。在磁盘方面,每个warden实例有一个自己的filesystem。这些filesystem使用aufs实现的。Aufs可以共享warden之间的只读内容,区分只写的内容,提高了磁盘空间的利用率。因为aufs只能在固定大小的文件上读写,所以磁盘也没有出现写满的可能性。

LXC是另一个Linux Container。那为什么不使用它,而开发了Warden呢。因为LXC的实现是和Linux绑死的,CloudFoundry希望warden能运转在各个不同的平台,而不只是Linux。另外Warden提供了一个Daemon和若干Api来操作,LXC提供的是系统工具。还有最重要的一点是LXC过于庞大,Warden只需要其中的一点点功能就可以了,更少的代码便于调试。

六、结语

至此,我们已经全面的浏览了CloudFoundry的新功能,新设计。云计算的大潮浩浩汤汤,CloudFoundry作为第一个开源的PaaS平台日臻成熟,实用。但未来还会有更多更好设计等着我们发现,届时我们再一起分享。

关于作者

颜开,EMC中国研究院研究员,关注大数据,云计算等领域

博客: http://weibo.com/yankaycom

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/3625.html

相关文章

  • 深入Cloud Foundry(下)

    续与回顾 本文第一部分介绍了CloudFoundry的整体架构,并在最后花了一点篇幅简介CloudFoundry的代码组织情况,以便于读者自己去研究源代码。笔者认为开源项目较大的好处在于:当你读懂源代码、理解总体架构后,能够成竹在胸,并吸收为己用(有点类似武侠小说中的北冥神功)。为己用就是本篇要说的内容:我们使用CloudFoundry搭建自己的私有PaaS平台。 在介绍CloudFoundry之...

    qylost 评论0 收藏0
  • 深入 Cloud Foundry(上)

    引子 今年4月份,VMware突然发布了业内第一个开源的PaaS——CloudFoundry。几个关键字:开源、PaaS、VMware,如果你对云计算感兴趣,就冲着它的ApacheV2协议,如果不去GitHub拿它的代码好好研读一下,真有点对不起自己。笔者当时就是以这样的心态去研究它的代码,并把它部署在我们labs里面。发布至今的这几个月里,笔者一直关注它的演进,并从它的架构设计中获益良多,...

    XiNGRZ 评论0 收藏0
  • 云计算之美—单节点部署CloudFoundry方法

    摘要:执行后,开始启动,最终出现下图就说明成功了共启动了个模块。需要两个文件和一个文件夹我在我的机子上找到这些文件,分别拷贝到相应的目录,就了。安装完后,执行上面的步骤都执行下,出现图中的信息,说明安装成功了,现在就可以在上面部署应用了。 作者:egg博客:http://blog.csdn.net/zhangerqing(转载请说明出处)一、环境需求官方系统环境要求:Setup a VM with...

    Salamander 评论0 收藏0
  • PaaS未来世界

    摘要:未来世界此屏幕截图是一个非常好的例子,它包含了通过或者命令行开始所需要的所有内容。未来世界架构元素核心系统架构系统的核心和的附加功能都围绕着控制器。而健康管理器的作用是识别任何可能产生的问题,并通过告知控制器或者其他机制来解决这些问题。 PaaS的未来会是什么样的呢?NoOps和DevOps又如何融入其中呢?PaaS将会让开发者生活的更加轻松。 实际上,PaaS是一些事物的混合体,它关注更快...

    Lavender 评论0 收藏0
  • 5分钟部署一个Hello World Servlet到CloudFoundry

    摘要:首先从我的下载我写好的到本地。安装,然后执行命令行,确保成功,在项目根目录的文件夹内生成了。将放到本地的文件夹下面。启动本地,确保该本地工作成功。然后切换回项目根目录,执行部署到您的上。 首先从我的Github下载我写好的hello world Servlet到本地。 安装Maven,然后执行命令行mvn clean install,确保build成功,在项目根目录的target文件夹...

    chenatu 评论0 收藏0

发表评论

0条评论

tianlai

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<