企业内部应用转换为在线服务
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 功能导览:
- 用 Administrator 帐号启动 Visual Studio
- 建立一个新的”Cloud Service”后,建立一个 WCF 服务的 Web Role 命名为 WCFServiceRole
- 用以下的代码建立一个角色实例 ```
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 的对话框内输入服务地址 http://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="http://{your application}.cloudapp.net/service1.svc" binding="basicHttpBinding"bindingConfiguration=" BasicHttpBinding_IService1" contract="ServiceReference1. IService1"name="BasicHttpBinding_IService1" />
- 右单击 WCFClient,然后选择Debug->Start new instance客户端应该像步骤 10 一样运行。如果多运行客户端几次就可以发现,请求会由不同的角色实例接受。
- 在上述端点配置修改地址,并使用不同的公共端口 InstanceInput 端点,以对应到指定的实例。例如,如果公共端口范围为 10105 至 10109,然后 http:// {您的应用程序}。cloudapp.net:10105/service1.svc 可解析到第一个实例,http:// {您的应用程序}。cloudapp.net:10106/service1.svc 可解析到第二个实例。
小结
直接使用 Windows Azure 的功能就可以快速将企业内部应用迁移到公有云环境。Windows Azure SDK 提供了方便好用的代码修改与直接部署应用的环境。
评论