Top gabimeve të Cian

Top gabimeve të Cian

Të gjithëve përshëndetje! 

Më quajnë Nikita, unë jam lideri i ekipit të inxhinierëve në Cian. Një nga detyrat e mia në kompani është të ulim numrin e incidenteve që lidhen me infrastrukturën në prodhim, deri në zero.
Ajo që do të flasim më tej na ka sjellë shumë mundime, dhe qëllimi i këtij artikulli është të ndihmojmë të tjerët të mos përsërisin gabimet tona ose të paktën të minimizojnë ndikimin e tyre. 

Preambula

ShumĂ« kohĂ« mĂ« parĂ«, kur Cian pĂ«rbĂ«hej nga monolite dhe nuk kishte asnjĂ« shenjĂ« tĂ« mikroshĂ«rbimeve, ne matnim disponueshmĂ«rinĂ« e burimit duke kontrolluar 3–5 faqe. 

Nëse përgjigjeshin - gjithçka ishte në rregull, nëse nuk përgjigjeshin për një kohë të gjatë - alarmohej. Sa kohë duhet të mos punojnë për t'u konsideruar incident - e vendosnin njerëzit në takime. Ekipi i inxhinierëve gjithmonë merrte pjesë në hetimin e incidentit. Kur hetimi përfundonte, shkruhej një postmortem - një raport i tillë dërguar në email në formatin: çfarë ndodhi, sa zgjati, çfarë bëmë në moment, çfarë do të bëjmë në të ardhmen. 

Faqet kryesore të sitit ose si e kuptojmë se kemi arritur fundin

 
Për të pasur një mënyrë për të kuptuar prioritetin e gabimeve, kemi identifikuar faqet më kritike për funksionalitetin e biznesit. Në to, ne numërojmë numrin e kërkesave të suksesshme/dhe të pasuksesshme dhe kohëve të pritjes. Kështu matim uptime. 

Supozoni se kemi zbuluar se ka një seri seksionesh super të rëndësishme në sit që përgjigjen për shërbimin kryesor - kërkesa dhe dërgimi i njoftimeve. Nëse numri i kërkesave që përfunduan me gabim tejkalon 1%, - ky është një incident kritik. Nëse për një periudhë 15 minutash gjatë orëve të pikut, përqindja e gabimeve tejkalon 0,1% - kjo gjithashtu konsiderohet një incident kritik. Këto kritere mbulojnë shumicën e incidenteve, ndërsa të tjeratShkruhen jashtë kufijve të këtij artikulli.

Top gabimeve të Cian

Të dhënat më të mira të incidenteve të Cian

Kështu, ne sigurisht që kemi mësuar të identifikojmë faktin se një incident ka ndodhur. 

Tani çdo incident është përshkruar në mënyrë të detajuar dhe është reflektuar në epikën Jira. Për ta thënë këtë: për këtë kemi krijuar një projekt të veçantë, e quajtëm FAIL - në të mund të krijohen vetëm epika. 

Nëse të gjitha dështimet e viteve të fundit do të mblidheshin, do të dominonin: 

  • incidencet qĂ« lidhen me mssql;
  • incidencet qĂ« shkaktohen nga faktorĂ« tĂ« jashtĂ«m;
  • gabimet e administratorĂ«ve.

Le të ndalemi më së shumti te gabimet e administratorëve, si dhe disa dështime interesante të tjera.

Vendi i pestë - "Rregullimi i DNS"

Ishte një martë e palakmushme. Ne vendosëm të rregullojmë DNS-klasterin. 

Na lindi dëshira të transferonim serverat e brendshëm të DNS nga bind në powerdns, duke ndarë për këtë servera të veçantë, ku nuk kishte asgjë përveç DNS. 

Vendosëm për një server DNS në çdo lokacion të DC-ve tona dhe arriti momenti i migrimit të zonave nga bind në powerdns dhe kalimi i infrastrukturës në serverat e rinj. 

Në mesin e migrimit, nga të gjitha serveraqë ishin treguar në cache lokal bind në të gjitha serverat, mbeti vetëm një, që ishte në qendrën e të dhënave në Shën Petersburg. Ky DC fillimisht kishte shkruar si jo kritik për ne, por papritur u bë pikë e vetme dështimi.
Në pikërisht atë periudhë migrimi ra lidhja midis Moskës dhe Shën Petersburgut. Ne faktikisht mbetëm pa DNS për pesë minuta dhe u ringritëm kur hostin u zgjidhën problemet. 

Konkluzione:

Nëse më herët ne e neglizhonim faktorët e jashtëm gjatë përgatitjes për punë, tani ata gjithashtu janë përfshirë në listën e asaje për çka përgatitemi. Dhe tani synojmë që të gjithë komponentët të jenë të rezervuar n-2, dhe për kohën e punëve mund të ulim këtë nivel në n-1.

  • GjatĂ« hartimit tĂ« planit tĂ« veprimit, shĂ«nojnĂ« pikat ku shĂ«rbimi mund tĂ« dĂ«shtojĂ«, dhe mendoni skenarĂ« ku gjithçka shkoi "keq pĂ«r mĂ« keq", mĂ« parĂ«.
  • ShpĂ«rndani serverat e DNS tĂ« brendshĂ«m nĂ« lokacione tĂ« ndryshme/gjithsej/kolonat/switch-at/fushtat.
  • NĂ« çdo server vendosni njĂ« server lokal tĂ« caching DNS qĂ« drejton kĂ«rkesat nĂ« serverat kryesorĂ« tĂ« DNS, dhe nĂ« rast tĂ« paaksesueshmĂ«risĂ« sĂ« tij, do tĂ« pĂ«rgjigjet nga cache. 

Vendi i katërt - "Rregullimi i Nginx"

Një ditë të bukur ekipi ynë vendosi se "mjaft është mjaft", dhe filloi procesi i ristrukturimit të konfigurations së nginx. Qëllimi kryesor - të sillte konfigurimet në një strukturë intuitively të kuptueshme. Më parë gjithçka ishte "historikisht e përcaktuar" dhe nuk pati asnjë logjikë. Tani çdo server_name u nxorr në një skedar të quajtur njëlloj dhe ndarë të gjitha konfigurimet sipas dosjeve. për ta thënë këtë - konfigurimi ka në vetvete 253949 rreshta ose 7836520 karaktere dhe zë pothuajse 7 megabajt. Niveli i sipërm i strukturës: 

Struktura Nginx

├── 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

Ka është bërë ndjeshëm më mirë, por gjatë ridhenim dhe shpërndarjes së konfigurimeve, disa prej tyre kishin një zgjedhje të gabuar dhe nuk u përfshinë në direktivën include *.conf. Si pasojë, disa host-e u bënë të pakapshëm dhe kthenin 301 në të parën. Për shkak se kodi i përgjigjes nuk ishte 5xx/4xx, nuk u vërejt menjëherë, por vetëm në mëngjes. Pas kësaj, filluam të shkruajmë teste për të kontrolluar komponentët infrastrukturore.

Konkluzione: 

  • Strukturojini saktĂ« konfigurimet (jo vetĂ«m nginx) dhe mendoni pĂ«r strukturĂ«n nĂ« fazĂ«n e hershme tĂ« projektit. KĂ«shtu do t'i bĂ«ni ato mĂ« tĂ« kuptueshme pĂ«r ekipin, duke ulur kĂ«shtu TTM.
  • PĂ«r disa komponentĂ« infrastrukture, shkruani teste. PĂ«r shembull: kontrolloni qĂ« tĂ« gjithĂ« server_name kyç tĂ« kthejnĂ« statusin e duhur, + trupin e pĂ«rgjigjes. Mjafton tĂ« keni disa skripta tĂ« thjeshtĂ« nĂ« dispozicion qĂ« kontrollojnĂ« funksionet kryesore tĂ« komponentit, pĂ«r tĂ« mos u kapur papritur nĂ« 3 tĂ« mĂ«ngjesit, duke u pyetur se çfarĂ« tjetĂ«r duhet tĂ« kontrolloni. 

Vendi i tretë - "Papritur mbaroi vendi në Cassandra"

Të dhënat rriteshin progresivisht dhe gjithçka ishte mirë deri në momentin kur në klasterin Cassandra filluan të dështojnë riparimet e kaq shumë case-space, sepse nuk mund të përfundonin kompaktimin. 

Një ditë të errët, klasteri pothuajse u shndërrua në një kungull, pikërisht:

  • mbetĂ«n rreth 20% nĂ« total nĂ« klaster;
  • nuk mund tĂ« shtoheshin node tĂ« plota, sepse nuk pĂ«rfundonte pastrimi pas shtimit tĂ« njĂ« node pĂ«r shkak tĂ« mungesĂ«s sĂ« vendit nĂ« pjesĂ«t;
  • performanca po bie pak nga pak, sepse kompaktimi nuk funksionon; 
  • klasteri punon nĂ« modalitetin emergjent.

Top gabimeve të Cian

Zgjedhja - shtuam 5 node pa pastrimin, pas së cilës filluam të nxjerrim ngadalë nga klasteri dhe t'i ri-insertojmë si node të zbrazëta, të cilëve u kishte mbaruar vendi. Koha e shpenzuar ishte shumë më e madhe nga sa do doja. Kishim rrezik për një qasje të pjesshme ose totale të klasterit. 

Konkluzione:

  • NĂ« tĂ« gjitha serverĂ«t Cassandra, nuk duhet tĂ« jetĂ« e zĂ«nĂ« mĂ« shumĂ« se 60% e hapĂ«sirĂ«s nĂ« secilĂ«n pjesĂ«. 
  • Ato nuk duhet tĂ« jenĂ« tĂ« ngarkuara mĂ« shumĂ« se 50% sipas CPU.
  • Nuk duhet tĂ« injoroni planifikimin e kapacitetit dhe duhet ta mendoni atĂ« pĂ«r secilin komponent, sipas specifikave tĂ« tij.
  • Sa mĂ« shumĂ« node nĂ« klaster - aq mĂ« mirĂ«. ServerĂ«t qĂ« mbajnĂ« sasi tĂ« vogla tĂ« tĂ« dhĂ«nave, ri-rikthehen mĂ« shpejt, dhe njĂ« klaster i tillĂ« Ă«shtĂ« mĂ« i lehtĂ« pĂ«r t'u rikuperuar. 

Vendi i dytë - "Të dhënat iƥen nga magazina e çelësave dhe vlerave të consul"

Për zbulimin e shërbimeve ne, si shumë të tjerë, përdorim consul. Por ne e përdorim çelësin dhe vlerën e tij për vendosjen blue-green të monolit. Aty ruhen informacionet mbi upstream-at aktivë dhe jo aktivë, të cilat ndërruan vendet gjatë deploy-it. Për këtë është shkruar një shërbim vendosjeje, i cili ndërvepron me KV. Në një moment, të dhënat nga KV u zhdukën. I rikuperuam nga memoria, por me disa gabime. Si pasojë, gjatë vendosjes, ngarka në upstream-at u shpërnda në mënyrë të pandjeshme, dhe morëm shumë gabime 502 për shkak të mbingarkesës së backend-ëve sipas CPU. Në fund kemi kaluar nga consul KV në postgres, nga ku t'i heqësh nuk është aq e lehtë.  

Konkluzione:

  • ShĂ«rbimet pa ndonjĂ« lloj autorizimi nuk duhet tĂ« pĂ«rmbajnĂ« tĂ« dhĂ«na kritikĂ« pĂ«r funksionimin e faqes. PĂ«r shembull, nĂ«se nuk keni autorizim nĂ« ES - do ishte mĂ« mirĂ« tĂ« ndalonit qasje nĂ« nivelin e rrjetit nga çdo vend ku nuk nevojitet, tĂ« linit vetĂ«m ato tĂ« nevojshme, si dhe tĂ« bĂ«nit action.destructive_requires_name: true.
  • PĂ«rgatitni mekanizmin e ruajtjes dhe rikuperimit paraprakisht. PĂ«r shembull, pĂ«rgatitni paraprakisht njĂ« skript (pĂ«r shembull, nĂ« Python), i cili di tĂ« bĂ«jĂ« back-up dhe rikuperimin.

Vendi i parë - "Kapiteni i paditur" 

NĂ« njĂ« moment, vĂ«mĂ« re njĂ« shpĂ«rndarje tĂ« paekuilibruar tĂ« ngarkesĂ«s nĂ« nginx upstream kur kishte 10+ servera nĂ« backend. PĂ«r shkak se round-robin drejtonte kĂ«rkesat nga upstreami i parĂ« deri tek ai i fundit nĂ« rend, dhe çdo reload i nginx fillonte nga fillimi, kĂ«rkesat gjithmonĂ« i binin mĂ« shumĂ« upstreamĂ«ve tĂ« parĂ« se sa atyre tĂ« tjerĂ«ve. Si pasojĂ« — ata punonin mĂ« ngadalĂ« dhe i gjithĂ« siti vuante. Kjo bĂ«hej gjithnjĂ« e mĂ« evidente me rritjen e trafikut. Thjesht pĂ«r tĂ« pĂ«rditĂ«suar nginx pĂ«r tĂ« pĂ«rfshirĂ« random, kjo nuk funksionoi — duhej tĂ« ri-shkruhej njĂ« pĂ«rmbledhje e madhe e kodit lua, i cili nuk funksionoi nĂ« versionin 1.15 (nĂ« atĂ« kohĂ«). Duhej tĂ« patch-ojmĂ« nginx 1.14.2, duke e pĂ«rfshirĂ« mbĂ«shtetje pĂ«r random. Kjo zgjidhi problemin. Ky defekt Ă«shtĂ« fitues nĂ« kategorinĂ« 'kapiteni i padukshĂ«m'.

Konkluzione:

Ishte shumë interesante dhe tërheqëse të hulumtoja këtë defekt). 

  • NdĂ«rtoni monitorimin nĂ« njĂ« mĂ«nyrĂ« qĂ« tĂ« ndihmojĂ« nĂ« identifikimin e kĂ«tij lloj fluktuacionesh shpejt. PĂ«r shembull, mund tĂ« pĂ«rdorni ELK pĂ«r tĂ« vĂ«shtruar rps pĂ«r çdo backend tĂ« çdo upstream, duke ndjekur kohĂ«n e tyre tĂ« pĂ«rgjigjes nga kĂ«ndvĂ«shtrimi i nginx. NĂ« kĂ«tĂ« rast, kjo na ndihmoi tĂ« zbulojmĂ« problemin. 

Si rezultat, shumica e dështimeve mund të ishin evituar me një qasje më të kujdesshme ndaj asaj që po bën. Duhet gjithmonë të mbani mend ligjin e Murphy-t: Anything that can go wrong will go wrong, dhe të ndërtoni komponentët duke u udhëhequr prej tij. 

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster