
God til alle!
Mit navn er Nikita, jeg er teamleder for Cians ingeniÞrteam. Et af mine ansvarsomrÄder i virksomheden er at reducere antallet af hÊndelser relateret til infrastruktur i produktionen til nul.
Det, der vil blive diskuteret nedenfor, gav os en masse smerte, og formÄlet med denne artikel er at forhindre andre mennesker i at gentage vores fejl eller i det mindste minimere deres indvirkning.
prĂŠambel
For lang tid siden, da Cian bestod af monolitter, og der endnu ikke var antydninger af mikrotjenester, mĂ„lte vi tilgĂŠngeligheden af ââen ressource ved at tjekke 3-5 sider.
De svarer - alt er i orden, hvis de ikke svarer i lang tid - alarm. Hvor lĂŠnge de skulle have fri fra arbejde, for at det kunne betragtes som en hĂŠndelse, blev besluttet af folk pĂ„ mĂžder. Et team af ingeniĂžrer var altid involveret i efterforskningen af ââhĂŠndelsen. Da undersĂžgelsen var afsluttet, skrev de en obduktion â en slags rapport pĂ„ e-mail i formatet: hvad skete der, hvor lĂŠnge det varede, hvad vi gjorde i Ăžjeblikket, hvad vi vil gĂžre i fremtiden.
Sidens hovedsider eller hvordan vi forstÄr, at vi har ramt bunden
For pÄ en eller anden mÄde at forstÄ fejlens prioritet har vi identificeret de mest kritiske webstedssider for virksomhedsfunktionalitet. Ved at bruge dem tÊller vi antallet af vellykkede/mislykkede anmodninger og timeouts. SÄdan mÄler vi oppetid.
Lad os sige, at vi fandt ud af, at der er en rÊkke supervigtige dele af webstedet, der er ansvarlige for hovedtjenesten - sÞgning og indsendelse af annoncer. Hvis antallet af anmodninger, der mislykkes, overstiger 1 %, er dette en kritisk hÊndelse. Hvis fejlraten inden for 15 minutter i primetime overstiger 0,1 %, betragtes dette ogsÄ som en kritisk hÊndelse. Disse kriterier dÊkker de fleste hÊndelser; resten er uden for denne artikels omfang.

Top bedste hĂŠndelser Cian
SÄ vi har helt sikkert lÊrt at fastslÄ, at der skete en hÊndelse.
Nu er hver hĂŠndelse beskrevet i detaljer og afspejlet i Jira-eposet. Forresten: til dette startede vi et separat projekt, kaldet det FAIL - kun epos kan oprettes i det.
Hvis du samler alle fejlene i de sidste par Är, er lederne:
- mssql-relaterede hĂŠndelser;
- hÊndelser forÄrsaget af eksterne faktorer;
- admin fejl.
Lad os se mere detaljeret pÄ administratorernes fejl samt nogle andre interessante fejl.
Femteplads - "At bringe tingene i orden i DNS"
Det var en stormfuld tirsdag. Vi besluttede at genoprette orden i DNS-klyngen.
Jeg Ăžnskede at overfĂžre interne DNS-servere fra bind til powerdns, og allokere helt separate servere til dette, hvor der ikke er andet end DNS.
Vi placerede én DNS-server pÄ hver lokation af vores DC'er, og tidspunktet kom til at flytte zoner fra bind til powerdns og skifte infrastrukturen til nye servere.
Midt i flytningen, af alle ting servereAf de servere, der var angivet i lokale caching-bindinger, var der kun Ă©n tilbage â den i datacentret i St. Petersborg. Dette datacenter blev oprindeligt erklĂŠret ikke-kritisk for os, men blev pludselig et enkelt fejlpunkt.
Det var i denne overgangsperiode, at kanalen mellem Moskva og Skt. Petersborg gik ned. Vi var reelt uden DNS i fem minutter og kom os igen, da vĂŠrt lĂžste problemerne.
Konklusioner:
Hvis vi tidligere forsÞmte eksterne faktorer under forberedelsen til arbejdet, er de nu ogsÄ inkluderet pÄ listen over, hvad vi forbereder os pÄ. Og nu bestrÊber vi os pÄ at sikre, at alle komponenter er reserveret n-2, og under arbejdet kan vi sÊnke dette niveau til n-1.
- NÄr du udarbejder en handlingsplan, skal du markere de punkter, hvor tjenesten kan fejle, og gennemtÊnke et scenarie, hvor alt gik "fra slemt til vÊrre" pÄ forhÄnd.
- Distribuer interne DNS-servere pÄ tvÊrs af forskellige geolokationer/datacentre/racks/switches/inputs.
- PĂ„ hver server skal du installere en lokal cache-DNS-server, som omdirigerer anmodninger til de vigtigste DNS-servere, og hvis den ikke er tilgĂŠngelig, vil den svare fra cachen.
Fjerdeplads - "At sĂŠtte tingene i orden i Nginx"
En skĂžnne dag besluttede vores team, at "vi har fĂ„et nok af det her", og processen med at omstrukturere nginx-konfigurationer begyndte. HovedmĂ„let er at bringe konfigurationerne til en intuitiv struktur. Tidligere var alt "historisk etableret" og bar ingen logik. Nu er hver server_name blevet flyttet til en fil med samme navn, og alle konfigurationer er blevet distribueret i mapper. Konfigurationen indeholder i Ăžvrigt 253949 linjer eller 7836520 tegn og fylder nĂŠsten 7 megabyte. Ăverste strukturniveau:
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 blev meget bedre, men i processen med at omdĂžbe og distribuere konfigurationer, havde nogle af dem den forkerte udvidelse og var ikke inkluderet i include *.conf-direktivet. Som et resultat blev nogle vĂŠrter utilgĂŠngelige og returnerede 301 til hovedsiden. PĂ„ grund af at svarkoden ikke var 5xx/4xx, blev dette ikke bemĂŠrket med det samme, men fĂžrst om morgenen. Derefter begyndte vi at skrive test for at kontrollere infrastrukturkomponenter.
Konklusioner:
- Strukturer dine konfigurationer korrekt (ikke kun nginx) og tÊnk strukturen igennem pÄ et tidligt stadium af projektet. PÄ denne mÄde vil du gÞre dem mere forstÄelige for teamet, hvilket igen vil reducere TTM.
- Skriv test for nogle infrastrukturkomponenter. For eksempel: kontrol af, at alle nÞgleservernavne giver den korrekte status + svartekst. Det vil vÊre nok kun at have et par scripts ved hÄnden, der kontrollerer komponentens grundlÊggende funktioner, for ikke at huske febrilsk klokken 3, hvad der ellers skal kontrolleres.
Tredjeplads - âPludselig lĂžb tĂžr for plads i Cassandraâ
Dataene voksede stĂžt, og alt var fint indtil det Ăžjeblik, hvor reparationen af ââstore sagsrum begyndte at mislykkes i Cassandra-klyngen, fordi komprimering ikke kunne fungere pĂ„ dem.
En stormfuld dag blev klyngen nĂŠsten til et grĂŠskar, nemlig:
- der var omkring 20% ââaf den samlede plads tilbage i klyngen;
- Det er umuligt at tilfÞje noder fuldt ud, fordi oprydning ikke gÄr igennem efter tilfÞjelse af en node pÄ grund af pladsmangel pÄ partitionerne;
- produktiviteten falder gradvist, da komprimering ikke virker;
- Klyngen er i nĂždtilstand.

Afslut - vi tilfÞjede yderligere 5 noder uden oprydning, hvorefter vi begyndte systematisk at fjerne dem fra klyngen og gÄ ind i dem igen, som tomme noder, der var lÞbet tÞr for plads. Der blev brugt meget mere tid, end vi gerne ville. Der var risiko for delvis eller fuldstÊndig utilgÊngelighed af klyngen.
Konklusioner:
- PÄ alle cassandra-servere bÞr ikke mere end 60% af pladsen pÄ hver partition vÊre optaget.
- De bĂžr ikke indlĂŠses med mere end 50 % cpu.
- Du bÞr ikke glemme alt om kapacitetsplanlÊgning og nÞdt til at gennemtÊnke det for hver komponent, baseret pÄ dens detaljer.
- Jo flere noder i klyngen, jo bedre. Servere, der indeholder en lille mÊngde data, overbelastes hurtigere, og en sÄdan klynge er lettere at genoplive.
Andenplads - "Data forsvandt fra konsul nĂžglevĂŠrdi-lagring"
Til serviceopdagelse bruger vi som mange konsul. Men vi bruger ogsÄ dens nÞglevÊrdi til blÄ-grÞn layout af monolitten. Den gemmer information om aktive og inaktive upstreams, som skifter plads under udrulningen. Til dette formÄl blev der skrevet en implementeringstjeneste, der interagerede med KV. PÄ et tidspunkt forsvandt dataene fra KV. Gendannet fra hukommelsen, men med en rÊkke fejl. Som et resultat, under upload, blev belastningen pÄ upstreams fordelt ujÊvnt, og vi modtog mange 502-fejl pÄ grund af, at backends var overbelastet pÄ CPU'en. Det resulterede i, at vi flyttede fra konsul KV til postgres, hvorfra det ikke lÊngere er sÄ nemt at fjerne dem.
Konklusioner:
- Tjenester uden nogen autorisation bĂžr ikke indeholde data, der er kritiske for driften af ââwebstedet. For eksempel, hvis du ikke har autorisation i ES, ville det vĂŠre bedre at nĂŠgte adgang pĂ„ netvĂŠrksniveau alle steder, hvor det ikke er nĂždvendigt, kun lade de nĂždvendige vĂŠre, og ogsĂ„ indstille action.destructive_requires_name: true.
- Ăv din backup- og gendannelsesmekanisme pĂ„ forhĂ„nd. Lav for eksempel et script pĂ„ forhĂ„nd (for eksempel i python), der kan sikkerhedskopiere og gendanne.
FĂžrstepladsen - âCaptain Unobviousâ
PĂ„ et tidspunkt bemĂŠrkede vi en ujĂŠvn fordeling af belastningen pĂ„ nginx upstreams i tilfĂŠlde, hvor der var 10+ servere i backend. PĂ„ grund af det faktum, at round-robin sendte forespĂžrgsler fra 1. til sidste upstream i rĂŠkkefĂžlge, og hver nginx reload startede forfra, modtog de fĂžrste upstreams altid flere anmodninger end resten. Som et resultat arbejdede de langsommere, og hele siden led. Dette blev mere og mere mĂŠrkbart, efterhĂ„nden som mĂŠngden af ââtrafik steg. Blot at opdatere nginx for at aktivere tilfĂŠldig virkede ikke - vi er nĂždt til at lave en masse lua-kode om, der ikke startede pĂ„ version 1.15 (pĂ„ det tidspunkt). Vi var nĂždt til at lappe vores nginx 1.14.2 og introducerede tilfĂŠldig support i den. Dette lĂžste problemet. Denne fejl vinder kategorien "Captain Non-Obviousness".
Konklusioner:
Det var meget interessant og spĂŠndende at udforske denne fejl).
- Organiser din overvÄgning, sÄ den hjÊlper dig med at finde sÄdanne udsving hurtigt. For eksempel kan du bruge ELK til at overvÄge rps pÄ hver backend af hver upstream, overvÄge deres responstid fra nginx' synspunkt. I dette tilfÊlde hjalp dette os med at identificere problemet.
Som et resultat kunne de fleste af fejlene have vÊret undgÄet med en mere omhyggelig tilgang til det, du lavede. Vi skal altid huske Murphys lov: Alt, der kan gÄ galt, vil gÄ galt, og bygge komponenter baseret pÄ det.
Kilde: www.habr.com
