基于开源云技术的高可用Web应用云研究
发布者:    发布时间:2014-06-21     阅读:148次

0 引言

    Web应用(Web Application ,Web App)是基于万维网的一种延伸,既包括以浏览器为入口的站点,也包括一些更适应移动终端的Native App。在普通计算机上以浏览器访问Web资源为主,根据WordWebSize官网对Web网页的实时统计,截至2013年6月27日,Web网页数量已超过4506亿页 。而各类移动终端上,浏览器启动次数逐渐减少,因为Native App更适用于移动互联网,很多Native App(如微博、微信、淘宝等)已内置浏览器。根据百度2013年一季度的移动互联网发展趋势报告,截至2013年3月,移动互联网的人均上网时长已超越PC互联网的29%。

    Web应用的特点是基于Http等协议以统一资源标识符的形式对资源进行访问,资源存放在互联网中的某一服务器(物理的或虚拟的)中,但其中存在以下两个问题:①负载(访问量)周期性变化,在部分时间需要大量的计算资源(网络带宽、数据处理、存储等) ,如新学期学生选课、购物网促销等,而其它时间需要的计算资源要小得多甚至零负载;②易受突发事件影响,如美女毕业照致人大网络瘫痪等。这些问题是Web应用与生俱来的缺陷,目前主流的解决方法包括基于分层的Web架构、分布式集群、缓存技术、负载均衡等。这些方法能在一定程度上解决Web应用的负载问题,但存在管理成本高、可伸缩性有限、浪费计算资源等问题。

    本文通过分析传统的分层架构集群存在的问题,并针对问题设计了SPI云架构方案。结合开源Openstack、Cloudify平台,设计并实现了“Openstack+Cloudify+WebApp”的SPI方案,该方案具有应用安全、弹性计算、高性价比等特点。

1 传统分层架构集群

    大多数现代企业级应用的构建分为3个或4个物理层。第一层是数据层,一般采用关系型数据库实现。第二层是业务逻辑层,实现应用核心的业务逻辑功能。第三层是Web表示层,实现应用请求响应的用户结果呈现(比如HTML、JSON、XML等) 。通常在Web表示层之上还有负载均衡。许多应用系统也使用一个消息传递层,基于可靠的异步通信和事件驱动的处理模式,业务逻辑服务消费消息层到达的消息,并处理消息映射的工作。为了实现高可用性和更高的处理能力,每个层都使用集群配置。3个或4个不同的集群,由网络通信组成一个整体,形成企业级应用,如图1所示。

 图1 分层架构的集群 

图1 分层架构的集群

    分层架构的集群在一定程度上增加了Web应用的处理能力,但同时存在以下问题:

    (1)管理存在困难。每一层是一个不同的集群,需要不同的特定技术支持,会造成如下问题:①每一层集群需购买相关组件并雇佣专业人员安装维护,带来昂贵成本;②组件繁多带来跟踪和监控上的困难;③业务处理需要多个组件动态组合,若产生故障难以维护;④应用多个分层协同工作,分层部署困难。

    (2)性能方面受到一定限制。一项完整的业务处理需要多个层共同协作,而每层间只能通过网络传输完成,使得每一项业务处理的时延受到限制。同时,随着集群的扩展,计算能力增加,但网络带宽存在瓶颈,整个系统吞吐受限。

    上述延迟和可伸缩性受限问题,一般通过建立缓存机制解决。在数据库层增加基于内存技术的缓存层,适用于读操作次数远大于写操作的情况。同时可在Web表示层建立基于资源分类的缓存,此方法特别适用于静态资源的缓存,可减少请求处理的路径。增加缓存层同样会付出一定代价。增加新的层,需要为新的技术和管理付费,同时缓存技术对于写操作多的场景并不适用。

    (3)造成计算资源浪费。一个Web应用系统为了解决系统负载高峰,对集群节点进行扩展,而在运营中为了应对突发事件的影响,需开启更多节点以防止系统宕机,造成大量的计算资源浪费。

2 SPI云计算架构

    云计算有着较多定义,其中美国国家标准技术研究所(NIST)的定义是云计算定义的权威。云计算是一种无所不在、方便、按需通过网络使用可配置计算资源共享池的计算模型。计算资源包括网络、服务器存储、应用程序等。计算资源共享池可以最小化平台的服务管理、服务交互,并且迅速地提供或释放计算资源。云计算具有按需自助服务、网络获取、资源池化、快速弹性、可计量服务五个基本特征。

    云计算可分为软件即服务(Software as a Service,SaaS)、平台即服务(Platform as a Service,PaaS)、基础设施即服务(Infrastructure as a Service,IaaS)三类服务模型,也被简称为SPI模型,如图2所示。

 图2 SPI模型栈 

图2 SPI模型栈

    不同企业对SPI三层模型的划分略有差别,但大体相同。图2中,IaaS层对物理服务器集群进行统一管理,形成集群系统,向外提供各种带有操作系统的虚拟主机服务。这些虚拟主机的内存、硬盘、网络均是可配置的。PaaS层通过IaaS层提供的接口使用虚拟主机,并向用户提供应用程序的运行环境服务,如数据库服务。SaaS层利用PaaS层提供的运行环境运行相关应用,用户可以在线使用。

    在SPI模型栈中部署的应用有分层架构集群中应用所不具备的优势,具体有以下几方面:① SPI中运行的应用可根据应用负载或访问量动态伸缩。假设应用A运行在SPI中,应用A就运行在Tomcat容器并使用MySQL数据库。当A负载量过大时,可向PaaS申请更多的MySQL服务实例和Tomcat实例。而PaaS层则向IaaS层申请相应操作系统的虚拟主机以运行MySQL与Tomcat;当应用A的负载远小于其服务的实例时,PaaS层即进行空闲实例回收,IaaS层销毁相应的虚拟机;② SPI中可同时运行多个应用,实现应用共享计算资源。由于PaaS层的实例是无状态或数据同步的,可随时增加与销毁,因此可以将应用间的计算能力共享,以平衡多个应用的同时运行。另外,由于所有的运行环境运行在虚拟机中,形成网络、系统、主机的隔离,保证了多个应用间的隔离与安全;③ 成本降低。公有云(如GAE、SAE等)平台按需付费,相比自己购置或租用同等计算能力的服务器更加实惠。自建私有云有着大量的开源云平台,如Openstack、CloudStack等IaaS平台,Cloudify、CloudFoundry等PaaS平台。IaaS与PaaS平台间耦合度低,能够较好地相互组合使用,而且这些平台均有较为活跃的社区进行技术讨论与支持。

3 “Openstack+Cloudify+WebApp”SPI设计方案

    3.1 Openstack计算资源管理

    OpenStack基于一系列开源技术,提供了大量可伸缩的云计算服务软件。公司、服务提供商、增值代理商、中小型企业、研究人员和全球数据中心均可利用Openstack部署大规模的私有云或公共云。

    Openstack是SPI架构的基础,通过网络虚拟化、存储虚拟化、计算能力虚拟化及相关管理与调度技术,提供虚拟主机服务。OpenStack 包括7个核心组件:计算(Compute)、对象存储(Object Storage)、身份(Identity) 、仪表板(Dashboard)、块存储(Block Storage)、网络(Network)和镜像(Image Service)。

    如图3所示,Dashboard为其他OpenStack服务组件提供了一个web前端。Identity实现所有服务的身份验证。Compute是整个Openstack平台的核心组件,提供虚拟服务器,同时依赖Network、Block Storage、Image三个组件,分别为虚拟服务器提供虚拟网络、虚拟存储卷以及镜像服务。Image服务为计算节点提供存储、检索镜像及相关的元数据信息。而镜像及相关元数据信息存储在Object Storage中,也可以存放在本地文件系统、网络文件系统中等。

 图3 openstack的七大组件 

图3 openstack的七大组件

    如图4所示,本文将Openstack部署在三台服务器中,一台作为控制节点,两台作为计算节点。由于实验平台硬件资源有限,取消了对实验非必须的一些组件(如swift)的部署,并将与计算(提供虚拟机)无关的组件统一安装到控制节点。控制节点有以下组件:数据库(MySQL)、消息队列(RabbitMQ)、身份认证(keystone)、镜像服务(glance)、网络(nova‐network)、服务API(novaapi/glance‐api)、计算调度(nova‐scheduler)、控制台服务(nova‐consoleauth)、远程访问(nova‐novncproxy);计算节点有虚拟化(KVM)、计算(nova‐compute)组件,其中虚拟化为计算提供基础服务。

    三台服务器由两台交换机组成外网与内网,10.10.4.0/24作为外部网络,各节点通过此交换机与外部通信,外部通过此网络获取计算服务资源;192.168.1.0/24为内部网络,用于组件之间的通信和虚拟机之间私有信息的传递。计算节点内虚拟机的网络采用FlatDHCP 模式,在该模式下,控制节点提供dhcp 和nat 服务形成虚拟网络的网关,平台内所有虚拟机向控制节点请求虚拟IP ,组成虚拟内部网络。虚拟IP 网段为192.168.100.0/24。为了保证虚拟机能够为外部网络提供计算服务,需要提供外部访问方法,一种为远程控制(noVNC) ,另一种为直接分配外部IP(浮动IP)。远程控制由控制节点中的远程控制组件提供相应服务,但并不能满足Web应用的需求,因此建立了浮动IP表。将空闲的外部IP(或IP 段)装入表中,根据用户需求由网络组件控制虚拟机的浮动IP分配。

    通过上述部署,三台物理服务器统一对外提供计算资源服务。通过Dashboard或Shell命令配置一些基本信息,为Cloudiy平台建立基础(安全认证、操作系统、虚拟机配置、总配额等)。

 图4 openstack部署拓扑 

图4 openstack部署拓扑

    3.2 基于Cloudify的平台服务

    Cloudify设计为任何应用可部署到任何云中,使得企业、ISVs 、托管服务供应商们都因为云的自动化和弹性管理而迅速获益。Cloudify通过对应用部署和运行进行的额外组织,帮助应用管理(Application onborading )和自动化最大化。Cloudify开发运营的途径是将基础设施作为代码,允许描述部署与部署后的步骤。

    如图5所示,Cloudify工作在Openstack的基础上,通过Cloud Driver操作Openstack的API,实现权限验证、开启虚拟机、关闭虚拟机、连接虚拟机、向虚拟机传文件、部署应用程序等功能。

 图5 Cloudify在Openstack之上工作 

图5 Cloudify在Openstack之上工作

    Cloudify Cloud Driver是基于云环境的Cloufify抽象层,为Cloudify提供云基础设施接口,为Cloudify运行应用按需提供计算资源。在Cloudify需配置一些必要信息以操作Openstack,作为Cloud Driver工作的基础。具体配置如表1。

    通过上述配置,Cloudify通过Cloud Driver访问Openstack,启动一台(本文实验启动了一台,可以是多台)虚拟机并上传脚本文件、a.pem文件、Cloudify运行组件程序等。当以上文件上传成功后,Cloudify在该虚拟机中通过脚本文件下载并安装JDK、启动Management组件。由此Cloudify进入了正常工作阶段,可以在任一地点访问Cloudify平台。Cloudify提供了REST API和CloudShell客户端两种访问方式。

表1 Cloud Driver依赖的配置

 表1 Cloud Driver依赖的配置 

    3.3 WebApp自部署与自管理

    WebApp的运行依赖于数据库和Web容器两种平台,因此Cloudify需要为WebApp提供这些平台。而无论是数据库还是容器,相对Cloudify而言均可称之为一个实例(如一个或多个MySql实例、Tomcat实例等)。Cloudify通过用户上传Recipe的方式对WebApp进行自部署与自管理。

    Recipe具有一个庞大的配置体系,可配置应用的部署过程、应用生命周期中的事件响应。部署过程包括在WebApp部署前先部署数据库或数据库集群、安装JDK及容器等工作。应用生命周期事件响应包括每个实例的生命周期事件(如启动、初始化、销毁等) ,同时也包括每个实例工作状态的变化(如访问用户数变化、网络吞吐流量变化等) 。通过Recipe配置,该应用在用户数量或网络吞吐量超过一个实例负载时启动新的实例,以动态减少实例的压力;在应用实例空闲较多时,可销毁一定数量的实例以节省计算资源。当部署多个应用在一个平台之上时,可以使应用相互支援、共享计算资源等。

    图6即为WebApp在Cloudify上自部署的过程。

    Management首先启动,由开发者通过REST API 或CloudShell访问Management并上传Recipe 。Management解析Recipe,获取应用部署过程,通过Cloud Driver控制Openstack按部署过程开启虚拟机、安装依赖的软件、部署应用程序,并在每台虚拟机中安装Cloudify‐Agent监听每个实例的状态,以便于自管理。

    Cloudify的弹性服务依赖于基于元组的思想。元组表示应用程序的最小业务单元,相对Cloudify是一个处理单元实例,相对Openstack是一个虚拟机实例。Openstack与Cloudify之间相互独立,相对Cloudify、Openstack是一台大机器,透明地提供了大量计算资源。如图7所示,Openstack提供网络与计算资源,Cloudify则根据应用程序需求向Openstack申请即可,一个应用程序可以有多种平台支持,图中WebApp由一个ApachBL实例、两个Tomcat实例、一个MySQL实例及一个公网和四个内网资源组成。实例之间是相互独立的透明服务,Cloudify对实例动态增加或减少并不影响用户业务,并且实例增加不会给其它实例带来负担。

 图6 WebApp在Cloudify平台上自部署 

图6 WebApp在Cloudify平台上自部署

 图7 WebApp在平台中运行逻辑 

图7 WebApp在平台中运行逻辑

    3.4 测试实验

    部署一个简单的Web应用到Cloudify中,以实验该开源云平台。在Cloudify 官网下载一个测试WebApp(HelloWorld),然后启动CloudifyShell(也可以通过Cloudify Web 部署),与Management 建立连接。将下载好的HellowWorld Recipe放到Cloudify Shell可以找到的目录中,通过install‐application HelloWorld命令即可完成应用的自动部署。

    部署完成后,可以通过CloudifyShell中的命令或Cloudify Web查看应用的运行状态。

     同时在Openstack中也可以发现新启动了虚拟机,如图9所示。

 图9 Openstack中的实例 

图9 Openstack中的实例

4 结语

    本文提出的开源云平台与当前Google的GAE、Amazon的AWS、Sina的SAE提供的功能类似。由于它们是商用的,我们无法在实验室运行,也看不到其内部技术细节。本文的Openstack、Cloudify均为开源技术平台,任何人均可研究或将其商用。

    在该平台中部署的Web应用具有以下特点:①应用安全。除一般Web应用的安全措施外,每一个实例都运行在独立的虚拟机中,每台虚拟机均有独立的防火墙与虚拟网,形成了很好的安全防护;②弹性服务。根据开发者开发的Recipe,平台按预选配置好的策略进行增加或减少服务实例,在使用足够计算资源的同时不浪费计算资源;③性价比高。多应用可同时部署在一个平台中,共享硬件资源,而软件平台均是开源,同时平台自部署与自管理减少了管理人员。

    该组合适用于建立各种云平台,如智能家居云、电视服务云等,将所有家居、电视服务部署到本文讨论的平台中可实现服务间共享计算资源,还可解决单一应用负载峰值过高时的压力问题,同时平台的自部署、自管理功能大大减少了服务器的运维、管理工作。