Блог

Деплойлар 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-те қолданба жарияласаңыз, бұның ешқайсысы сізге көрінбейді — бұл да мақсат. Байланысты: жарияланған қолданбаңыз қайта жариялау кезінде қалай тұрақты қалады.

Mythex · Pricing · ЖИ көмегімен кез келген нәрсені жасаңыз · Сайттар мен қосымшаларға арналған үлгілер · Mythex салыстыруда · ЖИ-мен қосымша жасау сөздігі · ЖИ-мен қосымша жасауға арналған тегін құралдар · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)