Kuidas me CIAN-is alistame terabaite logisid

Kuidas me CIAN-is alistame terabaite logisid

Tere kĂ”igile, olen Aleksander, töötan CIAN-is insenerina ning tegele mul sĂŒsteemiadministreerimise ja infrastruktuuri protsesside automatiseerimisega. Ühe eelmise artikli kommentaarides paluti meil rÀÀkida, kust me saame 4 TB logisid pĂ€evas ja mida me nendega teeme. Jah, meil on palju logisid ja nende töötlemiseks on loodud eraldi infrastruktuuri klaster, mis vĂ”imaldab meil kiiresti lahendada probleeme. KĂ€esolevas artiklis rÀÀgin, kuidas me ĂŒhe aastaga selle pidevalt kasvava andmevoogiga töötamiseks kohandasime.

Kust me alustasime

Kuidas me CIAN-is alistame terabaite logisid

Viimased paar aastat on cian.ru koormus kasvanud vĂ€ga kiiresti ning 2018. aasta kolmandaks kvartaliks ulatus saidi kĂŒlastatavus 11,2 miljoni unikaalse kasutajani kuus. Sel ajal kaotasime kriitilistel hetkedel kuni 40% logisid, mistĂ”ttu ei suuda me kiiresti intsidente lahendada ning kulutame neile vĂ€ga palju aega ja vaeva. Samuti ei suutnud me sageli probleemi pĂ”hjust leida ning see kordus mĂ”ne aja pĂ€rast. See oli peavalu, millega tuli midagi ette vĂ”tta.

Sel hetkel kasutasime logide salvestamiseks 10 andmnode Elasticsearch 5.5.2 klastri vaikeseadeid indekseid. See juurutati ĂŒle aasta tagasi populaarse ja taskukohase lahendusena: siis ei olnud logivool nii suur, et oleks mĂ”tet ebastandardeid konfiguratsioone vĂ€lja mĂ”elda. 

Saabunud logide töötlemist tagas Logstash erinevatel portidel viiel Elasticsearch koordineerijatel. Iga indeks, sÔltumata suurusest, koosnes viiest shardist. Toolik oli korraldatud tunni ja pÀeva rotatsiooniks, mistÔttu ilmus klastrisse iga tunni jooksul ligikaudu 100 uut shardit. Kuni logisid oli veel mitte vÀga palju, suutis klaster hakkama saada ja tema seadeid ei mÀrgatud. 

Kiire kasvu probleemid

Generated logide maht kasvas vĂ€ga kiiresti, kuna kaks protsessi kattusid. Ühest kĂŒljest kasvas teenuse kasutajate arv pidevalt. Teiselt poolt hakkasime aktiivselt ĂŒleminekutele mikroteenustele, jagades meie vanad monoliidid C# ja Pythonis. MitukĂŒmmend uusi mikroteenust, mis asendasid osa monoliidist, genereerisid infrastruktuuri klastri jaoks mĂ€rgatavalt rohkem logisid. 

Just scaling led us to a point where the cluster became almost unmanageable. When logs began to come in at a rate of 20,000 messages per second, frequent unnecessary rotations increased the number of shards to 6,000, and over 600 shards were allocated to each node. 

This caused issues with memory allocation, and when a node failed, all shards had to be moved simultaneously, multiplying the traffic and loading the other nodes, making it nearly impossible to write data to the cluster. During this time, we were left without logs. And when there was a problem with serveriga we lost 1/10 of the cluster in general. The large number of small-sized indexes added to the complexity.

Ilma logideta ei saanud me aru sĂŒndmuse pĂ”hjustest ja varem vĂ”i hiljem oleksime samadele probleemidele uuesti jalaga peale astunud, mis meie meeskonna ideoloogias olid vastuvĂ”etamatud, kuna kĂ”ik meie töö mehhanismid on ĂŒles ehitatud just sellele — mitte kordama samu probleeme. Selleks vajasime tĂ€ielikku logide mahtu ja nende edastamist praktiliselt reaalajas, kuna valveinseneride meeskond jĂ€lgis hĂ€ireid mitte ainult mÔÔdikutelt, vaid ka logidelt. Probleemi ulatuse mĂ”istmiseks — toona oli logide kogumaht umbes 2 TB pĂ€evas. 

Seadsime eesmĂ€rgiks — tĂ€ielikult vĂ€listada logide kadumine ja vĂ€hendada nende toimetamise aega ELK-klastrisse maksimaalselt 15 minutini erakorraliste olukordade ajal (sellele numbrile toetudes, saime hiljem sisemises KPI-sse).

Uus rotatsiooni mehhanism ja kuum-soe sÔlmed

Kuidas me CIAN-is alistame terabaite logisid

Klastri muutmist alustasime ElasticSearchi versiooni uuendamisega 5.5.2-st 6.4.3-ni. Meie 5. versioon krahhas jĂ€lle, ja otsustasime selle kustutada ja tĂ€ielikult uuendada — logide pĂ€rast pole enam vahet. Nii et selle ĂŒlemineku sooritasime vaid paaritunni jooksul.

Selle etapi kĂ”ige suurem muudatus oli Apache Kafka juurutamine kolme node'i juures, kus koordinaator toimis vahepevana. SĂ”numite maakler pÀÀstis meid logide kadumisest ElasticSearch’i probleemide korral. Samal ajal lisasime klastrisse 2 node’i ja lĂ€ksime ĂŒle hot-warm arhitektuurile, kus oli kolm "kuuma" node'i, asetatud erinevatesse rack'idesse andmekeskuses. Neilt suunati edasi logid, mida ei tohtinud mingil juhul kaotada — nginx, samuti rakenduste vealogid. ÜlejÀÀnud node’itelt suunati vĂ€iksemad logid — debug, warning jms, samuti liikusid 24 tunni pĂ€rast „olulised“ logid „kuumadelt“ node'ilt.

Et mitte suurendada vĂ€ikeste indeksite arvu, lĂ€ksime ajarotatsioonilt ĂŒle rollover mehhanismile. Foorumites oli palju teavet selle kohta, et suuruse jĂ€rgi rotatsioon on vĂ€ga ebastabiilne, mistĂ”ttu otsustasime kasutada rotatsiooni indeksis olevate dokumentide arvu jĂ€rgi. AnalĂŒĂŒsisime iga indeksi ja registreerisime dokumentide arvu, mille jĂ€rel peaks rotatsioon kĂ€ivituma. Nii saavutame optimaalse shard'i suuruse — mitte rohkem kui 50 GB. 

Klastri optimeerimine

Kuidas me CIAN-is alistame terabaite logisid

Kuid me ei ole probleemidest tĂ€ielikult vabanenud. Kahjuks hakkasid ikkagi ilmuma vĂ€iksed indeksid: need ei saavutanud mÀÀratud mahtu, ei roteerunud ja kustutati globaalsete indeksite puhastamisega, mis kestis ĂŒle kolme pĂ€eva, kuna me eemaldasime kuupĂ€eva jĂ€rgi rotateerimise. See pĂ”hjustas andmete kadumise, kuna indeks klastrist kadus tĂ€ielikult, ja katse kirjutada mitteeksisteerivasse indeksisse rikkus meie haldust logikat, mida kasutasime. Kirjutamiseks mĂ”eldud alias muudeti indeksiks ja see rikkus rollover'i loogikat, mis pĂ”hjustas kontrollimatut mĂ”ningate indeksite kasvu kuni 600 GB. 

NÀiteks pöördemugava konfiguratsiooni jaoks:

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

Rollover aliasi puudumise korral tekkis viga:

ERROR    alias "nginx_write" not found.
ERROR    Failed to complete action: rollover.  : Unable to perform index rollover with alias "nginx_write".

Probleem lahendamine jĂ€i jĂ€rgmisse iteratsiooni ja keskendusime muule kĂŒsimusele: lĂ€ksime ĂŒle Logstashi pull-loogikale, mis tegeleb sisendi logide töötlemisega (ĂŒlekĂŒllastumise teabe eemaldamine ja rikastamine). Panime selle Dockerisse, mida kĂ€itame lĂ€bi docker-compose, seal asub ka logstash-exporter, mis edastab statistikat Prometheusele logivoo operatiivseks jĂ€lgimiseks. Nii andsime endale vĂ”imaluse sujuvalt muuta logstashi instantside arvu, mis vastutavad iga logitĂŒĂŒbi töötlemise eest.

Samal ajal, kui me klastreid tĂ€iustasime, kasvas cian.ru kĂŒlastatavus 12,8 miljoni unikaalse kasutajani kuus. Tulemuseks oli see, et meie muudatused jĂ€id natuke maha tootmisest ja sattusime olukorda, kus 'soojad' nodid ei suuda koormusega hakkama saada ja peatavad kogu logide edastamise. 'KĂŒsimata' andmed saime probleemideta, kuid ĂŒlejÀÀnud kohaletoimetamisse tuli sekkuda ja teostada kĂ€sitsi rollover, et jaotada indeksid ĂŒhtlaselt. 

Klastris on kohaliku docker-compose'i tÔttu keeruline skaleerida ja logstash instantside seadistusi muuta, kuna kÔik toimingud tuli kÀsitsi teha (uute lÔppude lisamiseks tuli kÀsitsi lÀbi kÀia kÔik serverid ja igal pool teha docker-compose up -d).

Logide ĂŒmberjaotamine

Sel aastal septembris jÀtkasime monoliidi lÔhkumist, klastrikoormus kasvas ja logide voog lÀhenes 30 000 sÔnumile sekundis. 

Kuidas me CIAN-is alistame terabaite logisid

JÀrgmist iteratsiooni alustasime riistvara vÀrskendamisega. Viielt koordinaatorilt lÀksime kolmele, vahetasime vÀlja andmeserverid ja sÀÀstsime raha ning mahutavust. Nodide jaoks kasutame kahte konfiguratsiooni: 

  • „Kuumade“ nodide jaoks: E3-1270 v6 / 960Gb SSD / 32 Gb x 3 x 2 (3 Hot1 ja 3 Hot2 jaoks).
  • „Soojade“ nodide jaoks: E3-1230 v6 / 4Tb SSD / 32 Gb x 4.

Sellel iteratsioonil kolisime mikroteenuste access-logi indeksi ĂŒle, mis vĂ”tab sama palju ruumi kui front-end nginx logid, teise kolme „kuuma“ node gruppi. „Kuumades“ nodides hoidame nĂŒĂŒd andmeid 20 tundi ja seejĂ€rel kanname need „soojadesse“ muude logide hulka. 

Me lahendasime vĂ€ikeste indeksite kadumise probleemi nende rotatsiooni ĂŒmberhÀÀlestamisega. NĂŒĂŒd rotatakse indekseid igal juhul iga 23 tunni jĂ€rel, isegi kui andmeid on vĂ€he. See on veidi suurendanud shardide arvu (need on nĂŒĂŒd ligikaudu 800), kuid klastrite jĂ”udluse seisukohalt on see talutav. 

Klastris on nĂŒĂŒd kuus 'kuuma' ja ainult neli 'soe' sĂ”lme. See pĂ”hjustab minimaalset viivitust suuremate ajavahemikega pĂ€ringutes, kuid tulevikus sĂ”lmede arvu suurendamine lahendab selle probleemi.

Selles iteratsioonis lahendasime ka poolautomaatse skaleerimise puudumise probleemi. Selleks kĂ€ivitasime infrastruktuuri Nomad klastriga — analooge, mis juba töötavad meie tootmises. Praegu ei muutu Logstash'i arv automaatselt koormuse pĂ”hjal, kuid jĂ”uame ka sinna.

Kuidas me CIAN-is alistame terabaite logisid

Tulevikuplaanid

Tehtud konfiguratsioon on suurepĂ€raselt skaleeritav ja hetkel salvestame 13,3 TB andmeid — kĂ”ik logid nelja pĂ€eva jooksul, mis on hĂ€davajalik hĂ€irete kiireks analĂŒĂŒsimiseks. Osa loge muudame mÔÔdikiteks, mida kogume Graphite'i. Töötajate töö lihtsustamiseks on meil infrastruktuuri klastrile mĂ”eldud mÔÔdikud ja poolautomaatsete tĂŒĂŒpiliste probleemide parandamise skriptid. PĂ€rast jĂ€rgmise aasta andmete sĂ”lme arvu suurendamist plaanime andmete sĂ€ilitamise perioodi pikendada 4 pĂ€evalt 7 pĂ€evani. See on piisav kiireks tööks, kuna pĂŒĂŒame alati uurida juhtumeid nii kiiresti kui vĂ”imalik, samas kui pikaajaliste uuringute jaoks on meil telemeetriandmed. 

2019. aasta oktoobris kasvas cian.ru kĂŒlastatavus juba 15,3 miljoni unikaalse kasutaja vĂ”rra kuus. See oli tĂ”sine proov arhitektuurilise lahenduse logide edastamiseks. 

Praegu valmistume ElasticSearchi versiooni 7 uuendamiseks. TĂ”si, selleks tuleb uuendada paljude indeksite mapping'ut ElasticSearchis, kuna need on ĂŒle kantud versioonist 5.5 ja kuulutatud deklareerimisele versioonis 6 (versioonis 7 neid lihtsalt pole). See tĂ€hendab, et uuendamise kĂ€igus juhtub kindlasti midagi ootamatut, mis jĂ€tab meid ajutiselt logideta. Versioonilt 7 ootame enim Kibana’d koos tĂ€iustatud liidese ja uute filtritega. 

Oleme saavutanud oma pĂ”hieesmĂ€rgi: enam ei kaota logisid ja oleme vĂ€hendanud infrastruktuuri klastrite seisakuaega 2-3 kokkuvarisemisest nĂ€dalas paaritunniseks hooldusperioodiks kuus. Kogu see töö tootmiskeskkonnas on peaaegu mĂ€rkamatuks jÀÀnud. NĂŒĂŒd saame aga tĂ€pselt mÀÀrata, mis meie teenustega toimub, saame seda kiiresti teha rahulikult ning ei pea muretsema, et logid kaovad. KokkuvĂ”ttes oleme rahul, Ă”nnelikud ja valmistume uute saavutuste nimel, millest rÀÀgime hiljem.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster