Политиката за прекратяване на „oldestinstance“ на AWS AutoScaling не винаги прекратява най-старите екземпляри

Сценарий

Създавам скрипт, който ще стартира нови екземпляри в AutoScaling Group и след това ще премахне старите екземпляри. Целта е да се въведат новосъздадени (или актуализирани) AMI в AutoScaling Group. Това се постига чрез увеличаване на капацитета Desired с удвояване на текущия брой инстанции. След това, след като новите екземпляри са Running, намалявайки капацитета Desired със същия брой.

проблем

Когато стартирам скрипта, наблюдавам как капацитетът на групата се увеличава двойно, новите екземпляри идват онлайн, достигат състояние Running и след това капацитетът на групата намалява. Работи като чар. Проблемът е, че ПОНЯКОГА екземплярите, които се прекратяват от намаляването, всъщност са новите вместо по-старите.

Въпрос

Как мога да гарантирам, че групата за автоматично мащабиране винаги ще прекрати най-стария екземпляр?

Настройки

  • Групата за автоматично мащабиране има следното Termination Polices: OldestInstance, OldestLaunchConfiguration. Политиката Default е премахната.
  • Default Cooldown е настроен на 0 секунди.
  • Групата има само една зона на достъпност.

Отстраняване на неизправности

  • Играх си с настройката Cooldown. Накрая просто го поставих на 0.
  • Изчаках различно време, за да видя дали съществуващите сървъри трябва да работят за определен период от време, преди да бъдат прекратени. Изглежда, че ако са на по-малко от 5 минути, е по-малко вероятно да бъдат прекратени, но не винаги. Имах сървъри на 20 минути, които не бяха прекратени вместо новите. Може би новостартираните екземпляри имат някакъв гратисен период за защита от прекратяване?

Концесия

Знам, че в повечето случаи сървърите, които ще заменя, ще работят дълго време. В производството това може да не е проблем. Все пак е възможно по време на нормалния ход на AutoScaling по-стар сървър да остане работещ вместо по-нов. Това не е приемлив начин за работа.

Бих могъл да принудя конкретни екземпляри да прекратят, но това би отменило смисъла на OldestInstance Правилата за прекратяване.

Актуализация: 12 февруари 2014 г. Продължих да виждам това в производство. Екземпляри с по-стари конфигурации за стартиране, които се изпълняват от седмици, ще бъдат оставени да работят, докато по-новите екземпляри ще бъдат прекратени. На този етап смятам, че това е грешка. Нишка в Amazon беше отворена за тази тема преди няколко години, очевидно без резолюция.

Актуализация: 21 февруари 2014 г. Работих с екипа за поддръжка на AWS и към този момент те потвърдиха предварително, че може да е грешка. Проучват проблема.


person SunSparc    schedule 24.01.2014    source източник
comment
Какъв точно е въпросът?   -  person EkoostikMartin    schedule 25.01.2014


Отговори (3)


Не изглежда, че можете точно, защото автоматичното мащабиране се опитва да направи още едно нещо за вас в допълнение към правилния брой работещи екземпляри: поддържа броя на вашите екземпляри балансиран в зоните на достъпност... и приоритизира това възнаграждение, по-високо от вашата политика за прекратяване.

Преди Auto Scaling да избере инстанция за прекратяване, тя първо идентифицира зоната на наличност, която има повече инстанции от другите зони на наличност, използвани от групата. Ако всички зони на наличност имат еднакъв брой инстанции, това идентифицира произволна зона на наличност. В рамките на идентифицираната зона на достъпност автоматичното мащабиране използва политиката за прекратяване, за да избере екземпляра за прекратяване.

http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/us-termination-policy.html

Ако не сте в равновесие, тогава поддържането на баланс е може би най-разумната стратегия, особено ако използвате ELB. документацията е малко двусмислена, но ELB ще рекламира такава публичен IP в DNS за всяка зона на достъпност, където е конфигуриран; тези три IP адреса ще постигнат първото ниво на балансиране на натоварването чрез кръгов DNS. Ако всички зони за достъпност, където ELB е активиран, имат здрави екземпляри, тогава изглежда, че има корелация 1:1 между кой външен IP адрес удря трафикът и сървърите на коя зона за достъпност този трафик ще бъде предложен от ELB - поне това това показват регистрационните файлове на сървъра ми. Изглежда, че ELB не насочва трафика през зоните за наличност към алтернативни сървъри, освен ако всички сървъри в дадена зона не бъдат открити като нездравословни и това може да е едно от оправданията защо са внедрили автоматично мащабиране по този начин.

Въпреки че този алгоритъм може да не винаги първо убива най-стария екземпляр на базата на целия регион, ако работи, както е документирано, той ще унищожи най-стария в избраната зона за достъпност и в даден момент трябва да премине през всички тях в течение на няколко смени на натоварване... така че няма да остави и най-стария да работи за неопределено време. Колкото по-голям е броят на екземплярите в групата, изглежда, че толкова по-малко значим трябва да е този ефект.

person Michael - sqlbot    schedule 25.01.2014
comment

С малко помощ от mxmissile вече го поправихме.

Всички проблеми бяха в картографирането на PostalAddress. Първо бях направил идентификатори на всички полета - така че промених необходимите свойства на Карта.

След това получих Невалиден индекс 4 за тази SqlParameterCollection с грешка Count=4 всеки път, когато се опитах да запазя адресите. Тази грешка се причинява, когато едно поле е картографирано два пъти. За това картографиране собственикът беше картографиран два пъти. Не е необходимо да бъде посочено в картата - като го коментирате, приложението работи. Ревизираният клас Mapping е както следва;

public class PostalAddressMap 
    : ClassMap<PostalAddress>
{
    public PostalAddressMap()
    {
        Table("tblPostalAddresses");
        Id(x => x.Id);
        Map(x => x.Address);
        Map(x => x.AddressType);

        References(x => x.Contact)
            .Class<Contact>()
            .Column("Owner");

    }
}

След като тези промени бяха направени, приложението записа контактите и адресите правилно.

- person SunSparc; 27.01.2014
comment
100% сигурни ли сте, че вашата група за автоматично мащабиране не е настроена да използва всички зони на достъпност? Виждах точно поведението, описано от въпроса ви, и промяната към една зона за наличност изглежда го поправи. Вече направих половин дузина подвижни внедрявания и надеждно прекратява най-стария екземпляр. Преди поне всеки друг път прекратяваше новата инстанция. Изглежда, че OldestInstance може действително да обмисли зони за наличност, противно на документацията. - person Derek Lewis; 17.10.2014

Има няколко други начина да го направите:

  1. Увеличете желаното до 2 пъти
  2. Изчакайте действие за увеличаване на капацитета
  3. Когато новите екземпляри работят, преустановете цялата активност на AS (as-suspend-processes MyAutoScalingGroup)
  4. Желано нулиране
  5. Прекратете старите инстанции
  6. Възобновете дейността на AS.

Or:

  1. Изведете чисто нов ASG с новата конфигурация за стартиране.
  2. Спрете дейността на AS, докато 1. не приключи.
  3. Ако всичко е наред, изтрийте стария ASG.
  4. Възобновете дейността на AS

За окончателно внедряване на връщане назад:

  1. Създайте нов ELB (може да се наложи да поискате от Amazon да предостави повече elb, ако имате много трафик, това е малко куцо и не го прави подходящ за автоматизация)
  2. Създайте нов ASG с нов LC
  3. Превключете DNS към нов ELB
  4. Изтрийте стария ELB/ASG/LC, ако всичко е наред, ако не, просто сменете обратно DNS

Или с новия ASG API, който ви позволява да прикачите/откачите екземпляри от ASG:

  1. По някакъв начин изведете новите си екземпляри (може да са просто изпълнени екземпляри или да създадете временен asg)
  2. Спрете активността на AS, използвайте http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/attach-instance-asg.html, за да ги прикачите към вашия стар ASG,
  3. Използвайте http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/detach-instance-asg.html или прекратете старите си копия
  4. Възобновете дейността на AS

Причината, поради която може да искате да използвате стария си ASG, е, че може да е пита да зададете отново всички политики (дори когато са автоматизирани) и се чувства малко по-безопасно да промените възможно най-малко.

A.

person ambakshi    schedule 04.10.2014

Моят случай на използване е, че трябваше да намалим мащаба и да можем да изберем кои машини да не работят. За съжаление политиката за прекратяване „OldestFirst“ също не работеше за нас. Успях да използвам вариант на метода за прикачване/откачане, който ambakshi сподели, за да премахна най-стария (или всеки екземпляр, който избера) и в същото време да намаля желаната стойност на екземплярите на групата за автоматично мащабиране.

Стъпка 1 – Променете минималната стойност на групата за автоматично мащабиране на числото, до което искате да намалите.

Стъпка 2 – Спиране на ASG

Стъпка 3 – Отделете екземплярите, които искате да прекратите, можете да направите няколко екземпляра в една команда. Уверете се, че използвате флага трябва да намалите желания капацитет

Стъпка 4 – Възобновете ASG

Стъпка 5 – Прекратете вашите екземпляри с помощта на конзолата или CLI

АКТУАЛИЗАЦИЯ

Няма нужда да спирате групата за автоматично мащабиране, просто изпълнението на стъпки 1, 3 и 5 работи за мен. Просто имайте предвид всяко балансиране на зоната на достъпност, което може да се случи.

person kwackbars    schedule 03.12.2014