Сәтсіз қайта жариялау жұмыс істеп тұрған бэкендті ешқашан өшірмейді
25 қыркүйекте сәтсіз қайта жариялау қолданбаның бэкендін өшірді. Ол бэкенд шамамен екі жарым сағат бойы тұрақты жұмыс істеп тұрған еді. Сәтсіз жарияланымды кері қайтаратын код жариялау басталғанға дейін-ақ қолданыста болған серверлік қолданбаларды да, жарияланым барысында жанама өзгертілген барлық серверлік қолданбаларды да өшірді. Енді тек жарияланым жасаған қолданбаларды ғана өшіруге болады, ал бұрыннан бар қолданба жарияланымға дейін іске қосулы болған дәл сол нұсқасына қайтарылады. Сол күні жасалған екі қосымша түзету кері қайтару басты жарияланым құралы сәтсіз аяқталғанда да орындалатынын, ал ұйықтап жатқан, бірақ сау қолданбаны «іске қосылмады» деп бағаламайтынын қамтамасыз етті.
Бэкенд қалай жарияланады
Mythex қолданбасының бэкенді болса, яғни тек статикалық файлдар емес, API немесе сервер болса, жариялау оны Dockerfile-дан (қолданбаны образға орайтын рецепт) құрастырады және сол образды хостинг платформасының машиналарына жайғастырады. Содан кейін денсаулық тексеруі жаңа нұсқаның шынымен іске қосылып, тұрақты жұмыс істеп тұрғанын күтеді, одан кейін ғана жарияланым тірі деп белгіленеді.
Жолда бірдеңе сәтсіз болса, оны болдырмау үшін кері қайтару (rollback) іске қосылады. Бұл кері қайтаруды дұрыс жасау жарияланымдағы басқа нәрселердің көпшілігінен маңыздырақ, өйткені ол дәл бірдеңе дұрыс болмай жатқанда іске қосылады.
1-мәселе: кері қайтару қалпына келтіруі керек нәрсені өшірді
Кері қайтару жарияланым жіберілген серверлік қолданбалардың тізімін сақтап отырды, ал сәтсіздік болғанда олардың барлығын жойды. Бірінші жариялау үшін бұл дұрыс: қолданба дәл сәт бұрын жасалды, оған ешнәрсе тәуелді емес, ал оны өшіру бәрін бастапқы күйге келтіреді.
Қайта жариялау үшін бұл дәл қате еді. Қолданба бұрыннан бар болды және нақты келушілерге қызмет көрсетіп тұрды. 25 қыркүйекте сәтсіз қайта жариялау екі жарым сағат бойы тірі тұрған қолданбаның API-ін өшірді.
Сол кодта тағы бір сәтсіздік жасырылған болатын. Жою сәтті болмаған жерде бұзылған жаңа образ машиналарда қалып қойды, ал біз иесіне ағымдағы сайтының әлі тірі екенін хабарладық. Денсаулық тексеруі сәтсіз аяқталған кезде жаңа образ әлдеқашан барлық машинаға жайғастырылған болады. Ештеңе істемеу — кері қайтару емес.
Түзету: тек өзіңнің жасағаныңды өшір, қалғанын қалпына келтір
Енді әр жарияланым жанама өзгерткен әр серверлік қолданба үшін мыналарды жазып алады:
- осы жарияланым оны жасады ма, және
- егер жасамаса, жаңа алдында қай образды іске қосып тұрғаны.
Сәтсіздік болғанда әр қолданба үш өңдеудің бірін алады:
- Осы жарияланым жасаған: бұрынғыдай өшіреді.
- Бұрыннан бар, алдыңғы образы белгілі: сол конфигурациямен алдыңғы образды қайта жайғастырады. Құрастыру жоқ, тек образ қайтады.
- Бұрыннан бар, алдыңғы образы белгісіз: оны қозғамайды. Қалпына келтіре алмаған жағдайда да бар қолданба ешқашан өшірілмейді.
Бұл ережелер кішкене таза функция ретінде жазылған және өз тесттері бар, сондықтан шешім «бәрін өшір» күйіне қайта оралмайды — мұндай өзгеріс болса тест құлайды.
2-мәселе: жүйе кері қайтаруды жазып алғанға дейін құралы сәтсіз болуы мүмкін еді
Түзетуден көп кешікпей біз оның кемшілігін таптық. Хостинг платформасының жариялау құралы өзінің түтін тексерулерін (smoke check) жүргізеді: жаңа машиналар құласа, ол қатемен аяқталады. Бірақ ол мұны жаңа образ машиналарға жайғастырылғаннан кейін жасайды.
Біздің код қолданбаны кері қайтаруға тек құрал сәтті аяқтағаннан кейін тіркейтін. Құралдың өзі жариялауды сәтсіз еткенде қолданба кері қайтару тізімінде әлі болмады, сондықтан ештеңе қалпына келмеді. Staging ортамызда бұзылған қайта жариялау бұзылған образды қызмет көрсетуде қалдырды.
Түзету: кері қайтаруды бастамас бұрын тіркеу
Қолданба дайындалған бойда және оған ештеңе жайғастырылмас бұрын кері қайтару тізіміне тіркеледі — жасалғаны жоқ па және қандай образда тұрғаны туралы мәліметпен бірге. Кейінгі кез келген қате болса да, кері қайтару нені қалпына келтіру керек екенін біледі. Оны жергілікті түрде тексердік: бұзылған қайта жариялау құралдың өз түтін тексерулерінде сәтсіз аяқталды, ал алдыңғы нұсқа жауап беруді жалғастырды.
3-мәселе: ұйықтап жатқан қолданба «ешқашан іске қосылмады» деп сәтсіз болды
Mythex-те жарияланған қолданбалар несиеңді үнемдеу үшін бос тұрғанда ұйықтайды. Қайта жариялау ұйықтап тұрған машинаны тоқтатылған күйде қалдырады, сондықтан денсаулық тексеруі оны оятуы керек. Ол платформадан машинаны іске қосуды бір рет сұрап, жауапқа мән бермеді.
25 қыркүйекте сол бір іске қосу сұрауы ешқайда жетпеді. Сау API бес минуттық денсаулық тексеруінің бүкіл уақыты бойы тоқтатылған күйде тұрды және «1 машина ешқашан іске қосылмады (соңғы күйі: stopped)» деген хабармен сәтсіз аяқталды.
Платформа кейде іске қосуды қабылдамайды. Осы мәселені қайталап тексеру кезінде ол біз қоздырмай-ақ «lease currently held» (ресурс қазір ұсталған) қақтығысын қайтарды, ал машина жаңартылып жатқанда іске қосуды да қабылдамайды.
Түзету: сұрай беру және есікті қағу
Денсаулық тексеруі енді:
- күтіп тұрғанда тоқтаған машинаны іске қосуды әр 20 секунд сайын қайта сұрайды,
- платформа бас тартқанда оның жауабын жазып алады,
- қолданбаға бір қалыпты сұрау жібереді, дәл келуші сияқты — платформаның прокси-сервері сұрау келгенде ұйықтап тұрған машинаны оятады.
Нақты платформада бірінші іске қосуы қабылданбаған уақытша қолданбамен қайталап көрдік. Түзетуге дейін жариялау 91 секундтан кейін сәтсіз болды. Түзеткеннен кейін ол 20 секундта жарияланды. Бастапқыдан іске қосылғанда шынымен құлайтын қолданба әлі де сәтсіз болады, бұл дұрыс.
Осыдан не үйрендік
- Кері қайтаруда жаңа мен бұрыннан бар арасындағы айырмашылықты білу керек. Өзің жасағанды «кері қайтару» — ол өшіру. Бұрыннан болған нәрсені «кері қайтару» — ол қалпына келтіру. Екеуін бірдей деп қарау — қауіпсіздік механизмінің жұмыс істеп тұрған қолданбаны өшіруінің себебі.
- Кері қайтару тәсілін әрекеттен бұрын жазып қой. Егер кері қайтару қадам сәтті аяқталғаннан кейін ғана жазылса, жартылай сәтсіз болған қадам кері қайтаратын ешнәрсе қалдырмайды.
- Сен тәуелді болатын сұраудың жауабын ешқашан елемеңдер. Бір елеусіз «жоқ» сау қолданбаны сәтсіз жариялауға айналдырды.
Сол күнгі тағы бір түзету: жариялаудан кейін бірден құлайтын қолданбаларды ұстау. Жариялау сенің тарапыңда сәтсіз болғанда не болатыны туралы жариялау ақаулықтарын түзету құжаттарда бар.