Ожидание полной инициализации нового развертывания перед заменой промежуточного / рабочего слота (swap VIP)? - PullRequest
1 голос
/ 17 февраля 2012

Я использую следующий код для перестановки моего недавно развернутого приложения из промежуточного слота в рабочий слот (swap VIP):

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

Я думал, что флаг -WaitToComplete будет гарантировать, что все виртуальные машины полностьюинициализируйте перед выполнением подкачки, но это не так, и он выполняет подкачку, когда вновь развернутое приложение в рабочем слоте все еще инициализируется и недоступно в течение примерно 5/10 минут, пока инициализируется полностью.

Что такоелучший способ убедиться, что приложение полностью инициализировано перед выполнением операции Swap VIP?

Ответы [ 4 ]

9 голосов
/ 19 октября 2012

Этот фрагмент 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 голосов
/ 15 мая 2015

Вот небольшой твик к приведенному выше примеру Ричарда Эстбери, который будет повторяться ограниченное количество раз.Вся заслуга ему за оригинальный пример кода, так что я бы проголосовал за него как за ответ, наиболее подходящий к делу.Просто разместите этот вариант здесь в качестве альтернативы для людей, чтобы скопировать / вставить по мере необходимости:

$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)
0 голосов
/ 18 февраля 2012

Я не очень знаком с PowerShell, но из моего опыта работы с оболочками вы конвейерно выполняете команды. Каждый набор перед символом канала (|) представляет отдельную команду, которая передаст свой результат следующей команде в канал (команда после символа канала). И поскольку вы выполняете эти команды до того, как деполяция будет полностью завершена, вы развертываете только что развернутое приложение в рабочий слот.

Первое, на что следует обратить внимание, это то, что у вас есть аргумент "-WaitToComplete" только для последней команды, которая фактически является Get-OperationStatus.

Другая вещь, которую я вижу, это то, что эти команды powershell просто выполняют своп vip. Как насчет развертывания?

Из того, что вы описали, видно, что ваш сервер сборки автоматически развертывается для подготовки, и у вас есть событие после сборки, которое выполняет скрипт подкачки. То, что Майк Эриксон предлагает здесь, имело бы смысл, если бы ваш поток был таким - немедленно поменяйте местами после деполоя к постановке. Зачем вам переходить в промежуточный режим, если вы собираетесь произвести обмен без предварительной проверки работоспособности приложения? Однако я бы не рекомендовал прямую деполяцию на сервер (удаление + развертывание), а обновление службы. Потому что когда мы выполняем обновление службы, наше развертывание сохраняет свой публичный IP-адрес. Если мы удалим + deploy, мы получим новый публичный IP-адрес. И общедоступный IP-адрес размещенной службы уже гарантированно не изменится, пока развертывание не будет удалено.

Наконец, вы должны немного расширить свой скрипт PowerShell. Сначала включите подпрограмму, которая проверит (и подождет) промежуточный слот на «готовность», а затем выполнит обмен. Как я уже сказал, мне не очень нравится PowerShell, но я уверен, что это возможно.

Только мои 2 цента.

UPDATE

После повторного ознакомления с этим руководством я теперь кое-что понимаю. Вы ожидаете завершения операции, но это операция VIP-SWAP, которую вы ожидаете завершить. Если ваше заявленное развертывание еще не готово, вы должны подождать, пока оно не станет готовым. А также, как упоминал Майк, может быть задержка DNS, которая отмечена в конце guide :

Примечание:

Если вы посетите производственную площадку вскоре после ее продвижения, DNS имя может быть не готово. Если вы столкнулись с ошибкой DNS (404), подождите несколько минут и попробуйте еще раз. Имейте в виду, что Windows Azure создает DNS Назовите записи динамически и что изменения могут занять несколько минут размножаться.

ОБНОВЛЕНИЕ 2

Ну, вам придется запросить все роли и все их экземпляры и подождать, пока все они будут готовы. Технически, вы можете провести VIP-своп, по крайней мере, один экземпляр для каждой роли готов, но я думаю, что это еще больше усложнит сценарий.

0 голосов
/ 17 февраля 2012

Я предполагаю, что на самом деле вы видите задержку распространения записей DNS и их доступности.

Что вы должны найти, так это то, что как только статус сообщается как Готов , вы не сможете получить доступ к своему сайту, используя промежуточный URL "http: //.cloudapp.net", вы обнаружите, что он может не появиться ... но если вы посмотрите на портале управления, вы увидите в нижней части свойств значение "VIP" - если вы используете этот IP-адрес "http://xxx.xxx.xxx.xxx, вы сможете попасть на свой сайт .

Когда вы делаете SWAP, вы обнаружите похожее поведение. Обновление DNS займет некоторое время, но вы, вероятно, увидите, что вы все равно можете получить доступ к сайту с IP-адресом или промежуточным адресом (если он стал доступен).

Наконец, 1 вопрос ... в зависимости от вашего вопроса может показаться, что вы, возможно, развертываете в стадии подготовки как часть своей сборки, а затем сразу переходите в рабочее развертывание ... это правильно, и если да, то почему бы просто не выполнить развертывание в развертывание производства? (Я не утверждаю, что развертывание непосредственно в рабочей среде является наилучшей практикой ... но если это ваш рабочий процесс, я не вижу никакой пользы от временного развертывания до подготовки)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...