
Paljusid kogemusi on seotud Elasticsearchiga. Aga mis juhtub, kui soovid selle abil salvestada âsuuriâ logisid? Ja veel, kuidas ellu jÀÀda, kui ĂŒks mitmest andmekeskusest langeb vĂ€lja? Milline arhitektuur peaks olema ja milliseid takistusi vĂ”ivad ette tulla?
Klassikaaslased otsustasime kasutada Elasticsearchi logihalduse kĂŒsimuste lahendamiseks ning nĂŒĂŒd jagame kogemusi Habraga: arhitektuuri ja takistuste kohta.
Mina olen Peeter Zaitsev, töötan sĂŒsteemiadministraatorina Klassikaaslaste juures. Enne seda töötasin ka administraatorina, tegelesin Manticore Searchi, Sphinx searchi ja Elasticsearchiga. Kui peaks veel mĂ”ni ...search vĂ€lja tulema, tĂ”enĂ€oliselt töötan ka sellega. Osalen ka mitmes avatud lĂ€htekoodiga projektis vabatahtlikuna.
Kui ma Klassikaaslaste juurde tulin, ĂŒtlesin arvelt intervjuul, et oskan töötada Elasticsearchiga. PĂ€rast harjumist ja mĂ”ned lihtsad ĂŒlesanded lahendades sain suure ĂŒlesande logihaldusĂŒsteemi reformimiseks, mis oli sel ajal olemas.
NÔuded
SĂŒsteemi nĂ”uded olid sĂ”nastatud jĂ€rgmiselt:
- Frontendina pidin kasutama Graylogi. Kuna ettevÔttes oli juba kogemus selle toote kasutamisega, siis programmilised ja testijad tundsid seda, see oli neile tuttav ja mugav.
- Andme maht: keskmiselt 50-80 tuhat sÔnumit sekundis, kuid kui midagi katki lÀheb, siis liiklust ei piirata, see vÔib olla 2-3 miljonit rida sekundis.
- Kliendiga arutades töötluse kiirusnĂ”udeid, mĂ”istsime, et sellise sĂŒsteemi tĂŒĂŒpiline kasutusmuster on jĂ€rgmine: inimesed otsivad oma rakenduse logisid viimase kahe pĂ€eva jooksul ja ei sooviks oodata vastust rohkem kui sekund.
- Adminnid nĂ”udsid, et sĂŒsteem oleks vajadusel kergesti skaaleeritav, ilma et nad peaksid sĂŒgavale tĂ€ielikult sisse minema, kuidas see toimib.
- Ainus hooldusĂŒlesanne, mis nendele sĂŒsteemidele perioodiliselt vaja oli, oli mingi riistvara vahetamine.
- Lisaks on Odnoklassnikites ilus tehniline traditsioon: iga teenus, mille me kÀivitame, peab taluma andmekeskuse riket (Àkilist, planeerimata ja absoluutselt igal ajal).
Selle projekti viimase nÔudmise tÀitmine nÔudis meilt kÔige rohkem vaeva, millest rÀÀgin lÀhemalt hiljem.
Keskkond
Me töötame neljas andmekeskuses, kusjuures Elasticsearch'i andmeklastrid vÔivad asuda vaid kolmes (mitme mitte-tehnilise pÔhjuse tÔttu).
Nendes neljas andmekeskuses asub ligikaudu 18 000 erinevat logiallikat â riistvara, konteinerid, virtuaalmasinad.
Oluline omadus: klastrite kĂ€ivitamine toimub konteinerites mitte fĂŒĂŒsilistel masinatel, vaid . Konteineritele garanteeritakse 2 tuuma, mis on sarnased 2.0Ghz v4-le ning ĂŒlejÀÀnud tuumade kasutamine, juhul kui need on seisakusse jÀÀnud.
TeisisÔnu:

Topoloogia
Lahenduse ĂŒldine visioon paistis mulle alguses jĂ€rgmine:
- 3-4 VIP-d seisavad Graylogi domeeni A-kirje taga, sellele aadressile saadetakse logid.
- iga VIP on LVS tasakaalustaja.
- PĂ€rast seda jĂ”uavad logid Graylogi sĂŒsteemi, osa andmetest lĂ€heb GELF-formaadis, osa syslog-formaadis.
- Edasi kirjutatakse see kĂ”ik suurte partiidena Elasticsearch'i koordinaatorite sĂŒsteemi.
- Need omakorda saadavad kirjutamis- ja lugemisemandid asjakohastele andmenoodidele.

Terminoloogia
MÔned vÔivad terminoloogias mitte kÔigega pÔhjalikult tuttavad olla, seetÔttu tasub sellel peatumiseks natuke aega vÔtta.
Elasticsearchis on mitu tĂŒĂŒpi sĂ”lme â master, koordinaator, andmesĂ”lm. On veel kaks muud tĂŒĂŒpi, mis on mĂ”eldud erinevate logide töötlemiseks ja erinevate klastrite omavaheliseks suhtlemiseks, kuid me oleme kasutanud vaid nimetatud tĂŒĂŒpe.
Master
Kontrollib kĂ”iki klastris olevaid sĂ”lmesid, toetab ajakohast klastrikaarti ja levitab seda sĂ”lmede vahel, töötleb sĂŒndmuste loogikat ning tegeleb erineva tĂŒĂŒpi klastrisiseste toimingutega.
Koordinaator
Teeb ĂŒhte ainsat ĂŒlesannet: vĂ”tab vastu kliendilt pĂ€ringud lugemiseks vĂ”i kirjutamiseks ja suunab selle liikluse. Kui tegu on kirjutamispĂ€ringuga, kĂŒsib ta suure tĂ”enĂ€osusega masterilt, millisesse shardi vastavat indeksi seda panna, ja suunab pĂ€ringu edasi.
AndmesÔlm
Hoidab andmeid, tÀidab vÀljast tulevaid otsingupÀringuid ja tehingute toiminguid, mis on seotud sellel asuvate shardidega.
Graylog
See on midagi sarnast Kibana ja Logstashi sulandumisega ELK-virnas. Graylog ĂŒhendab endas nii kasutajaliidese kui ka logide töötlemise torujuhtme. Graylogi taga töötavad Kafka ja Zookeeper, mis tagavad Graylogi sidususe klastrina. Graylog suudab vahemĂ€llu salvestada logisid (Kafka) juhtudel, kui Elasticsearch ei ole kergesti ligipÀÀsetav, ja kordab ebaĂ”nnestunud lugemis- ja kirjutamisĂŒlesandeid, rĂŒhmitades ja sildistades logisid vastavalt mÀÀratud reeglitele. Nagu Logstash, omab Graylog ka funktsionaalsust stringide muutmiseks enne Elasticsearch'i salvestamist.
Lisaks on Graylogis sisseehitatud teenuse avastamine, mis vĂ”imaldab ĂŒhe kergesti ligipÀÀsetava Elasticsearch'i sĂ”lme pĂ”hjal saada kogu klastri kaardi ja filtreerida seda konkreetse sildi alusel, mis vĂ”imaldab suunata pĂ€ringud teatud konteineritele.
Visuaalselt nÀeb see umbes vÀlja nii:

See on ekraanipilt konkreetsest instantsist. Siin ehitame otsingupÀringu pÔhjal histogrammi ning kuvame asjakohaseid ridu.
Indeksid
Tagasi sĂŒsteemi arhitektuuri juurde, tahaksin detailselt peatuda sellel, kuidas me index mudelit ehitasime, et kĂ”ik see Ă”igesti toimiks.
KĂŒljendatud skeemil on see alumine tase: Elasticsearchi andmesĂ”lmed.
Indeks on suur virtuaalne entiteet, mis koosneb Elasticsearch'i shard'idest. Iga shard iseenesest on vaid Lucene indeks. Iga Lucene indeks koosneb omakorda ĂŒhest vĂ”i enamast segmendist.

Disaini kĂ€igus arvestasime, et suurte andmemahtude lugemiskiirusnĂ”uete tĂ€itmiseks on vajalik andmad ĂŒhtlaselt "jaotada" andmed andmepunktide vahel.
See tÔi meid jÀreldusele, et indeksi shard'ide arv (koos replikatega) peab olema rangelt vÔrdne andmepunktide arvuga. Esiteks, et tagada replikeerimise faktor, mis on kaks (st vÔime kaotada poole klastrist). Teiseks, et lugemis- ja kirjutamispeab töötlema vÀhemalt poole klastrist.
KÀivitusaja mÀÀrasime esmalt 30 pÀeva.
Shard'ide jaotus vÔib olla visuaalselt esitatud jÀrgmiselt:

Kogu tumehall ristkĂŒlik on indeks. Vasak punane ruut selles on pĂ”hishard, indeksis esimene. Ja sinine ruut on kopeeritud shard. Need asuvad erinevates andmekeskustes.
Kui me lisame veel ĂŒhe shard'i, jĂ”uab see kolmandasse andmekeskusesse. Ja lĂ”puks saame me sellise struktuuri, mis vĂ”imaldab andmekeskuse kadumist ilma, et andmete jĂ€rjepidevus kannataks:

Indeksite rotatsiooni, st uue indeksi loomise ja kÔige vanema indeksi kustutamise, oleme seadnud 48 tunniks (indeksi kasutuse patterni kohaselt: viimase 48 tunni jooksul otsitakse enim).
Selline indeksi rotatsiooni intervall on seotud jÀrgmiste pÔhjustega:
Kui konkreetne andmevahe nodi saab otsingupĂ€ringu, on jĂ”udluse seisukohalt kasulikum, kui kĂŒsitakse ainult ĂŒhte shard'i, kui selle suurus on vĂ”rreldav nodi mĂ€lupanga suurusega. See vĂ”imaldab hoida indeksi "kuuma" osa mĂ€lupangas ja kiiresti sellele juurde pÀÀseda. Kui "kuumi osi" on palju, siis indeksi otsingukiirus halveneb.
Kui sĂ”lm hakkab tĂ€itma otsingupĂ€ringut ĂŒhes shardis, eraldab ta fĂŒĂŒsilise masina hĂŒperthreading tuumadele vastava arvu lĂ”ime. Kui otsingupĂ€ring hĂ”lmab suurt hulka shard'e, kasvab lĂ”imede arv proportsionaalselt. See mĂ”jutab negatiivselt otsingu kiirus ja avaldab halba mĂ”ju uute andmete indekseerimisele.
OtsingulĂ€vede tagamiseks otsustasime kasutada SSD-sid. Kiireks pĂ€ringute töötlemiseks peavad masinad, millel need konteinerid asuvad, omama vĂ€hemalt 56 tuuma. Arv 56 on valitud kui tingimisi piisav vÀÀrtus, mis mÀÀrab lĂ”imede arvu, mida Elasticsearch töös genereerib. Elasticsearchis sĂ”ltuvad paljud thread pool'i parameetrid otseselt saadaval olevate tuumade arvust, mis omakorda mĂ”jutab vajalike nodede arvu klastris pĂ”himĂ”ttega "vĂ€hem tuumi â rohkem node".
KokkuvĂ”ttes selgus, et keskmiselt kaalub shard umbes 20 gigabaidi ning ĂŒhe indeksi kohta on 360 shard'i. SeetĂ”ttu, kui me neid roteerime iga 48 tunni jĂ€rel, on neid kokku 15. Iga indeks mahutab andmeid kahe pĂ€eva jooksul.
Andmete salvestamise ja lugemise skeemid
Vaatame, kuidas selles sĂŒsteemis andmeid salvestatakse.
Oletame, et Graylogist tuleb koordinaatorisse mingi pÀring. NÀiteks soovime indekseerida 2-3 tuhat rida.
Koordinaator, saades Graylogist pĂ€ringu, kĂŒsib meistrilt: âIndekseerimise pĂ€ringus on konkreetne indeks, kuid millisesse shard'i see kirjutada â seda pole tĂ€psustatudâ.
Meister vastab: âSalvesta see teave shard'i numbriga 71â, pĂ€rast mida saadetakse see otse asjakohasesse andme-sĂ”lme, kus asub primary-shard numbriga 71.
PĂ€rast seda replikatakse tehingute logi replica-shard'i, mis asub juba teises andmekeskuses.

Graylogist tuleb koordinaatorisse otsingupÀring. Koordinaator suunab selle indeksi pÔhjal, samas Elasticsearch jaotab pÀringud round-robin meetodil primary-shard'i ja replica-shard'i vahel.

180 sĂ”lme vastavad ebavĂ”rdselt ja seni, kuni nad vastavad, kogub koordinaator teavet, mille juba kiiremad andme-sĂ”lmed temasse âvĂ€lja sĂŒlitasidâ. PĂ€rast seda, kui kas kogu teave on saabunud vĂ”i pĂ€ringu jaoks on saavutatud ajavahemik, edastab ta kĂ”ik otse kliendile.
Selle sĂŒsteemi keskmine vastamisaeg otsingupĂ€ringutele viimase 48 tunni jooksul on 300â400 ms, vĂ€lja arvatud pĂ€ringud, mis sisaldavad leading wildcard'it.
Elasticsearchi "Lilledega": Java seadistamine

Kuna soovime, et kÔik see töötaks nii nagu algselt plaanisime, veetsime me vÀga palju aega erinevate asjade klastris hÀÀlestamisele.
Esimene leitud probleem oli seotud sellega, kuidas Elasticsearch on vaikimisi Java jaoks eelseadistatud.
Probleem number ĂŒks
Oli palju teateid, et meil on Lucene tasemel, kui taustatöödel on kĂ€ivitatud, Lucene segmentide ĂŒhendamised ebaĂ”nnestunud. Samuti oli logides nĂ€ha, et see on OutOfMemoryError-iga seotud. Telemeetria kohaselt nĂ€gime, et heap on vabanev ja ei olnud selge, miks see operatsioon ebaĂ”nnestub.
Selgus, et Lucene indeksite ĂŒhendamised toimuvad vĂ€ljaspool heap'i. Ja konteinerid on ĂŒsna rangelt piiratud kasutatavate ressurssidega. Nendesse ressurssidesse mahtus ainult heap (heap.size vÀÀrtus oli ligikaudu vĂ”rdne RAM-iga) ja mĂ”ned off-heap operatsioonid kukkusid vĂ€lja mĂ€lu jagamise veaga, kui mingil pĂ”hjusel ei mahtunud nad neid umbes 500 MB, mis olid limiidile lĂ€hedal.
Probleem oli ĂŒsna lihtne: konteinerile antud RAM-i mahtu suurendati, pĂ€rast mida unustasime, et sellised probleemid ĂŒldse eksisteerisid.
Teine probleem
Umbes 4â5 pĂ€eva pĂ€rast klastrite kĂ€ivitamist mĂ€rkisime, et andmenoodid hakkavad perioodiliselt klastrist vĂ€lja langema ja tagasi tulema 10â20 sekundi pĂ€rast.
Kui hakkasime uurima, selgus, et see off-heap mĂ€lu Elasticsearchis ei ole praktiliselt ĂŒldse kontrollitud. Kui andsime konteinerile rohkem mĂ€lu, saime vĂ”imaluse tĂ€ita otsepuud (direct buffer pools) erinevate andmetega, ning need puhastusid ainult pĂ€rast seda, kui Elasticsearch kĂ€ivitas explicit GC.
MĂ”nel juhul toimus see operatsioon ĂŒsna pika aja jooksul, ja selle aja jooksul suutis klaster mĂ€rgistada selle noodiga juba vĂ€lja langenud. See probleem on hĂ€sti kirjeldatud. .
Lahendus oli jÀrgmine: piirasime Java vÔimet kasutada peamise osa mÀlu vÀljaspool heapsit nende operatsioonide jaoks. Piirasime selle 16 gigabaidini (-XX:MaxDirectMemorySize=16g), saavutades, et explicit GC kutsuti oluliselt sagedamini ja toimus oluliselt kiiremini, lÔpetades seelÀbi klastrit destabiliseerimise.
Kolmas probleem
Kui arvasite, et probleemid "sĂ”lmedega, mis lahkuvad klastrist kĂ”ige ettearvamatumatel hetkedel" on nĂŒĂŒdseks lĂ€bi, eksite.
Indeksite töö seadistamisel valisime mmapfs, et vĂ€rskete shardide puhul suure segmentatsiooniga. See oli ĂŒsna suurem viga, sest mmapfs-i kasutamisel kaardistatakse fail peamĂ€llu ning seejĂ€rel töötame juba mapped-failiga. SeetĂ”ttu tekib olukord, kus ĂŒritades viimaseid niite peatada, lĂ€heme me safepointi poole vĂ€ga kaua, ja teel sinna lakkab rakendus reageerimast meistrilt kĂŒsimistele, kas see on ikka veel aktiivne. SeetĂ”ttu arvab master, et sĂ”lm ei ole enam klastris. PĂ€rast seda, umbes 5â10 sekundi pĂ€rast, töötab prĂŒgikoristus, sĂ”lm taastub, siseneb taas klastrisse ja alustab shardide initsialiseerimist. KĂ”ik see meenutas tugevalt âtoodet, mida me vÀÀrimeâ ja ei sobinud tĂ”sisemaks kasutamiseks.
Selle kĂ€itumise lĂ”petamiseks vĂ”tsime kĂ”igepealt kasutusele standardse niofs'i ning seejĂ€rel, kui oleme Elastic'i viiendast versioonist kuuesse migrate'nud, proovime hybridfs'i, kus see probleem ei esinenud. TĂŒĂŒpide kohta saab rohkem lugeda storage'st. .
Neljas probleem
Siis oli veel ĂŒks vĂ€ga huvitav probleem, mida lahendasime rekordiliselt kaua. Me pĂŒĂŒdsime seda 2-3 kuud, kuna selle muster oli tĂ€iesti arusaamatu.
MĂ”nikord lĂ€ksid meie koordinaatorid Full GC'sse, tavaliselt pĂ€rast lĂ”unat, ja sealt nad enam ei naasnud. Samas, kui logisime GC viivitusi, nĂ€gi see vĂ€lja selline: kĂ”ik sujus hĂ€sti, hĂ€sti, hĂ€sti, ja siis jĂ€rsku â kĂ”ik lĂ€ks Ă€kki halvaks.
Alguses arvasime, et meil on kuri kasutaja, kes kĂ€ivitab mingisuguse pĂ€ringu, mis lööb koordinaatori töökeskkonnast vĂ€lja. Logisime pĂ€ringuid vĂ€ga kaua, pĂŒĂŒdes aru saada, mis toimub.
LÔpuks selgus, et hetkel, kui mÔni kasutaja kÀivitab vÀga suurepÀringu ja see jÔuab konkreetsele Elasticsearchi koordinaatorile, vastavad mÔned noodid kauem kui teised.
Kuni sel hetkel, mil koordinaator ootab kĂ”igi nodide vastust, kogub ta endasse tulemusi, mis on saadetud juba vastanud nodidelt. GC jaoks tĂ€hendab see, et meie hĂŒpoteekide kasutusmuster muutub vĂ€ga kiiresti. Ja see GC, mida me kasutasime, ei suutnud selle ĂŒlesandega toime tulla.
Ainus lahendus, mille me leidsime, et muuta klastrite kĂ€itumist sellises olukorras, on migreerimine JDK13-le ja prĂŒgikoguja Shenandoah kasutamine. See lahendas probleemi, koordinaatorid ei kukkunud enam alla.
Sellega lÔppesid Java probleemid ja algasid ribalaiuse probleemid.
âMarjadâ Elasticsearchiga: ribalaius

Ribalaiuse probleemid tÀhendavad, et meie klaster töötab stabiilselt, kuid dokumentide indekseerimise tipppunktide ajal ja manööverdushetkedel on jÔudlus ebapiisav.
Esimene mĂ€rgatav sĂŒmptom: mĂ”ningate âplahvatusteâ korral tootmises, kui genereeritakse Ă€kki vĂ€ga suur hulk logisid, hakkab Graylogis sageli ilmuma indekseermise viga es_rejected_execution.
See toimus seetĂ”ttu, et thread_pool.write.queue ĂŒhes andmega nodis suudab enne Elasticsearchi indekseerimistaotluse töötlemist ja teabe jagusse kirjutamist vaikimisi vahemĂ€lus hoida vaid 200 taotlust. Ja kĂ€sitletakse seda parameetrit vĂ€ga vĂ€he. Mainitakse vaid lĂ”pp-arvu teemasid ja vaikimisi suurust.
Muidugi hakkasime seda vÀÀrtust kohandama ning selgus jĂ€rgmist: meie seadistuses vahemĂ€lustatakse ĂŒsna hĂ€sti kuni 300 taotlust, samas kui suurem vÀÀrtus toob meid tagasi Full GC-i.
Lisaks, kuna need on ĂŒhes taotluses saabuvad sĂ”numipakid, pidi Graylogi seadistama nii, et see kirjutaks mitte liiga sageli ja vĂ€ikeste pakettidega, vaid suurte pakettidega vĂ”i iga kolme sekundi jĂ€rel, kui pakett pole veel tĂ€ielik. Sellisel juhul tundub, et teave, mida me Elasticsearchi kirjutame, on kĂ€ttesaadav mitte kahe sekundi jooksul, vaid viie sekundi jooksul (mis sobib meile tĂ€iesti), kuid vĂ€heneb retrai arv, mis tuleb suure teabe paketi edastamiseks teha.
See on eriti oluline siis, kui meil on midagi kukkunud ja see teatatakse meeleheitlikult, et vĂ€ltida tĂ€ielikku spĂ€mmimist Elasticis, ja mĂ”ne aja pĂ€rast â mittetoimivad Graylogi noodid ummistunud puhvrite tĂ”ttu.
Lisaks, kui meil olid need plahvatused tootmises, saime kaebusi programmeerijatelt ja testijatelt: hetkel, kui nad neid logisid tÔeliselt vajavad, tullakse neid vÀlja vÀga aeglaselt.
Hakkasime uurima. Ăhest kĂŒljest oli selge, et nii otsingupĂ€ringud kui ka indekseerimispĂ€ringud töötavad pĂ”himĂ”tteliselt ĂŒhel ja samal fĂŒĂŒsilisel masinal, seega mingil mÀÀral on teatud langused vĂ€ltimatud.
Kuid seda sai osaliselt vÀltida, kasutades ƥesti versioonides Elasticsearchi ilmunud algoritmi, mis vÔimaldab suunata pÀringud asjakohastele andmepunktide vahel mitte juhuslikult round-robin pÔhimÔttel (konteiner, mis tegeleb indekseerimisega ja hoiab primary-shard'i, vÔib olla vÀga hÔivatud, seal ei ole kiire vastuse vÔimalust), vaid suunata see pÀring vÀhem koormatud konteinerisse, millel on replica-shard, mis vastab oluliselt kiiremini. TeisisÔnu, jÔudsime use_adaptive_replica_selection: true juurde.
Lugemise pilt hakkab vÀlja nÀgema selline:

Selle algoritmile ĂŒleminek aitas oluliselt parandada pĂ€ringu aega olukordades, kus meil oli suur logide kirjutamise voog.
LÔppkokkuvÔttes seisnes peamine probleem sujuvas andmekeskuse vÀljavÔtmises.
Mida me ootasime klastrilt kohe pĂ€rast ĂŒhenduse kaotamist ĂŒhe DC-ga:
- Kui meil on kadunud andmekeskuses praegune master, siis valitakse see ĂŒmber ja liigub rollina teisele sĂ”lmele teises DC-s.
- Master eemaldab kiiresti klastrist kÔik kÀttesaamatud sÔlmed.
- JÀÀnud pÔhjal mÔistab ta: kadunud andmekeskuses olid meil sellised peamised shardid, kiiresti promootib ta tÀiendavad replica-shardid jÀÀnud andmekeskustes ja meil jÀtkub andmete indekseerimine.
- Selle tulemusena hakkab meie klastrite kirjutamis- ja lugemisvĂ”ime jĂ€rk-jĂ€rgult langema, kuid ĂŒldiselt töötab kĂ”ik aeglaselt, kuid stabiilselt.
Kuidas selgus, soovisime midagi sellist:

Aga saime jÀrgmist:

Kuidas see juhtus?
Andmekeskuse kokkuvarisemise hetkel oli meie kitsaskohaks master.
Miks?
Asja on selles, et masteris on TaskBatcher, mis vastutab teatud ĂŒlesannete ja sĂŒndmuste levitamise eest klastris. Iga nodi vĂ€ljalĂŒlitamine, iga shardi edasiviimine replica-st primary-sse, igasugune shardi loomise ĂŒlesanne â kĂ”ik see lĂ€heb esmalt TaskBatcherisse, kus see töödeldakse jĂ€rjestikku ja ĂŒhes voos.
Ăhe andmekeskuse vĂ€ljaviimise hetkel juhtus, et kĂ”ik elujĂ”ulised andmenoodid elujĂ”ulistes andmekeskustes pidid teatama masterile, et "meil on kadunud sellised shardid ja sellised andmenoodid".
Samal ajal saatsid elujĂ”ulised andmenoodid kogu selle teabe praegusele masterile ja proovsid oodata kinnitust, et ta on selle vastu vĂ”tnud. Nad ei oodanud seda, sest master sai ĂŒlesandeid kiiremini, kui ta oskas vastata. Noodid kordasid pĂ€ringuid ajavahemiku lĂ”ppedes, samal ajal kui master ei pĂŒĂŒdnud enam neile vastata, vaid oli tĂ€ielikult pĂŒhendunud pĂ€ringute sorteerimisele prioriteedi jĂ€rgi.
Terminali vaates nÀgi vÀlja nii, et data-nodes saatis masterile nii palju, et ta lÀks full GC. PÀrast seda kolis meie master jÀrgmisse nodde, kus toimus sama asi, ja lÔpuks lagunes klaster tÀielikult.
Me tegime mÔÔtmisi ja enne versiooni 6.4.0, kus see probleem fikseeriti, piisab, kui eemaldada korraga vaid 10 data-nodeâit 360-st, et klaster tĂ€ielikult maas oleks.
See nÀgi vÀlja umbes nii:

PĂ€rast versiooni 6.4.0, kus see kohutav bugi parandati, lĂ”petasid data-nodes masteri tapmise. Kuid see ei teinud teda ânutikamaksâ. Nimelt: kui me eemaldame 2, 3 vĂ”i 10 (mille iganes arv, mis ei ole 1) data-node'it, saab master mingi esialgse sĂ”numi, mis ĂŒtleb, et node A on kadunud, ja pĂŒĂŒab sellest rÀÀkimiseks teavitada node B, node C, node D.
Praegu saab sellega vĂ”idelda ainult seadistades aega, mille jooksul proovitakse kellelegi midagi selgitada, umbes 20-30 sekundit, ja seelĂ€bi kontrollida data-centerâi eemaldamise kiirus klastrist.
PÔhimÔtteliselt vastab see algselt projekti lÔppprodukti jaoks esitatud nÔuetele, kuid puhta teaduse seisukohalt on see tÔrge. Mis, muide, on arendajate poolt versioonis 7.2 edukalt parandatud.
Kuid kui mingi andme-node kukkus, selgus, et teavet selle kukkumise kohta on olulisem levitada kui kogu klastrile rÀÀkida, et sellel olid sellised esmased osad (et reklaamida replica-shard teises andmekeskuses esmaseks, kuhu saaks andmeid kirjutada).
SeetÔttu, kui kÔik "rahutused" on möödas, ei mÀrgistata vÀljatootud andme-nodesid kohe vananenuks. Seega peame ootama, kuni kÔik pinged vÀljatoodud andme-nodedele aeguvad, ja alles siis hakkab meie klaster rÀÀkima, et seal-seal-seal tuleb andmete salvestamine jÀtkata. TÀpsemat teavet saab lugeda siit. .
KokkuvĂ”ttes vĂ”tab andmeruumi vĂ€ljutamine meil tĂ€na tipptunnil aega umbes 5 minutit. Sellise suure ja kohmakas masina jaoks on see ĂŒsna hea tulemus.
KokkuvÔttes jÔudsime jÀrgmise lahenduseni:
- Meil on 360 andme-node'i, millel on 700 gigabaidi kÔvakettad.
- 60 koordinaatorit liikluse suunamiseks nende samade andmepunktide kaudu.
- 40 meistrit, kes on jÀÀnud meile kui mingi pÀrand versioonidest enne 6.4.0 - et ellu jÀÀda andmekeskuse sulgemisest, olime moraalselt valmis kaotama mÔned masinad, et tagada isegi halvimates stsenaariumides ustavus meistrite seas.
- Iga katse rollide ĂŒhendamiseks ĂŒhes konteineris jooksis meie puhul kokku sellega, et varem vĂ”i hiljem node purunes koormuse all.
- Kogu klastris kasutatakse heap.size-d, mis on 31 gigabaiti: kÔik katsed suurust vÀhendada tÔid kaasa, et raskete otsingupÀringute puhul, millel oli leading wildcard, kas tapeti mÔned node'id vÔi tabas circuit breaker ise Elasticsearchis.
- Lisaks pingutasime otsingutulemuste tagamiseks hoidma klastris objektide arvu minimaalsena, et töödelda vĂ”imalikult vĂ€he sĂŒndmusi kitsas kohas, mis meil meistris Ă”nnestus.
Viimaseks jÀlgimisest
Kuna kÔik see töötaks nii, nagu oli planeeritud, jÀlgime jÀrgmist:
- Iga andme taga sĂ”lmib meie pilve, et see on olemas ja sellel on sellised shardâid. Kui kustutame kuskil midagi, teatab klaster 2â3 sekundi jooksul, et keskuses A oleme kustutanud sĂ”lmed 2, 3 ja 4 â see tĂ€hendab, et teistes andmekeskustes ei saa me mingil juhul kustutada neid sĂ”lmi, kus on jÀÀnud shard'id ainsuses.
- Teades meistri kĂ€itumist, jĂ€lgime vĂ€ga tĂ€helepanelikult pending-ĂŒlesannete arvu. Sest isegi ĂŒks jÀÀk ĂŒlesanne, kui seda Ă”igel ajal ei taandata, vĂ”ib teoreetiliselt kriitilises olukorras olla pĂ”hjus, miks meil ei toimi nĂ€iteks replica-shardi edastus primary'sse, mis peatab indekseerimise.
- Samuti jÀlgime vÀga hoolikalt garbage collectori viivitusi, kuna meil on selle probleemiga juba olnud suuri raskusi optimeerimise kÀigus.
- Threadâite tagasilĂŒkked, et mĂ”ista ette, kus asub 'pudelikael'.
- Ja ka standardsed nÀitajad, nagu heap, RAM ja I/O.
Monitooringu loomisel tuleb kindlasti arvesse vĂ”tta Elasticsearchi Thread Pooli omadusi. kirjeldab seadistamise vĂ”imalusi ja vaikevÀÀrtusi otsimiseks, indekseerimiseks, kuid jĂ€tab tĂ€iesti tĂ€helepanuta thread_pool.management. Need niidid töötlevad eelkĂ”ige pĂ€ringuid tĂŒĂŒpi _cat/shards ja muid sarnaseid, mida on mugav kasutada jĂ€lgimise kirjutamisel. Mida suurem klaster, seda rohkem selliseid pĂ€ringuid tehakse ajaĂŒhikus ning eelmainitud thread_pool.management on lisaks sellele, et seda ei ole ametlikus dokumentatsioonis esitatud, vaikimisi piiratud 5 niidiga, mis saab kiiresti ammendatud, pĂ€rast mida jĂ€lgimine lakkab korrektselt töötamast.
LÔpetuseks tahaks öelda: meil Ônnestus! Oleme suutnud anda meie programmeerijatele ja arendajatele tööriista, mis on praktiliselt igas olukorras vÔimeline kiiresti ja usaldusvÀÀrselt andma teavet sellest, mis toimub tootmises.
Jah, see osutus ĂŒsna keeruliseks, aga sellegipoolest suutsime meie soovid mahutada juba olemasolevatesse toodetesse, mida ei pidanud enda jaoks parandama ja ĂŒmber kirjutama.

Allikas: habr.com
