Topp fakapov Cyan

Topp fakapov Cyan

Med vĂ€nliga hĂ€lsningar! 

Jag heter Nikita, jag Àr teamledare för Cians ingenjörsteam. Ett av mina ansvarsomrÄden pÄ företaget Àr att minska antalet incidenter relaterade till infrastruktur i produktionen till noll.
Det som kommer att diskuteras nedan gav oss mycket smĂ€rta, och syftet med den hĂ€r artikeln Ă€r att förhindra att andra mĂ€nniskor upprepar vĂ„ra misstag eller Ă„tminstone minimerar deras inverkan. 

ingressen

För lĂ€nge sedan, nĂ€r Cian bestod av monoliter, och det inte fanns nĂ„gra antydan om mikrotjĂ€nster Ă€nnu, mĂ€tte vi tillgĂ€ngligheten av en resurs genom att kontrollera 3-5 sidor. 

De svarar - allt Ă€r bra, om de inte svarar pĂ„ lĂ€nge - varna. Hur lĂ€nge de behövde vara lediga frĂ„n jobbet för att det skulle anses vara en incident bestĂ€mdes av folk pĂ„ möten. Ett team av ingenjörer var alltid involverat i utredningen av hĂ€ndelsen. NĂ€r utredningen var klar skrev de en obduktion – en slags rapport via mejl i formatet: vad hĂ€nde, hur lĂ€nge det varade, vad vi gjorde i stunden, vad vi kommer att göra i framtiden. 

Sidans huvudsidor eller hur vi förstÄr att vi har nÄtt botten

 
För att pĂ„ nĂ„got sĂ€tt förstĂ„ prioriteringen av felet har vi identifierat de mest kritiska webbplatssidorna för affĂ€rsfunktionalitet. Med hjĂ€lp av dem rĂ€knar vi antalet lyckade/misslyckade förfrĂ„gningar och timeouts. SĂ„ hĂ€r mĂ€ter vi upptid. 

LÄt oss sÀga att vi fick reda pÄ att det finns ett antal superviktiga delar av webbplatsen som Àr ansvariga för huvudtjÀnsten - att söka och skicka in annonser. Om antalet förfrÄgningar som misslyckas överstiger 1 % Àr detta en kritisk incident. Om felfrekvensen inom 15 minuter under bÀsta sÀndningstid överstiger 0,1 %, anses detta ocksÄ vara en kritisk incident. Dessa kriterier tÀcker de flesta av incidenterna, resten ligger utanför ramen för denna artikel.

Topp fakapov Cyan

Topp bÀsta incidenter Cian

SĂ„ vi har definitivt lĂ€rt oss att faststĂ€lla det faktum att en incident intrĂ€ffade. 

Nu beskrivs varje incident i detalj och Ă„terspeglas i Jira-eposet. Förresten: för detta startade vi ett separat projekt, kallat det FAIL - bara epos kan skapas i det. 

Om du samlar alla misslyckanden under de senaste Ă„ren Ă€r ledarna: 

  • mssql-relaterade incidenter;
  • incidenter orsakade av yttre faktorer;
  • admin fel.

LÄt oss titta mer i detalj pÄ administratörers misstag, liksom nÄgra andra intressanta misslyckanden.

Femte plats - "RĂ€tta ordning i DNS"

Det var en stormig tisdag. Vi bestĂ€mde oss för att Ă„terstĂ€lla ordningen i DNS-klustret. 

Jag ville överföra interna DNS-servrar frĂ„n bind till powerdns, och tilldela helt separata servrar för detta, dĂ€r det inte finns nĂ„got förutom DNS. 

Vi placerade en DNS-server pĂ„ varje plats i vĂ„ra DC:er, och ögonblicket kom att flytta zoner frĂ„n bind till powerdns och byta infrastrukturen till nya servrar. 

Mitt under flytten, av alla servrar som specificerades i lokala cachingbindningar pÄ alla servrar, Äterstod bara en, som fanns i datacentret i St. Petersburg. Denna DC förklarades frÄn början som icke-kritisk för oss, men blev plötsligt en enda punkt av misslyckande.
Det var under denna flyttperiod som kanalen mellan Moskva och St Petersburg föll ner. Vi var faktiskt lĂ€mnade utan DNS i fem minuter och kom upp igen nĂ€r hostaren Ă„tgĂ€rdade problemet. 

Slutsatser:

Om vi ​​tidigare försummade externa faktorer under förberedelserna för arbetet, finns de nu ocksĂ„ med i listan över vad vi förbereder oss för. Och nu strĂ€var vi efter att sĂ€kerstĂ€lla att alla komponenter Ă€r reserverade n-2, och under arbetets gĂ„ng kan vi sĂ€nka denna nivĂ„ till n-1.

  • NĂ€r du gör upp en handlingsplan, markera de punkter dĂ€r tjĂ€nsten kan misslyckas och tĂ€nk igenom ett scenario dĂ€r allt gick "frĂ„n dĂ„ligt till vĂ€rre" i förvĂ€g.
  • Distribuera interna DNS-servrar över olika geolokaliseringar/datacenter/rack/switchar/ingĂ„ngar.
  • Installera en lokal cachande DNS-server pĂ„ varje server, som omdirigerar förfrĂ„gningar till de huvudsakliga DNS-servrarna, och om den inte Ă€r tillgĂ€nglig kommer den att svara frĂ„n cachen. 

FjÀrde plats - "RÀtta ordning i Nginx"

En vacker dag beslutade vĂ„rt team att "vi har fĂ„tt nog av det hĂ€r", och processen med att omstrukturera nginx-konfigurationer började. HuvudmĂ„let Ă€r att fĂ„ konfigurationerna till en intuitiv struktur. Tidigare var allt "historiskt etablerat" och bar ingen logik. Nu har varje server_name flyttats till en fil med samma namn och alla konfigurationer har distribuerats till mappar. Konfigurationen innehĂ„ller förresten 253949 rader eller 7836520 tecken och tar upp nĂ€stan 7 megabyte. Översta strukturnivĂ„: 

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.conf

Det blev mycket bÀttre, men i processen med att döpa om och distribuera konfigurationer hade nÄgra av dem fel tillÀgg och inkluderades inte i include *.conf-direktivet. Som ett resultat blev vissa vÀrdar otillgÀngliga och returnerade 301 till huvudsidan. PÄ grund av att svarskoden inte var 5xx/4xx mÀrktes detta inte direkt utan först pÄ morgonen. Efter det började vi skriva tester för att kontrollera infrastrukturkomponenter.

Slutsatser: 

  • Strukturera dina konfigurationer korrekt (inte bara nginx) och tĂ€nk igenom strukturen i ett tidigt skede av projektet. PĂ„ sĂ„ sĂ€tt kommer du att göra dem mer förstĂ„eliga för teamet, vilket i sin tur kommer att minska TTM.
  • Skriv tester för vissa infrastrukturkomponenter. Till exempel: kontrollera att alla nyckelservernamn ger korrekt status + svarstext. Det rĂ€cker med att bara ha nĂ„gra skript till hands som kontrollerar komponentens grundlĂ€ggande funktioner, för att inte frenetiskt komma ihĂ„g klockan 3 vad mer som behöver kontrolleras. 

Tredje plats - "Plötsligt fick utrymme i Cassandra"

Data vĂ€xte stadigt och allt var bra tills det ögonblick dĂ„ reparationen av stora utrymmen började misslyckas i Cassandra-klustret, eftersom komprimering inte kunde fungera pĂ„ dem. 

En stormig dag förvandlades klungan nÀstan till en pumpa, nÀmligen:

  • det fanns cirka 20 % av det totala utrymmet kvar i klustret;
  • Det Ă€r omöjligt att lĂ€gga till noder helt, eftersom rensningen inte gĂ„r igenom efter att en nod lagts till pĂ„ grund av brist pĂ„ utrymme pĂ„ partitionerna;
  • produktiviteten sjunker gradvis eftersom packning inte fungerar; 
  • Klustret Ă€r i nödlĂ€ge.

Topp fakapov Cyan

Avsluta - vi lade till ytterligare 5 noder utan rensning, varefter vi började systematiskt ta bort dem frĂ„n klustret och gĂ„ in i dem igen, som tomma noder som hade slut pĂ„ utrymme. Det gick Ă„t mycket mer tid Ă€n vi skulle önska. Det fanns en risk för att klustret helt eller delvis skulle vara otillgĂ€ngligt. 

Slutsatser:

  • PĂ„ alla cassandra-servrar bör inte mer Ă€n 60 % av utrymmet pĂ„ varje partition vara upptaget. 
  • De bör laddas med högst 50 % cpu.
  • Du bör inte glömma kapacitetsplaneringen och behöver tĂ€nka igenom den för varje komponent, baserat pĂ„ dess specifika egenskaper.
  • Ju fler noder i klustret, desto bĂ€ttre. Servrar som innehĂ„ller en liten mĂ€ngd data överbelastas snabbare, och ett sĂ„dant kluster Ă€r lĂ€ttare att Ă„teruppliva. 

Andra plats - "Data försvann frÄn konsuls nyckel-vÀrdelagring"

För tjĂ€nsteupptĂ€ckt anvĂ€nder vi, som mĂ„nga, konsul. Men vi anvĂ€nder ocksĂ„ dess nyckel-vĂ€rde för blĂ„grön layout av monoliten. Den lagrar information om aktiva och inaktiva uppströms, som byter plats under driftsĂ€ttning. För detta Ă€ndamĂ„l skrevs en driftsĂ€ttningstjĂ€nst som samverkade med KV. Vid nĂ„got tillfĂ€lle försvann uppgifterna frĂ„n KV. ÅterstĂ€lld frĂ„n minnet, men med ett antal fel. Som ett resultat, under uppladdningen, fördelades belastningen pĂ„ uppströmsströmmarna ojĂ€mnt, och vi fick mĂ„nga 502-fel pĂ„ grund av att backends var överbelastade pĂ„ CPU:n. Som ett resultat av detta flyttade vi frĂ„n konsul KV till postgres, varifrĂ„n det inte lĂ€ngre Ă€r sĂ„ lĂ€tt att ta bort dem.  

Slutsatser:

  • TjĂ€nster utan tillstĂ„nd bör inte innehĂ„lla data som Ă€r kritiska för driften av webbplatsen. Till exempel, om du inte har behörighet i ES, skulle det vara bĂ€ttre att neka Ă„tkomst pĂ„ nĂ€tverksnivĂ„ överallt dĂ€r det inte behövs, lĂ€mna bara de nödvĂ€ndiga, och Ă€ven stĂ€lla in action.destructive_requires_name: true.
  • Öva pĂ„ sĂ€kerhetskopierings- och Ă„terstĂ€llningsmekanismen i förvĂ€g. Gör till exempel ett skript i förvĂ€g (till exempel i python) som kan sĂ€kerhetskopiera och Ă„terstĂ€lla.

Första plats - "Captain Unobvious" 

Vid nÄgot tillfÀlle mÀrkte vi en ojÀmn fördelning av belastningen pÄ nginx uppströms i fall dÀr det fanns 10+ servrar i backend. PÄ grund av det faktum att round-robin skickade förfrÄgningar frÄn 1:a till sista uppströms i ordning, och varje nginx-reload började om, fick de första uppströmsarna alltid fler förfrÄgningar Àn resten, vilket ledde till att de arbetade lÄngsammare och hela sajten led. Detta blev allt mer mÀrkbart i takt med att trafikmÀngden ökade. Att bara uppdatera nginx för att aktivera slumpmÀssigt fungerade inte - vi mÄste göra om ett gÀng lua-kod som inte tog fart pÄ version 1.15 (vid det ögonblicket). Vi var tvungna att patcha vÄr nginx 1.14.2 och introducerade slumpmÀssigt stöd i den. Detta löste problemet. Denna bugg vinner kategorin "Kapten Non-Obviousness".

Slutsatser:

Det var vĂ€ldigt intressant och spĂ€nnande att utforska denna bugg). 

  • Organisera din övervakning sĂ„ att den hjĂ€lper dig att snabbt hitta sĂ„dana fluktuationer. Till exempel kan du anvĂ€nda ELK för att övervaka rps pĂ„ varje backend av varje uppströms, övervaka deras svarstid frĂ„n nginx synvinkel. I det hĂ€r fallet hjĂ€lpte detta oss att identifiera problemet. 

Som ett resultat kunde de flesta av misslyckandena ha undvikits med en mer noggrann instĂ€llning till vad du gjorde. Vi mĂ„ste alltid komma ihĂ„g Murphys lag: Allt som kan gĂ„ fel kommer att gĂ„ fel, och bygga komponenter baserat pĂ„ det. 

KĂ€lla: will.com

LĂ€gg en kommentar