在Windows Azure中开发部署云应用,或者将现有应用迁移到Windows Azure云平台,伸缩性是一个重要的考虑因素,直接关系到云应用资源的按需使用及产生的相关成本。
伸缩性与应用场景及所使用的云资源密切相关,例如,某些商务网站,当业务请求负荷迅猛增加、超出预设的容量能力上限时,应考虑适量增加资源,例如增加计算实例数量,或者提高计算实例的配置;而当工作负荷较低,则需要考虑是否减少计算实例,或者调低计算实例的配置。此外,例如在某些科学计算场景中,可以根据并行计算(Parallel Computing)任务数量的变化,对资源进行动态的伸缩性控制。
通常,在Windows Azure中,可以通过Management Portal对服务进行伸缩性配置。例如,下图中对一个运行中的移动服务(Windows Azure Mobile Services)进行调整,在菜单的“Scale”项下,可以看到“模式(Mobile Service Mode)”,可以选择实例的类型,例如是不是共享的模式;“实例规模(Instance Size)”可以选择实例计算资源的尺寸;在“实例数量(Instance Count)”中,可以调整实例的数量,等等。
对于其他服务也提供相类似的操作界面,例如下面的WebSites服务:
此外,另一个利器就是使用Windows Azure PowerShell 命令行。Windows Azure PowerShell为用户,特别是IT人员和开发者提供了强大的脚本环境,使得更方面、高效地进行部署和管控,特别是实现自动化管理。具体资源可以参考:
http://msdn.microsoft.com/en-us/library/windowsazure/jj156055.aspx
可以在下面的官方网址下载Windows Azure PowerShell工具:
https://www.windowsazure.com/en-us/downloads/?fb=en-us
目前,常用的命令行包括了Windows Azure的管理、Windows Azure SQL Database的管理等,而不断有新的功能支持在推出,包括了对IaaS虚拟机、虚拟网络、移动服务等的支持。
例如,通过使用Set-AzureRole命令,可以设置Windows Azure role的运行数量。具体命令如下:
Set-AzureRole [-ServiceName] <String> [-Slot] <String> [-RoleName] <String> [-Count] <Int32> [ <CommonParameters>]
其中,-Count<Int32> 的值为设定的Windows Azure role的数量。
此外,可以通过Get-AzureRole命令,获得Windows Azure role的主要信息,包括运行数量等。
例如,可以通过Management Portal,可以看到一个已经发布到Windows Azure 运行环境的服务的配置信息,该服务的实例数量为2。如下图所示意。
通过使用Set-AzureRole命令,调整设置运行数量为1。如下图所示意:
与此对应,可以通过Management Portal,看到该服务的实例数量,与通过PowerShell获得的信息一致。如下图所示意。
以自定义的方式对Windows Azure资源进行控制,例如基于预设条件或者基于性能监控结果的自动伸缩管理,将更有效地对Azure资源/服务进行管理。Windows Azure SDK提供了全套API,特别是服务管理的REST API方式,使得这一想法成为可能。
对于Windows Azure Service Management REST API,可以参考以下网址:
http://msdn.microsoft.com/en-us/library/ee460799.aspx
Windows Azure Service Management REST API的功能支持,与通过其他方式,例如通过Windows Azure Management Portal的交互方式和Windows Azure PowerShell 的命令行方式,是一致的。但不同的是,通过Windows Azure Service Management REST API,可以在自己的应用里、通过程序的方式对Windows Azure服务进行控制。
对于Windows Azure Management Portal的交互方式和Windows Azure PowerShell 的命令行方式,可以参考:
http://blogs.technet.com/b/nevin_dongs_blog/archive/2013/02/24/windows-azure-management-portal-windows-azure-powershell.aspx
针对计算实例的增加或减少的情景,一些关键的API包括:
. Get Deployment,见:http://msdn.microsoft.com/en-us/library/ee460804.aspx
. Change Deployment Configuration,见:http://msdn.microsoft.com/en-us/library/ee460809.aspx
通过REST API可以获得及设置相关的实例配置,例如RoleInstanceList,InstanceSize等。
此外,针对IaaS,例如Windows Azure Virtual Machine,也可以通过增加/减少VM,或者改变VM的配置,例如将尺寸由“小(Small)”改成“大(Large)”的方式,实现Scale-Out或者Scale-Up,一��关键的API包括:
. Add Role,见:http://msdn.microsoft.com/en-us/library/jj157186.aspx
. Delete Role,见:http://msdn.microsoft.com/en-us/library/jj157184.aspx
. Update Role,见:http://msdn.microsoft.com/en-us/library/jj157187.aspx
之前,Joseph Fultz发过一篇很不错的文章:Performance-Based Scaling in Windows Azure,文章给出了一个基于运行性能来进行伸缩的例子,非常有借鉴价值。具体网址如下:
http://msdn.microsoft.com/en-us/magazine/gg232759.aspx
可以将性能计数器收集的功能放在一个Worker Role中,并将收集的性能数据存储在Windows Azure Storage中,然后根据性能是否达到条件来确定是否增加或减少实例数量,如下图所示:
当通过代码来实现自动伸缩的时候,有些因素需要考虑到,例如:
· 伸缩性操作提交后需要时间来完成,例如增加1个实例的操作,在提交后可能需要15到20分钟才能完成。
· 伸缩性操作提交的时机,因为目前Windows Azure是按照完整小时来计费的,当花费不足1小时也是按照1小时来计费的,考虑到上面提到的时间差,所以提交伸缩性请求的时候需要考虑到这一点,可以更好地节省成本。 最新的报价和付费细节可访问:http://www.windowsazure.com/en-us/pricing/details/
· 并不是所有的应用/服务都适合进行自动伸缩,例如最好是采用无状态设计的。
最近得知,ASP.NET 和Web Tools 2012.2更新已经发布,这也是针对Visual Studio 2012和.NET 4.5的一些更新,对于Azure应用的开发者,特别是Windows Azure Web Sites,这也是值得尝试的一个工具更新。
具体可见以下ScottGu的博客:
http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx
总的看来,一些主要的改进包括:
. 新的针对ASP.NET Web Forms、ASP.NET MVC和ASP.NET Web API 的Visual Studio项目模版。
. ASP.NET SignalR实时通讯。详情见:http://asp.net/signalr。
. ASP.NET Web API针对追踪(Trace)、OData的改进,例如路由、元数据、查询合法性验证等。
. Web Tools改进,例如页审查 (Page Inspector)等。