2.3 Azure公有云上的几种部署模型
Azure是微软针对不断增长的公有云计算需求而推出的计算平台。Azure的主要目标是为开发者提供一系列的组件、服务和工具,帮助开发者快速构建和部署针对互联网的应用程序。现在越来越多的网站均构建在Azure上,因此有必要在此讨论Web网站在Azure上的部署模式。在了解Azure上Web网站部署模式之前,非常有必要先了解云计算的三个重要词汇:IaaS、PaaS和SaaS。
IaaS(Infrastructure as a Service)即基础设施即服务。云提供商仅负责管理物理网络、物理服务器、机架存储和虚拟化等服务,云用户自己管理从操作系统到应用程序的全部应用和组件。
PaaS(Platform as a Service)即平台即服务。云服务提供商把常用的软件和应用封装成开箱即用的服务提供给云用户使用。例如,在IaaS层面使用SQL SERVER数据库,需要云用户自己创建虚拟机,安装SQL SERVER软件并完成配置,最后才能创建SQL SERVER数据库。如果在PaaS层面使用SQL SERVER数据库,那么操作系统和SQL SERVER的安装和配置由云服务提供商来负责执行,云用户直接使用SQL脚本或工具创建SQL SERVER数据库即可。就这一方面而言,PaaS相对于IaaS可以让云用户更加专注于自己的业务。
SaaS(Software as a Service)即软件即服务。服务提供商打破传统的软件许可证销售方式,把软件硬件组合在一起作为统一的服务提供给终端用户使用。可以让终端用户按需付费使用的方式,微软Office 365就是一个SaaS的典型。SaaS是未来软件行业的一个趋势。如图2.5所示,该图展示了IaaS、PaaS和SaaS三者所在不同的层级关系,并清晰地展示了哪些组件是云提供商负责管理,哪些组件是云用户负责管理。
图2.5 IaaS、PaaS和SaaS三种服务层级比较
目前在Azure上部署Web网站有三种方式:Web应用、Cloud Service和虚拟网络。其中前两种是PaaS的方式,最后一种是IaaS的方式。
2.3.1 Web应用加数据库模型
Web应用(Web App)是一种纯PaaS的Web网站部署方案。开发人员可以通过FTP/FTPS、Visual Studio和源代码管理工具上传Web网站内容。
Web应用自带负载平衡和弹性计算功能。每个负载平衡的Web服务器节点都是Web应用自行部署的,即管理员上传的Web网站内容会自动地复制到每个Web服务器节点上去,同时Web服务器节点也会被加入负载平衡承担Web请求的负载。弹性计算功能是指Web应用可以根据网络实时的负载或预设的时间条件动态地在负载平衡环境中扩充或缩减Web服务器节点,这样一来,Web网站的管理员就不需要为突然到来的Web负载高峰而发愁了,同时在业务空闲时间还可以节省资源。
Web应用还支持多种部署槽模式(Deployment Slot),可以让开发和测试人员在99%近似于生产环境的环境中部署一套Web网站来进行上线前的最后测试,以便让管理员在测试环境和生产环境之间灵活地切换。
Web应用模式适合部署“纯”的Web网站,即除了Web网站内容以外,没有需要改写注册表、安装Windows服务或注册COM组件等安装动作的网站。
Web应用无法加入某个特定的Azure虚拟网络,因此调用IaaS层面的数据库服务比较困难,推荐PaaS层的SQL(SQL Azure)或MySQL服务作为Web应用的数据服务。
需要保存在公共区域的会话数据,可以保存在SQL Azure数据库或Redis Cache PaaS服务中。
2.3.2 Cloud Service加虚拟网络模型
Cloud Service是另一种PaaS层的Web网站部署模式。和Web应用模式相比较,Cloud Service同样内置了网络负载平衡和弹性计算功能。Cloud Service也支持部署槽模式,极大地方便了开发人员的测试。
不同的是,Cloud Service会把运行承担实例的虚拟机暴露给管理员。Web网站管理员可以通过远程桌面登录到虚拟机上进行管理。在部署模式下,Cloud Service支持两种部署角色:Web Role和Work Role。Web Role代表应用需要面向用户的部分,具有界面;Work Role是不需要直接和用户发生交互的角色,例如后台服务程序逻辑。
在向Cloud Service部署Web应用时,需要把Web Role和Work Role一并打包成cspkg部署文件,cspkg文件是自包含的,不但含有Web网站内容,也含有这些内容的描述文件;然后上传到Cloud Service某个指定的部署槽中。在实现弹性计算的过程中,Cloud Service会动态地创建虚拟机,在虚拟机节点创建完成后,使用cspkg文件执行Web站点安装,最后把这台虚拟机加入到负载平衡环境中。当某个Web节点需要缩减时,直接从负载平衡环境中删除这个节点,并直接把虚拟机文件删除。
与Web应用相比,Cloud Service允许在部署时挂载自定义动作,可以在虚拟机上注册COM组件安装Windows服务等。
Cloud Service还可以作为一个整体加入到虚拟网络中,这就使得Cloud Service中的Web服务器节点可以访问到IaaS层的其他服务,这种灵活性是Web应用所不具备的。
2.3.3 虚拟网络部署虚拟机模型
在这种部署模型下,与传统的On-Promises环境部署一个Web网站没有太多的区别。Azure用户需要自行规划子网、在虚拟网络内创建虚拟机、部署IIS数据库等各项服务。Azure上的防火墙在配置端口映射时可以支持网络负载平衡功能,可以把Web请求均衡地引导到虚拟网络中的Web服务器虚拟机。Web网站管理员需要自己配置DNS域名、虚拟机和安装IIS服务等。
与On-Promises相比,在虚拟网络部署模式下,最需要考虑的问题是如何实现Azure承诺的99.95%服务级别协议。想要达到99.95%的高可用性,不能只依靠Azure的运维管理,也需要用户在部署应用时充分考虑部署架构。要达到99.95%的SLA,最重要的一点就是用户在部署自己应用的时候,每种服务器角色不能是单台且每个服务器角色至少需要两个实例。其中的原因需要从Azure的物理架构说起,请参考图2.6 Azure虚拟机部署的简要说明。
图2.6 Azure虚拟机部署的简要说明
在Azure云机房内,每个物理机架上都运行着很多的虚拟机,这些虚拟机均构建在微软虚拟化平台Hyper-V上面。每一个物理机架都被看作是一个故障域(Fault Domain),既然是物理机架,那么就有损坏的可能,例如机架顶部的网络设备掉线、物理机架上的硬盘损坏甚至是支撑物理机架运行的电源掉电。要知道,超大规模是所有云机房的特点,每个云机房内都会有上万台物理计算机和上万块的硬盘以及数不清的其他设备。在这种规模下,每种产品的次品率都不再是一个能够忽视的问题,因此云机房内每天都会有硬件损坏发生。
那么怎么保证Web应用不会因为物理机架的问题而导致应用程序停用呢?这就需要在部署应用的时候,不能有单点故障。因此每种应用服务器角色都必须含有两台以上的实例。同时,相同角色的实例,必须加入同一个可用性集(Availability Set)。可用性集只有一个名字可以设置,它后面是一个分布算法。在同一个可用性集内的虚拟机实例,会保证不会被Azure分配到同一个物理机架上运行,这就保证了某个故障域出现问题的时候,其他故障域中仍然有相同角色的虚拟机实例在运行。故障的损失仅限于计算能力的降低,不会因为某个服务器角色彻底停用而导致整个Web应用出现故障。
图2.6中还有一个升级域的概念(Upgrade Domain)。在机架上,负责管理全部虚拟机和网络等资源的组件是一个特殊版本的操作系统,可以把它理解为一个Windows Server 2012针对Hyper-V服务进行过专门优化的版本。这个操作系统本身也需要安装补丁以提升安全性和性能。Azure在进行升级维护时,也是以故障域为单位进行升级操作的,在同一个物理机架上运行的虚拟机都被认为是在同一个升级域内。这种情况和物理机架故障类似,在相同服务器角色多实例部署且加入可用性集的情况下,升级操作只会让应用损失部分计算能力。
那么多实例部署又引申出另外一个问题,那就是在角色和角色之间调用时,如何让被调用的角色中的多实例使用共同的服务名和地址。这需要使用Azure中的另一项技术即内部负载平衡(internal load balancer)。内部负载平衡可以自动侦测多实例中处于正常工作状态的实例,并把对于该角色的调用请求分摊到正常运行的实例中,如图2.7所示。
图2.7 内部负载平衡示意图
Web层具有面向互联网的端点443端口。负载平衡器TCP端口443(HTTPS)到Web服务器分发来自Web客户端的传入流量。数据库服务器是一个内部负载平衡端点,其中Web服务器实例集中访问该数据库服务的内部负载平衡的端点,内部负载平衡在所有数据库实例中实现流量平衡和故障转移。
使用虚拟网络部署虚拟机的方式运行Web网站不具备弹性计算的能力,Azure无法根据Web请求的负载动态地增加或缩减Web服务器的个数。整个Web网站的运维环境都需要Web网站管理员进行管理,很多场景下虚拟网络部署虚拟机的方式也扮演者重要的角色。通常来说,复杂的部署架构都需要使用管理员直接在虚拟网络中搭建虚拟机的方式来实现。
值得注意的是,由于虚拟网络中无法支持虚拟IP地址,所以无法实现SQL灾难恢复群集,SQL SERVER的高可用性需要SQL Always On技术来搭建。