2012-02-17 52 views
1

我用下面的代碼來交換從籌劃插槽我的新部署應用到生產插槽(交換VIP):在交換分段/生產槽(交換VIP)之前等待新部署完全初始化?

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

我認爲-WaitToComplete標誌將確保所有虛擬機都完全在做之前初始化然而它並沒有進行交換,它會執行交換,此時生產插槽中新部署的應用程序仍在初始化,並且在完全初始化時不可用約5/10分鐘。

在進行Swap VIP操作之前,確保應用程序已完全初始化的最佳方法是什麼?

+0

我需要這個,因爲我使用一個自動構建部署到Azure的 – 2012-02-17 18:06:18

回答

0

我在猜測,您實際上可能會看到的是DNS條目傳播並可用的延遲。

你應該找到的是,一旦狀態報告爲就緒您可能無法使用分段URL「http://.cloudapp.net」訪問您的網站,您會發現它可能不會來up ...但是如果你看管理門戶,你會在屬性的底部看到'VIP'的值 - 如果你使用這個IP地址「http://xxx.xxx.xxx.xxx你應該能夠

當您進行交換時,您會發現類似的行爲,DNS更新需要一段時間才能傳播,但您可能會發現仍然可以通過IP地址訪問站點或登臺地址(如果已經可用)。

最後,有1個問題......根據你的問題,聽起來你可能會部署到作爲你的構建的一部分,然後立即促進生產部署......這是正確的,如果是這樣,爲什麼不只是部署到生產部署? (我並不是建議直接部署到生產中是一種最佳實踐......但如果這是您的工作流程,我認爲暫時部署到暫存沒有任何好處)

希望這有助於您!

+0

感謝您的答覆。回答你的問題:PowerShell腳本是整個自動化和半自動化構建過程的一部分,有時如果它對於CI或測試而言,它自動直接部署到環境中,但對於更安全的環境,例如Production和Staging,它有一個額外的手動步驟,測試人員會驗證位於臨時插槽中的新部署。這就是我們不直接部署到生產槽的原因。 – 2012-02-17 21:58:16

+0

謝謝你的澄清。那麼在測試人員驗證部署後,您是否看到了問題?如果是這樣,那麼我會期待你看到的'延遲可用性'很可能導致DNS更改被傳播。再次嘗試通過使用VIP直接訪問您的網站來測試此功能,並查看它是否按預期響應。 – 2012-02-18 02:12:09

+0

謝謝邁克。是的,我已將其跟蹤到DNS問題。 – 2012-02-28 19:49:19

0

我對PowerShell並不是很熟悉,但是從我對shell的所有經驗來看,你都是流水線命令。管道字符之前的每個集合(|)表示一個將其結果傳遞給管道中的下一個命令(管道字符之後的命令)的單個命令。而且由於在解體完全完成之前您正在執行這些命令,這就是爲什麼您將新部署的應用程序交換到生產插槽。

這裏首先要注意的是,你只有最後一個命令的參數「-WaitToComplete」,它實際上是Get-OperationStatus。

我看到的其他事情是,這個powershell命令只會做VIP交換。怎麼樣部署?

從您描述的內容看,您的構建服務器自動部署到分段,並且您具有執行交換腳本的構建後事件。如果你的流量是這樣的話,麥克埃裏克森在這裏提出的建議是有道理的 - 在depoloy之後立即交換到舞臺。如果您打算在不檢查應用程序運行狀況的情況下進行交換,那麼爲什麼要部署到分段?不過,我不會建議直接depolyment到服務器(刪除+部署),但服務升級。因爲當我們進行服務升級時,我們的部署會保留其公共IP地址。如果我們刪除+部署,我們會得到一個新的公共IP地址。而託管服務的公共IP地址已被保證不被更改,直到部署被刪除。

最後,您應該擴展一下您的PowerShell腳本。首先包括一個例程,它將檢查(並等待直到)準備好插槽,然後執行交換。正如我所說,我沒有太多的PowerShell,但我相信這是可行的。

只是我2美分。

UPDATE

重溫this guide後,現在我明白了什麼。您正在等待操作完成,但這是您正在等待完成的VIP-SWAP操作。如果您的陳述式部署尚未準備就緒,則必須等待它做好準備。也像邁克提到,有可能是DNS延遲,這是在guide結束指出:

注:

如果不久後它的推廣參觀生產現場,DNS 名字可能沒有準備好。如果遇到DNS錯誤(404),請等待 幾分鐘後重試。請記住,Windows Azure會動態創建DNS 名稱條目,並且更改可能需要幾分鐘的時間才能傳播。

更新2

那麼,你將不得不查詢所有的角色和他們所有的實例,並等待他們都準備好了。技術上你可以進行VIP交換,每個角色至少準備一個實例,但我認爲這會使腳本更加複雜。

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) 
+0

不錯的是,儘管添加某種超時值會很好(例如,5-10分鐘),因爲如果其中一個角色無法啓動,您將陷入無限循環。 – 2013-02-19 18:00:46

+0

正確!隨時提高我的代碼! – 2013-02-24 19:59:06

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)