在交换暂存/生产槽(交换VIP)之前等待新部署完全初始化?

时间:2012-02-17 18:05:14

标签: powershell azure

我使用以下代码将新部署的应用程序从暂存槽交换到生产槽(交换VIP):

Get-HostedService -serviceName $serviceName -subscriptionId $subcription -certificate $certificate | Get-Deployment -slot staging | Move-Deployment |Get-OperationStatus –WaitToComplete

我认为-WaitToComplete标志会确保所有虚拟机在进行交换之前已经完全初始化,但它不会执行交换,此时生产槽中新部署的应用程序仍在初始化,并且在完全初始化时不可用约5/10分钟。

在执行Swap VIP操作之前,确保应用程序完全初始化的最佳方法是什么?

4 个答案:

答案 0 :(得分:9)

此PowerShell代码段将一直等到每个实例都准备就绪(以@astaykov给出的答案为基础)。

它查询暂存插槽中正在运行的实例的状态,并且只有当所有实例都显示为“就绪”时才会离开循环。

$hostedService = "YOUR_SERVICE_NAME"

do {
    # query the status of the running instances
    $list = (Get-AzureRole -ServiceName $hostedService `
                           -Slot Staging `
                           -InstanceDetails).InstanceStatus 

    # total number of instances
    $total = $list.Length

    # count the number of ready instances
    $ready = ($list | Where-Object { $_ -eq "ReadyRole" }).Length

    Write-Host "$ready out of $total are ready"

    $notReady = ($ready -ne $total)
    If ($notReady) {
        Start-Sleep -s 10
    }
}
while ($notReady)

答案 1 :(得分:0)

我猜你可能实际看到的是DNS条目传播并变得可用所需的延迟。

您应该发现,一旦状态报告为就绪,您可能无法使用登台网址“http://.cloudapp.net”访问您的网站,您会发现它可能不会出现......但如果您查看管理门户,您将在属性的底部看到'VIP'的值 - 如果您使用该IP地址“http://xxx.xxx.xxx.xxx你应该能够到达你的网站。

当您进行SWAP时,您会发现类似的行为。 DNS更新需要一段时间才能传播,但您可能会看到仍然可以使用IP地址或登台地址(如果已经可用)访问该站点。

最后,1个问题......基于您的问题,听起来您可能正在部署作为构建的一部分进行暂存,然后立即升级到生产部署......这是正确的,如果是这样,为什么不直接部署到生产部署? (我不是建议直接部署到生产中是最佳实践......但如果这是您的工作流程,我认为临时部署到暂存没有任何好处)

希望这有帮助!

答案 2 :(得分:0)

我对PowerShell不是很熟悉,但根据我对shell的经验,你就是流水线命令。管道字符串(|)之前的每个集合表示一个命令,该命令将其结果传递给管道中的下一个命令(管道字符后面的命令)。并且因为您在解除完全完成之前执行这些命令,这就是您将新部署的应用程序交换到生产槽的原因。

首先要注意的是,你只有最后一个命令的“-WaitToComplete”参数,实际上是Get-OperationStatus。

我看到的其他事情是这个powershell命令只会执行vip交换。部署怎么样?

根据您的描述,您的构建服务器似乎是自动部署到分段,并且您具有执行交换脚本的构建后事件。 Mike Erickson在这里建议的是有意义的,如果你的流程是这样的 - 在depoloy之后立即交换到分期。如果要在不先检查应用程序运行状况的情况下进行交换,为什么要部署到分段?但是我不建议直接解组到服务器(删除+部署),而是服务升级。因为当我们进行服务升级时,我们的部署会保留其公共IP地址。如果我们删除+部署,我们会获得一个新的公共IP地址。并且已保证托管服务的公共IP地址不会被更改,直到部署被删除。

最后,您将稍微扩展PowerShell脚本。首先包括一个例程,它将检查(并等待直到)暂存槽为“就绪”,然后执行交换。正如我所说的那样,我对PowerShell并不多,但我确信这是可行的。

只需2美分。

<强>更新

重新审视this guide之后,我现在明白了一些事情。您正在等待操作完成,但这是您正在等待完成的VIP-SWAP操作。如果您的说明部署尚未准备就绪,则必须等待它准备就绪。并且像迈克提到的那样,可能存在DNS延迟,这在guide结尾处注明:

  

注意:

     

如果您在促销后不久访问生产网站,则为DNS   名称可能尚未准备好。如果遇到DNS错误(404),请等待   几分钟后再试一次。请记住,Windows Azure会创建DNS   动态命名条目,并且更改可能需要几分钟   传播。

更新2

那么,您将不得不查询所有角色及其所有实例,并等待所有这些实例准备就绪。技术上你可以进行VIP交换,每个角色至少有一个实例准备就绪,但我认为这会使脚本更加复杂。

答案 3 :(得分:0)

以上是对理查德·阿斯特伯里(Richard Astbury)上述例子的一个小调整,将重试有限次数。所有信用都归功于原始样本代码,所以我最后投票给他作为答案。只需在此处发布此变体,即可根据需要复制/粘贴人员:

$hostedService = "YOUR_SERVICE_NAME"
# Wait roughly 10 minutes, plus time required for Azure methods
$remainingTries = 6 * 10

do {
    $ready=0
    $total=0
    $remainingTries--

    # query the status of the running instances
    $list = (Get-AzureRole -ServiceName $hostedService -Slot Staging -InstanceDetails).InstanceStatus 

    # count the number of ready instances
    $list | foreach-object { IF ($_ -eq "ReadyRole") { $ready++ } }

    # count the number in total
    $list | foreach-object { $total++ } 

    "$ready out of $total are ready"

    if (($ready -ne $total) -and ($remainingTries -gt 0)) {
        # Not all ready, so sleep for 10 seconds before trying again
        Start-Sleep -s 10
    }
    else {
        if ($ready -ne $total) {
            throw "Timed out while waiting for service to be ready: $hostedService"
        }

        break;
    }
}
while ($true)