2014-04-02 35 views
5

Uruchomimy naszą aplikację internetową na Amazon EC2 z równoważonymi obciążeniami, autoskalowanie serwerami WWW (IIS).Synchronizacja serwerów IIS w aws ec2 z najlepszą praktyką autoskalowania

Przed automatycznym skalowaniem nasz proces wdrażania został skopiowany na kilka dużych serwerów internetowych.

Teraz z funkcją autoskalowania mamy od 5 do 12 serwerów sieciowych, które pojawiają się i znikają w dowolnym momencie, co utrudnia proces wdrożenia.

W tym celu napisałem skrypt programu Powerhell, który pobiera adres IP serwerów w grupie automatycznego skalowania i używa MSDeploy do synchronizowania ich z wyznaczonym serwerem wdrażania (w module równoważenia obciążenia, poza grupą autoskalowania). Następnie tworzy nowy AMI i aktualizuje konfigurację automatycznego skalowania.

Wszystko wydawało się dobre, dopóki po przebudowaniu serwera wdrażania skrypt synchronizacji nie zaktualizuje stanu działania witryn sieci Web. Mogę więc wprowadzić stronę w tryb konserwacji.

chciałbym wiedzieć:

  • jak inni ludzie podejść do problemu (w szczególności synchronizacji serwerów IIS w autoskalowania EC2) (w przypadku braku WFF dla IIS 8)

  • dlaczego początek/stop synchronizacji zawodzi

Kod:

Set-AWSCredentials -AccessKey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -SecretKey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
Set-DefaultAWSRegion "us-west-2" 

$date = get-date 
$dateString = $date.ToString("yyyyMMdd-HHmm") 
$name = $dateString + "Web" 
$imageId = new-ec2image -InstanceId x-xxxxxxxx -Name $name -NoReboot 1 

$launchConfiguration = New-ASLaunchConfiguration -LaunchConfigurationName $name -ImageId $imageId -InstanceType "m3.medium" -SecurityGroups @('Web') -InstanceMonitoring_Enabled $false 

Update-AsAutoScalingGroup -AutoScalingGroupName "XxxxxxxxxxxxXxxxxxxxxx" -LaunchConfigurationName $name 

$a = Get-ASAutoScalingInstance | select -expandproperty InstanceId | Get-EC2Instance | select -expandproperty RunningInstance | select -property PrivateIpAddress 

foreach($ip in $a) 
{ 
     $command = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" 
     $arg = "-dest:webServer,computerName=" + $ip.PrivateIpAddress; 
     $args = @('-verb:sync', '-source:webServer', $arg) 
     &$command $args 
} 
+0

jakakolwiek pomoc w docenianiu formatowania. mają kod z wcięciem przez cztery znaki, ale bez radości. – sentece

Odpowiedz

4

Nie próbuj "synchronizować" serwerów internetowych. Rozważ jednorazową instalację i pozwól na uruchomienie narzędzia w celu wdrożenia zarządzania synchronizacją.

To, co zrobiłem w przeszłości, to wykorzystanie CloudFormation do stworzenia środowiska, a także połączenie cfn-init i cfn-hup w celu przeprowadzenia instalacji. Proces wdrażania staje się wtedy przypadkiem ponownego umieszczenia nowego pakietu w miejscu podobnym do S3, a następnie skorzystania z CloudFormation w celu pobicia wersji.

Spowoduje to uruchomienie aktualizacji cfn-hup, przy czym każdy serwer usunie pakiet z S3 i zainstaluje go ponownie.

Ponadto - jeśli twoja grupa skalowania skaluje, automatycznie użyje cfn-init do rozwinięcia i zainstalowania pakietu całkowicie , zanim zarejestruje instancję z modułem równoważenia obciążenia.

Kilka podobnych pytań stackoverflow tutaj

Również napisałem dwa artykuły wiele księżyców temu o tym

To powinno dać wam wystarczy iść.

+0

Trochę się boję! Dowiem się, co to wszystko znaczy i zgłoś się jak najszybciej. ale dziękuję! – sentece

+0

Sztuką jest myśleć o używaniu początkowych serwerów do * ściągania * plików z centralnej lokalizacji (np. - S3). cfn-init służy do bootstrap serwera z niezbędnymi komponentami do uruchomienia, a także do uruchamiania cfn-hup, który będzie monitorował zmiany. Po wykryciu zmiany wykonujesz nowe pociągnięcie. –

+0

dzięki, świetna odpowiedź. Nie zaimplementowałem tego, ale następnym razem zrobię coś takiego. Pracowałem nad moimi pierwotnymi problemami za mo – sentece