Деплойлар 502 қатесіз қалай нөлге түсті
Mythex backend-ін әр деплойлағанда, бірнеше сұрау 502 Bad Gateway қатесін алатын. Көп емес, бірақ деплой кезіндегі 502 — біреудің басуы ештеңе істемеді, немесе ол қараған құрастыру бір сәт тоқтап қалды дегені. Оны екі бөлек мәселеге апардық: өздігінен қалпына келтіретін watchdog деплойлармен күресті, және сервер тыңдауды тоқтатқан сәт пен жүктеме теңестірушісі оған трафикті тоқтатқан сәт арасындағы алшақтық. Түзетулерден кейінгі үш қатарлы өндірістік деплойда саны 10-нан 6-ға, одан 0-ге түсті.
Орнату
API мен оркестратор AWS Application Load Balancer (ALB) артындағы шағын серверлер тобында контейнер ретінде жұмыс істейді. Деплой серверлерді біреу-біреуден жаңартады: ескі контейнерлерді босатады, жаңаларын іске қосады, содан кейін келесіне көшеді. Әр серверде watchdog контейнерлердің жұмыс істеп тұрғанын тексеріп, істемегенін қайта іске қосады — түнгі 3-те құлаған процесс біреу оянбай-ақ қайта оралуы үшін.
Екеуі де жеке-жеке дұрыс. Бірге алғанда олай болмады.
1-мәселе: watchdog деплоймен жарысты
Watchdog минутына бір рет жұмыс істеп, бір сәтсіз денсаулық тексерісінен кейін бірақ «емдейтін» еді. Ал деплой 150 секундқа дейін қызметтерді әдейі босатады — сол уақытта денсаулық тексерісі сәтсіз болуы керек. Сондықтан watchdog әр деплойда іске қосылды.
Көбінесе ол жарысты зиянсыз жеңілтті. Бір рет жеңіп алды: деплой ортасында compose файлын (қай контейнерлер жұмыс істеуі керектігін сипаттайтын) қайта жазып, бір серверді шлюз контейнерінсіз қалдырды — ал деплой жұмысы сәттілік хабарлады.
Түзетулер:
- Бір құлып. Деплой енді серверді бастапқы орнатушы скриптпен бірдей файл құлпын алады, сондықтан watchdog пен деплой ешқашан бірге жұмыс істей алмайды.
- Бір соққы емес, төрт. Watchdog әрекет ету үшін қатарынан төрт сәтсіз тексеру керек. Босатылып жатқан қызмет енді өлі сияқты көрінбейді.
- Бір анықтама. Compose файлында енді бір ғана бастапқы көзі бар, серверлерге жарияланады, көшірмелер бір-бірінен ауытқымайды.
- Сенбей, тексеріңіз. Деплой жұмысы енді команда қайтарды деп өтпейді. Бұл әр серверде API-ді, оркестраторды, шлюзді және жариялау жұмыскерін тексереді, содан кейін ғана сәттілік бере алады.
2-мәселе: сервер трафиктен бұрын кетіп қалды
Екінші мәселе тыныштау болды. Деплой серверді босатқанда, сервер денсаулық соңғы нүктесіне 503 жауап беруді бастайды, жүктеме теңестірушісі оны айналымнан шығаруы үшін. Біздікі бұны 5 секунд жасап, содан кейін өшетін.
Бірақ ALB денсаулықты тек белгілі бір аралықта тексерді, және мақсатты тоқтатар алдында бірнеше қатарынан сәтсіздік керек болды — ұшынан ұшына шамамен 60 секундқа дейін. Сондықтан шамамен 55 секунд бойы жүктеме теңестірушісі тыңдауды тоқтатқан серверге нақты сұрауларды жіберіп тұрды. Олар біздің 502-лер болды.
Түзету — екі уақыт кестесін сәйкестендіру болды:
- Мақсатты топ денсаулықты енді әр 5 секунд тексереді және 2 сәтсіздіктен кейін мақсатты тоқтатады — оны байқауға шамамен 10 секунд.
- Босатқыш денсаулық тексерулеріне сәтсіз жауап бере бастағаннан кейін 15 секунд нақты трафикке қызмет көрсетуді жалғастырады, сондықтан әрқашан қабаттасу болады.
- Бұл баптаулар серверде басылған бір рет басқару консолінде емес, инфрақұрылымды орнататын скриптте тұрады.
Сандарды бір-бірімен үйлестіру
Мұндай уақыт шектері бір-біріне тәуелді. Босатқыш жүктеме теңестірушісі байқауға қажет уақыттан ұзақ болуы керек; босатқыш пен тоқтату контейнерді мәжбүрлеп өшіргенге дейін аяқталуы керек. Біреу алты айдан кейін бір санды өзгертіп, бағдарламаны қайта енгізіп алуы оңай.
Сондықтан бұл байланыстарды тесттер ретінде жаздық: босатқыш тексеру аралығы мен сәтсіздік шегінің көбейтіндісінен ұзақ болуы керек; қайта сау деп белгіленуге кеткен уақыт қысқа қалуы керек; бүкіл босатқыш контейнердің тоқтату grace кезеңіне сыйуы керек. Бір санды басқаларсыз өзгертсеңіз, CI құлайды. Тесттердің өзін де мутация тексердік — әр санды дұрыс емес мәнге өзгертіп, бір тест оны ұстайтынын тексердік.
Деплойды өлшеу оңай қате жасалады
Біздің алғашқы өлшеуіміз таза деплойдың шамамен 3% бұзылғанын айтты. Ол олай емес еді. Біз 200-ден басқа барлық жауапты санап жүрдік, ал босату кезінде денсаулық соңғы нүктесінен келген 503 сәтсіздік емес — босатқыш өз жұмысын істеп тұр, теңестірушіге сол серверді таңдамауды айтып, нақты сұрауларға қызмет көрсетіп жатыр.
Келушілер сезетіні — 502: сұрау ешнәрсеге жетпеді. Тек соны санау үш өндірістік деплойда шынайы көріністі берді — 10, сосын 6, сосын 0.
Одан не алдық
- Өздігінен қалпына келетін жүйе жоспарланған тоқтауды білуі керек. Деплойды құлаудан ажырата алмайтын watchdog ақыры деплоймен күреседі.
- Босату — қол алысу. Сервер теңестіруші нақты трафикті жібермейтінін дәлелденгенше қызмет көрсетуін жалғастыруы керек, және бұл уақыт теңестірушіде орнатылады, серверде емес.
- Инварианттарды тесттер ретінде кодтаңыз. Операциялық сандар ауытқиды. Оларды бір-бірімен байланыстыратын тесттер ауытқымайды.
- Өлшеудің алдында не өлшейтініңізді шешіңіз. «Қателер» дұрыс метрика емес болды; «ешнәрсеге жетпеген сұраулар» дұрыс болды.
Егер Mythex-те қолданба жарияласаңыз, бұның ешқайсысы сізге көрінбейді — бұл да мақсат. Байланысты: жарияланған қолданбаңыз қайта жариялау кезінде қалай тұрақты қалады.