Top fakapov Cyan

Top fakapov Cyan

Labi visiem! 

Mani sauc Ņikita, es esmu Cian inženieru komandas komandas vadÄ«tājs. Viens no maniem pienākumiem uzņēmumā ir lÄ«dz nullei samazināt ar infrastruktÅ«ru saistÄ«to incidentu skaitu ražoÅ”anā.
Tas, kas tiks apspriests tālāk, sagādāja mums daudz sāpju, un Ŕī raksta mērÄ·is ir neļaut citiem cilvēkiem atkārtot mÅ«su kļūdas vai vismaz samazināt to ietekmi. 

Preambula

Sen, kad Cian sastāvēja no monolÄ«tiem un vēl nebija ne miņas no mikropakalpojumiem, mēs izmērÄ«jām resursa pieejamÄ«bu, pārbaudot 3-5 lapas. 

Viņi atbild - viss ir kārtÄ«bā, ja viņi ilgu laiku neatbild - modri. Cik ilgi viņiem bija jābÅ«t bez darba, lai to uzskatÄ«tu par incidentu, cilvēki lēma sanāksmēs. NegadÄ«juma izmeklÄ“Å”anā vienmēr bija iesaistÄ«ta inženieru komanda. Kad izmeklÄ“Å”ana bija pabeigta, viņi uzrakstÄ«ja pēcnāves ziņojumu ā€“ sava veida ziņojumu pa e-pastu Ŕādā formātā: kas noticis, cik ilgi tas ilga, ko mēs darÄ«jām Å”obrÄ«d, ko darÄ«sim turpmāk. 

Vietnes galvenās lapas jeb kā mēs saprotam, ka esam trāpÄ«juÅ”i apakŔā

 
Lai kaut kā izprastu kļūdas prioritāti, esam noteikuÅ”i biznesa funkcionalitātei vissvarÄ«gākās vietnes lapas. Izmantojot tos, mēs uzskaitām veiksmÄ«go/neveiksmÄ«go pieprasÄ«jumu un taimautu skaitu. Šādi mēs novērtējam darbÄ«bas laiku. 

Teiksim, mēs noskaidrojām, ka vietnē ir vairākas Ä«paÅ”i svarÄ«gas sadaļas, kas ir atbildÄ«gas par galveno pakalpojumu - sludinājumu meklÄ“Å”anu un iesniegÅ”anu. Ja neveiksmÄ«go pieprasÄ«jumu skaits pārsniedz 1%, tas ir kritisks incidents. Ja 15 minÅ«Å”u laikā vislabākajā laikā kļūdu lÄ«menis pārsniedz 0,1%, tad arÄ« tas tiek uzskatÄ«ts par kritisku incidentu. Å ie kritēriji attiecas uz lielāko daļu incidentu; pārējie ir ārpus Ŕī raksta darbÄ«bas jomas.

Top fakapov Cyan

Labākie incidenti Cyan

Tātad, mēs noteikti esam iemācÄ«juÅ”ies noteikt faktu, ka noticis incidents. 

Tagad katrs incidents ir sÄ«ki aprakstÄ«ts un atspoguļots Jira eposā. Starp citu: Å”im nolÅ«kam mēs sākām atseviŔķu projektu, ko sauca par FAIL - tajā var izveidot tikai epikus. 

Ja apkopojat visas pēdējo gadu neveiksmes, lÄ«deri ir: 

  • ar mssql saistÄ«ti incidenti;
  • ārēju faktoru izraisÄ«ti incidenti;
  • admin kļūdas.

Apskatīsim sīkāk administratoru kļūdas, kā arī dažas citas interesantas neveiksmes.

Piektā vieta - ā€œSakārtot lietas DNSā€

Tā bija vētraina otrdiena. Mēs nolēmām atjaunot kārtÄ«bu DNS klasterÄ«. 

Es gribēju pārsÅ«tÄ«t iekŔējos DNS serverus no bind uz powerdns, pieŔķirot tam pilnÄ«gi atseviŔķus serverus, kur nav nekā, izņemot DNS. 

Mēs ievietojām vienu DNS serveri katrā mÅ«su DC vietā, un pienāca brÄ«dis pārvietot zonas no saistÄ«Å”anas uz powerdns un pārslēgt infrastruktÅ«ru uz jauniem serveriem. 

PārvietoÅ”anās laikā no visiem serveriem, kas bija norādÄ«ti vietējās keÅ”atmiņas saitēs visos serveros, palika tikai viens, kas atradās datu centrā Sanktpēterburgā. Å is DC sākotnēji tika pasludināts par mums nekritisku, taču pēkŔņi kļuva par vienu neveiksmes punktu.
TieÅ”i Å”ajā pārvietoÅ”anas periodā nogāzās kanāls starp Maskavu un Sanktpēterburgu. Mēs faktiski palikām bez DNS piecas minÅ«tes un atgriezāmies, kad mitinātājs novērsa problēmu. 

Secinājumi:

Ja agrāk, gatavojoties darbam, mēs atstājām novārtā ārējos faktorus, tad tagad arÄ« tie ir iekļauti sarakstā, kam gatavojamies. Un tagad mēs cenÅ”amies nodroÅ”ināt, lai visi komponenti bÅ«tu rezervēti n-2, un darba laikā mēs varam pazemināt Å”o lÄ«meni lÄ«dz n-1.

  • Sastādot rÄ«cÄ«bas plānu, atzÄ«mējiet punktus, kur pakalpojums varētu neizdoties, un iepriekÅ” pārdomājiet scenāriju, kurā viss noritēja ā€œno slikta uz sliktākuā€.
  • Izplatiet iekŔējos DNS serverus pa dažādām Ä£eogrāfiskajām atraÅ”anās vietām/datu centriem/statÄ«viem/slēdžiem/ievadēm.
  • Katrā serverÄ« instalējiet lokālo keÅ”atmiņas DNS serveri, kas novirza pieprasÄ«jumus uz galvenajiem DNS serveriem, un, ja tas nav pieejams, tas atbildēs no keÅ”atmiņas. 

Ceturtā vieta - ā€œLietu sakopÅ”ana Nginksāā€

Kādā jaukā dienā mÅ«su komanda nolēma, ka ā€œmums ar to ir ganaā€, un sākās nginx konfigurāciju pārveidoÅ”anas process. Galvenais mērÄ·is ir izveidot konfigurācijas intuitÄ«vā struktÅ«rā. IepriekÅ” viss bija ā€œvēsturiski izveidotsā€, un tam nebija nekādas loÄ£ikas. Tagad katrs servera_nosaukums ir pārvietots uz tāda paÅ”a nosaukuma failu, un visas konfigurācijas ir sadalÄ«tas mapēs. Starp citu, konfigurācijā ir 253949 rindiņas vai 7836520 rakstzÄ«mes un tā aizņem gandrÄ«z 7 megabaitus. Augstākais struktÅ«ras lÄ«menis: 

Nginx struktūra

ā”œā”€ā”€ 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

Tas kļuva daudz labāks, taču konfigurāciju pārdēvÄ“Å”anas un izplatÄ«Å”anas procesā dažām no tām bija nepareizs paplaÅ”inājums un tās netika iekļautas direktÄ«vā include *.conf. Rezultātā daži saimnieki kļuva nepieejami un atgrieza 301 galvenajā lapā. Sakarā ar to, ka atbildes kods nebija 5xx/4xx, tas netika pamanÄ«ts uzreiz, bet tikai no rÄ«ta. Pēc tam mēs sākām rakstÄ«t testus, lai pārbaudÄ«tu infrastruktÅ«ras komponentus.

Secinājumi: 

  • Pareizi strukturējiet savas konfigurācijas (ne tikai nginx) un pārdomājiet struktÅ«ru projekta agrÄ«nā stadijā. Tādā veidā jÅ«s padarÄ«siet tos saprotamākus komandai, kas savukārt samazinās TTM.
  • Uzrakstiet testus dažiem infrastruktÅ«ras komponentiem. Piemēram: pārbaudiet, vai visiem atslēgas servera_nosaukumiem ir pareizs statuss + atbildes pamatteksts. Pietiks tikai ar dažiem skriptiem, kas pārbauda komponenta pamatfunkcijas, lai trijos no rÄ«ta drudžaini neatcerētos, kas vēl ir jāpārbauda. 

TreŔā vieta - ā€œPēkŔņi Kasandrā pietrÅ«ka vietasā€

Dati nepārtraukti auga, un viss bija kārtÄ«bā lÄ«dz brÄ«dim, kad Cassandra klasterÄ« sāka nedarboties lielo korpusu remonts, jo uz tiem nevarēja strādāt blÄ«vÄ“Å”ana. 

Kādā vētrainā dienā klasteris gandrīz pārvērtās par ķirbi, proti:

  • klasterÄ« bija palikuÅ”i aptuveni 20% no kopējās vietas;
  • Nav iespējams pilnÄ«bā pievienot mezglus, jo tÄ«rÄ«Å”ana nenotiek pēc mezgla pievienoÅ”anas, jo starpsienās trÅ«kst vietas;
  • produktivitāte pakāpeniski samazinās, jo blÄ«vÄ“Å”ana nedarbojas; 
  • Klasteris ir avārijas režīmā.

Top fakapov Cyan

Iziet ā€” mēs pievienojām vēl 5 mezglus bez tÄ«rÄ«Å”anas, pēc tam sākām tos sistemātiski noņemt no klastera un atkārtoti ievadÄ«t, piemēram, tukÅ”us mezglus, kuriem bija beigusies vieta. Tika pavadÄ«ts daudz vairāk laika, nekā mēs vēlētos. Pastāvēja klastera daļējas vai pilnÄ«gas nepieejamÄ«bas risks. 

Secinājumi:

  • Visos cassandra serveros nedrÄ«kst aizņemt vairāk kā 60% vietas katrā nodalÄ«jumā. 
  • Tie ir jāielādē ar ne vairāk kā 50% CPU.
  • Jums nevajadzētu aizmirst par jaudas plānoÅ”anu un rÅ«pÄ«gi pārdomāt katru komponentu, pamatojoties uz tā specifiku.
  • Jo vairāk mezglu klasterÄ«, jo labāk. Serveri, kuros ir neliels datu apjoms, tiek pārslogoti ātrāk, un Ŕādu kopu ir vieglāk atdzÄ«vināt. 

Otrā vieta - ā€œDati pazuda no konsula atslēgas vērtÄ«bu krātuvesā€

Pakalpojumu atklāŔanai mēs, tāpat kā daudzi, izmantojam konsulu. Bet mēs izmantojam arÄ« tās atslēgas vērtÄ«bu monolÄ«ta zili zaļajam izkārtojumam. Tajā tiek glabāta informācija par aktÄ«vajām un neaktÄ«vajām augÅ”tecēm, kas izvietoÅ”anas laikā mainās vietām. Å im nolÅ«kam tika uzrakstÄ«ts izvietoÅ”anas pakalpojums, kas sadarbojās ar KV. Kādā brÄ«dÄ« dati no KV pazuda. Atjaunots no atmiņas, bet ar vairākām kļūdām. Rezultātā augÅ”upielādes laikā augŔējo plÅ«smu slodze tika sadalÄ«ta nevienmērÄ«gi, un mēs saņēmām daudzas 502 kļūdas, jo centrālā procesora aizmugursistēmas tika pārslogotas. Rezultātā mēs no konsula KV pārcēlāmies uz postgresu, no kurienes tos vairs nav tik vienkārÅ”i noņemt.  

Secinājumi:

  • Pakalpojumos bez jebkādas atļaujas nedrÄ«kst bÅ«t dati, kas ir bÅ«tiski vietnes darbÄ«bai. Piemēram, ja jums nav autorizācijas ES, labāk bÅ«tu liegt piekļuvi tÄ«kla lÄ«menÄ« no visur, kur tas nav nepiecieÅ”ams, atstāt tikai nepiecieÅ”amos, kā arÄ« iestatÄ«t action.desstructive_requires_name: true.
  • IepriekÅ” praktizējiet dublÄ“Å”anas un atkopÅ”anas mehānismu. Piemēram, iepriekÅ” izveidojiet skriptu (piemēram, python), kas var dublēt un atjaunot.

Pirmā vieta - "Captain Unobvious" 

Kādā brÄ«dÄ« mēs pamanÄ«jām nevienmērÄ«gu slodzes sadalÄ«jumu nginx augÅ”pusē gadÄ«jumos, kad aizmugursistēmā bija 10+ serveri. Sakarā ar to, ka apļveida robots sÅ«tÄ«ja pieprasÄ«jumus no 1. lÄ«dz pēdējai augÅ”pusei un katra nginx pārlādÄ“Å”ana sākās no jauna, pirmās augÅ”upējās plÅ«smas vienmēr saņēma vairāk pieprasÄ«jumu nekā pārējās. Rezultātā tie darbojās lēnāk un cieta visa vietne. Tas kļuva arvien pamanāmāks, palielinoties satiksmes apjomam. VienkārÅ”a nginx atjaunināŔana, lai iespējotu izlases veidu, neizdevās ā€” mums ir jāpārveido virkne lua koda, kas (tajā brÄ«dÄ«) netika palaista 1.15 versijā. Mums bija jāuzlabo mÅ«su nginx 1.14.2, ievieÅ”ot tajā nejauÅ”u atbalstu. Tas atrisināja problēmu. Å Ä« kļūda iegÅ«st kategoriju ā€œKapteinis, kas nav acÄ«mredzamsā€.

Secinājumi:

Bija ļoti interesanti un aizraujoÅ”i izpētÄ«t Å”o kļūdu). 

  • Organizējiet uzraudzÄ«bu tā, lai tas palÄ«dzētu ātri atrast Ŕādas svārstÄ«bas. Piemēram, varat izmantot ELK, lai uzraudzÄ«tu rps katrā katras augÅ”puses aizmugurē, pārraudzÄ«tu to reakcijas laiku no nginx viedokļa. Å ajā gadÄ«jumā tas mums palÄ«dzēja noteikt problēmu. 

Tā rezultātā lielāko daļu neveiksmju varēja izvairÄ«ties, rÅ«pÄ«gāk pievērÅ”oties tam, ko darāt. Mums vienmēr jāatceras Mērfija likums: Viss, kas var noiet greizi, noies greizi, un veidot komponentus, pamatojoties uz to. 

Avots: www.habr.com

Pievieno komentāru