在Windows Azure公有云环境部署企业应用

作者 王枫 发布于 2014年4月5日        

企业内部应用转换为在线服务

Windows Azure已经成为众多IT服务提供商们热议的话题,其中,有的认为只有提供互连网用户服务的应用才适合放在公有云环境内运行。然而,事实上,在当前Windows Azure环境上,有许多企业也把企业内部的应用放在公有云上,它们包括

Web/Brower架构。Web服务器直接放在Windows Azure环境中,方便企业内员工通过HTTPS方式连接到企业内网或互联网访问。特别在跨国企业环境中,这样做可减少公司内部不同国家的办公室之间网络流量。

Client/Server架构。应用服务器放在Windows Azure环境中,用户端的应用可以部署在PC或移动设备上,方便用户访问。如果考虑网络安全,还可以加上VPN或其他安全保护机制。

本文主要介绍某个企业将原本在企业数据中心的应用的迁移到Windows Azure上部署的案例。在该企业的数据中心里,该应用是让企业购买软件后自行部署到物理机的,企业要安排IT人员到客户端去协助维护与更新软件。迁移到Windows Azure中部署成在线服务之后,可以节省原本要另外购买服务器硬件的成本,同时也减少了IT对客户服务的工作量,以后升级及维护的工作可以通过脚本直接在Windows Azure环境中对所有虚拟机和软件进行配置。本文主要内容有:对迁移前的应用架构的关键点分析、部署过程中需要调适的配置、可能的不同部署方式等。Windows Azure应用部署原则按照应用实际运行的最佳环境需求设计。

以下内容先介绍针对要迁移的应用的架构环境进行调研,然后介绍迁移到Windows Azure的过程。调研工作主要从从硬件、网络、存储、应用等四个方面进行,了解原有环境存在的缺点与客户期望的改进。然后说明迁移到Widnows Azure后的优点以及实现了哪些改进。

原有应用架构环境调研

服务器

对于传统数据中心,用户通过互联网访问服务器上安装的应用,合作伙伴直接开发新的插件上传到服务器并与现有应用集成。每个客户的基本配置是一台网站服务器和一台数据库服务器。企业的传统数据中心环境都采用直接提供物理机的方式,或者由客户自行准备物理机来安装应用。

迁移到Windows Azure虚拟机环境后可以提高服务器的硬件资源使用效率。

网络环境

默认情况下,网络环境应该把不同客户的虚拟机网络都隔离开来,可以使用Vlan ID在同交换机上隔离网络通道。但是因为需要在所有服务器上打补丁(应用本身的补丁与Windows Server, SQL Server的补丁),所以必须与管理服务器连接,这在物理交换机上很容易实现。但是,迁移到Windows Azure环境里之后,就只能使用Azure本身的Virtual Network来做,解决方案会在后面详述。

存储

在传统数据中心里,所有的虚拟机文件都是放在物理服务器外部的共享存储中,通过集群解决无理解故障,故障时处理逻辑可以自动迁移到其他物理机上,重启后继续运行。正在使用的服务将会中断,也会存在少量数据丢失的可能,通过数据库回滚技术可以继续正常工作。但是对客户来说,服务质量还需进一步加强。因为成本的限制,共享存储内的数据并没有同步拷贝到其他数据中心。

应用

该企业准备迁移的应用属于三层架构,为了简化安装与运营的维护要求,网站与应用被安装在同一台网站服务器内,只有数据库独立安装于一台虚拟机中。应用层已经具备了扩容的功能,可以建立网站服务器资源池,并配置硬件负载平衡器,只要在网站资源池内新增网站服务器然后执行配置更改的脚本就可以提供多台服务器共同提供服务。后端的数据库服务器没有设计为数据水平分散的架构,在硬件的数据库服务器没有做到扩容的功能。

调研结果

这是典型的符合从物理机转换到虚拟化环境然后再迁移到Windows Azure的场景。本文主要讨论如何使用Windows Azure解决方案满足客户的期望。以下是四个方面是主要且常见的需求:

  • 物理机资源使用率提高与虚拟机容错
  • 网络可以隔离,但是管理环境的网络必须连接到每一部服务器
  • 数据存储高可用性提升
  • 应用与数据库扩容

迁移到WINDOWS AZURE

物理机资源使用率提高与虚拟机容错

在Windows Azure环境里不需要去考虑物理机硬件,因为物理机的管理已经由Azure完全负责。

虚拟机的容错在Azure的环境里是默认存在的,只要选取就行。

网络可以隔离,但是管理环境网络必须透通

Azure环境里配置不同的虚拟网络并把不同的客户虚拟机指派到隔离的虚拟网络就可以隔离虚拟机,管理服务器虚拟机则是通过Azure默认提供给每一台虚拟机的公网IP地址来推送补丁即可。此种作法比较简单,直接用原有功能配置即可。但是有以下几点状况必须考虑:

  • 客户数量增加时,虚拟网络的数量管理变得复杂
  • 实际压力测试结果,当虚拟机数量增加时,通过公网在所有虚拟机上打补丁会影响到客户用公网连接网站服务器的效能
  • 考虑上面两点,在此环境的最佳作法是
  • 减少虚拟网络数量,依照打补丁虚拟机群的设计区分虚拟网络(并非隔离)。在虚拟网络之下新增子网络数量,不同客户的虚拟机放在不同的子网络(仍未隔离)。虚拟机服务器隔离的配置是在增加新的虚拟机时执行配置脚本,用Windows虚拟机本身的防火墙配置开启相同客户的服务器还有管理服务器连接同时阻绝其他的服务器
  • 因网络层并未隔离,所以打补丁可以走虚拟网络完成工作,不会影响公网的客户连接

数据存储高可用性提升

此项目在不同城市的数据中心设置了两个Windows Azure的存储帐号,并把客户的数据在两个Azure数据中心同步,以满足基本的高可用性需求。

除了这种做法之外,还有其他作法

  • 比较安全的作法是把数据放在公司网络,网站与应用服务器放在Azure,中间通过Azure的Connect功能建立VPN连接保护资料传输。这种作法安全性高,但是降低了网络效率。
  • 数据拷贝一份到Azure的存储,部署到Azure里的数据库虚拟机里设置为只读,仅提供查询。要写入的数据仍然导向VPN连接到公司网络的数据库服务器上处理。此种方法应用代码修改多,数据更新稍慢。

应用与数据库扩容

此部分是此项目进行中最精华的部分。原有应用已经有了负载均衡功能,但关键是要有网络硬件的负载平衡器来分配多并发的连接要求,在Windows Azure默认的部署方式默认支持公网IP地址负载平衡,只要在加入新的虚拟机时选取,可取代原有环境中的硬件负载平衡器。

图为原有环境中使用WCF服务器的负载平衡,但是如果内部虚拟网络IP地址也有负载平衡的需求,则可以在修改应用代码让网站应用本身去选择连接多部后端服务器。虽然Web Role与Worker Role能够通过虚拟网络内的通道直接进行通讯,但Windows Azure在内部虚拟网络的环境中没有提供负载平衡的功能。要做到内部网络IP地址也能有负载平衡,我们可以自行编写代码完成,

举例说明:端口10101对应第一个实例,端口10102对应第二个实例,依此类推。Windows Azure SDK 1.7版本内有一个功能——InstanceInput,这个功能可以让用户端应用(或前端网站服务器)直接连接到后端的服务器实例(任选Web Role或是Worker Role)。以下是完整的InstanceInput功能导览:

  1. 用Administrator帐号启动Visual Studio

  2. 建立一个新的”Cloud Service”后,建立一个WCF服务的Web Role命名为WCFServiceRole

  3. 用以下的代码建立一个角色实例

     public string GetData(int value)
    {
         return string.Format("From {0} - You entered: {1}", RoleEnvironment.
    CurrentRoleInstance.Id, value);
    }
    
  4. 然后,在服务部署的地方加代码来关闭地址过滤功能

     [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
    

    因为默认的环境下已经建立的服务会连接特定的端口配置,此代码的作用是停用连接特定端口,所以才能另外配置端口

  5. 在此Solution内部新建一个控制面板命名为”WCFClient”

  6. 按 Ctrl+F5来运行一次这个Solution

  7. 在WCFClient上右单击后点选Add Service Reference…

  8. 在Add Service Reference的对话框内输入服务地址https://127.0.0.1/Service1.svc,然后单击Go,再接着单击ok

  9. 把下方代码加到Main方法,解决命名空间的解析:

     Service1Client client = new Service1Client();
    Console.WriteLine(client.GetData(100));
    client.Close();
    Console.ReadLine();
    
  10. 右单击WCFClient后点选Debug->Start new instance客户端应该显示From WCFServiceRole_IN_0 – You entered: 100。 在控制台窗口中按[Enter],停止客户端。

    以上步骤只是基本的WCF客户端服务器方案而已,接下来要把InstanceInput端口加入。

  11. 关闭浏览器来停止云服务实例。

  12. 在云服务项目内,双击WCFServiceRole令其弹出属性页。

  13. 点击Endpoint选项卡,然后单击”添加“来添加一个端点。更改端点类型为InstanceInput,再把Private Port改为80,Public Port保留为默认值。这些端口设置可以有所不同。使用此端口范围,以便对应个别实例 -第一个值对应第一个实例,第二个值对应第二个实例,等等。

  14. 点击Configuration选项卡,并更改实例计数为2。

  15. 部署到Azure Cloud Service。

  16. 等到Cloud Service部署完成后,在WCFClient中编辑app.config文件,把客户端复位向到新的服务端点

     <endpoint address="https://{your application}.cloudapp.net/service1.svc"
     binding="basicHttpBinding"bindingConfiguration="
    BasicHttpBinding_IService1" contract="ServiceReference1.
    IService1"name="BasicHttpBinding_IService1" />
    
  17. 右单击WCFClient,然后选择Debug->Start new instance客户端应该像步骤10一样运行。如果多运行客户端几次就可以发现,请求会由不同的角色实例接受。

  18. 在上述端点配置修改地址,并使用不同的公共端口InstanceInput端点,以对应到指定的实例。例如,如果公共端口范围为10105至10109,然后https:// {您的应用程序}。cloudapp.net:10105/service1.svc可解析到第一个实例,https:// {您的应用程序}。cloudapp.net:10106/service1.svc可解析到第二个实例。

小结

直接使用Windows Azure的功能就可以快速将企业内部应用迁移到公有云环境。Windows Azure SDK提供了方便好用的代码修改与直接部署应用的环境。

本文转载自:https://www.infoq.com/cn/articles/enterprise-applications-deployment-in-windows-Azure-cloud