Elasticsearch klasteris 200 TB+

Elasticsearch klasteris 200 TB+

Daudzi cilvēki cÄ«nās ar Elasticsearch. Bet kas notiek, ja vēlaties to izmantot žurnālu glabāŔanai ā€œÄ«paÅ”i lielā apjomāā€? Un vai ir arÄ« nesāpÄ«gi piedzÄ«vot kļūmi kādā no vairākiem datu centriem? Kādu arhitektÅ«ru vajadzētu veidot, un uz kādām kļūmēm jÅ«s paklupsiet?

Mēs, Odnoklassniki, nolēmām izmantot elasticsearch, lai atrisinātu baļķu pārvaldības problēmu, un tagad mēs dalāmies pieredzē ar Habr: gan par arhitektūru, gan par nepilnībām.

Esmu Pjotrs Zaicevs, strādāju par sistēmas administratoru uzņēmumā Odnoklassniki. Pirms tam biju arÄ« admins, strādāju ar Manticore Search, Sphinx search, Elasticsearch. Iespējams, ja parādÄ«sies vēl viens ...meklējums, iespējams, arÄ« es ar to strādāŔu. Es arÄ« brÄ«vprātÄ«gi piedalos vairākos atvērtā pirmkoda projektos.

Kad ierados Odnoklassniki, intervijā neapdomÄ«gi teicu, ka varētu strādāt ar Elasticsearch. Pēc tam, kad es to sapratu un izpildÄ«ju dažus vienkārÅ”us uzdevumus, man tika dots lielais uzdevums reformēt tajā laikā pastāvoÅ”o žurnālu pārvaldÄ«bas sistēmu.

Prasības

Sistēmas prasÄ«bas tika formulētas Ŕādi:

  • Graylog bija paredzēts izmantot kā priekÅ”galu. Tā kā uzņēmumam jau bija Ŕī produkta lietoÅ”anas pieredze, programmētāji un testētāji to zināja, viņiem tas bija pazÄ«stams un ērts.
  • Datu apjoms: vidēji 50-80 tÅ«kstoÅ”i ziņojumu sekundē, bet ja kaut kas saplÄ«st, tad trafiku nekas neierobežo, var bÅ«t 2-3 miljoni rindu sekundē
  • Pārrunājot ar klientiem prasÄ«bas meklÄ“Å”anas vaicājumu apstrādes ātrumam, mēs sapratām, ka tipisks Ŕādas sistēmas izmantoÅ”anas modelis ir Ŕāds: cilvēki meklē savas lietojumprogrammas žurnālus pēdējo divu dienu laikā un nevēlas gaidÄ«t ilgāk par vienu otrais formulēta vaicājuma rezultātam.
  • Administratori uzstāja, ka sistēma ir viegli mērogojama, ja nepiecieÅ”ams, neprasot viņiem dziļi iedziļināties tās darbÄ«bā.
  • Tā ka vienÄ«gais apkopes uzdevums, kas Ŕīm sistēmām periodiski nepiecieÅ”ams, ir aparatÅ«ras maiņa.
  • Turklāt Odnoklassniki ir lieliskas tehniskās tradÄ«cijas: jebkuram pakalpojumam, ko mēs palaižam, ir jāpārdzÄ«vo datu centra kļūme (pēkŔņa, neplānota un absolÅ«ti jebkurā laikā).

Visvairāk mums izmaksāja pēdējā prasÄ«ba Ŕī projekta realizācijā, par ko pastāstÄ«Å”u sÄ«kāk.

treŔdiena

Mēs strādājam četros datu centros, savukārt Elasticsearch datu mezgli var atrasties tikai trijos (vairāku netehnisku iemeslu dēļ).

Å ajos četros datu centros ir aptuveni 18 tÅ«kstoÅ”i dažādu žurnālu avotu ā€“ aparatÅ«ras, konteineri, virtuālās maŔīnas.

SvarÄ«ga iezÄ«me: klasteris sākas konteineros Podmans nevis uz fiziskām maŔīnām, bet gan uz paÅ”u mākoņa produkts viens mākonis. Konteineriem tiek garantēti 2 kodoli, lÄ«dzÄ«gi kā 2.0 GHz v4, ar iespēju atlikuÅ”os kodolus pārstrādāt, ja tie ir dÄ«kstāvē.

Citiem vārdiem sakot:

Elasticsearch klasteris 200 TB+

Topoloģija

Sākotnēji es redzēju risinājuma vispārējo formu Ŕādi:

  • 3-4 VIP atrodas aiz Graylog domēna A ieraksta, Ŕī ir adrese, uz kuru tiek nosÅ«tÄ«ti žurnāli.
  • katrs VIP ir LVS balansētājs.
  • Pēc tam žurnāli nonāk Graylog akumulatorā, daži dati ir GELF formātā, daži syslog formātā.
  • Tad tas viss lielās partijās tiek rakstÄ«ts Elasticsearch koordinatoru baterijai.
  • Un tie, savukārt, nosÅ«ta rakstÄ«Å”anas un lasÄ«Å”anas pieprasÄ«jumus attiecÄ«gajiem datu mezgliem.

Elasticsearch klasteris 200 TB+

Vārdu krājums

Varbūt ne visi saprot terminoloģiju detalizēti, tāpēc es vēlētos nedaudz pakavēties pie tā.

Elasticsearch ir vairāku veidu mezgli - galvenais, koordinators, datu mezgls. Ir divi citi veidi dažādām žurnālu transformācijām un saziņai starp dažādām kopām, taču mēs izmantojām tikai uzskaitītos.

Meistars
Tas nosÅ«ta ping visiem klasterÄ« esoÅ”ajiem mezgliem, uztur atjauninātu klasteru karti un izplata to starp mezgliem, apstrādā notikumu loÄ£iku un veic dažāda veida klastera mēroga uzkopÅ”anu.

Koordinators
Veic tikai vienu uzdevumu: pieņem lasÄ«Å”anas vai rakstÄ«Å”anas pieprasÄ«jumus no klientiem un marÅ”rutē Å”o trafiku. Ja ir rakstÄ«Å”anas pieprasÄ«jums, visticamāk, tas jautās kapteinim, kurā attiecÄ«gā indeksa fragmentā tas jāievieto, un novirzÄ«s pieprasÄ«jumu tālāk.

Datu mezgls
Uzglabā datus, veic no ārpuses ienākoÅ”us meklÄ“Å”anas vaicājumus un veic darbÄ«bas ar uz tiem esoÅ”ajām lauskas.

Greylog
Tas ir kaut kas lÄ«dzÄ«gs Kibana saplÅ«Å”anai ar Logstash ELK kaudzē. Graylog apvieno gan lietotāja saskarni, gan žurnālu apstrādes cauruļvadu. Zem pārsega Graylog darbojas Kafka un Zookeeper, kas nodroÅ”ina savienojumu ar Graylog kā kopu. Graylog var saglabāt žurnālus (Kafka) keÅ”atmiņā, ja Elasticsearch nav pieejams, un atkārtot neveiksmÄ«gus lasÄ«Å”anas un rakstÄ«Å”anas pieprasÄ«jumus, grupēt un atzÄ«mēt žurnālus saskaņā ar noteiktiem noteikumiem. Tāpat kā Logstash, Graylog ir funkcionalitāte, lai mainÄ«tu rindas pirms to rakstÄ«Å”anas Elasticsearch.

Turklāt Graylog ir iebūvēts pakalpojumu atklājums, kas ļauj, pamatojoties uz vienu pieejamo Elasticsearch mezglu, iegūt visu klastera karti un filtrēt to pēc noteikta taga, kas ļauj novirzīt pieprasījumus uz konkrētiem konteineriem.

Vizuāli tas izskatās apmēram Ŕādi:

Elasticsearch klasteris 200 TB+

Å is ir ekrānuzņēmums no konkrēta gadÄ«juma. Å eit mēs izveidojam histogrammu, pamatojoties uz meklÄ“Å”anas vaicājumu, un parādām atbilstoŔās rindas.

Indeksi

Atgriežoties pie sistēmas arhitektūras, es vēlos sīkāk pakavēties pie tā, kā mēs izveidojām indeksa modeli, lai tas viss darbotos pareizi.

IepriekŔ redzamajā diagrammā tas ir zemākais līmenis: Elasticsearch datu mezgli.

Indekss ir liela virtuāla vienība, kas sastāv no Elasticsearch skaidiņām. Pats par sevi katra no lauskas ir nekas vairāk kā Lucene indekss. Un katrs Lucene indekss, savukārt, sastāv no viena vai vairākiem segmentiem.

Elasticsearch klasteris 200 TB+

Izstrādājot, mēs sapratām, ka, lai izpildÄ«tu prasÄ«bas par lasÄ«Å”anas ātrumu lielam datu apjomam, mums Å”ie dati ir vienmērÄ«gi "jāizplata" pa datu mezgliem.

Tā rezultātā fragmentu skaitam vienā indeksā (ar replikām) jābÅ«t stingri vienādam ar datu mezglu skaitu. Pirmkārt, lai nodroÅ”inātu replikācijas koeficientu, kas vienāds ar diviem (tas ir, mēs varam zaudēt pusi no klastera). Un, otrkārt, lai apstrādātu lasÄ«Å”anas un rakstÄ«Å”anas pieprasÄ«jumus vismaz pusē klastera.

Vispirms mēs noteicām glabāŔanas laiku kā 30 dienas.

Skaldu sadalÄ«jumu grafiski var attēlot Ŕādi:

Elasticsearch klasteris 200 TB+

Viss tumÅ”i pelēkais taisnstÅ«ris ir rādÄ«tājs. Kreisais sarkanais kvadrāts tajā ir primārais shards, pirmais rādÄ«tājā. Un zilais kvadrāts ir kopijas lauskas. Tie atrodas dažādos datu centros.

Kad mēs pievienojam vēl vienu Ŕķembu, tā nonāk treÅ”ajā datu centrā. Un galu galā mēs iegÅ«stam Å”o struktÅ«ru, kas ļauj zaudēt lÄ«dzstrāvu, nezaudējot datu konsekvenci:

Elasticsearch klasteris 200 TB+

Indeksu rotācija, t.i. izveidojot jaunu indeksu un dzÄ“Å”ot vecāko, mēs to pielÄ«dzinājām 48 stundām (pēc indeksa izmantoÅ”anas modeļa: visbiežāk tiek meklētas pēdējās 48 stundas).

Šis indeksa rotācijas intervāls ir saistīts ar Ŕādiem iemesliem:

Kad meklÄ“Å”anas pieprasÄ«jums nonāk noteiktā datu mezglā, tad no veiktspējas viedokļa ir izdevÄ«gāk, ja tiek vaicāts viens shards, ja tā izmērs ir salÄ«dzināms ar mezgla gūžas izmēru. Tas ļauj saglabāt ā€œkarstoā€ indeksa daļu kaudzē un ātri tai piekļūt. Ja ir daudz ā€œkarstu daļuā€, indeksa meklÄ“Å”anas ātrums samazinās.

Kad mezgls sāk izpildÄ«t meklÄ“Å”anas vaicājumu vienā fragmentā, tas pieŔķir pavedienu skaitu, kas ir vienāds ar fiziskās maŔīnas hiperpavedienu kodolu skaitu. Ja meklÄ“Å”anas vaicājums ietekmē lielu skaitu shardu, pavedienu skaits palielinās proporcionāli. Tas negatÄ«vi ietekmē meklÄ“Å”anas ātrumu un negatÄ«vi ietekmē jaunu datu indeksÄ“Å”anu.

Lai nodroÅ”inātu nepiecieÅ”amo meklÄ“Å”anas latentumu, mēs nolēmām izmantot SSD. Lai ātri apstrādātu pieprasÄ«jumus, iekārtām, kurās tika mitināti Å”ie konteineri, bija jābÅ«t vismaz 56 kodoliem. Skaitlis 56 tika izvēlēts kā nosacÄ«ti pietiekama vērtÄ«ba, kas nosaka pavedienu skaitu, ko Elasticsearch Ä£enerēs darbÄ«bas laikā. Programmā Elasitcsearch daudzi pavedienu kopas parametri ir tieÅ”i atkarÄ«gi no pieejamo kodolu skaita, kas savukārt tieÅ”i ietekmē nepiecieÅ”amo mezglu skaitu klasterÄ« saskaņā ar principu ā€œmazāk kodolu - vairāk mezgluā€.

Rezultātā mēs noskaidrojām, ka vidēji shards sver aptuveni 20 gigabaitus, un vienā rādÄ«tājā ir 1 shards. AttiecÄ«gi, ja mēs tos pagriežam reizi 360 stundās, tad mums ir 48 no tiem. Katrs rādÄ«tājs satur datus par 15 dienām.

Datu rakstÄ«Å”anas un nolasÄ«Å”anas shēmas

Izdomāsim, kā dati tiek ierakstÄ«ti Å”ajā sistēmā.

Pieņemsim, ka kāds pieprasÄ«jums no Greylog pienāk koordinatoram. Piemēram, mēs vēlamies indeksēt 2-3 tÅ«kstoÅ”us rindu.

Koordinators, saņēmis pieprasÄ«jumu no Graylog, iztaujā meistaru: "IndeksÄ“Å”anas pieprasÄ«jumā mēs Ä«paÅ”i norādÄ«jām indeksu, bet nebija norādÄ«ts, kurā fragmentā tas jāraksta."

Meistars atbild: ā€œUzrakstiet Å”o informāciju uz sharda numuru 71ā€, pēc tam tā tiek nosÅ«tÄ«ta tieÅ”i uz attiecÄ«go datu mezglu, kur atrodas primārā sharda numurs 71.

Pēc tam darījumu žurnāls tiek pavairots reprodukcijas fragmentā, kas atrodas citā datu centrā.

Elasticsearch klasteris 200 TB+

No Graylog koordinatoram tiek saņemts meklÄ“Å”anas pieprasÄ«jums. Koordinators to novirza atbilstoÅ”i indeksam, savukārt Elasticsearch izplata pieprasÄ«jumus starp primāro un reprodukcijas fragmentu, izmantojot apļa-robin principu.

Elasticsearch klasteris 200 TB+

180 mezgli reaģē nevienmērÄ«gi, un, kamēr tie reaģē, koordinators uzkrāj informāciju, kuru jau ir ā€œizspļāvuÅ”iā€ ātrāki datu mezgli. Pēc tam, kad vai nu ir saņemta visa informācija, vai pieprasÄ«jums ir sasniedzis taimautu, tas visu nodod tieÅ”i klientam.

Visa Ŕī sistēma vidēji apstrādā meklÄ“Å”anas vaicājumus pēdējo 48 stundu laikā 300ā€“400 ms, izņemot tos vaicājumus, kuriem ir vadoŔā aizstājējzÄ«me.

Ziedi ar Elasticsearch: Java iestatīŔana

Elasticsearch klasteris 200 TB+

Lai tas viss darbotos tā, kā mēs sākotnēji vēlējāmies, mēs pavadījām ļoti ilgu laiku, lai atkļūdotu dažādas lietas klasterī.

Pirmā atklāto problēmu daļa bija saistÄ«ta ar veidu, kā Java pēc noklusējuma ir iepriekÅ” konfigurēta programmā Elasticsearch.

Viena problēma
Mēs esam redzējuÅ”i ļoti daudzus ziņojumus, ka Lucene lÄ«menÄ«, kad darbojas fona darbi, Lucene segmentu sapludināŔana neizdodas un rodas kļūda. Tajā paŔā laikā žurnālos bija skaidrs, ka tā ir OutOfMemoryError kļūda. Mēs redzējām no telemetrijas, ka gūža ir brÄ«va, un nebija skaidrs, kāpēc Ŕī operācija neizdevās.

IzrādÄ«jās, ka Lucene indeksu saplÅ«Å”ana notiek ārpus gūžas. Un konteineri ir diezgan stingri ierobežoti patērēto resursu ziņā. Å ajos resursos varēja ietilpt tikai kaudze (vērtÄ«ba heap.size bija aptuveni vienāda ar RAM), un dažas ārpus kaudzes darbÄ«bas avarēja ar atmiņas pieŔķirÅ”anas kļūdu, ja kāda iemesla dēļ tās neietilpa ~500 MB, kas palika pirms ierobežojuma.

Labojums bija diezgan triviāls: tika palielināts konteineram pieejamās RAM apjoms, pēc kura mēs aizmirsām, ka mums pat bija Ŕādas problēmas.

Otrā problēma
4-5 dienas pēc klastera palaiÅ”anas mēs pamanÄ«jām, ka datu mezgli periodiski sāka izkrist no klastera un iekļūt tajā pēc 10-20 sekundēm.

Kad mēs sākām to izdomāt, izrādÄ«jās, ka Ŕī Elasticsearch atmiņa netiek kontrolēta nekādā veidā. Kad konteineram pieŔķīrām vairāk atmiņas, mēs varējām aizpildÄ«t tieÅ”os buferu baseinus ar dažādu informāciju, un tas tika notÄ«rÄ«ts tikai pēc tam, kad no Elasticsearch tika palaists skaidrais GC.

Dažos gadÄ«jumos Ŕī darbÄ«ba prasÄ«ja diezgan ilgu laiku, un Å”ajā laikā klasterim izdevās atzÄ«mēt Å”o mezglu kā jau izietu. Å Ä« problēma ir labi aprakstÄ«ta Å”eit.

Risinājums bija Ŕāds: mēs ierobežojām Java iespēju Ŕīm darbÄ«bām izmantot lielāko daļu atmiņas ārpus kaudzes. Mēs ierobežojām to lÄ«dz 16 gigabaitiem (-XX:MaxDirectMemorySize=16g), nodroÅ”inot, ka tieÅ”ais GC tiek izsaukts daudz biežāk un apstrādāts daudz ātrāk, tādējādi vairs nedestabilizējot kopu.

TreŔā problēma
Ja domājat, ka problēmas ar ā€œmezgliem, kas atstāj klasteru visnegaidÄ«tākajā brÄ«dÄ«ā€ ir beiguÅ”ies, jÅ«s maldāties.

Kad mēs konfigurējām darbu ar indeksiem, mēs izvēlējāmies mmapfs to samazināt meklÄ“Å”anas laiku uz svaigām skaidām ar lielu segmentāciju. Å Ä« bija diezgan liela kļūda, jo, izmantojot mmapfs, fails tiek kartēts RAM, un tad mēs strādājam ar kartēto failu. Sakarā ar to izrādās, ka tad, kad GC mēģina apturēt pavedienus lietojumprogrammā, mēs ļoti ilgu laiku dodamies uz droÅ”u punktu, un ceļā uz to aplikācija pārstāj atbildēt uz meistara pieprasÄ«jumiem par to, vai tā ir dzÄ«va. . AttiecÄ«gi kapteinis uzskata, ka mezgls vairs neatrodas klasterÄ«. Pēc tam, pēc 5-10 sekundēm, darbojas atkritumu savācējs, mezgls atdzÄ«vojas, atkal nonāk klasterÄ« un sāk inicializēt lauskas. Tas viss ļoti Ŕķita kā "iestudējums, kuru mēs pelnÄ«jām" un nebija piemērots nekam nopietnam.

Lai atbrÄ«votos no Ŕīs uzvedÄ«bas, mēs vispirms pārgājām uz standarta niofs, un pēc tam, kad mēs migrējām no piektās Elastic versijas uz sesto, mēs izmēģinājām hibrÄ«dus, kur Ŕī problēma netika atkārtota. Varat lasÄ«t vairāk par uzglabāŔanas veidiem Å”eit.

Ceturtā problēma
Tad radās vēl viena ļoti interesanta problēma, kuru mēs risinājām rekordÄ«su laiku. Mēs to ķērām 2-3 mēneÅ”us, jo tā raksts bija absolÅ«ti nesaprotams.

Dažreiz mÅ«su koordinatori devās uz Full GC, parasti kaut kad pēc pusdienām, un nekad no turienes neatgriezās. Tajā paŔā laikā, reÄ£istrējot GC aizkavi, tas izskatÄ«jās Ŕādi: viss notiek labi, labi, labi, un tad pēkŔņi viss iet ļoti slikti.

Sākumā domājām, ka mums ir ļauns lietotājs, kurÅ” palaida kaut kādu pieprasÄ«jumu, kas izsita koordinatoru no darba režīma. Mēs ļoti ilgu laiku reÄ£istrējām pieprasÄ«jumus, mēģinot saprast, kas notiek.

Rezultātā izrādījās, ka brīdī, kad lietotājs palaiž milzīgu pieprasījumu un tas nonāk pie konkrēta Elasticsearch koordinatora, daži mezgli reaģē ilgāk nekā citi.

Un, kamēr koordinators gaida atbildi no visiem mezgliem, viņŔ uzkrāj rezultātus, kas nosÅ«tÄ«ti no mezgliem, kuri jau ir atbildējuÅ”i. AttiecÄ«bā uz GC tas nozÄ«mē, ka mÅ«su kaudzes izmantoÅ”anas modeļi mainās ļoti ātri. Un mÅ«su izmantotais GC nevarēja tikt galā ar Å”o uzdevumu.

VienÄ«gais labojums, ko atradām, lai mainÄ«tu klastera darbÄ«bu Å”ajā situācijā, ir migrācija uz JDK13 un Shenandoah atkritumu savācēja izmantoÅ”ana. Tas atrisināja problēmu, mÅ«su koordinatori pārstāja krist.

Šeit beidzās problēmas ar Java un sākās joslas platuma problēmas.

"Ogas" ar Elasticsearch: caurlaidspēja

Elasticsearch klasteris 200 TB+

Problēmas ar caurlaidspēju nozīmē, ka mūsu klasteris darbojas stabili, bet indeksēto dokumentu skaita maksimuma un manevru laikā veiktspēja ir nepietiekama.

Pirmais konstatētais simptoms: dažu ražoÅ”anas ā€œsprādzienuā€ laikā, kad pēkŔņi tiek Ä£enerēts ļoti liels skaits žurnālu, Graylog sāk bieži mirgot indeksÄ“Å”anas kļūda es_rejected_execution.

Tas bija saistÄ«ts ar faktu, ka thread_pool.write.queue vienā datu mezglā lÄ«dz brÄ«dim, kad Elasticsearch spēj apstrādāt indeksÄ“Å”anas pieprasÄ«jumu un augÅ”upielādēt informāciju diskā esoÅ”ajā shardā, pēc noklusējuma spēj keÅ”atmiņā saglabāt tikai 200 pieprasÄ«jumus. Un iekŔā Elasticsearch dokumentācija Par Å”o parametru tiek runāts ļoti maz. Tiek norādÄ«ts tikai maksimālais pavedienu skaits un noklusējuma izmērs.

Protams, mēs devāmies sagrozÄ«t Å”o vērtÄ«bu un uzzinājām sekojoÅ”o: konkrēti mÅ«su iestatÄ«jumos lÄ«dz 300 pieprasÄ«jumiem keÅ”atmiņā ir diezgan labi, un lielāka vērtÄ«ba ir saistÄ«ta ar faktu, ka mēs atkal lidojam uz Full GC.

Turklāt, tā kā Ŕīs ir ziņojumu paketes, kas tiek saņemtas viena pieprasÄ«juma ietvaros, bija nepiecieÅ”ams pielāgot Graylog, lai tas nerakstÄ«tu bieži un mazās partijās, bet gan lielās partijās vai reizi 3 sekundēs, ja partija joprojām nav pabeigta. Å ajā gadÄ«jumā izrādās, ka informācija, ko mēs ierakstām Elasticsearch, kļūst pieejama nevis pēc divām sekundēm, bet pēc piecām (kas mums der diezgan labi), bet gan pārkārtojumu skaits, kas jāveic, lai izspiestu lielu tiek samazināta informācijas kaudze.

ÄŖpaÅ”i svarÄ«gi tas ir tajos brīžos, kad kaut kur kaut kas nobružājies un nikni par to ziņo, lai nedabÅ«tu galÄ«gi spamotu Elastic, bet pēc kāda laika - Greylog mezglus, kas nedarbojas aizsērējuÅ”o buferu dēļ.

Turklāt, kad mums bija Å”ie paÅ”i sprādzieni ražoÅ”anā, mēs saņēmām sÅ«dzÄ«bas no programmētājiem un testētājiem: brÄ«dÄ«, kad viņiem patieŔām vajadzēja Å”os baļķus, viņiem tos iedeva ļoti lēni.

Viņi sāka to izdomāt. No vienas puses, bija skaidrs, ka gan meklÄ“Å”anas vaicājumi, gan indeksÄ“Å”anas vaicājumi bÅ«tÄ«bā tika apstrādāti vienās un tajās paŔās fiziskajās iekārtās, un tā vai citādi bÅ«s zināmi trÅ«kumi.

Taču to var daļēji apiet tādēļ, ka sestajā Elasticsearch versijā parādÄ«jās algoritms, kas ļauj izplatÄ«t vaicājumus starp attiecÄ«gajiem datu mezgliem, nevis pēc nejauŔības principa ā€œround-robinā€ (konteiners, kas veic indeksÄ“Å”anu un satur primāro shard var bÅ«t ļoti aizņemts, nebÅ«s iespējas ātri atbildēt), bet pārsÅ«tÄ«t Å”o pieprasÄ«jumu uz mazāk ielādētu konteineru ar replika-shard, kas atbildēs daudz ātrāk. Citiem vārdiem sakot, mēs nonācām pie use_adaptive_replica_selection: true.

LasÄ«Å”anas attēls sāk izskatÄ«ties Ŕādi:

Elasticsearch klasteris 200 TB+

Pāreja uz Ŕo algoritmu ļāva būtiski uzlabot vaicājuma laiku tajos brīžos, kad mums bija jāraksta liela žurnālu plūsma.

Visbeidzot, galvenā problēma bija nesāpÄ«ga datu centra noņemÅ”ana.

Ko mēs vēlējāmies no klastera tÅ«lÄ«t pēc savienojuma zaudÄ“Å”anas ar vienu DC:

  • Ja mums ir paÅ”reizējais galvenais galvenais datu centrs, tas tiks atkārtoti atlasÄ«ts un pārvietots kā loma uz citu mezglu citā DC.
  • Kapteinis ātri noņems no klastera visus nepieejamos mezglus.
  • Pamatojoties uz atlikuÅ”ajiem, viņŔ sapratÄ«s: pazaudētajā datu centrā mums bija Ŕādas tādas primārās lauskas, atlikuÅ”ajos datu centros viņŔ ātri virzÄ«s papildu replikas, un mēs turpināsim indeksēt datus.
  • Tā rezultātā klastera rakstÄ«Å”anas un lasÄ«Å”anas caurlaidspēja pakāpeniski pasliktināsies, taču kopumā viss darbosies, lai arÄ« lēni, bet stabili.

Kā izrādījās, mēs vēlējāmies kaut ko līdzīgu:

Elasticsearch klasteris 200 TB+

Un mēs saņēmām sekojoÅ”o:

Elasticsearch klasteris 200 TB+

Kā tas notika?

Kad datu centrs nokrita, mūsu meistars kļuva par vājo kaklu.

Kāpēc?

Fakts ir tāds, ka meistaram ir TaskBatcher, kas ir atbildÄ«gs par noteiktu uzdevumu un notikumu izplatÄ«Å”anu klasterÄ«. Jebkura mezgla izeja, jebkura fragmenta paaugstināŔana no replikas uz primāro, jebkurÅ” uzdevums, lai kaut kur izveidotu fragmentu ā€” tas viss vispirms tiek nosÅ«tÄ«ts uz TaskBatcher, kur tas tiek apstrādāts secÄ«gi un vienā pavedienā.

Viena datu centra izņemÅ”anas brÄ«dÄ« izrādÄ«jās, ka visi saglabājuÅ”os datu centru datu mezgli uzskatÄ«ja par savu pienākumu informēt meistaru "mēs esam pazaudējuÅ”i tādas un tādas lauskas un tādus un tādus datu mezglus."

Tajā paŔā laikā izdzÄ«vojuÅ”ie datu mezgli nosÅ«tÄ«ja visu Å”o informāciju paÅ”reizējam kapteinim un mēģināja gaidÄ«t apstiprinājumu, ka viņŔ to pieņēma. Viņi to negaidÄ«ja, jo meistars uzdevumus saņēma ātrāk, nekā spēja atbildēt. Mezglu atkārtotu pieprasÄ«jumu noildze beidzās, un kapteinis Å”ajā laikā pat nemēģināja uz tiem atbildēt, bet bija pilnÄ«bā iesaistÄ«ts uzdevumā kārtot pieprasÄ«jumus pēc prioritātes.

Termināļa formā izrādījās, ka datu mezgli nosūtīja galveno sūtījumu tiktāl, ka tas pārgāja pilnā GC. Pēc tam mūsu galvenā loma pārcēlās uz kādu nākamo mezglu, ar to notika pilnīgi tas pats, un rezultātā klasteris pilnībā sabruka.

Mēs veicām mērījumus, un pirms versijas 6.4.0, kur tas tika labots, mums pietika ar to, ka vienlaikus izvadījām tikai 10 datu mezglus no 360, lai pilnībā izslēgtu klasteru.

Tas izskatÄ«jās apmēram Ŕādi:

Elasticsearch klasteris 200 TB+

Pēc versijas 6.4.0, kurā tika novērsta Ŕī briesmÄ«gā kļūda, datu mezgli pārtrauca nogalināt galveno. Bet tas viņu nepadarÄ«ja "gudrāku". Proti: kad mēs izvadām 2, 3 vai 10 (jebkuru skaitu, izņemot vienu) datu mezglus, kapteinis saņem pirmo ziņojumu, kas saka, ka mezgls A ir aizgājis, un mēģina pastāstÄ«t mezglam B, mezglam C par to, mezglam D.

Un Å”obrÄ«d to var atrisināt, tikai iestatot taimautu mēģinājumiem kādam par kaut ko pastāstÄ«t, kas vienāds ar aptuveni 20-30 sekundēm un tādējādi kontrolējot datu centra pārvietoÅ”anās ātrumu no klastera.

Principā tas iekļaujas prasÄ«bās, kas sākotnēji tika izvirzÄ«tas gala produktam projekta ietvaros, taču no ā€œtÄ«rās zinātnesā€ viedokļa tā ir kļūda. Ko, starp citu, izstrādātāji veiksmÄ«gi salaboja versijā 7.2.

Turklāt, kad kāds datu mezgls nodzisa, izrādÄ«jās, ka informācijas izplatÄ«Å”ana par tā izieÅ”anu bija svarÄ«gāka nekā stāstÄ«t visam klasterim, ka tajā ir Ŕādas un tādas primārās shards (lai veicinātu replikas fragmentu citos datos centrā primārajā, un uz tiem varētu rakstÄ«t informāciju).

Tāpēc, kad viss jau ir apstājies, atbrÄ«votie datu mezgli netiek uzreiz atzÄ«mēti kā novecojuÅ”i. AttiecÄ«gi mēs esam spiesti gaidÄ«t, kamēr visi ping ir beidzies uz atbrÄ«votajiem datu mezgliem, un tikai pēc tam mÅ«su klasteris sāk mums pateikt, ka tur, tur un tur mums ir jāturpina ierakstÄ«t informāciju. JÅ«s varat lasÄ«t vairāk par Å”o Å”eit.

Rezultātā datu centra izņemÅ”anas operācija mÅ«sdienās aizņem apmēram 5 minÅ«tes sastrēgumstundā. Tik lielam un neveiklam kolosam tas ir diezgan labs rezultāts.

Rezultātā mēs nonācām pie Ŕāda lēmuma:

  • Mums ir 360 datu mezgli ar 700 gigabaitu diskiem.
  • 60 koordinatori trafika marÅ”rutÄ“Å”anai caur Å”iem paÅ”iem datu mezgliem.
  • 40 meistari, kurus esam atstājuÅ”i kā sava veida mantojumu kopÅ” versijām pirms 6.4.0 - lai pārdzÄ«votu datu centra izņemÅ”anu, bijām garÄ«gi gatavi zaudēt vairākas maŔīnas, lai bÅ«tu garantēts meistaru kvorums pat gadā. sliktākais scenārijs
  • JebkurÅ” mēģinājums apvienot lomas vienā konteinerā tika apmierināts ar faktu, ka agrāk vai vēlāk mezgls slodzes laikā saplÄ«sÄ«s.
  • Visā klasterÄ« tiek izmantots 31 gigabaita lielums heap.size: visi mēģinājumi samazināt izmēru izraisÄ«ja dažu mezglu iznÄ«cināŔanu smagos meklÄ“Å”anas vaicājumos, izmantojot vadoÅ”o aizstājējzÄ«mi, vai arÄ« paÅ”a Elasticsearch ķēdes pārtraucēju.
  • Turklāt, lai nodroÅ”inātu meklÄ“Å”anas veiktspēju, mēs centāmies saglabāt pēc iespējas mazāku objektu skaitu klasterÄ«, lai apstrādātu pēc iespējas mazāk notikumu saÅ”aurinātajā kaklā, ko ieguvām galvenajā.

Visbeidzot par uzraudzību

Lai nodroÅ”inātu, ka tas viss darbojas, kā paredzēts, mēs uzraugām sekojoÅ”o:

  • Katrs datu mezgls ziņo mÅ«su mākonim, ka tas eksistē, un uz tā ir tādas un tādas lauskas. Kad kaut kur kaut ko dzÄ“Å”am, klasteris pēc 2-3 sekundēm ziņo, ka centrā A esam dzēsuÅ”i mezglus 2, 3 un 4 - tas nozÄ«mē, ka citos datu centros mēs nekādā gadÄ«jumā nevaram nodzēst tos mezglus, uz kuriem ir tikai viena lauskas. pa kreisi.
  • Zinot meistara uzvedÄ«bas bÅ«tÄ«bu, mēs ļoti rÅ«pÄ«gi aplÅ«kojam nepabeigto uzdevumu skaitu. Jo pat viens iestrēdzis uzdevums, ja tas laicÄ«gi nebeidzas, teorētiski kādā ārkārtas situācijā var kļūt par iemeslu, kādēļ, piemēram, replikas Ŕķembas reklamÄ“Å”ana primārajā nedarbojas, kādēļ indeksÄ“Å”ana pārstās darboties.
  • Mēs arÄ« ļoti rÅ«pÄ«gi skatāmies uz atkritumu savācēju aizkavÄ“Å”anos, jo mums jau ir bijuÅ”as lielas grÅ«tÄ«bas optimizācijas laikā.
  • Noraida pēc pavediena, lai jau iepriekÅ” saprastu, kur ir saÅ”aurinājums.
  • Nu, standarta metrika, piemēram, kaudze, RAM un I/O.

Veidojot uzraudzÄ«bu, jāņem vērā Elasticsearch Thread Pool funkcijas. Elasticsearch dokumentācija apraksta konfigurācijas opcijas un noklusējuma vērtÄ«bas meklÄ“Å”anai un indeksÄ“Å”anai, bet pilnÄ«bā klusē par thread_pool.management. Å ie pavedieni Ä«paÅ”i apstrādā vaicājumus, piemēram, _cat/shards un citus lÄ«dzÄ«gus, kurus ir ērti izmantot, rakstot monitoringu. Jo lielāks ir klasteris, jo vairāk Ŕādu pieprasÄ«jumu tiek izpildÄ«ts laika vienÄ«bā, un iepriekÅ”minētais thread_pool.management ne tikai nav uzrādÄ«ts oficiālajā dokumentācijā, bet arÄ« pēc noklusējuma ir ierobežots lÄ«dz 5 pavedieniem, kas tiek ļoti ātri atbrÄ«voties, pēc tam kura uzraudzÄ«ba pārstāj darboties pareizi.

Nobeigumā es gribu teikt: mēs to izdarÄ«jām! Mēs varējām saviem programmētājiem un izstrādātājiem dot rÄ«ku, kas gandrÄ«z jebkurā situācijā var ātri un droÅ”i sniegt informāciju par to, kas notiek ražoÅ”anā.

Jā, tas izrādÄ«jās diezgan sarežģīts, bet, neskatoties uz to, mums izdevās ietilpināt savas vēlmes esoÅ”ajos produktos, kas nebija jālāpÄ« un jāpārraksta paÅ”iem.

Elasticsearch klasteris 200 TB+

Avots: www.habr.com

Pievieno komentāru