Hvernig við fengum birtingar niður í núll 502-villur
Í hvert sinn sem við birtum bakenda Mythex fengum nokkrar beiðnir 502 Bad Gateway. Ekki margar, en 502 við birtingu þýðir að smellur einhvers gerði ekki neitt, eða að smíð sem viðkomandi fylgdist með stöðvaðist um stund. Við rektum það til tveggja aðskilinna vandamála: vaktmanns sem sjálfvirkt lagar hlutina og barðist gegn birtingum okkar, og bils á milli þess að þjónn hætti að hlusta og þess að álagsjafnarinn hætti að senda honum umferð. Í þremur samfelldum framleiðslubirtingum eftir lagfæringarnar fór talan úr 10 í 6 og síðan í 0.
Uppsetningin
API-ið okkar og orchestrator keyra sem gámar á litlum hópi þjóna á bak við AWS Application Load Balancer (ALB). Birting uppfærir einn þjón í einu: hún tæmir gömlu gámana, ræsir nýja og heldur áfram. Vaktmaður á hverjum þjóni athugar að gámarnir séu uppi og endurræsir allt sem er ekki það, og er til þess að hrun klukkan þrjú um nótt lagist án þess að nokkur þurfi að vakna.
Þessi tvö eru bæði skynsamleg ein og sér. Saman voru þau það ekki.
Vandamál 1: vaktmaðurinn keppti við birtinguna
Vaktmaðurinn keyrði einu sinni á mínútu og „læknaði“ eftir eina misheppnaða heilsufarsathugun. Birting tæmir þjónustur af ásettu ráði í allt að 150 sekúndur, en meðan á því stendur á heilsufarsathugun einmitt að mistakast. Þannig að vaktmaðurinn fór í gang í hverri einustu birtingu.
Oftast tapaði hann kappinu án skaða. Einu sinni vann hann: hann endurskrifaði compose-skrána (lýsinguna á því hvaða gámar eiga að keyra) mitt í birtingu og skildi eftir þjón án nokkurs gáttargáms, á meðan birtingarverkið tilkynnti árangur.
Lagfæringarnar:
- Einn lás. Birtingin tekur nú sama skráarlás og bootstrap-skriftan á þjóninum, þannig að vaktmaðurinn og birting geta aldrei keyrt samtímis.
- Fjögur skipti, ekki eitt. Vaktmaðurinn þarf fjórar samfelldar mislukkaðar athuganir áður en hann aðhefst. Þjónusta sem er að tæmast lítur ekki lengur út fyrir að vera dauð.
- Ein skilgreining. Compose-skráin hefur nú eina uppsprettu, birta á þjónana, í stað afrita sem gátu skekkst.
- Sannreyndu, ekki treystu. Birtingarverkið stenst ekki lengur því að skipun skilaði kóða. Það athugar API, orchestrator, gátt og birtingarvinnsluforrit á hverjum þjóni áður en það getur heppnast.
Vandamál 2: þjónninn fór áður en umferðin gerði það
Annað vandamálið var lúmskara. Þegar birting tæmir þjón byrjar þjónninn að svara heilsuendapunkti sínum með 503 svo að álagsjafnarinn taki hann úr umferð. Okkar þjónn gerði það í 5 sekúndur, og lokaðist síðan.
En ALB athugar heilsu aðeins með reglulegu millibili og þarf nokkrar mislukkaðar athuganir í röð áður en hann hættir að beina á skotmark, allt að um 60 sekúndum frá enda til enda. Þannig að í um 55 sekúndur hélt álagsjafnarinn áfram að senda raunverulegar beiðnir á þjón sem var þegar hættur að hlusta. Þetta voru 502-villurnar okkar.
Lagfæringin var að láta tímalínurnar tvær stemma:
- Markhópurinn athugar nú á 5 sekúndna fresti og merkir skotmark óheilbrigt eftir 2 misheppnaðar athuganir, um 10 sekúndur að taka eftir því.
- Tæmingin þjónar raunverulegri umferð í 15 sekúndur eftir að hún fer að mistakast heilsuathuganir, þannig að alltaf er skörun.
- Þessar stillingar lifa í skriftunni sem setur upp innviðina, ekki í stjórnborði sem einhver smellti einu sinni í.
Að láta tölurnar halda hver annarri
Tímamörk eins og þessi reiða sig hvert á annað. Tæmingin verður að vara lengur en tíminn sem álagsjafnarinn þarf til að taka eftir; tæmingin plús lokun verður að ljúka áður en gámnum er þvingað út. Það er auðvelt fyrir einhvern að breyta einni tölu eftir sex mánuði og endurvekja villuna óvart.
Þess vegna skrifuðum við þessi tengsl niður sem próf: tæmingin verður að vera lengri en heilsuathugunarbilið margfaldað með misheppnunarmörkunum; tíminn til að verða aftur talinn heilbrigður verður að haldast stuttur; öll tæmingin verður að komast fyrir innan stöðvunarfrestsins sem gámurinn hefur. Breyttu einni tölu án hinna og CI fellur. Við gerðum mutation-próf á prófunum sjálfum: breyttum hverri tölu í rangt gildi og athuguðum að próf næði því.
Það er auðvelt að mæla birtingu vitlaust
Fyrsta mælingin okkar sagði að hrein birting væri um 3% biluð. Hún var það ekki. Við töldum hvert svar sem var ekki 200, og 503 frá heilsuendapunkti meðan á tæmingu stendur er ekki bilun. Það er tæmingin að gera sitt: segja álagsjafnaranum að velja ekki þjóninn meðan hann þjónar enn raunverulegum beiðnum.
Það sem notendur finna er 502: beiðnin náði engu. Að telja aðeins þær gaf rétta mynd: 10, síðan 6, síðan 0 í þremur framleiðslubirtingum.
Það sem við lærðum
- Sjálfvirk viðgerð þarf að vita um áætlaðan niðurtíma. Vaktmaður sem getur ekki greint birtingu frá hruni mun á endanum berjast við birtinguna.
- Tæming er handaband. Þjónninn verður að halda áfram að þjóna þar til álagsjafnarinn hefur sannanlega hætt að senda umferð, og sá tímasetning er stillt á álagsjafnaranum, ekki þjóninum.
- Kóðaðu óbreytanleika sem próf. Rekstrartölur reka sig til. Próf sem tengja þær hvert við annað gera það ekki.
- Ákveddu hvað þú mælir áður en þú mælir. „Villur“ var röng mælikvarði; „beiðnir sem náðu engu“ var sá rétti.
Ef þú birtir forrit á Mythex sérðu ekkert af þessu — sem er einmitt málið. Tengt: hvernig birta forritið þitt helst uppi á meðan þú birtir það aftur.