Cloud Foundry是VMware主导使用Ruby开发的一款开源PaaS云计算平台,它提供了各种各样的云平台、开发框架以及应用程序服务。开发人员可以在该平台上迅速部署及运行Web应用程序。Cloud Foundry能够帮助开发者使用Java或者其他的基于JVM的架构构建应用,它支持的应用程序框架包含Spring、Grails、Ruby on Rails、Node.js 及 Scala,NET的支持。 Cloud Foundry遵从OpenStack云计算平台规范,作为业内第一个开源的PaaS,它给我们打开了一扇研究云计算环境下PaaS平台架构设计的窗户,让我们管中窥豹,学习和借鉴。
Cloud foundry是Vmware的开源PaaS产品,Vmware还有自己的商业版本:VMwarevFabric Cloud Application Platfor,这和Cloud Foundry属于两个产品,分别由两批团队开发。比较而言,vFabric作为商业产品,完善很多,而且发展已久,和STS深度整合。
图43-01 :Cloud foundry 概念图
从图能清晰的看到Cloud foundry的3大能力,这也是业界标准PaaS平台通常能提供的能力。
基于Cloud Foundry的项目部署架构。特点如下:
从CF的多层部署的模式去看,并没有超出我们曾经熟知的集群和分布式的理念,CF作了一些封装和提供了一些自动部署的能力。
图43-02 :CF推荐的软件架构,多层部署模式
结合CF的功能结构图,程序员设计完毕的代码,通过cloud controller上传到cf,并通过一定的规则部署在DEA区,前端route根据路由的分发,把请求给分解,如果有后端应用(no web)也同样部署在DEA区(可以理解一下上下2张图中的红圈圈,即程序部署的位置),并用rabbitMQ进行关联,这样根据CF提供的通用架构模式和基础服务的支撑,达到了一种系统通用分布式的架构能力,并能达到一定高度的并发访问的要求,并极大的简化了部署和监控的工作。
图43-03: 逻辑视图
图43-04 :CloudFoundry的总架构图
CloudFoundry的核心就是一套消息系统,以及多模块的分布式系统,支持模块自发现,错误自检,且模块间低耦合,面向消息的架构是它节点横向扩展,组件自发现等云特性的基础。中心位置有个叫nats的组件,基于EventMachine的消息系统。每个台服务器上的每个模块会根据自己的消息类别,向MessageBus发布多个消息主题;而同时也向自己需要交互的模块,按照需要的信息内容的消息主题订阅消息。
图43-05 :CF内部控制,指令,数据流向图
Router
Router组件对所有进来的Request进行路由。进入Router的request主要有两类:
图43-06 Route架构:(左图为老版本设计,右图为新版本设计)
所有进入CloudFoundry系统的requests都会经过Router组件,Router被设计成去单点依赖,组件可平行扩充,且可替代,以保证扩展性。这是CloudFoundry,也是所有云计算系统的设计原则。云系统可以部署多个Routers共同处理进来的requests,CloudFoundry保证所有的request是无状态的,这样负载均衡可采用DNS,硬件LoadBalancer,ngnix,都是可行的。目前Router组件,是对nginx的一个简单封装。
Cloud Controller
CloudController是CloudFoundry的管理模块。主要工作包括:
Cloud Controller就是与VMC和STS交互的服务器端。VMC和STS与CloudFoundry通信采用的是restful接口,从VMC或者STS接到JSON格式的协议,数据持久化到CloudController Database,并发消息到各模快去控制管理整个云。
Health Manager和DEA是外部模块,CCDatabase就是CloudController Database,这里是个单点。CloudController Database的并发性不会很多,应用级别的数据库访问是由底下的Service模块处理的,这个数据库存的是Cloud的配置信息。读操作主要来自DEA启动,作为初始化DEA的依据;以及healthmanager模块会从这里读取预期的状态信息,这部份数据会与从DEA得到的实际状态信息进行比对。
图43-07a:Cloud control架构(old)
图43-07b:Cloud control架构(new)
Health Manager
HealthManager: 做的事情不复杂,简单的说是从各个DEA里面拿到运行信息,然后进行统计分析,报告等。统计数据会与CloudController的设定指标进行比对,并提供Alert等。
DEA
Droplet Execution Agency:Droplet是指提交的源代码 + 配套好的运行环境 +管理脚本,例如Start/Stop这些小脚本全部压缩好在一起的tar包。还有一个概念,叫做Stagingapp,就是指制作上面描述这个包,然后把它存储好的过程。CloudFoundry会自动保存这个Droplet,直到你start一个app的时候,一台部署了DEA模块的服务器会来拿一个Droplet的copy去运行。所以如果你扩展你的app到10个instances,那这个Droplet就被会复制十份,让10个DEA服务器拿去运行。
图43-08 :DEAs架构(左图为老版本设计,右图为新版本设计)
Services
Service模块是一个独立的、可Plugin的模块,以方便第三方把自己的服务整合入CloudFoundry生态系统。在Github上看到service是与CloudFoundry Core项目vcap独立的一个repository,为vcap-service。Service模块其中设计原则是方便第三方服务提供商提供服务。
从Github上看,已有以下服务提供:MongoDB;mysql;PostgreSql;RabbitMQ;Redis等。基类都是放在base文件夹中,第三方如果需要自己开发CloudFoundry的服务,需要继承改写它里面的两个基础类:Node和Gateway;而里面一些操作,如:Provision,可以在base的provisioner.rb基础上加入自己的逻辑,同样的还有Service_Error和Service_Message等。
从架构了解上来说,只要知道服务间的关系,知道个服务与base间透过继承关系来横向扩充,而CloudFoundry与apps调用Service是通过base来完成这一简单的架构方法即可。
对CF的架构以及CF组件有了个初步的了解,CF的特点为:
CF从本质来说就是应用和服务的管理系统(mis系统),只是管理的不是二维表中的数据,而是我们上传的web应用和它自身的服务,从一个应用上传到CF,就启动了CF的流程,下图其实是vmc push命令在CF的内部组件之间的交互过程。
图 43-09:CF部署应用的内部流程
在传统方式中,程序员把商业或开源工具安装在本地系统上,编写代码,然后把开发的应用程序部署到他们自己的基础设施上并管理它们;基于PaaS的部署,开发人员不必为定义可伸缩性要求去操心,他们也不必用XML编写部署说明,这些工作全部由PaaS提供商处理
CloudFoundry官方用Chef作为部署工具 。Chef是OrchestrationEngine的一种,可以自动化管理、部署复杂的云环境。工作过程大概就是部署人员写一系列的“recipes”,这些“recipes”描述我们需要把我们的服务器部署成什么(Apache,Mysql还是Hadoop),然后Chef可以自己执行这些配置。现在数据中心变得越来越庞大,原来那种通过自己写脚本完成自动部署的IT管理方式日渐不堪重负,帮助管理、部署数据中心服务器集群的中间件变得越来越重要,这也是DevOps的范畴,.在以后的篇幅中在阐述。
部署有2种方式,软部署和硬部署。项目开发完毕,会有war包和数据库脚本,如果是软部署,提交给相依的云平台部署人员即可。他们根据软件部署模型来部署,由云平台部署人员控制ip以及route的分派,以及数据库和应用的绑定。
如果是硬部署,则是直接面向主机的操作系统,划分主机的ip地址以及网络规划,部署应用服务器并且调优,设定好war中的数据库连接方式,自行确定前端派发的分派方式。下面用个切图比较方式,比较一下传统模式部署(硬部署)和基于paas的部署(软部署,以CF为范例)。
开发模式 |
传统部署 |
云部署 |
图43-10:单一部署 |
[mysqld] user = foobar port = 3306 basedir = /usr bind-address=192.168.0.8 key_buffer = 16M ….. [nginx] http.include mime.types; default_type: keepalive_timeout 65; ….. [tomcat] ….. [frontend] dependencies: mysqlclient ruby files: core/app/fe/**/* core/common/**/* |
# 登录到CF vmc target http://api.cloudfoundry.com vmc login
# 创建并启动应用 vmc push myapp –instances 2 –mem 64M –path ../code
# 创建数据库实例并绑定 vmc create-service mysql –name mydb –bind myapp
# 升级应用的代码 vmc update myapp –path ../code |
图43-11:分布部署 |
更多。。。
这里省略 |
# 创建多实例的前后端应用 vmc push fe –instances 8 –mem 64M –path ../fe_code vmc push be –instances 2 –mem 256M –path ../be_code # 创建服务并绑定 vmc create-service mysql –name mysql –bind fe vmc create-service mongodb –name mongo –bind be vmc create-service rabbit –name rabbit –bind fe vmc create-service redis –name redis –bind fe vmc bind-service redis be vmc bind-service rabbit be # 执行代码更新 vmc update fe –path ../new_fe_code vmc update be –path ../new_be_code |
Github上找到CloudFoundry的全部代码:https://github.com/cloudfoundry,你会看到几个不同的Repositories,它们分别是:
程序员如果基于CF作开发,以下书籍可以参考,这些书籍不在1.5章节中声明的辅助文档之列,因为这些都是CF的PPT课件:
《AM-1 从开发者的角度看CloudFoundry.pdf》,
《AM-2 Cloud Foundry BootCamp.pdf》
《PM编程语言与架构专场 Spring带你步入云端 Chinese.pdf》
《PM解决方案和合作伙伴专场 3 CloudFoundry服务网关的架构.pdf》
《PM数据库专场 CloudFoundry中MongoDB的应用.pdf》
图43-12: 开发部署
图43-13: 物理部署图
要搭建一个完整的私有云系统,还有很多缺少的地方,譬如下层的IaaS如何集成?如果CloudFoundry一个组件负载过高,应该如何扩容?能否做到自动化?如何检测、管理CloudFoundry的服务器集群?这些都是需要解决的问题。
CloudFoundry是与底层IaaS无关的,可以用vSphere或者OpenStack来作为IaaS方案。为了实现云计算的可伸缩性,IaaS层需要提供如下功能:
私有云有了IaaS和PaaS,有了自动化管理工具(也就是OrchestrationEngine),但中间还缺少监控管理工具。有了监控管理工具,我们才可以知道现在CloudFoundry每个服务器的资源使用情况,才可以向IaaS请求计算资源。
上一篇 从项目开发到云端架构(11) : http://timeson.iteye.com/blog/1689462
下一篇 从项目开发到云端架构(13) : http://timeson.iteye.com/blog/1696300