
Alt bra!
Jeg heter Nikita, jeg er teamleder for Cians ingeniĂžrteam. Et av mine ansvar i selskapet er Ă„ redusere antall hendelser knyttet til infrastruktur i produksjon til null.
Det som vil bli diskutert nedenfor ga oss mye smerte, og hensikten med denne artikkelen er Ä forhindre at andre mennesker gjentar vÄre feil eller i det minste minimere deres innvirkning.
innledning
For lenge siden, da Cian besto av monolitter, og det ikke var noen hint til mikrotjenester ennÄ, mÄlte vi tilgjengeligheten til en ressurs ved Ä sjekke 3-5 sider.
De svarer - alt er bra, hvis de ikke svarer pĂ„ lenge - varsler. Hvor lenge de mĂ„tte ha fri fra jobb for at det skulle bli ansett som en hendelse, ble bestemt av folk i mĂžter. Et team av ingeniĂžrer var alltid involvert i etterforskningen av hendelsen. Da etterforskningen var fullfĂžrt, skrev de en postmortem â en slags rapport pĂ„ e-post i formatet: hva skjedde, hvor lenge det varte, hva vi gjorde i Ăžyeblikket, hva vi skal gjĂžre i fremtiden.
Hovedsidene til nettstedet eller hvordan vi forstÄr at vi har truffet bunnen
For pÄ en eller annen mÄte Ä forstÄ prioriteringen av feilen, har vi identifisert de mest kritiske sidene for forretningsfunksjonalitet. Ved Ä bruke dem teller vi antall vellykkede/mislykkede forespÞrsler og tidsavbrudd. Slik mÄler vi oppetid.
La oss si at vi fant ut at det er en rekke superviktige deler av nettstedet som er ansvarlige for hovedtjenesten â sĂžking og innsending av annonser. Hvis antallet forespĂžrsler som mislykkes overstiger 1 %, er dette en kritisk hendelse. Hvis feilraten innen 15 minutter i sendetid overstiger 0,1 %, anses dette ogsĂ„ som en kritisk hendelse. Disse kriteriene dekker de fleste hendelsene, resten er utenfor rammen av denne artikkelen.

Topp beste hendelser Cyan
SÄ vi har definitivt lÊrt Ä fastslÄ det faktum at en hendelse skjedde.
NĂ„ er hver hendelse beskrevet i detalj og reflektert i Jira-eposet. Forresten: for dette startet vi et eget prosjekt, kalt det FAIL - bare epos kan lages i det.
Hvis du samler alle feilene de siste Ärene, er lederne:
- mssql-relaterte hendelser;
- hendelser forÄrsaket av eksterne faktorer;
- admin feil.
La oss se mer detaljert pÄ feilene til administratorer, samt noen andre interessante feil.
Femteplass - "Ă sette ting i orden i DNS"
Det var en stormfull tirsdag. Vi bestemte oss for Ă„ gjenopprette orden i DNS-klyngen.
Jeg Ăžnsket Ă„ overfĂžre interne DNS-servere fra bind til powerdns, og tildele helt separate servere for dette, der det ikke er noe annet enn DNS.
Vi plasserte én DNS-server pÄ hver plassering av vÄre DC-er, og Þyeblikket kom for Ä flytte soner fra bind til powerdns og bytte infrastrukturen til nye servere.
Midt i flyttingen, av alle ting servereAv serverne som var spesifisert i lokale mellomlagringsbindinger, var det bare Ă©n som gjensto â den i datasenteret i St. Petersburg. Dette datasenteret ble opprinnelig erklĂŠrt som ikke-kritisk for oss, men ble plutselig et enkelt feilpunkt.
Det var i denne overgangsperioden at kanalen mellom Moskva og St. Petersburg gikk ned. Vi ble i praksis stÄende uten DNS i fem minutter og kom oss tilbake da vert fikset problemene.
Konklusjoner:
Hvis vi tidligere forsÞmte eksterne faktorer under forberedelsene til arbeid, er de nÄ ogsÄ inkludert i listen over hva vi forbereder oss pÄ. Og nÄ streber vi etter Ä sikre at alle komponenter er reservert n-2, og under arbeidet kan vi senke dette nivÄet til n-1.
- NÄr du lager en handlingsplan, merk av punktene der tjenesten kan svikte, og tenk gjennom et scenario der alt gikk «fra vondt til verre» pÄ forhÄnd.
- Distribuer interne DNS-servere pÄ tvers av forskjellige geolokasjoner/datasentre/rack/svitsjer/innganger.
- PĂ„ hver server, installer en lokal caching DNS-server, som omdirigerer forespĂžrsler til hoved-DNS-serverne, og hvis den ikke er tilgjengelig, vil den svare fra cachen.
Fjerdeplass - "Ă sette ting i orden i Nginx"
En vakker dag bestemte teamet vÄrt at "vi har fÄtt nok av dette," og prosessen med Ä refaktorisere nginx-konfigurasjoner begynte. HovedmÄlet er Ä bringe konfigurasjonene til en intuitiv struktur. Tidligere var alt "historisk etablert" og hadde ingen logikk. NÄ har hver server_name blitt flyttet til en fil med samme navn og alle konfigurasjonene har blitt distribuert til mapper. Konfigurasjonen inneholder forresten 253949 linjer eller 7836520 tegn og tar opp nesten 7 megabyte. ToppnivÄ av struktur:
Nginx struktur
âââ access
â âââ allow.list
...
â âââ whitelist.conf
âââ geobase
â âââ exclude.conf
...
â âââ geo_ip_to_region_id.conf
âââ geodb
â âââ GeoIP.dat
â âââ GeoIP2-Country.mmdb
â âââ GeoLiteCity.dat
âââ inc
â âââ error.inc
...
â âââ proxy.inc
âââ lists.d
â âââ bot.conf
...
â âââ dynamic
â âââ geo.conf
âââ lua
â âââ cookie.lua
â âââ log
â â âââ log.lua
â âââ logics
â â âââ include.lua
â â âââ ...
â â âââ utils.lua
â âââ prom
â âââ stats.lua
â âââ stats_prometheus.lua
âââ map.d
â âââ access.conf
â âââ ..
â âââ zones.conf
âââ nginx.conf
âââ robots.txt
âââ server.d
â âââ cian.ru
â â âââ cian.ru.conf
â â âââ ...
â â âââ my.cian.ru.conf
âââ service.d
â âââ ...
â âââ status.conf
âââ upstream.d
âââ cian-mcs.conf
âââ ...
âââ wafserver.confDet ble mye bedre, men i prosessen med Ă„ gi nytt navn og distribuere konfigurasjoner, hadde noen av dem feil utvidelse og ble ikke inkludert i include *.conf-direktivet. Som et resultat ble noen verter utilgjengelige og returnerte 301 til hovedsiden. PĂ„ grunn av at svarkoden ikke var 5xx/4xx ble dette ikke lagt merke til umiddelbart, men fĂžrst om morgenen. Etter det begynte vi Ă„ skrive tester for Ă„ sjekke infrastrukturkomponenter.
Konklusjoner:
- Strukturer konfigurasjonene dine riktig (ikke bare nginx) og tenk gjennom strukturen pÄ et tidlig stadium av prosjektet. PÄ denne mÄten vil du gjÞre dem mer forstÄelige for teamet, noe som igjen vil redusere TTM.
- Skriv tester for noen infrastrukturkomponenter. For eksempel: sjekke at alle nÞkkelservernavn gir riktig status + svartekst. Det vil vÊre nok Ä bare ha noen fÄ skript for hÄnden som sjekker de grunnleggende funksjonene til komponenten, for ikke Ä febrilsk huske klokken 3 hva annet som mÄ sjekkes.
Tredjeplass - "Plutselig gikk tom for plass i Cassandra"
Dataene vokste jevnt og trutt, og alt var bra inntil det Þyeblikket da reparasjonen av store kofferter begynte Ä mislykkes i Cassandra-klyngen, fordi komprimering ikke kunne fungere pÄ dem.
En stormfull dag ble klyngen nesten til et gresskar, nemlig:
- det var omtrent 20 % av den totale plassen igjen i klyngen;
- Det er umulig Ä legge til noder fullt ut, fordi opprydding ikke gÄr gjennom etter Ä ha lagt til en node pÄ grunn av mangel pÄ plass pÄ partisjonene;
- produktiviteten faller gradvis fordi komprimeringen ikke fungerer;
- Klyngen er i nĂždmodus.

Avslutt - vi la til 5 noder til uten opprydding, hvoretter vi begynte Ä systematisk fjerne dem fra klyngen og gÄ inn i dem igjen, som tomme noder som hadde gÄtt tom for plass. Det ble brukt mye mer tid enn vi skulle Þnske. Det var en risiko for delvis eller fullstendig utilgjengelighet av klyngen.
Konklusjoner:
- PÄ alle cassandra-servere bÞr ikke mer enn 60 % av plassen pÄ hver partisjon vÊre okkupert.
- De skal ikke lastes med mer enn 50 % cpu.
- Du bÞr ikke glemme kapasitetsplanlegging og trenger Ä tenke gjennom den for hver komponent, basert pÄ dens spesifikasjoner.
- Jo flere noder i klyngen, jo bedre. Servere som inneholder en liten mengde data overbelastes raskere, og en slik klynge er lettere Ă„ gjenopplive.
Andreplass â «Data forsvant fra konsulnĂžkkelverdilagring»
For tjenesteoppdagelse bruker vi, som mange, konsul. Men vi bruker ogsÄ nÞkkelverdien for blÄgrÞnn utforming av monolitten. Den lagrer informasjon om aktive og inaktive oppstrÞms, som bytter plass under utrulling. For dette formÄlet ble det skrevet en distribusjonstjeneste som samhandlet med KV. PÄ et tidspunkt forsvant dataene fra KV. Gjenopprettet fra minnet, men med en rekke feil. Som et resultat, under opplastingen, ble belastningen pÄ oppstrÞmsene fordelt ujevnt, og vi fikk mange 502-feil pÄ grunn av at backends ble overbelastet pÄ CPU. Det fÞrte til at vi flyttet fra konsul KV til postgres, hvor det ikke lenger er sÄ lett Ä fjerne dem.
Konklusjoner:
- Tjenester uten autorisasjon skal ikke inneholde data som er kritiske for driften av nettstedet. For eksempel, hvis du ikke har autorisasjon i ES, ville det vÊre bedre Ä nekte tilgang pÄ nettverksnivÄ fra alle steder der det ikke er nÞdvendig, la bare de nÞdvendige, og ogsÄ angi action.destructive_requires_name: true.
- Ăv pĂ„ sikkerhetskopierings- og gjenopprettingsmekanismen pĂ„ forhĂ„nd. Lag for eksempel et skript pĂ„ forhĂ„nd (for eksempel i python) som kan sikkerhetskopiere og gjenopprette.
FĂžrste plass - "Captain Unobvious"
PÄ et tidspunkt la vi merke til en ujevn fordeling av belastningen pÄ nginx oppstrÞms i tilfeller der det var 10+ servere i backend. PÄ grunn av det faktum at round-robin sendte forespÞrsler fra 1. til siste oppstrÞms i rekkefÞlge, og hver nginx reload startet pÄ nytt, mottok de fÞrste oppstrÞmsene alltid flere forespÞrsler enn resten. Som et resultat jobbet de tregere og hele siden led. Dette ble stadig mer merkbart etter hvert som trafikkmengden Þkte. Bare Ä oppdatere nginx for Ä aktivere tilfeldig fungerte ikke - vi mÄ gjÞre om en haug med lua-kode som ikke tok av pÄ versjon 1.15 (i det Þyeblikket). Vi mÄtte lappe vÄr nginx 1.14.2, og introduserte tilfeldig stÞtte i den. Dette lÞste problemet. Denne feilen vinner kategorien "Kaptein Non-Obviousness".
Konklusjoner:
Det var veldig interessant og spennende Ă„ utforske denne feilen).
- Organiser overvÄkingen din slik at den hjelper deg Ä finne slike svingninger raskt. Du kan for eksempel bruke ELK til Ä overvÄke rps pÄ hver backend av hver oppstrÞms, overvÄke responstiden deres fra nginx synspunkt. I dette tilfellet hjalp dette oss med Ä identifisere problemet.
Som et resultat kunne de fleste feilene vÊrt unngÄtt med en mer nÞye tilnÊrming til det du gjorde. Vi mÄ alltid huske Murphys lov: Alt som kan gÄ galt vil gÄ galt, og bygge komponenter basert pÄ det.
Kilde: www.habr.com
