Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Sveiki visiem, mani sauc Aleksandrs, es strādāju CIAN par inženieri un esmu saistÄ«ts ar sistēmu administrÄ“Å”anu un infrastruktÅ«ras procesu automatizāciju. Komentāros pie viena no iepriekŔējiem rakstiem mums lÅ«dza pastāstÄ«t, kur mēs saņemam 4 TB baļķu dienā un ko mēs ar tiem darām. Jā, mums ir daudz žurnālu, un to apstrādei ir izveidots atseviŔķs infrastruktÅ«ras klasteris, kas ļauj ātri atrisināt problēmas. Å ajā rakstā es runāŔu par to, kā mēs to gada laikā pielāgojām darbam ar arvien pieaugoÅ”u datu plÅ«smu.

Kur mēs sākām?

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Dažu pēdējo gadu laikā cian.ru slodze ir augusi ļoti strauji, un lÄ«dz 2018. gada treÅ”ajam ceturksnim resursu trafika sasniedza 11.2 miljonus unikālo lietotāju mēnesÄ«. TobrÄ«d kritiskos brīžos pazaudējām lÄ«dz pat 40% baļķu, tāpēc nevarējām operatÄ«vi tikt galā ar incidentiem un veltÄ«jām daudz laika un pūļu to risināŔanai. Mēs arÄ« bieži nevarējām atrast problēmas cēloni, un pēc kāda laika tā atkārtojās. Tā bija elle, un kaut kas bija jādara lietas labā.

Tolaik žurnālu glabāŔanai izmantojām 10 datu mezglu kopu ar ElasticSearch versiju 5.5.2 ar standarta indeksa iestatÄ«jumiem. Tas tika ieviests pirms vairāk nekā gada kā populārs un pieņemams risinājums: tad baļķu plÅ«sma nebija tik liela, nebija jēgas izdomāt nestandarta konfigurācijas. 

IenākoÅ”o žurnālu apstrādi nodroÅ”ināja Logstash dažādos piecu ElasticSearch koordinatoru portos. Viens indekss neatkarÄ«gi no izmēra sastāvēja no piecām lauskas. Tika organizēta stundu un dienas rotācija, kā rezultātā katru stundu klasterÄ« parādÄ«jās apmēram 100 jaunas lauskas. Lai gan žurnālu nebija ļoti daudz, klasteris tika galā labi, un neviens nepievērsa uzmanÄ«bu tā iestatÄ«jumiem. 

Straujas izaugsmes izaicinājumi

Izveidoto baļķu apjoms pieauga ļoti ātri, jo divi procesi pārklājās viens ar otru. No vienas puses, pieauga pakalpojuma lietotāju skaits. No otras puses, mēs sākām aktÄ«vi pāriet uz mikropakalpojumu arhitektÅ«ru, zāģējot savus vecos monolÄ«tus C# un Python. Vairāki desmiti jaunu mikropakalpojumu, kas nomainÄ«ja monolÄ«ta daļas, radÄ«ja ievērojami vairāk žurnālu infrastruktÅ«ras klasterim. 

Tā bija mērogoÅ”ana, kas noveda mÅ«s lÄ«dz vietai, kur klasteris kļuva praktiski nevadāms. Kad žurnāli sāka pienākt ar ātrumu 20 tÅ«kstoÅ”i ziņojumu sekundē, bieža bezjēdzÄ«ga rotācija palielināja lauskas skaitu lÄ«dz 6 tÅ«kstoÅ”iem, un vienā mezglā bija vairāk nekā 600 lauskas. 

Tas radÄ«ja problēmas ar RAM pieŔķirÅ”anu, un, kad mezgls avarēja, visas Ŕķembas sāka kustēties vienlaicÄ«gi, palielinot trafiku un ielādējot citus mezglus, kas padarÄ«ja gandrÄ«z neiespējamu datu ierakstÄ«Å”anu klasterÄ«. Un Å”ajā periodā mēs palikām bez baļķiem. Un, ja radās problēma ar serveri, mēs bÅ«tÄ«bā zaudējām 1/10 no klastera. Liels skaits mazu indeksu palielināja sarežģītÄ«bu.

Bez baļķiem nesapratām incidenta iemeslus un agrāk vai vēlāk varējām atkal uzkāpt uz tā paÅ”a grābekļa, un mÅ«su komandas ideoloÄ£ijā tas bija nepieņemami, jo visi mÅ«su darba mehānismi ir izstrādāti, lai darÄ«tu tieÅ”i pretējo - nekad neatkārtotos. tās paÅ”as problēmas. Lai to izdarÄ«tu, mums bija nepiecieÅ”ams pilns žurnālu apjoms un to piegāde gandrÄ«z reāllaikā, jo dežurējoÅ”u inženieru komanda uzraudzÄ«ja brÄ«dinājumus ne tikai no metrikas, bet arÄ« no žurnāliem. Lai saprastu problēmas mērogu, tobrÄ«d kopējais žurnālu apjoms bija aptuveni 2 TB dienā. 

Mēs izvirzÄ«jām mērÄ·i nepārvaramas varas apstākļos pilnÄ«bā novērst baļķu zudumus un samazināt to piegādes laiku ELK klasterim lÄ«dz maksimāli 15 minÅ«tēm nepārvaramas varas apstākļos (vēlāk mēs paļāvāmies uz Å”o skaitli kā iekŔējo KPI).

Jauns rotācijas mehānisms un karsti silti mezgli

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Mēs sākām klastera konvertÄ“Å”anu, atjauninot ElasticSearch versiju no 5.5.2 uz 6.4.3. Atkal mÅ«su 5. versijas klasteris nomira, un mēs nolēmām to izslēgt un pilnÄ«bā atjaunināt ā€” joprojām nav neviena žurnāla. Tāpēc mēs veicām Å”o pāreju tikai pāris stundu laikā.

Vislielākā mēroga transformācija Å”ajā posmā bija Apache Kafka ievieÅ”ana trÄ«s mezglos ar koordinatoru kā starpposma buferi. Ziņojumu brokeris pasargāja mÅ«s no žurnālu zaudÄ“Å”anas ElasticSearch problēmu laikā. Tajā paŔā laikā mēs klasterim pievienojām 2 mezglus un pārgājām uz karsto un silto arhitektÅ«ru ar trim ā€œkarstajiemā€ mezgliem, kas atrodas dažādos datu centra plauktos. Mēs novirzÄ«jām uz viņiem žurnālus, izmantojot masku, kuru nekādā gadÄ«jumā nevajadzētu pazaudēt - nginx, kā arÄ« lietojumprogrammu kļūdu žurnālus. Uz atlikuÅ”ajiem mezgliem tika nosÅ«tÄ«ti nelieli žurnāli - atkļūdoÅ”ana, brÄ«dinājums utt., Un pēc 24 stundām tika pārsÅ«tÄ«ti ā€œsvarÄ«giā€ žurnāli no ā€œkarstajiemā€ mezgliem.

Lai nepalielinātu mazo indeksu skaitu, no laika rotācijas pārgājām uz apgāŔanās mehānismu. Forumos bija daudz informācijas, ka rotācija pēc indeksa lieluma ir ļoti neuzticama, tāpēc nolēmām izmantot rotāciju pēc indeksā esoÅ”o dokumentu skaita. Mēs analizējām katru indeksu un reÄ£istrējām dokumentu skaitu, pēc kura jādarbojas rotācijai. Tādējādi esam sasnieguÅ”i optimālo shard izmēru - ne vairāk kā 50 GB. 

Klasteru optimizācija

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Tomēr mēs neesam pilnÄ«bā atbrÄ«vojuÅ”ies no problēmām. Diemžēl joprojām parādÄ«jās nelieli indeksi: tie nesasniedza norādÄ«to apjomu, netika pagriezti un tika izdzēsti, globāli tÄ«rot indeksus, kas vecāki par trim dienām, jo ā€‹ā€‹mēs noņēmām rotāciju pēc datuma. Tas izraisÄ«ja datu zudumu, jo indekss no klastera pilnÄ«bā pazuda, un mēģinājums rakstÄ«t neesoŔā indeksā pārkāpa kuratora loÄ£iku, kuru izmantojām pārvaldÄ«bai. RakstÄ«Å”anas aizstājvārds tika pārveidots par indeksu un salauza apgāŔanās loÄ£iku, izraisot dažu indeksu nekontrolētu pieaugumu lÄ«dz 600 GB. 

Piemēram, rotācijas konfigurācijai:

сurator-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

Ja nebija apgāŔanās aizstājvārda, radās kļūda:

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

Mēs atstājām Ŕīs problēmas risinājumu nākamajai iterācijai un pievērsāmies citai problēmai: pārgājām uz Logstash vilkÅ”anas loÄ£iku, kas apstrādā ienākoÅ”os žurnālus (noņemot nevajadzÄ«go informāciju un bagātinot). Mēs ievietojām to dockerā, kuru palaižam, izmantojot docker-compose, un tur ievietojām arÄ« logstash-exporter, kas nosÅ«ta metriku uz Prometheus žurnālu straumes operatÄ«vai uzraudzÄ«bai. Tādā veidā mēs devām sev iespēju vienmērÄ«gi mainÄ«t logstash gadÄ«jumu skaitu, kas ir atbildÄ«gi par katra veida žurnālu apstrādi.

Kamēr mēs uzlabojām kopu, cian.ru trafika palielinājās lÄ«dz 12,8 miljoniem unikālo lietotāju mēnesÄ«. Rezultātā izrādÄ«jās, ka mÅ«su pārvērtÄ«bas nedaudz atpalika no izmaiņām ražoÅ”anā, un mēs saskārāmies ar faktu, ka ā€œsiltieā€ mezgli netika galā ar slodzi un palēnināja visu baļķu piegādi. ā€œKarstosā€ datus saņēmām bez kļūmēm, bet pārējo piegādē bija jāiejaucas un jāveic manuāla apgāŔanās, lai vienmērÄ«gi sadalÄ«tu indeksus. 

Tajā paŔā laikā logstash gadÄ«jumu mērogoÅ”anu un iestatÄ«jumu mainÄ«Å”anu klasterÄ« sarežģīja fakts, ka tas bija lokāls docker-compose, un visas darbÄ«bas tika veiktas manuāli (lai pievienotu jaunus galus, bija manuāli jāiziet visas serveri un docker-compose up -d visur).

Baļķu pārdale

Å Ä« gada septembrÄ« vēl griezām monolÄ«tu, klastera slodze pieauga, un žurnālu plÅ«sma tuvojās 30 tÅ«kstoÅ”iem ziņojumu sekundē. 

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Mēs sākām nākamo iterāciju ar aparatÅ«ras atjauninājumu. Mēs pārgājām no pieciem koordinatoriem uz trim, nomainÄ«jām datu mezglus un uzvarējām naudas un uzglabāŔanas vietas ziņā. Mezglum mēs izmantojam divas konfigurācijas: 

  • ā€œKarstajiemā€ mezgliem: E3-1270 v6 / 960 Gb SSD / 32 Gb x 3 x 2 (3 ā€” Hot1 un 3 ā€” Hot2).
  • ā€œSiltiemā€ mezgliem: E3-1230 v6 / 4Tb SSD / 32 Gb x 4.

Å ajā iterācijā mēs pārvietojām indeksu ar mikropakalpojumu piekļuves žurnāliem, kas aizņem tādu paÅ”u vietu kā priekŔējās lÄ«nijas nginx žurnāli, uz otro trÄ«s ā€œkarstoā€ mezglu grupu. Tagad mēs glabājam datus par ā€œkarstajiemā€ mezgliem 20 stundas un pēc tam pārsÅ«tām tos uz ā€œsiltajiemā€ mezgliem uz pārējiem žurnāliem. 

Mēs atrisinājām mazo indeksu pazuÅ”anas problēmu, pārkonfigurējot to rotāciju. Tagad indeksi jebkurā gadÄ«jumā tiek pagriezti ik pēc 23 stundām, pat ja tur ir maz datu. Tas nedaudz palielināja shardu skaitu (to bija ap 800), taču no klasteru veiktspējas viedokļa tas ir pieļaujams. 

Rezultātā klasterÄ« bija seÅ”i ā€œkarstiā€ un tikai četri ā€œsiltiā€ mezgli. Tas rada nelielu pieprasÄ«jumu aizkavÄ“Å”anos ilgos laika intervālos, taču, palielinot mezglu skaitu nākotnē, Ŕī problēma tiks atrisināta.

Å Ä« iterācija arÄ« novērsa pusautomātiskās mērogoÅ”anas trÅ«kuma problēmu. Lai to izdarÄ«tu, mēs izvietojām infrastruktÅ«ras Nomad kopu ā€” lÄ«dzÄ«gu tam, ko jau esam izvietojuÅ”i ražoÅ”anā. Pagaidām Logstash daudzums automātiski nemainās atkarÄ«bā no slodzes, bet pie tā tiksim.

Kā mēs, CIAN, pieradinājām žurnālu terabaitus

Plāni nākotnei

Ieviestā konfigurācija lieliski mērogojas, un tagad mēs glabājam 13,3 TB datu - visus žurnālus 4 dienas, kas nepiecieÅ”ami brÄ«dinājumu ārkārtas analÄ«zei. Mēs pārvērÅ”am dažus žurnālus par metriku, ko pievienojam Graphite. Lai atvieglotu inženieru darbu, mums ir infrastruktÅ«ras klastera metrika un skripti bieži sastopamu problēmu pusautomātiskai laboÅ”anai. Pēc datu mezglu skaita palielināŔanas, kas plānots nākamgad, pāriesim uz datu glabāŔanu no 4 uz 7 dienām. OperatÄ«vajam darbam ar to pietiks, jo vienmēr cenÅ”amies pēc iespējas ātrāk izmeklēt incidentus, bet ilgstoÅ”ai izmeklÄ“Å”anai ir telemetrijas dati. 

2019. gada oktobrÄ« cian.ru datplÅ«sma jau bija pieaugusi lÄ«dz 15,3 miljoniem unikālo lietotāju mēnesÄ«. Tas kļuva par nopietnu baļķu piegādes arhitektoniskā risinājuma pārbaudi. 

Tagad mēs gatavojamies atjaunināt ElasticSearch uz versiju 7. Tomēr, lai to izdarÄ«tu, mums bÅ«s jāatjaunina daudzu indeksu kartÄ“Å”ana programmā ElasticSearch, jo tie tika pārvietoti no versijas 5.5 un tika deklarēti kā novecojuÅ”i 6. versijā (versijā tie vienkārÅ”i nepastāv 7). Tas nozÄ«mē, ka atjaunināŔanas procesa laikā noteikti bÅ«s kāda veida force majeure, kas atstās mÅ«s bez žurnāliem, kamēr problēma tiks atrisināta. No 7. versijas mēs visvairāk gaidām Kibana ar uzlabotu saskarni un jauniem filtriem. 

Mēs sasniedzām savu galveno mērÄ·i: pārtraucām baļķu zudumu un samazinājām infrastruktÅ«ras klastera dÄ«kstāves no 2-3 avārijām nedēļā lÄ«dz pāris stundām apkopes darbiem mēnesÄ«. Viss Å”is darbs ražoÅ”anā ir gandrÄ«z neredzams. Taču tagad varam precÄ«zi noteikt, kas notiek ar mÅ«su servisu, varam ātri to izdarÄ«t klusā režīmā un neuztraukties, ka žurnāli pazudÄ«s. Kopumā esam apmierināti, priecÄ«gi un gatavojamies jauniem varoņdarbiem, par kuriem runāsim vēlāk.

Avots: www.habr.com

Pievieno komentāru