
Elasticsearch on paljude jaoks tuttav. Kuid mis juhtub, kui soovid selle abil salvestada logisid «suures mahus»? Ja veel, kuidas taluda kÔigi mitme andmekeskuse tÔrkeid? Milline arhitektuur peaks olema, ja milliste peidetud probleemide ees seisad?
Me Odnoklassnikis otsustasime, et kasutame elasticsearchi, et lahendada logihalduse jautet, ja nĂŒĂŒd jagame oma kogemusi Habros: nii arhitektuuri kui ka peidetud probleemide kohta.
Mina olen Pjotr Zaitsev, töötan sĂŒsteemiadministraatorina Odnoklassnikis. Enne seda olin samuti admin ja töötasin Manticore Searchi, Sphinx Searchi ja Elasticsearchiga. VĂ”ib-olla, kui ilmub jĂ€lle mĂ”ni ...search, töötan ka selle kallal. Osalen ka mitmetes avatud lĂ€htekoodiga projektides vabatahtlikuna.
Kui ma tulin Odnoklassnikisse, ĂŒtlesin usinalt intervjuul, et oskan töötada Elasticsearchiga. PĂ€rast sellega harjumist ja mĂ”ne lihtsa ĂŒlesande tegemist anti mulle suur ĂŒlesanne reformeerida tollane logihaldussĂŒsteem.
NÔuded
SĂŒsteemi nĂ”uded formuleeriti jĂ€rgmiselt:
- Frontendina pidi olema kasutusel Graylog. Sest ettevÔttes oli juba selle toote kasutamise kogemus, arendajad ja testijad teadsid seda, see oli neile tuttav ja mugav.
- Andmemaht: keskmiselt 50-80 tuhat sÔnumit sekundis, kuid kui midagi lÀheb katki, siis liiklus ei ole millegagi piiratud, see vÔib olla 2-3 miljonit rida sekundis.
- Kliendiga nĂ”udlusi arutades jĂ”udsime arusaamisele, et tĂŒĂŒpiline musternĂ€ide sellise sĂŒsteemi kasutamisest on jĂ€rgmine: inimesed otsivad enda rakenduse logisid viima kahe pĂ€eva jooksul ja ei soovi, et ootavad rohkem kui ĂŒhe sekundi.
- Administraatorid rĂ”hutasid, et sĂŒsteem peab olema vajadusel hĂ”lpsasti skaleeritav, nĂ”udmata sĂŒgavat arusaamist selle toimimisest.
- Ainus hooldusĂŒlesanne, mis nendele sĂŒsteemidele perioodiliselt vajalik oli, oli vahetada mĂ”nd riistvara.
- Lisaks on Odnoklassnikis suurepÀrane tehniline traditsioon: iga teenus, mille me kÀivitame, peab taluma andmekeskuse tÔrke (Àkki, planeerimata ja igal ajal).
Selle projekti viimase nÔude tÀitmine nÔudis meilt kÔige suuremat vaeva, millest rÀÀgin lÀhemalt.
Keskkond
Me töötame neljas andmekeskuses, samas vÔivad Elasticsearchi andmenood asuda ainult kolmes (mitmete mitte-tehniliste pÔhjuste tÔttu).
Nendes neljas andmekeskuses asub umbes 18 tuhat erinevat logiallikat â riistvara, konteinerid, virtuaalmasinad.
Oluline omadus: klastrite kĂ€ivitamine toimub konteinerites mitte fĂŒĂŒsilistel masinatel, vaid . Korrustele garanteeritakse 2 tuuma, mis on vĂ”rdsed 2,0 GHz v4-ga, vĂ”imalusega kasutada ĂŒlejÀÀnud tuumasid, kui need on vabad.
TeisisÔnu:

Topoloogia
Lahendi ĂŒldine vĂ€limus nĂ€gi mulle algselt vĂ€lja jĂ€rgmine:
- 3-4 VIP-d seisavad domeeni Graylog A-kirje taga, sellele aadressile saadetakse logid.
- iga VIP esindab LVS-i koormuse tasakaalustajat.
- PÀrast seda jÔuavad logid Graylogi akusse, osa andmetest tuleb GELF formaadis, osa syslog formaadis.
- Edasi kirjutatakse kÔik need suurtel partidel Elasticsearchi koordinaatorite akusse.
- Need, omakorda, saadavad kirjutamise ja lugemise pÀringud asjakohastele andmeoordadele.

Terminoloogia
VÔib-olla ei tunne kÔik terminoloogiat kuigi hÀsti, seetÔttu tahaksin sellega pisut peatuda.
Elasticsearchis on mitmeid tĂŒĂŒpe noode â master, koordinaator, andmenood. On veel kaks muud tĂŒĂŒpi erinevate logide muutmiseks ja erinevate klastrite omavaheliseks sidumiseks, kuid me kasutasime ainult loetletud.
Master
Pingib kĂ”ik klastris olevad nood, toetab kehtivat klastrikaarti ja levitab seda noode vahel, kĂ€sitleb sĂŒndmuse loogikat, tegeleb igasuguse klastrisisese hooldusega.
Koordinaator
TĂ€idab ĂŒhte ainukest ĂŒlesannet: aktsepteerib kliendipĂ€ringuid lugemise vĂ”i kirjutamise jaoks ja suunab selle liikluse. Kui pĂ€ring on kirjutamise kohta, siis kĂŒsib see tĂ”enĂ€oliselt masterilt, millisesse sobivasse indeksi shard'i seda paigutada, ja suunab pĂ€ringu edasi.
Andmenood
Hoidab andmeid, tÀidab vÀljastpoolt saabuvaid otsingupÀringuid ja teoseid asuvatelt shardidelt.
Graylog
See, this is somewhat like a blend of Kibana with Logstash in the ELK stack. Graylog combines both UI and log processing pipeline. Under the hood, Kafka and Zookeeper work within Graylog, providing connectivity for Graylog as a cluster. Graylog can cache logs (Kafka) in case Elasticsearch becomes unavailable and retry failed read and write requests, grouping and tagging logs according to specified rules. Similar to Logstash, Graylog has functionality for modifying strings before writing them to Elasticsearch.
Additionally, Graylog features built-in service discovery, allowing you to obtain the entire cluster map based on one available Elasticsearch node and filter it by a specific tag, enabling requests to be directed to specific containers.
Visually, it looks something like this:

This is a screenshot from a specific instance. Here we build a histogram based on a search query, displaying relevant entries.
Indeksid
Returning to the system architecture, I would like to take a closer look at how we constructed the index model to ensure everything operates correctly.
In the previously provided diagram, this is the lowest level: Elasticsearch data nodes.
An index is a large virtual entity consisting of Elasticsearch shards. Each of these shards is, in fact, a Lucene index. And each Lucene index, in turn, consists of one or more segments.

During the design phase, we estimated that to meet the requirement for read speed on a large volume of data, we needed to evenly 'spread' this data across the data nodes.
This led to the fact that the number of shards per index (with replicas) should be strictly equal to the number of data nodes. Firstly, to ensure a replication factor of two (meaning we can lose half of the cluster). Secondly, to handle read and write requests on at least half of the cluster.
We initially defined the retention time as 30 days.
The distribution of shards can be graphically represented as follows:

The entire dark gray rectangle is the index. The left red square in it is the primary shard, the first one in the index. And the blue square is the replica shard. They are located in different data centers.
Kui me lisame veel ĂŒhe shard'i, lĂ€heb see kolmandasse andmekeskusesse. LĂ”puks saame sellise struktuuri, mis tagab andmete jĂ€rjepidevuse, isegi kui ĂŒks andmekeskus kaob.

Indeksite roteerimine, st uue indeksi loomine ja kÔige vanema kustutamine, on seatud 48 tunni peale (indeksi kasutusmuster: viimase 48 tunni jooksul otsitakse kÔige sagedamini).
Sellise indeksi roteerimise intervalliga seonduvad jÀrgmised pÔhjused:
Kui konkreetne andmenood saadab otsingupĂ€ringu, on jĂ”udluse seisukohalt kasulikum kĂŒsida ĂŒhte shard'i, kui selle suurus on vĂ”rdsustatav sĂ”lme mĂ€lu suurusega. See vĂ”imaldab hoida indeksi "kuuma" osa mĂ€lu ja kiiresti sellele pÀÀseda. Kui "kuumi osi" on liiga palju, halveneb indeksi otsingu kiirus.
Kui sĂ”lm hakkab mĂ”nel shard'il otsingupĂ€ringut tĂ€itma, eraldab ta niipalju lĂ”ime, kui palju on fĂŒĂŒsilise masina hĂŒper-töötleva tuuma. Kui otsingupĂ€ring puudutab palju shard'e, suureneb lĂ”imede arv proportsionaalselt. See mĂ”jutab negatiivselt otsingukiirus ja halvendab uute andmete indekseerimist.
Otsingu vajaliku latentsuse tagamiseks otsustasime kasutada SSD-sid. Kiirete pĂ€ringute töötlemiseks pidid need konteinerid asuvad masinad omama vĂ€hemalt 56 tuuma. Number 56 on valitud kui tinglikult piisav kogus, mis mÀÀrab, kui palju lĂ”ime Elasticsearch töös kasvatab. Elasticsearchis sĂ”ltuvad paljusid thread pool'i parameetreid otseselt kĂ€ttesaadavate tuumade arvust, mis omakorda mĂ”jutab otse klastis vajalike sĂ”lmede arvu pĂ”himĂ”ttel "vĂ€hem tuumasid â rohkem sĂ”lmi".
KokkuvĂ”ttes selgus, et keskmine shard kaalub umbes 20 gigabaiti, ja 1 indeksi kohta on 360 shard'i. Seega, kui me neid roteerime iga 48 tunni jĂ€rel, on meil neid 15 tĂŒkki. Iga indeks sisaldab andmeid 2 pĂ€eva jooksul.
Andmete kirjutamise ja lugemise skeemid
Vaatame, kuidas selles sĂŒsteemis andmeid kirjutatakse.
Oletame, et meil on Graylogist koordinaatorisse saabumas mÔni pÀring. NÀiteks soovime indekseerida 2-3 tuhat rida.
Koordinaator, saades Graylogilt pĂ€ringu, kĂŒsib mestĂ©rit: "Indekseerimise pĂ€ringus oli meil konkreetselt mÀÀratud indeks, kuid kuhu shard'i see kirjutada - ei olnud mĂ€rgitud."
Meister vastab: "Salvesta see teave shard'i numero 71", mille jÀrel see suunatakse otse asjakohasesse andme-Node'i, kus asub primary-shard numero 71.
SeejÀrel kopeeritakse tehingu logi replica-shard'ile, mis asub juba teises andmepunktis.

Graylogist tuleb koordinaatorisse otsingupÀring. Koordinaator suunab selle indeksi kaudu, samas kui Elasticsearch jagab pÀringud round-robin pÔhimÔttel primary-shard'i ja replica-shard'i vahel.

180 Node'i vastavad ebaĂŒhtlaselt ja seni, kuni nad vastavad, kogub koordinaator teavet, mille juba "vĂ€lja sĂŒlitasid" kiiremad andme-Node'id. PĂ€rast seda, kui kogu teave on saabunud vĂ”i pĂ€ringu puhul on saavutatud timeout, edastab ta kĂ”ik otse kliendile.
Kogu see sĂŒsteem töötleb keskmiselt viimase 48 tunni otsingupĂ€ringud 300-400 ms jooksul, vĂ€lja arvatud need pĂ€ringud, kus on leading wildcard.
"Lilled" Elasticsearchiga: Java seadistamine

Kuna kÔik see tööle hakkaks nagu me algselt soovisime, seadistasime me vÀga kaua erinevaid asju klastris.
Esimene osa avastatud probleemidest oli seotud sellega, kuidas Elasticsearchis on vaikimisi eelnevalt seadistatud Java.
Esimene probleem
Me nÀgime vÀga suurt hulka teateid selle kohta, et meil on Lucene tasemel, kui taustatööd on kÀivitunud, Lucene segmentide merge'id lÔppevad tÔrke tÔttu. Samal ajal oli logides nÀha, et see oli OutOfMemoryError-error. Telemeetria kaudu nÀgime, et heap on vaba, ja polnud selge, miks see operatsioon kukkus.
Selgus, et Lucene indeksi merge toimub vĂ€ljaspool heap'i. Ja konteinerid on ĂŒsna rangeid piiranguid tarbitavatele ressurssidele. Nendesse ressurssidesse mahtus ainult heap (heap.size vÀÀrtus oli ligikaudu sama kui RAM), samas kui teatud off-heap'i operatsioonid kukkusid mĂ€lu jaotamise tĂ”rkega, kui nad mingil pĂ”hjusel ei mahtunud nendesse ~500 MB, mis jĂ€id piirangust.
Parandus oli ĂŒsna triviaalne: konteinerile saadaval olev RAM-i maht suurenes, pĂ€rast mida unustasime, et sellised probleemid olid meil kunagi olnud.
Teine probleem
Umbes 4-5 pÀeva pÀrast klastrite kÀivitamist mÀrkasime, et andme-Node'id hakkavad perioodiliselt klastrist vÀlja kukkuma ja tulema tagasi umbes 10-20 sekundi pÀrast.
Kui me sĂŒvenesime, selgus, et see off-heap mĂ€lu Elasticsearchis ei ole praktiliselt ĂŒldse kontrollitav. Kui andsime konteinerile rohkem mĂ€lu, saime vĂ”imaluse tĂ€ita otsepuutepankade erinevat teavet ja see puhastati alles pĂ€rast seda, kui Elasticsearch kĂ€ivitas selgesĂ”nalise GC.
MĂ”nel juhul kestis see toiming ĂŒsna kaua ja selle aja jooksul mĂ€rkis klaster selle sĂ”lme juba vĂ€lja langenuks. Probleem on hĂ€sti kirjeldatud. .
Lahendus oli jÀrgmine: piirasime Java vÔimalust kasutada peamise osa mÀlu vÀljastpoolt heap'i nende operatsioonide jaoks. Piirasime seda kuni 16 gigabaidini (-XX:MaxDirectMemorySize=16g), saavutades nii, et selgesÔnaline GC kutsuti vÀlja mÀrgatavalt sagedamini ning töötas mÀrgatavalt kiiremini, lÔpetades klastrit destabiliseerimise.
Kolmas probleem
Kui arvate, et probleemid "sÔlmedega, mis lahkuvad klastrist kÔige ettenÀmatumal hetkel" on sellega lahenenud, siis eksite.
Kui me konfigureerisime indekseerimist, valisime mmapfs, et vĂ€rskete shardide kĂ”rge segmentatsiooniga. See oli ĂŒsna tĂ”sine viga, sest mmapfs-i kasutamisel kaardistatakse fail vahemĂ€lu, ja seejĂ€rel töötame juba kaardistatud failiga. SeetĂ”ttu osutame, et ĂŒritades GC-l peatada rakenduses niidid, kulus meil safepunkti jĂ”udmiseks vĂ€ga kaua aega, ja selles protsessis lakkas rakendus vastamast meistri pĂ€ringutele, et kas see on veel elus. Vastavalt sellele arvab meister, et sĂ”lm ei ole enam meie klastris kohal. SeejĂ€rel, umbes 5-10 sekundi pĂ€rast töötab garbage collector, sĂ”lm taastub, siseneb taas klastrisse ja alustab shardide algatamist. KĂ”ik see meenutas tugevalt "toodet, mille me vÀÀrisime" ja ei sobinud millekski tĂ”sisemaks.
Sellest kĂ€itumisest vabanemiseks lĂ€ksime esmalt ĂŒle standardsele niofs-ile ja hiljem, kui Elastic viiendatest versioonidest kuuesse migreerisime, proovisime hybridfs-i, kus see probleem ei kordunud. TĂŒĂŒpide ladustamise kohta saab rohkem lugeda. .
Neljas probleem
Siis oli veel ĂŒks vĂ€ga huvitav probleem, mida me ravisime rekordiliselt kaua. Kartsime seda 2-3 kuud, kuna selle mustrit oli tĂ€iesti vĂ”imatu mĂ”ista.
MĂ”nikord lĂ€ksid meie koordinaatorid Full GC-sse, tavaliselt pĂ€rast lĂ”unat, ja sealt nad enam ei naasnud. Samuti nĂ€gi GC viivituste logimisel vĂ€lja nii: meil lĂ€heb kĂ”ik hĂ€sti, hĂ€sti, hĂ€sti, ja siis plaan â ja kĂ”ik muutub jĂ€rsult halvemaks.
Alguses arvasime, et meil on kuri kasutaja, kes kĂ€ivitab mingi pĂ€ringu, mis tĂ”ukab koordinaatori töömoodulist vĂ€lja. Logisime pĂ€ringuid vĂ€ga kaua, pĂŒĂŒdes aru saada, mis toimub.
KokkuvÔttes selgus, et hetkel, kui mÔni kasutaja kÀivitab vÀga suure pÀringu ja see satub mÔnele konkreetsele Elasticsearchi koordinaatorile, vastavad mÔned sÔlmed kauem kui teised.
Ja see aeg, mille koordinaator ootab kĂ”igi sĂ”lmede vastuseid, kogub ta tulemused, mis on saadud juba vastanud sĂ”lmedelt. GC jaoks tĂ€hendab see, et meie mĂ€lu kasutuse muster muutub vĂ€ga kiiresti. Ja seda GC-d, mida me kasutasime, ei suutnud selle ĂŒlesandega toime tulla.
Ainus parandamine, mille me leidsime, et muuta klastri kĂ€itumist sellises olukorras, oli migratsioon JDK13-le ja Shenandoah prĂŒgikogumise kasutamine. See lahendas probleemi, koordinaatorid ei kukkunud enam.
Sellega lÔppesid Java probleemid, kuid algasid lÀbilaskevÔime probleemid.
Elasticsearchi "marjad": lÀbilaskevÔime

LÀbilaskevÔime probleemid tÀhendavad, et meie klaster töötab stabiilselt, kuid indeksite arvu tipphetkedel ja manööverdusmomentidel ei ole jÔudlus piisav.
Esimene kohatud sĂŒmptom: tootmises toimuvate
snapshots See juhtus sellepĂ€rast, et thread_pool.write.queue ĂŒhel andmesĂ”lmel, enne kui Elasticsearch suudab indekseerimise pĂ€ringu töödelda ja informatsiooni diskile kirjutada, suudab vaikimisi vahemĂ€llu salvestada ainult 200 pĂ€ringut. Ja
Elasticsearchi dokumentatsioonis sellest parameetrist rÀÀgitakse vÀga vÀhe. KÀsitletakse ainult ekstreemne arv teid ja vaikimisi suurust. Loomulikult otsustasime seda vÀÀrtust muuta ja selgus, et meie seadistuses suudab vahemÀllu salvestada pÀris hÀsti kuni 300 pÀringut, samas kui suurem vÀÀrtus toob meid tagasi Full GC-sse.
Lisaks, kuna need on sĂ”numipaketid, mis saabuvad ĂŒhe pĂ€ringu raames, pidime Graylogi seadistama nii, et see kirjutaks mitte sageli ja vĂ€ikeste partiitena, vaid suurte partiitena vĂ”i iga kolme sekundi jĂ€rel, kui partii ei ole ikka veel tĂ€is. Sellisel juhul muutub teave, mille me Elasticsearch'i kirjutame, kĂ€ttesaadavaks mitte kahe, vaid viie sekundi pĂ€rast (mis meid tĂ€iesti rahuldab), ent vĂ€heneb ka retrai arv, mida tuleb teha, et edastada suur partii teavet.
See on eriti oluline hetkedel, kui meil midagi kuskil kokku kukub ja sellest agaralt teatatakse, et mitte saada tĂ€ielikult spĂ€mmitud Elasticut, ega saada hiljem â mitte töötavaid Graylogi node'e ummistunud puhvriketaste tĂ”ttu.
Lisaks, kui meil toimusid need plahvatused tootmises, saime kaebusi programmeerijatelt ja testijatelt: just siis, kui nad neid logisid vÀga vajavad, vÀljastatakse need neile vÀga aeglaselt.
Hakkasime uurima. Ăhel poolt oli selge, et nii otsingupĂ€ringud kui ka indekseerimisperioodid töötavad pĂ”himĂ”tteliselt sama fĂŒĂŒsilise riistvara peal, ja mingil moel on teatavad langused vĂ€ltimatud.
Ent seda oli osaliselt vÔimalik vÀltida, kuna Elasticsearch'i kuuendas versioonis ilmus algoritm, mis vÔimaldab jagada pÀringud asjakohaste andmennodesse mitte juhuslikult round-robin (konteiner, mis tegeleb indekseerimisega ja hoiab primary-shardi, vÔib olla vÀga hÔivatud, seal ei ole vÔimalust kiiresti vastata), vaid suunata see pÀring vÀhem hÔivatud konteinerisse, millel on replica-shard, mis vastab oluliselt kiiremini. TeisisÔnu, jÔudsime user_adaptive_replica_selection: true juurde.
Lugemise pilt hakkab vÀlja nÀgema nii:

Selle algoritmi kasutuselevÔtt vÔimaldas oluliselt parandada pÀringuaega hetkedel, kui meil toimus suur logide kirjutamise voog.
LĂ”puks seisnes peamine probleem andmekeskuse valutus vĂ€ljalĂŒlitamises.
Mida me soovisime klastrilt kohe pĂ€rast ĂŒhenduse kaotamist ĂŒhe andmekeskusega:
- Kui meie kadunud andmekeskuses asub praegune master, siis ta valitakse uuesti ja liigub rollina teisele node'ile teises andmekeskuses.
- Master viskab kiiresti kÔik kÀttesaamatud node'id klastrist vÀlja.
- PÔhinedes allesjÀÀnud infole, mÔistab ta: kadunud andmekeskuses oli meil sellised primary-shardid, kiiresti promoverib ta komplementaarsed replica-shardid allesjÀÀnud andmekeskustes, ja meie andmete indekseerimine jÀtkub.
- Selle tulemusena hakkab meie klastrite kirjutamis- ja lugemisvĂ”imekus sujuvalt aeglustuma, kuid ĂŒldiselt töötab kĂ”ik aeglaselt, kuid stabiilselt.
Kuidas selgus, soovisime midagi sellist:

Ja saime jÀrgmist:

Kuidas see juhtus?
Andmekeskuse hukkumise hetkel oli kitsaskohaks meie master.
Miks?
Asi on selles, et masteril on TaskBatcher, mis vastutab teatud ĂŒlesannete ja sĂŒndmuste levitamise eest klastris. Iga nodi vĂ€ljalĂŒlitamine, iga shard'i edasiviimine replica'st primary'sse, iga ĂŒlesanne, mis puudutab shard'i loomist, jĂ”uab esmalt TaskBatcherisse, kus see töödeldakse jĂ€rjestikku ja ĂŒhes voos.
Andmekeskuse vÀljaviimisel tundus, et kÔik ellujÀÀnud andmenodid pidasid oma kohuseks teatada masterile, 'meil on kadunud sellised shardid ja sellised andmenodid'.
Samal ajal saatsid ellujÀÀnud andmenodid kogu selle info senisele masterile ja ĂŒritasid oodata kinnitust, et ta oli selle vastu vĂ”tnud. Nad ei saanud seda oodata, kuna master sai ĂŒlesandeid kiiremini kui jĂ”udis vastata. Noodid kordasid pĂ€ringuid ajaĂŒlevahe tĂ”ttu ja samal ajal ei pĂŒĂŒdnud master neile isegi vastata, olles tĂ€ielikult hĂ”ivatud pĂ€ringute prioriteetide jĂ€rjestamise ĂŒlesandega.
LÔppkokkuvÔttes tundus, et andmenod spammisid masterit piisavalt, et ta lÀks tÀielikku GC-d. PÀrast seda kolis master jÀrgmisele nodile, kellel juhtus tÀpselt sama, ja lÔpuks lagunes klaster tÀielikult.
Me tegime mÔÔtmisi ja enne versiooni 6.4.0, kus see oli parandatud, piisab meile, kui viia korraga vĂ€lja vaid 10 andmenodi 360-st, et klaster tĂ€ielikult maapinda lĂŒkata.
See nÀgi vÀlja umbes nii:

PĂ€rast versiooni 6.4.0, kus see ebameeldiv viga parandati, peatusid andmenod masteri tapmisest. Kuid "nutikam" ta sellest ei saanud. Nimelt: kui me viime vĂ€lja 2, 3 vĂ”i 10 (mis tahes arv, mis erineb ĂŒhest) andmenodist, saab master mingi esialgse sĂ”numi, mis ĂŒtleb, et nodi A on vĂ€lja lĂŒlitatud, ja pĂŒĂŒab rÀÀkida nodist B, nodist C, nodist D.
Ja praegust on sellega vÔimalik toime tulla vaid seadmisega, kus kellaaegade vahe on 20-30 sekundit, et hallata andmekeskuse klastrist vÀlja viimise kiirus.
PÔhimÔtteliselt vastab see algselt toodud nÔuetele lÔpptoote kohta projekti raames, kuid puhta teaduse seisukohalt on see viga. Mis, muide, on edukalt parandatud arendajate poolt versioonis 7.2.
Ja kui mingi andmenode vÀljus, selgus, et teavet tema vÀljumise kohta edastada on olulisem kui öelda kogu klastrile, et tal olid sellised primary-shard (et reklaamida replica-shard teises andmekeskuses primaarseks, et sinna saaks kirjutada teavet).
SeetÔttu, kui kÔik on juba «rahunenud», ei mÀrgita vÀljunud andmenodeid kohe stale'iks. Seega peame ootama, kuni kÔik pinged vÀljunud nodede peale aeganÔudmiseks mööduvad, ja alles seejÀrel hakkab meie klaster rÀÀkima, et seal, seal ja seal tuleb andmete kirjutamisega jÀtkata. Pikemalt saab sellest lugeda .
Seega, andmekeskuse vĂ€ljaviimise operatsioon kestab meil tĂ€na umbes 5 minutit tipptunnil. Sellise suure ja kohmakana on see ĂŒsna hea tulemus.
Seega jÔudsime jÀrgmise lahenduseni:
- Meil on 360 andmenode, kus on 700 gigabaidi kettad.
- 60 koordinaatorit liikluse suunamiseks nende andmenode vahel.
- 40 meistrit, mis on meile jÀÀnud kui mingi pĂ€rand versioonidest enne 6.4.0 â et ĂŒle elada andmekeskuse vĂ€ljaviimist, olime moraalselt valmis kaotama mĂ”ned masinad, et tagada isegi halva stsenaariumi korral meistrite kvoorum.
- Mistahes katsetused rollide ĂŒhendamiseks ĂŒhes konteineris lĂ”ppesid sellega, et varem vĂ”i hiljem lakkas node koormuse all töötamast.
- Kogu klastris kasutatakse heap.size vÀÀrtuses 31 gigabaiti: kÔik katsed vÀhendada suurust viisid selleni, et raskete otsingupÀringute puhul, kus on leading wildcard, tapeti mÔned nodede, vÔi katkestati circuit breaker ise Elasticsearchis.
- Lisaks, et tagada otsingu jĂ”udlus, pĂŒĂŒdsime hoida klastris objektide arvu minimaalne, et töödelda vĂ”imalikult vĂ€he sĂŒndmusi kitsas kohas, mis meil meistris tekkis.
LÔpetuseks vaatame jÀlgimist.
Kuna kÔik see töötas nagu planeeritud, jÀlgime jÀrgmist:
- Iga andmekeskuse node teatab meie pilve, et see on olemas ja et seal on sellised shardid. Kui me kustutame midagi kuskil, raporteerib klaster 2-3 sekundi pĂ€rast, et keskuses A kustutasime node 2, 3 ja 4 â see tĂ€hendab, et teistes andmekeskustes ei tohi mingil juhul kustutada neid node, millel on shardid ainukeses eksemplaris.
- Tundnud meistrite kĂ€itumise iseloomu, vaatame vĂ€ga hoolikalt pending-ĂŒlesannete arvu. Sest isegi ĂŒks peatunud ĂŒlesanne, kui see Ă”igeaegselt mitte ajutuks jÀÀda, vĂ”ib teoreetiliselt mingis ÀÀrmuslikus olukorras olla see pĂ”hjus, miks meie, nĂ€iteks, ei soorita replica-shardi tĂ”statamist primaarseks, millega seonduvalt seisab indekseerimine.
- Samuti vaatame vÀga tÀpselt garbage collector'i viivitusi, sest meil on olnud sellega juba suuri raskusi optimeerimisel.
- Threadide refuse, et eelnevalt mĂ”ista, kus asub âpudelikaelâ.
- Ja ka standardmÔÔdikud, nagu heap, RAM ja I/O.
JĂ€lgimise seadmisel tuleb tingimata arvesse vĂ”tta Thread Pooli eripĂ€ra Elasticsearch'is. kirjeldab seadistamise ja vaikevÀÀrtuste vĂ”imalusi otsinguks, indekseerimiseks, kuid jĂ€tab tĂ€ielikult tĂ€helepanuta thread_pool.management. Need threadid töötlevad, sealhulgas, pĂ€ringud nagu _cat/shards ja teised sarnased, mida on mugav kasutada jĂ€lgimise kirjutamisel. Mida suurem on klaster, seda rohkem selliseid pĂ€ringuid tĂ€idetakse ajaĂŒhikus, ning eelnevalt mainitud thread_pool.management ei ole mitte ainult esitatud ametlikus dokumentatsioonis, vaid on ka vaikevÀÀrtusena piiratud 5 threadiga, mis kaob vĂ€ga kiiresti, pĂ€rast mida jĂ€lgimine lĂ”petab korrektselt töötamise.
LÔpetuseks tahaksin öelda: meil on see Ônnestunud! Oleme suutnud anda meie programmeerijatele ja arendajatele tööriista, mis peaaegu igas olukorras suudab kiiresti ja usaldusvÀÀrselt pakkuda teavet selle kohta, mis toimub tootmises.
Jah, see osutus ĂŒsna keeruliseks, kuid ometi suutsime meie soovid paigutada juba olemasolevatesse toodetesse, mida ei olnud vaja oma vajadustele kohandada ega ĂŒmber kirjutada.

Allikas: habr.com
