【问题标题】:Can azure VM sizes be configured by service configuration?可以通过服务配置来配置 Azure VM 大小吗?
【发布时间】:2012-08-17 16:39:43
【问题描述】:

我想在 Azure 部署中部署不同大小的 VM,具体取决于目标云服务(例如,我希望在生产中使用更大的实例,但在测试中可以使用更小的实例)。在 Visual Studio 2010 中,所有服务配置的大小必须相同。

是否有解决方法,或者就是这样?

【问题讨论】:

标签: visual-studio-2010 azure


【解决方案1】:

我发现的最佳解决方法是拥有两个不同的云项目。所以基本上你只需创建两个不同的云项目,将所有相同的角色添加到每个项目中,但每个项目都有不同的配置。每次更改时,您只需要小心更新这两个地方的所有配置。这相当于拥有两个 CSDEF,正如编程猿布伦特已经提到的那样,这只是实现这一目标的具体方法。

这也为您提供了其他方面的灵活性。例如,您可以拥有一个同时具有 HTTP 和 HTTPS 端点的测试站点,但生产站点只能具有 HTTPS。

【讨论】:

  • 经过考虑,我认为这是最好的非理想选项。我在某些方面喜欢@Igorek 的方法,但归根结底,我认为维护多个云项目比维护自动化配置转换并在部署和环境中进行更容易。
【解决方案2】:

VM 大小在服务定义文件中声明。所以创建不同大小的云服务包需要不同的包。最终,这不是视觉工作室支持的东西。

除此之外,如果您正在创建云服务 (PaaS),我会质疑为什么需要这样做。我收到的最佳指导是运行您需要的最小 VM,并根据负载要求运行尽可能多的 VM。通过拥有更多、更小的实例,您的解决方案最终具有更大的弹性。

【讨论】:

  • 这在一般情况下不一定是好的建议(运行更多、更小的实例而不是更少的更大的实例)。无论哪种方式都需要权衡取舍,并且知道如何驾驭它们本质上取决于情况的细节。此外,弹性与正在运行的实例数量无关(在给定的情况下,两者可能存在反比关系)。
  • 我不同意本。实例越多,发生实例故障时损失的容量就越少(注意我说的是“何时”,而不是“如果”)。至于弹性,多个实例是创建冗余的一种方式,有助于提高整体弹性。但真正的弹性还需要解决方案能够处理故障实例正在处理的故障和转移/恢复工作负载,而对解决方案所服务的任何客户端的影响最小。如果没有这种冗余,任何中断都会造成更大的服务中断,从而降低弹性的出现。
  • 简单地添加更多实例仅有助于在 2 种情况下的弹性:MTTF 足够短,添加实例可以提高避免完全失败的概率,以显着统计方式,并且如果增加的并发性不会导致问题(并且,就像你说的,如果你的软件是为了正确响应故障而编写的)。有一个阈值,添加实例无法以任何明显的方式帮助您的弹性。因此,我的观点仍然成立:这种说法在一般情况下根本不正确。
【解决方案3】:

我进一步评论,但我认为我会为我的解决方案提供 powershell。我在构建我的 CI 服务器(恰好是 TeamCity)之前运行它,但这可以在本地或 CI 上运行。

Param(
    [string]$RoleType,  #WebRole or WorkerRole
    [string]$RoleName,  #RoleName from CSDEF
    [string]$VMInstanceSizeIn,  #Options for VM Size: Small, Medium, Large, ExtraLarge, A6, A7
    [string]$csDefPath  #File path for ServiceDefinition.csdef for the cloud service project
)

$timeStampFormat = "g"
if ($VMInstanceSizeIn -eq $null) {$VMInstanceSizeIn = "Medium"}

Write-Output "$(Get-Date -f $timeStampFormat) - Setting $RoleType role type with RoleName $RoleName VM Size to $VMInstanceSizeIn in ServiceDefinition.csdef prior to building the package file."

Try 
{
    $csDefConfig = "$csDefPath\ServiceDefinition.csdef"
    Write-Output "$(Get-Date -f $timeStampFormat) - config file location: $csDefConfig"
    $csDefConfigXml = [xml](Get-Content $csDefConfig)
    Write-Output "$(Get-Date -f $timeStampFormat) - Found ServiceDefinition File at $csDefConfig"
    $csDefCurrentXmlNode = $csDefConfigXml.ServiceDefinition.$RoleType | where {$_.Name -eq $RoleName}
    $csDefCurrentXmlNode.SetAttribute("vmsize", $VMInstanceSizeIn)
    $csDefConfigXml.Save($csDefConfig)
    Write-Output "$(Get-Date -f $timeStampFormat) - Successfully saved the ServiceDefinition.csdef file to $csDefConfig"
}

Catch
{
    Write-Output "$(Get-Date -f $timeStampFormat) - Powershell Script Error. An error occurred while attempting to modify the ServiceDefinition.csdef file prior to building the solution."  
    Write-Error -ErrorRecord $_
    ##teamcity[buildStatus status='FAILURE' ]
    exit(1)
}

请注意,在撰写本文时,我只需要处理一个 web 和 worker 角色,因此我不确定是否曾经使用多个 worker 角色进行过测试。至少应该足以让您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2018-08-25
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多