Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Përshëndetje të gjithëve, unë quhem Aleksandër, punoj në CIAN si inxhinier dhe merrem me administrimin e sistemeve dhe automatizimin e proceseve infrastrukturore. Në komentet për një nga artikujt e kaluar, na u kërkua të tregojmë se nga vijmë 4 TB log-e në ditë dhe çfarë bëjmë me to. Po, kemi shumë log-e, dhe për përpunimin e tyre kemi krijuar një klaster infrastrukture të veçantë që na lejon të zgjidhim shpejt probleme. Në këtë artikull do të flas për mënyrën se si e kemi adaptuar atë për një vit për të punuar me rrjedhën në rritje të të dhënave.

Nga kemi filluar

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Gjatë disa viteve të fundit, ngarkesa në cian.ru është rritur shumë shpejt, dhe deri në tremujorin e tretë të vitit 2018, vizitueshmëria e burimit arriti në 11.2 milion përdorues unikë në muaj. Në atë kohë, në momente kritike humbisnim deri në 40% të log-eve, duke na penguar të menaxhonim shpejt incidentet dhe duke shpenzuar shumë kohë dhe energji për t'i zgjidhur ato. Gjithashtu, shpesh nuk mund të gjenim shkakun e problemit, dhe ai përsëritej pas një kohe. Kjo ishte një situatë e vështirë që duhej të zgjidhnim.

Në atë kohë, për ruajtjen e log-eve përdornim një klaster prej 10 nodash të dhënash me ElasticSearch version 5.5.2 me parametra standard të indekseve. E implementuam atë më shumë se një vit më parë si një zgjidhje të njohur dhe të përballueshme: atëherë fluksi i log-eve nuk ishte aq i madh, dhe nuk kishte kuptim të shpiknim konfiguracione jo standarde. 

Përpunimin e log-eve të ardhshme e siguronim me Logstash në porte të ndryshme në pesë koordinatorë të ElasticSearch. Një indeks, pavarësisht nga madhësia, përbëhej prej pesë shardesh. U organizua rotacioni çdo orë dhe çdo ditë, si rezultat çdo orë në klaster ndodhnin rreth 100 sharde të reja. Ndërsa log-eve nuk ishin aq shumë, klasteri përballonte dhe askush nuk kishte vënë re parametrat e tij. 

Problemet nga rritja e shpejtë

Volumi i log-eve të gjeneruara rritej shumë shpejt, sepse dy procese përplasnin njëri-tjetrin. Nga njëra anë, numri i përdoruesve të shërbimit po rritej. Nga ana tjetër, ne filluam të kalojmë aktivisht në një arkitekturë mikroshërbimesh, duke ndarë monolitët tanë të vjetër në C# dhe Python. Disa dhjetëra mikroshërbime të reja, që zëvendësuan pjesë të monolitit, gjeneronin ndjeshëm më shumë log-e për klasterin infrastruktural. 

Pikërisht shkallëzimi na çoi në një situatë ku klasteri u bë praktikisht i pakontrolluar. Kur log-et filluan të vinin me shpejtësi 20,000 mesazhe në sekondë, rotacionet e shpeshta të padobishme rritën numrin e shardeve në 6,000, ndërsa për çdo nod kishte më shumë se 600 sharde. 

Kjo e çonte në probleme me ndarjen e memorie operativ dhe në momentin e rënies së një nodi fillonte një kalim i menjëhershëm i të gjithë shardeve, duke shumëfishuar trafikun dhe ngarkuar nodet e tjera, gjë që e bënte praktikisht të pamundur regjistrimin e të dhënave në klaster. Dhe në atë periudhë mbetëm pa log-e. Në rastin e një problemi me serverin humbnim 1/10 e klasterit në përgjithësi. Një numër i madh indekseve të vogla shtonte vështirësi.

Pa log-e nuk kuptonim arsyet e incidentit dhe mund tĂ« pĂ«rballeshim pĂ«rsĂ«ri me tĂ« njĂ«jtĂ«n problematikĂ«, ndonĂ«se ne nĂ« ideologjinĂ« tonĂ« nuk pranojmĂ« qĂ« ndodhin tĂ« njĂ«jtat probleme. Prandaj na duhej volume tĂ« plotĂ« log-esh dhe dorĂ«zimi i tyre pothuajse nĂ« kohĂ« reale, pasi ekipi i inxhinierĂ«ve pĂ«rgjonte sinjalizimet jo vetĂ«m nga metrikat, por edhe nga log-Ă«t. PĂ«r tĂ« kuptuar sasinĂ« e problemit — nĂ« atĂ« kohĂ« volumi total i log-eve arrinte rreth 2 TB nĂ« ditĂ«. 

Ne vendosĂ«m njĂ« qĂ«llim — tĂ« eliminojmĂ« plotĂ«sisht humbjen e log-eve dhe tĂ« shkurtuam kohĂ«n e dorĂ«zimit tĂ« tyre nĂ« klasterin ELK deri nĂ« maksimum 15 minuta gjatĂ« forcon e jashtĂ«zakonshme (kjo ishte numri nĂ« tĂ« cilin ne u mbĂ«shtetĂ«m si KPI tĂ« brendshĂ«m mĂ« vonĂ«).

Mekanizmi i ri i rotacionit dhe nodet hot-warm

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Transformimi i klasterit e filluam me pĂ«rditĂ«simin e versionit tĂ« ElasticSearch nga 5.5.2 nĂ« 6.4.3. Klasteri ynĂ« i versionit 5 ra pĂ«rsĂ«ri, dhe ne vendosĂ«m ta fiknim dhe ta azhurnonim plotĂ«sisht — gjithsesi nuk kishim log-e. Pra, kĂ«tĂ« kalim e realizuam brenda disa orĂ«ve.

Transformimi mĂ« i madh nĂ« kĂ«tĂ« fazĂ« ishte implementimi nĂ« tre nodet me njĂ« koordinatator si njĂ« tampon tĂ« pĂ«rkohshĂ«m Apache Kafka. Brokeri i mesazheve na shpĂ«toi nga humbja e log-eve gjatĂ« problemeve me ElasticSearch. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, ne shtuam 2 nodĂ« nĂ« klaster dhe kaluam nĂ« arkitekturĂ«n hot-warm me tre nodĂ« "tĂ« nxehta", tĂ« vendosura nĂ« rafte tĂ« ndryshme nĂ« qendrat e tĂ« dhĂ«nave. NĂ« to dirigjuam log-et qĂ« nuk mund tĂ« humbasim nĂ«n asnjĂ« rrethanĂ« — nginx, si dhe log-et e gabimeve tĂ« aplikacioneve. NĂ« nodet e tjera kalonin logĂ«t minorĂ« — debug, warning, etj., ndĂ«rsa pas 24 orĂ«sh kalonin "logĂ«t e rĂ«ndĂ«sishĂ«m" nga nodet "e nxehta".

PĂ«r tĂ« shmangur rritjen e numrit tĂ« indekseve tĂ« vegjĂ«l, ne kaluam nga rotacioni nĂ« kohĂ« nĂ« mekanizmin rollover. NĂ« forume kishte shumĂ« informacion qĂ« rotacioni sipas madhĂ«sisĂ« sĂ« indeksit ishte shumĂ« i pasigurt, prandaj ne vendosĂ«m tĂ« pĂ«rdorim rotacionin sipas numrit tĂ« dokumenteve nĂ« indeks. Anlizuam çdo indeks dhe regjistruam numrin e dokumenteve, pas tĂ« cilit duhet tĂ« aktivizohej rotacioni. NĂ« kĂ«tĂ« mĂ«nyrĂ« arritĂ«m njĂ« madhĂ«si optimale sharde — jo mĂ« shumĂ« se 50 GB. 

Optimizimi i klasterit

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Megjithatë, ne nuk u shpëtuam plotësisht problemeve. Fatkeqësisht, akoma shfaqeshin indekse të vogla: ato nuk arrinin volumin e caktuar, nuk rotatoeshin dhe hiqeshin me pastrimin global të indekseve mbi tre ditë, sepse ne hoqëm rotacionin sipas datës. Kjo çonte në humbje të të dhënave, pasi indeksi nga klasteri zhdukej plotësisht, dhe tentimi për të shkruar në një indeks që nuk ekzistonte prishte logjikën e curator-it, të cilin e përdornim për menaxhim. Alias për të shkruar shndërrohej në indeks dhe prishte logjikën e rollover-it, duke shkaktuar një rritje të pakontrolluar të disa indekseve deri në 600 GB. 

Për shembull, për konfigurimin e rotacionit:

curator-elk-rollover.yaml

---
actions:
  1:
    action: rollover
    options:
      name: "nginx_write"
      conditions:
        max_docs: 100000000
  2:
    action: rollover
    options:
      name: "python_error_write"
      conditions:
        max_docs: 10000000

Në mungesë të rollover alias, shfaqej një gabim:

ERROR     alias "nginx_write" not found.
ERROR     Failed to complete action: rollover.  <type 'exceptions.ValueError'>: Unable to perform index rollover with alias "nginx_write".

Zgjidhjen e kësaj probleme e lamë për iteratën e ardhshme dhe u angazhuam me një çështje tjetër: kaluam në logjikën pull të funksionimit të Logstash, që merret me përpunimin e logeve të ardhshme (heqja e informacionit të tepërt dhe pasurimi). E vendosëm atë në docker, të cilin e aktivizojmë përmes docker-compose, po aty e vendosëm logstash-exporter, i cili jep metrika në Prometheus për monitorimin operativ të fluksit të logeve. Kështu i dhamë vetes mundësinë të ndryshonim me lehtësi numrin e instancave të logstash që ishin përgjegjëse për përpunimin e çdo lloji logu.

Ndërkohë që po përmirësonim klasterin, vizita në cian.ru u rrit në 12,8 milion përdorues unikë në muaj. Si rezultat, transformimet tona paksa nuk po përputheshin me ndryshimet në prodhim, dhe përballeshim me faktin që nodet "të ngrohta" nuk po përballonin ngarkesën dhe ngadalësonin të gjithë dërgimin e logeve. Të dhënat "të nxehta" i merrnim pa u prishur, por për dërgimin e të tjerave duhej të ndërhyhej dhe të bëhej rollover manual, për të shpërndarë në mënyrë të barabartë indekset. 

Në të njëjtën kohë, shkallëzimi dhe ndryshimi i cilësimeve të instancave të logstash në klaster u vështirësuan nga fakti se kjo ishte një docker-compose vendor, dhe të gjitha veprimet kryheshin me duar (për të shtuar përfundimet e reja duhej të kalonim me duar në të gjitha serverët dhe të bënim docker-compose up -d kudo).

Rredistribuimi i logeve

Në shtator të këtij viti, ne ende vazhdojmë të ndajmë monolit, ngarkesa në klaster po rritej, dhe fluksi i logeve po afrohej në 30 mijë mesazhe në sekondë. 

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Iteratën e ardhshme e filluam me përditësimin e harduerit. Nga pesë koordinatorë kaluam në tre, zëvendësuam nodet e të dhënave dhe fituam si në para ashtu edhe në kapacitetin e ruajtjes. Për nodet përdorim dy konfiguracione: 

  • PĂ«r nodet "tĂ« nxehta": E3-1270 v6 / 960Gb SSD / 32 Gb x 3 x 2 (3 pĂ«r Hot1 dhe 3 pĂ«r Hot2).
  • PĂ«r nodet "tĂ« ngrohta": E3-1230 v6 / 4Tb SSD / 32 Gb x 4.

Në këtë iteratë ne e nxorrëm indeksin me loget e qasjes së mikroshërbimeve, i cili zë të njëjtin volum si loget e nginx-it të frontit, në grupin e dytë prej tre nodësh "të nxehta". Të dhënat në nodet "të nxehta" tani i ruajmë për 20 orë, dhe pastaj i kalojmë te "të ngrohtat" për loget e tjera. 

Problemin e zhdukjes së indekseve të vogla e zgjidhëm duke rregulluar rotacionin e tyre. Tani indekset rotatohen në çdo rast çdo 23 orë, edhe nëse atje ka pak të dhëna. Kjo pak rriti numrin e shardeve (tani janë rreth 800), por nga këndvështrimi i performancës së klasterit, është tolerueshme. 

Si rezultat, klasteri përfundoi me gjashtë nodet "të nxehta" dhe vetëm katër "të ngrohta". Kjo shkakton një vonesë të vogël në kërkesat për intervale të mëdha kohore, por rritja e numrit të nodëve në të ardhmen do t'i zgjidhë këtë problem.

NĂ« kĂ«tĂ« iteratĂ« e corrigjim edhe problemin e mungesĂ«s sĂ« shkallĂ«zimit gjysmĂ« automatiku. PĂ«r kĂ«tĂ«, ne zhvilluam njĂ« klasĂ«r infrastrukturore Nomad — tĂ« ngjashĂ«m me atĂ« qĂ« tashmĂ« Ă«shtĂ« zhvilluar tek ne nĂ« prodhim. NdĂ«rkohĂ«, numri i Logstash nuk ndryshon automatikisht nĂ« varĂ«si tĂ« ngarkesĂ«s, por do t'ia arrijmĂ« edhe kĂ«tij.

Si i zbutĂ«m terabyte-et e logĂ«ve nĂ« CIАН

Planet për të ardhmen

Konfigurimi i realizuar shkallëzohet shkëlqyer, dhe tani ne ruajmë 13.3 TB të dhënash - të gjitha loget për 4 ditët e kaluara, që janë të domosdoshme për analizimin urgjent të alarmeve. Një pjesë e logeve i transformojmë në metrika, të cilat i grumbullojmë në Graphite. Për të lehtësuar punën e inxhinierëve, kemi metrika për klasterin infra-strukturor dhe skripte për riparimin gjysmë-automatik të problemeve tipike. Pasi të rritet numri i nodëve të të dhënave, që është planifikuar për vitin e ardhshëm, ne do të kalojmë në ruajtjen e të dhënave nga 4 në 7 ditë. Kjo do të jetë e mjaftueshme për operimin efikas, pasi gjithmonë përpiqemi të hetojmë incidentet sa më shpejt të jetë e mundur, dhe për hetimet afatgjata kemi të dhëna telemetrie. 

Në tetor 2019, numri i vizitorëve të cian.ru u rrit në 15.3 milion përdorues unik në muaj. Kjo ishte një provë e rëndësishme për zgjidhjen arkitekturore të dorëzimit të logeve. 

Tani po përgatitemi të azhurnojmë ElasticSearch në versionin 7. Megjithatë, për këtë na nevojitet të azhurnojmë mapping-un e shumë indekseve në ElasticSearch, pasi ato u transferuan nga versioni 5.5 dhe u shpallën si të tërhequra në versionin 6 (në versionin 7 ato thjesht nuk ekzistojnë). Dhe kjo do të thotë se gjatë procesit të azhurnimit patjetër do të ketë ndonjë forcë më të madhe, e cila përkohësisht do të na lë pa loge. Nga versioni 7 presim më shumë nga Kibana me ndërfaqen e përmirësuar dhe filtrat e rinj. 

Ne arritëm qëllimin kryesor: ndalëm humbjen e logeve dhe e zvogëluam kohën pa funksion të klasterit infra-strukturor nga 2-3 rënie në javë në disa orë punë shërbimi në muaj. E gjithë kjo punë në prodhim është pothuajse e padukshme. Megjithatë, tani mund të përcaktojmë me saktësi se çfarë po ndodh me shërbimin tonë, mund ta bëjmë këtë shpejt në një ambient të qetë dhe nuk shqetësohemi se loget do të humbasin. Në përgjithësi, jemi të kënaqur, të lumtur dhe po përgatitemi për suksese të reja, për të cilat do të flasim më vonë.

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