Tester pÄ produksjon: Canary Deployment.

Kanari — en liten fugl som synger konstant. Disse fuglene er sensitive for metan og karbonmonoksid. Selv fra en liten konsentrasjon av ekstra gasser i luften, mister de bevisstheten eller dĂžr. Gullgravere og gruvearbeidere tok med seg fuglene: mens kanariene synger, kan man jobbe, hvis de stopper — betyr det at det er gass i gruven og det er pĂ„ tide Ă„ forlate den. Gruvearbeidere ofret smĂ„ fugler for Ă„ komme ut av gruvene i live.

Tester pÄ produksjon: Canary Deployment.

En tilsvarende praksis har ogsÄ funnet veien til IT. For eksempel i den standard oppgaven med Ä distribuere en ny versjon av en tjeneste eller applikasjon til produksjon etter Ä ha testet den. TestmiljÞet kan vÊre for kostbart, automatiserte tester dekker ikke alt man skulle Þnske, og det er risikabelt Ä ikke teste og ofre kvaliteten. I slike tilfeller er Canary Deployment-tilnÊrmingen nyttig, hvor litt ekte produksjonstrafikk sendes til den nye versjonen. Denne tilnÊrmingen hjelper trygt Ä sjekke den nye versjonen i produksjon, og ofre lite for Ä oppnÄ et stort mÄl. Mer om hvordan denne tilnÊrmingen fungerer, hvilke fordeler den har og hvordan den kan implementeres, vil Andrey Markelov (Andrey_V_Markelov), med et eksempel pÄ implementering i selskapet Infobip.

Andrey Markelov — ledende programvareingeniĂžr i Infobip, har jobbet med utvikling av applikasjoner i Java innen finans og telekommunikasjon i 11 Ă„r. Han utvikler Open Source-produkter, deltar aktivt i Atlassian Community og skriver plugins for Atlassians produkter. Evangelist for Prometheus, Docker og Redis.

Spill video

Om Infobip

Dette er en global telekommunikasjonsplattform som lar banker, detaljhandlere, nettbutikker og transportselskaper sende meldinger til sine kunder via SMS, push, e-post og talebeskjeder. I denne bransjen er stabilitet og pÄlitelighet viktig, slik at kundene mottar meldingene i tide.

IT-infrastrukturen til Infobip i tall:

  • 15 datasentre over hele verden;
  • 500 unike tjenester i drift;
  • 2500 instanser av tjenester, noe som er betydelig mer enn teamene;
  • 4,5 TByte mĂ„nedlig trafikk;
  • 4,5 milliarder telefonnumre;

Bedriften vokser, og det samme gjĂžr antall utgivelser. Vi gjennomfĂžrer omtrent 60 utgivelser om dagen, fordi kundene Ăžnsker flere muligheter og kapasitet. Men det er komplisert — det er mange tjenester, men fĂ„ team. Man mĂ„ raskt skrive kode som mĂ„ fungere i produksjon uten feil.

Utgivelser

En typisk release hos oss gÄr til slik. For eksempel, det finnes tjenester A, B, C, D og E, hver av dem utvikles av et eget team.

Tester pÄ produksjon: Canary Deployment.

PĂ„ et tidspunkt bestemmer teamet for tjeneste A seg for Ă„ deployere en ny versjon, men teamene for tjenestene B, C, D og E vet ingenting om dette. Teamet for tjeneste A har to alternativer.

De vil utfÞre en inkrementell release: de vil fÞrst erstatte én versjon, og sÄ den andre.

Tester pÄ produksjon: Canary Deployment.

Men det finnes et annet alternativ: teamet finner ekstra ressurser og maskiner, deployerer den nye versjonen, og sÄ bytter de ruteren, og versjonen begynner Ä fungere i produksjon.

Tester pÄ produksjon: Canary Deployment.

Uansett hvilket alternativ som velges, oppstĂ„r det nesten alltid problemer etter deployeringen, selv om versjonen er testet. Testing kan gjĂžres manuelt, automatisk, eller man kan unngĂ„ testing — problemer vil oppstĂ„ uansett. Den enkleste og mest riktige mĂ„ten Ă„ lĂžse dem pĂ„, er Ă„ rulle tilbake til den arbeidende versjonen. FĂžrst etterpĂ„ kan man begynne Ă„ se pĂ„ skadene, Ă„rsakene og rette opp i dem.

SĂ„, hva Ăžnsker vi?

Vi trenger ikke problemer. Hvis kundene oppdager dem raskere enn oss, vil det skade omdÞmmet vÄrt. Derfor mÄ vi oppdage problemer raskere enn kundene. Ved Ä arbeide proaktivt, minimerer vi skadene.

Samtidig Ăžnsker vi Ă„ fremskynde deployeringen, sĂ„ det skjer raskt, enkelt, av seg selv og uten stress for teamet. IngeniĂžrer, DevOps-ingeniĂžrer og programmerere mĂ„ ivaretas — en ny versjon av programvaren er stressende. Teamet er ikke et forbruksmateriell, vi streber etter Ă„ utnytte menneskelige ressurser pĂ„ en fornuftig mĂ„te..

Problemer med deployering

Kundetrafikk er uforutsigbar. Det er umulig Ă„ forutsi nĂ„r kundetrafikken vil vĂŠre minimal. Vi vet ikke nĂ„r og hvor kundene starter sine kampanjer — kanskje i natt i India, og i morgen i Hongkong. Med store tidsforskjeller, gir ikke en deployering kl 02:00 noen garantier for at kundene ikke vil lide.

Problemer med leverandÞrer. Meldingsplattformer og leverandÞrer er vÄre partnere. Av og til opplever de nedetid, noe som kan forÄrsake feil under deployeringen av nye versjoner.

Fordelte team. Teamene som utvikler klientdelen og backend, befinner seg i ulike tidssoner. PĂ„ grunn av dette kan de ofte ikke bli enige med hverandre.

Datasentre kan ikke replikeres i staging. Ett datasenter har 200 stativer — Ă„ gjenskape dette i en sandkasse kan selv ikke gjĂžres omtrent.

Nedetiderer uakseptable! Vi har et akseptabelt tilgjengelighetsnivÄ (Error Budget), hvor vi jobber 99,99% av tiden, for eksempel, og de gjenvÊrende prosentene er vÄrt «feilrett», Ä oppnÄ 100% pÄlitelighet er umulig, men det er viktig Ä kontinuerlig overvÄke nedetider og driftsstans.

Klassiske lĂžsningsalternativer

Å skrive kode uten feil. Da jeg var en ung utvikler, kom ledere til meg og ba om Ă„ levere uten feil, men det er ikke alltid mulig.

Å skrive tester. Tester fungerer, men ikke alltid slik virksomheten þnsker. Å tjene penger er ikke testenes oppgave.

Å teste pĂ„ staging. I lĂžpet av mine 3,5 Ă„r i Infobip har jeg aldri sett at staging-tilstanden er i det minste delvis lik produksjon.

Tester pÄ produksjon: Canary Deployment.

Vi forsĂžkte til og med Ă„ utvikle denne ideen: fĂžrst hadde vi staging, sĂ„ pre-produksjon, og deretter pre-pre-produksjon. Men det hjalp ikke — de samsvarte ikke engang i kapasitet. Med staging kan vi garantere grunnleggende funksjonalitet, men vi vet ikke hvordan den vil oppfĂžre seg under belastning.

Utgivelsen gjÞres av den som utviklet. Dette er en god praksis: selv om noen endrer navnet pÄ kommentaren, legges det umiddelbart til i produksjon. Dette hjelper til med Ä utvikle ansvarlighet og ikke glemme endringene som er gjort.

Det er ogsÄ ytterligere komplikasjoner. For utvikleren er det stressende Ä bruke mye tid pÄ Ä sjekke alt manuelt.

Koordinerte utgivelser. Denne lÞsningen tilbys vanligvis av ledelsen: «La oss bli enige om at dere tester og legger til nye versjoner hver dag». Det fungerer ikke: det er alltid et team som venter pÄ alle de andre, eller omvendt.

Smoke-tester

En annen mÄte Ä lÞse vÄre utplasseringsproblemer pÄ. La oss se hvordan smoke-tester fungerer i det forrige eksempelet, nÄr team A Þnsker Ä deployere en ny versjon.

FÞrst deployer teamet én instans til produksjon. Beskjeder i instansen fra mockene simulerer reell trafikk, slik at den samsvarer med den normale daglige trafikken. Hvis alt ser bra ut, bytter teamet den nye versjonen til brukertrafikk.

Tester pÄ produksjon: Canary Deployment.

Den andre muligheten er Ä deployere med ekstra maskinvare. Teamet tester det pÄ produksjon, sÄ bytter de, og alt fungerer.

Tester pÄ produksjon: Canary Deployment.

Ulemper med smoke-tester:

  • Man kan ikke stole pĂ„ tester. Hvor kan man fĂ„ den samme trafikken som i produksjon? Man kan bruke trafikk fra i gĂ„r eller fra forrige uke, men den samsvarer ikke alltid med den nĂ„vĂŠrende.
  • Vanskelig Ă„ opprettholde. Man mĂ„ vedlikeholde testkontoer, og stadig tilbakestille dem fĂžr hver distribusjon nĂ„r aktive poster blir sendt til lagringen. Dette er mer komplisert enn Ă„ skrive tester i sin egen sandkasse.

Den eneste fordelen her er man kan sjekke ytelsen.

Canary-utgivelser

PĂ„ grunn av manglene ved smoke-tester begynte vi Ă„ bruke canary-utgivelser.

Praksisen, lik den hvordan gruvearbeidere brukte kanarifugler for Ă„ indikere gassnivĂ„er, har ogsĂ„ funnet sin plass i IT. Vi sender litt ekte produksjonstrafikk til den nye versjonen, samtidig som vi prĂžver Ă„ holde oss innenfor Service Level Agreement (SLA). SLA er vĂ„r "feilmargin" som vi kan bruke en gang i Ă„ret (eller i en annen tidsperiode). Hvis alt gĂ„r bra, slipper vi ut mer trafikk. Hvis ikke – gĂ„r vi tilbake til tidligere versjoner.

Tester pÄ produksjon: Canary Deployment.

Implementering og detaljer

Hvordan implementerte vi canary-utgivelser? For eksempel, en gruppe kunder sender meldinger gjennom vÄr tjeneste.

Tester pÄ produksjon: Canary Deployment.

Distribusjonen skjer slik: vi fjerner en node fra lastbalansereren (1), endrer versjonen (2) og sender deretter ut litt trafikk (3).

Tester pÄ produksjon: Canary Deployment.

Generelt vil alle i gruppen vĂŠre glade, selv om en bruker er misfornĂžyd. Hvis alt gĂ„r bra – oppdaterer vi alle versjonene.

Tester pÄ produksjon: Canary Deployment.

Jeg vil vise skjematisk hvordan dette ser ut for mikrotjenester i de fleste tilfeller.

Det er Service Discovery og to andre tjenester: S1N1 og S2. Den fÞrste tjenesten (S1N1) varsler Service Discovery nÄr den starter, og Service Discovery lagrer den. Den andre tjenesten med to noder (S2N1 og S2N2) varsler ogsÄ Service Discovery nÄr den starter.

Tester pÄ produksjon: Canary Deployment.

Den andre tjenesten fungerer som server for den fÞrste. Den fÞrste spÞr Service Discovery om informasjon om sine servere, og nÄr den fÄr det, leter den etter og sjekker dem ("helse-sjekk"). NÄr den har sjekket, sender den meldinger til dem.

NÄr noen vil utbre den nye versjonen av den andre tjenesten, varsler de Service Discovery om at den andre noden vil vÊre canary-node: den vil motta mindre trafikk fordi det skal skje en distribusjon nÄ. Vi fjerner canary-noden fra lastbalansereren, og den fÞrste tjenesten sender ikke trafikk til den.

Tester pÄ produksjon: Canary Deployment.

Vi endrer versjonen, og Service Discovery vet at den andre noden nĂ„ er canary — vi kan gi den mindre belastning (5%). Hvis alt gĂ„r bra, endrer vi versjonen, gjenoppretter belastningen og fortsetter videre.

For Ă„ realisere alt dette trenger vi:

  • lastbalansering;
  • overvĂ„king, da det er viktig Ă„ vite hva hver bruker forventer, og hvordan vĂ„re tjenester fungerer i detalj;
  • versjonsanalyse, for Ă„ forstĂ„ hvor godt den nye versjonen vil fungere i produksjon;
  • automatisering — vi skriver oppsettet for distribusjon (deployment pipeline).

Tester pÄ produksjon: Canary Deployment.

Belastningsbalansering

Dette er det fÞrste vi mÄ tenke pÄ. Det finnes to balanseringsstrategier.

Den enkleste varianten, nÄr en node alltid er canary. Denne noden fÄr alltid mindre trafikk, og vi begynner distribusjonen med den. Ved problemer kan vi sammenligne ytelsen fÞr og under distribusjonen. For eksempel, hvis feilene har doblet seg, har ogsÄ skaden Þkt med det samme.

Canary-noden defineres under distribusjonen. NÄr distribusjonen er fullfÞrt og vi fjerner canary-statusen fra den, gjenopprettes trafikbalansen. Med fÊrre maskiner fÄr vi en rettferdig fordeling.

OvervÄkning

Grunnlaget for canary-utgivelser. Vi mÄ tydelig forstÄ hvorfor vi gjÞr dette, og hvilke metrikker vi Þnsker Ä samle inn.

Eksempler pÄ metrikker vi samler inn fra vÄre tjenester.

  • Antall feil, som skrives til loggene. Dette er et Ă„penbart mĂ„l pĂ„ at alt fungerer som det skal. Generelt er dette en god metrikk.
  • Tidsbruk for forespĂžrslene (latency). Denne metrikken overvĂ„kes av alle, fordi alle Ăžnsker Ă„ jobbe raskt.
  • KĂžstĂžrrelse (throughput).
  • Antallet vellykkede svar per sekund.
  • Tiden det tar Ă„ hĂ„ndtere 95% av alle forespĂžrslene.
  • Forretningsmetrikker: hvor mye penger virksomheten tjener over en viss periode eller kundeavgang. Disse metrikker kan vĂŠre viktigere for vĂ„r nye versjon enn de som ingeniĂžrer legger til.

Eksempler pÄ metrikker i de mest populÊre overvÄkningssystemene.

Teller. Dette er en Þkende stÞrrelse, for eksempel antall feil. Denne metrikken er enkel Ä interpolere og studere kurven: i gÄr var det 2 feil, og i dag 500, sÄ noe har gÄtt galt.

Antallet feil per minutt eller per sekund, er den viktigste indikatoren som kan beregnes ved hjelp av Teller. Disse dataene gir et klart bilde av systemets ytelse over tid. La oss vurdere et eksempel pÄ kurven for antall feil per sekund for to versjoner av produksjonssystemet.

Tester pÄ produksjon: Canary Deployment.

I den fÞrste versjonen var det fÄ feil, muligens fungerte ikke revisjonen. I den andre versjonen er alt mye verre. Man kan helt klart si at det er problemer, sÄ vi mÄ rulle tilbake denne versjonen.

Gauge. Metrikker ligner pÄ Counter, men vi registrerer verdier som bÄde kan Þke og minke. For eksempel, tiden for forespÞrselene eller stÞrrelsen pÄ kÞen.

PĂ„ diagrammet er et eksempel pĂ„ responstid (latency). Diagrammet viser at versjonene ligner, og de kan brukes. Men hvis man ser nĂŠrmere etter, er det tydelig hvordan stĂžrrelsen endres. Hvis tiden for forespĂžrslene Ăžker nĂ„r man legger til brukere, er det klart at det er problemer — slik var det ikke fĂžr.

Tester pÄ produksjon: Canary Deployment.

Summary. En av de viktigste indikatorene for virksomheten er percentilene. MÄlingen viser at i 95% av tilfellene fungerer systemet vÄrt slik vi Þnsker. Vi kan akseptere at det er problemer et sted, fordi vi forstÄr den generelle trenden, hvor bra eller dÄrlig alt stÄr til.

Tools

ELK Stack. For Ă„ implementere canary kan man bruke Elasticsearch — vi registrerer feil der nĂ„r hendelser skjer. Med et enkelt API-kall kan man hente antall feil nĂ„r som helst og sammenligne med tidligere perioder: GET /applg/_cunt?q=level:errr.

Prometheus. Har fungert godt i Infobip. Den lar deg implementere flerdimensjonale metrikker, fordi det brukes labeler.

Vi kan bruke nivÄ, instance, tjeneste, kombinere dem i ett system. Med offset kan man for eksempel se verdien av stÞrrelsen for en uke siden med bare én kommando GET /api/v1/query?query={query}, hvor {query}:

rate(logback_appender_total{ 
    level="error",  
    instance=~"$instance" 
}[5m] offset $offset_value)

Versjon analyse

Det finnes flere strategier for versjonsanalyse.

Se pÄ metrikker bare fra canary-noden. En av de enkleste alternativene: vi har deployert en ny versjon og studerer bare ytelsen. Men hvis ingeniÞren i lÞpet av dette begynner Ä undersÞke loggene, stadig nervÞst oppdaterer sidene, da er ikke denne lÞsningen forskjellig fra de andre.

Canary-noden sammenlignes med enhver annen node. Dette er en sammenligning med andre instanser som kjÞrer med full trafikk. For eksempel, hvis det er verre, eller ikke bedre, med liten trafikk enn pÄ de virkelige instansene, sÄ er noe galt.

Canary-noden sammenlignes med seg selv fra fortiden. Noder som er tildelt for canary kan sammenlignes med historiske data. For eksempel, hvis alt var bra for en uke siden, kan vi bruke disse dataene for Ä forstÄ den nÄvÊrende situasjonen.

Automatisering

Vi Þnsker Ä frigjÞre ingeniÞrene fra manuell sammenligning, sÄ det er viktig Ä implementere automatisering. Utrullingsprosessen (deployment pipeline) ser vanligvis slik ut:

  • vi starter;
  • fjerner noden fra balansefĂžreren;
  • setter canary-noden;
  • aktiverer balansefĂžreren med begrenset trafikk;
  • sammenligner.

Tester pÄ produksjon: Canary Deployment.

I dette trinnet implementerer vi automatisk sammenligning. Hvordan det kan se ut og hvorfor det er bedre enn manuell sjekk etter utrulling, vil vi se pÄ et eksempel fra Jenkins.

Dette er en pipeline til Groovy.

while (System.currentTimeMillis() < endCanaryTs) {
    def isOk = compare(srv, canary, time, base, offset, metrics)
    if (isOk) {
        sleep DEFAULT SLEEP
    }   else {
        echo "Canary feilet, mÄ tilbakestille"  
        return false
    }
}

Her i lĂžkken setter vi at vi vil sammenligne den nye noden i lĂžpet av en time. Hvis canary-prosessen ikke er fullfĂžrt, kaller vi funksjonen. Den forteller om alt er i orden eller ikke: def isOk = compare(srv, canary, time, base, offset, metrics).

Hvis alt er i orden — sleep DEFAULT SLEEP, for eksempel i ett sekund, og fortsetter. Hvis ikke, gĂ„r vi ut — utrullingen mislykkes.

Beskrivelse av metrikken. La oss se hvordan funksjonen compare kan se ut i et DSL-eksempel.

metric(
    'errorCounts',
    'rate(errorCounts{node=~"$canaryInst"}[5m] offset $offset)',
    {   baseValue, canaryValue ->
        if (canaryValue > baseValue * 1.3) return false 
        return true
    }
)

La oss anta at vi sammenligner antall feil og vil vite antallet feil per sekund de siste 5 minuttene.

Vi har to verdier: den grunnleggende og canary-noden. Verdien for canary-noden er den nĂ„vĂŠrende. Den grunnleggende er baseValue — dette er verdien av enhver annen non-canary node. Vi sammenligner verdiene mot hverandre etter formelen vi har basert pĂ„ vĂ„r erfaring og observasjoner. Hvis verdien canaryValue er dĂ„rlig, sĂ„ mislykkes utrullingen, og vi ruller tilbake.

Hvorfor er dette alt nĂždvendig?

Et menneske kan ikke sjekke hundrevis og tusenvis av metrikker, spesielt ikke gjÞre det raskt. Automatisk sammenligning hjelper til med Ä kontrollere alle metrikker og varsler raskt om problemer. Tid til varsling er kritisk: hvis noe har skjedd de siste 2 sekundene, vil skaden ikke vÊre sÄ stor som hvis det skjedde for 15 minutter siden. Mens noen merker problemet, sender en melding til support, og mens support kontakter oss for Ä tilbakestille, kan vi miste kunder.

Hvis prosessen gikk bra, distribuerer vi automatisk alle de andre nodene. I mellomtiden gjÞr ingeniÞrene ingenting. FÞrst nÄr de starter canary, bestemmer de hvilke metrikker de skal ta, hvor lenge sammenligningen skal vare, og hvilken strategi som skal brukes.

Tester pÄ produksjon: Canary Deployment.

Hvis det oppstĂ„r problemer – ruller vi automatisk tilbake canary-noden, jobber med tidligere versjoner og fikser feilene vi har funnet. Med metrikker er det lett Ă„ finne og se skaden fra den nye versjonen.

Hindringer

Å implementere dette er selvfĂžlgelig ikke enkelt. FĂžrst og fremst trenger vi et felles overvĂ„kingssystem. IngeniĂžrene har sine egne metrikker, support og analytikere har andre, og forretningssiden har tredje. Et felles system er et felles sprĂ„k som virksomhet og utvikling snakker.

Vi mÄ teste i praksis stabiliteten til metrikker. Testing hjelper oss Ä forstÄ, hva det minste antallet metrikker er for Ä sikre kvalitet.

Hvordan oppnÄ dette? Bruke canary-tjenesten ikke i distribusjonsÞyeblikket. Vi legger til en eller annen tjeneste pÄ den gamle versjonen som nÄr som helst kan ta hvilken som helst dedikert node, redusere trafikken uten distribusjon. Deretter sammenligner vi: vi studerer feilene og ser etter den grensen der vi oppnÄr kvalitet.

Tester pÄ produksjon: Canary Deployment.

Hvilken nytte har vi fÄtt fra canary-utgivelser

Vi har minimert prosentandelen skade fra feil. De fleste distribusjonsfeil skjer pÄ grunn av inkonsistens i data eller prioriteringer. Slike feil har blitt mye fÊrre fordi vi kan lÞse problemet i lÞpet av de fÞrste sekundene.

Vi har optimalisert teamenes arbeid. Nykommere har et 'rett til feil': de kan distribuere til produksjon uten frykt for Ă„ gjĂžre feil, noe som gir dem ekstra initiativ og motivasjon til Ă„ jobbe. Hvis de Ăždelegger noe, vil det ikke vĂŠre kritisk, og den som feilet, vil ikke bli sagt opp.

Vi har automatisert distribusjonen. Dette er ikke lenger en manuell prosess som fĂžr, men en ekte automatisert prosess. Men den tar lengre tid.

Vi har identifisert viktige metrikker. Hele selskapet, fra virksomheten til ingeniÞrene, forstÄr hva som virkelig er viktig i produktet vÄrt, hvilke metrikker, for eksempel kundeavgang og tilstrÞmning. Vi kontrollerer prosessen: tester metrikker, introduserer nye, ser hvordan de gamle fungerer, for Ä bygge et system som vil tjene penger mer effektivt.

Vi har mange flotte praksiser og systemer som hjelper oss. Likevel streber vi etter Ä vÊre profesjonelle og gjÞre jobben vÄr pÄ en kvalitetsmessig mÄte, uansett om vi har et system som kan hjelpe oss eller ikke.

IngeniĂžrmetoder og praksiser — hovedfokuset for TechLead Conf. Hvis du har oppnĂ„dd suksess pĂ„ veien mot teknisk dyktighet og er klar til Ă„ dele hva som har hjulpet deg, — send inn en sĂžknad om foredrag.

Vi planlegger Ă„ gjennomfĂžre TechLead Conf 8. juni. Vi forstĂ„r at det er vanskelig Ă„ ta beslutninger om deltagelse pĂ„ konferansen nĂ„. Men samtidig mener vi at karantenen ikke er en grunn til Ă„ stoppe profesjonell kommunikasjon og utvikling. Derfor vil vi pĂ„ en eller annen mĂ„te finne en mĂ„te Ă„ diskutere tech-lederens utfordringer og tilnĂŠrminger til Ă„ lĂžse dem — om nĂždvendig gĂ„r vi online og setter opp nettverking der!

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster