Elasticsearch tootmises - juurutamise parimad tavad

Elasticsearch on kaasaegse andmeanalüütika jaoks optimeeritud otsimootor.

Elasticsearch on hämmastav reaalajas otsingu- ja analüüsimootor. See on üles ehitatud Apache Lucene'ile. See on levitatud, RESTful, seda on lihtne kasutada ja see on väga saadaval. Elastsete otsingute kasutamise juhtumid hõlmavad otsingu toidet, tehingute jälgimist ja vigade tuvastamist, sisu avastamist, logianalüütikat, hägusat otsingut, sündmuste andmete koondamist, andmete visualiseerimist. Elasticsearch ja ülejäänud elastne pinu on osutunud äärmiselt mitmekülgseks ning nagu ülaltoodud kasutusjuhtumitest näete, on Elasticsearchi integreerimiseks sellesse, mida teie toode täna pakub, ja selle täiendava ülevaate saamiseks on mitu võimalust.

Me kasutame seda Botmetricu otsimisel ja analüüsimisel palju, indekseerime päevas umbes miljard dokumenti ja kasutame reaalajas andmete visualiseerimiseks väga keerulisi agregatsioone.

See tähendab, et rakenduse alglaadimine vs selle käivitamine tootmises ja hooldus on täiesti erinevad. See arikkel katab paljusid neist teguritest tegelikust elukogemusest ja on peamised tavalised teemad, mida peaksite Elasticsearchi tootmisel käitamiseks arvestama.

Mälu:

Elasticsearch ja Lucene on kirjutatud Java keeles, mis tähendab, et peate tähelepanu pöörama hunneruumile ja JVM-i statistikale. Mida rohkem Elasticsearchi kasutada on, seda rohkem mälu saab see kasutada filtrite ja muude vahemällu salvestamiseks, et päringu jõudlust suurendada. Kuid pange tähele, et liiga suur hunnik võib teile tekitada pikki prügiveo pause. Ärge seadke Xmx üle piiri, mida JVM kasutab tihendatud objekti osutite jaoks (tihendatud ops); täpne piirmäär varieerub, kuid on 32 GB lähedal.

Levinud probleem on liiga suure hunniku konfigureerimine. Teil on 64 GB masin - ja golly abil soovite Elasticsearchile anda kogu 64 GB mälu. Rohkem on parem! Hunnik on Elasticsearchi jaoks kindlasti oluline. Seda kasutavad paljud mälus olevad andmestruktuurid kiire töö tagamiseks. Kuid öeldes, et on veel üks suur mälukasutaja, kes on kuhjaga: OS-i faili vahemälu.

Lucene on ette nähtud aluseks oleva OS-i kasutamiseks mälus olevate andmestruktuuride vahemällu salvestamiseks. Lutseeni segmente hoitakse üksikutes failides. Kuna segmendid on muutumatud, ei muutu need failid kunagi. See muudab need väga vahemälu-sõbralikeks ja selle aluseks olev OS hoiab kiiremini ligipääsemiseks kuumad segmendid mälus. Need segmendid hõlmavad nii ümberpööratud indeksit (täisteksti otsingu jaoks) kui ka doc-väärtusi (liitmiste jaoks). Lucene'i jõudlus tugineb sellele suhtlemisele OS-iga. Kuid kui annate kogu vaba mälu Elasticsearchi hunnikule, ei jää OS-i failide vahemällu muud üle. See võib etendust tõsiselt mõjutada. Tavaline soovitus on anda 50% olemasolevast mälust Elasticsearchi hunnikule, jättes ülejäänud 50% vabaks. Seda ei kasutata; Lucene tarbib rõõmuga kõik, mis failide vahemällu jääb. Elastsete otsingute hunniku saab konfigureerida järgmistel viisidel,

eksport ES_HEAP_SIZE = 10 g

või

ES_JAVA_OPTS = "- Xms10g -Xmx10g" ./bin/elasticsearch

PROTSESSOR:

Elasticsearch toetab liitmist ja filtreeritud päringuid. Keerukate filtreeritud päringute käivitamine, intensiivne indekseerimine, perkolatsioon ja indeksite vastased päringud vajavad suurt protsessorit, seega on õige valimine kriitiline. Peab mõistma protsessori spetsifikatsioone ja seda, kuidas nad käituvad Javaga, kui päringud jooksevad JVM-is.

Igas basseinis on mitu lõime, mida saab konfigureerida, ja sellel on järjekord. Selle muutmine pole soovitatav, kui teil pole väga konkreetseid nõudeid, kuna Elasticsearch jaotab südamikud dünaamiliselt.

Keermebasseini tüübid:

Elasticsearchil on 3 tüüpi niitide basseine.

  1. Vahemällu salvestatud: vahemällu salvestatud niidikogu on piiramatu lõimekogu, mis ootel lõimeid tekitab, kui ootel taotlusi on. Seda lõimekogumit kasutatakse sellele kogumile esitatud taotluste blokeerimise või tagasilükkamise vältimiseks. Selle lõimekogumi kasutamata lõimed lõpetatakse pärast elusoleku lõppemist (vaikimisi viis minutit). Vahemälulõnga bassein on reserveeritud üldise niidi kogumi jaoks.
  2. Fikseeritud: fikseeritud niidide kogum sisaldab kindla suurusega niite, et käsitleda päringutega järjekorda (valikuliselt piiritletud) ootel päringutele, millel pole lõime nende teenindamiseks. Suuruseparameeter kontrollib lõimede arvu ja vaikeseadeks on südamike arv korda 5.
  3. Skaleerimine: skaleeriva niidi kogum hoiab dünaamilist arvu niite. See arv on võrdeline töökoormusega ja varieerub 1 ja suuruse parameetri väärtuse vahel.

Elasticsearch jagab CPU kasutamise erinevat tüüpi keermekogudeks:

  • üldine: tavatoimingute jaoks, nagu näiteks avastus ja keermespargi tüüp, on vahemällu salvestatud.
  • register: indekseerimise / kustutamise toimingute jaoks. Keermebasseini tüüp on fikseeritud.
  • otsing: loendustegevused / otsingutoimingud. Keermebasseini tüüp on fikseeritud.
  • saada: operatsioonide saamiseks. Keermebasseini tüüp on fikseeritud.
  • lahtiselt: hulgitoimingute jaoks, näiteks hulgiindekseerimine. Keermebasseini tüüp on fikseeritud. Hulgdokumentide parim konfiguratsioon sõltub klastri konfiguratsioonist. Seda saab tuvastada mitme väärtuse proovimisega.
  • perkolaat: perkolatsiooniks. Keermebasseini tüüp on fikseeritud.
  • värskendamine: värskendustoimingute jaoks. Keermebasseini tüüp on skaleeriv.

Konkreetset keermekogu saab muuta, määrates selle tüübispetsiifilised parameetrid.

Loe lähemalt https://www.elastic.co/guide/et/elasticsearch/reference/2.2/modules-threadpool.html#types

Shard suurus:

Kihl on ühik, mille abil Elasticsearch klastris andmeid levitab. Kiirus, millega Elasticsearch suudab andmete tasakaalustamisel kilde ümber tõsta, nt. pärast tõrget sõltub kihtide suurusest ja arvust, samuti võrgu ja ketta jõudlusest.

Elasticsearchis täidetakse iga päring ühe kiuna ühe kihina. Mitu kihti saab aga töödelda paralleelselt, nagu ka mitu päringut ja liitmist sama kihi kohta.

See tähendab, et minimaalne päringu latentsusaeg, kui vahemälu pole seotud, sõltub andmetest, päringu tüübist ja kihi suurusest. Paljude väikeste kihtide päring teeb töötlemise kihi kohta kiiremaks, kuid kuna palju rohkem ülesandeid tuleb järjekorda panna ja järjestikku töödelda, ei pea see tingimata olema kiirem kui väiksema hulga suuremate kihtide päring. Paljude väikeste kihtide olemasolu võib ka päringute läbilaskevõimet vähendada, kui samaaegselt on mitu päringut.

Igas kihis on andmeid, mida tuleb mälus hoida, ja see kasutab kuhjaga ruumi. See hõlmab andmestruktuure, mis hoiavad teavet sirmi tasemel ja ka segmendi tasemel, et määratleda, kus andmed asuvad kettal. Nende andmestruktuuride suurus ei ole fikseeritud ja varieerub olenevalt kasutusjuhtudest. Üks segmendiga seotud üldkulude oluline tunnus on see, et see ei ole rangelt proportsionaalne segmendi suurusega. See tähendab, et suurematel segmentidel on väiksemat üldkulu andmemahu kohta võrreldes väiksemate segmentidega. Erinevus võib olla märkimisväärne. Õige arvu kildude valimine on keeruline, sest kunagi ei tea, kui palju dokumente enne alustamist saate. Paljude kildude omamine võib klastri jaoks olla nii hea kui ka kohutav. Indeksid ja kildehaldus võivad peasõlme üle koormata, mis võib reageerida, mis võib põhjustada veidra ja vastiku käitumise. Pange oma peasõlmedele klastri suurusega toimetulemiseks piisavalt ressursse.

Halb on see, et kildude arv on muutumatu ja see määratletakse indeksi loomisel. Kui indeks on loodud, on kildude arvu muutmiseks ainus viis indeksite kustutamine, nende uuesti loomine ja uuesti indekseerimine.

Replikatsioon

Elasticsearch toetab replikatsiooni, andmeid korratakse andmesõlmede vahel, nii et sõlme kadu ei tooks kaasa andmete kaotust. Vaikimisi on replikatsioonitegur 1, kuid sõltuvalt teie tootenõuetest saab seda suurendada. Mida rohkem on koopiaid, seda katastroofikindlamad on teie andmed. Veel üks replikate olemasolu eelis on see, et igas sõlmes on kopeerimiskilp, mis parandab päringu toimivust, kuna päringuid kasutatakse ka koopiaid.

Elasticsearchi järjepidevuse tagamiseks kasutatav replikatsioonivalem on:

(esmane + number_parandusi) / 2 + 1

Jaotuse optimeerimine

Tooteandmete nõuete alusel saame liigitada andmed kuuma ja külma kategooriasse. Indeksitele, millele pääsetakse juurde teistest sagedamini, saab eraldada rohkem andmesõlmi, samas kui indeksitele, millele on vähem juurdepääs, on vähem ressursse. See strateegia on eriti kasulik aegridade andmete, näiteks rakenduse logide (nt ELK) salvestamiseks.

Seda saab saavutada, käivitades cronjob, mis liigutab indeksid korrapäraste ajavahemike järel erinevatesse sõlmedesse.

Kuum sõlm on teatud tüüpi andmesõlm, mis täidab kogu klastris indekseerimise. Neil on ka kõige uuemad indeksid, kuna tavaliselt küsitakse neid kõige sagedamini. Kuna indekseerimine on protsessori ja IO intensiivne toiming, peavad need serverid olema võimsad ja varustatud SSD-salvestusega. Suure käideldavuse jaoks soovitame käivitada vähemalt 3 kuuma sõlme. Sõltuvalt värskete andmete hulgast, mida soovite koguda ja mille kohta päringuid esitada, peate jõudluse eesmärkide saavutamiseks seda arvu kindlasti suurendama.

Soe sõlm on andmesõlme tüüp, mis on loodud suure hulga kirjutuskaitseliste indeksite haldamiseks, mida ei küsita nii sageli. Kuna need indeksid on kirjutuskaitstud, kipuvad soojad sõlmed SSD-de asemel kasutama suuri kinnitatud kettaid (tavaliselt ketravaid kettaid). Nagu kuuma sõlme puhul, soovitame kõrge kättesaadavuse tagamiseks vähemalt 3 sooja sõlme. Ja nagu ka varem, võib ka ettevaatusega väita, et suuremahuliste andmemahtude korral võib jõudlusnõuete täitmiseks vaja minna täiendavaid sõlme. Pange tähele ka seda, et protsessori ja mälu konfiguratsioonid peavad sageli peegeldama kuumade sõlmede konfiguratsioone. Seda saab kindlaks teha ainult testides päringutega, mis on sarnased sellele, mida kogeksite tootmissituatsioonis.

Kuuma ja sooja sõlme kohta leiate lisateavet siit.

Teine strateegia, mida saate kohandada, on indeksite arhiveerimine s3-le ja taastamine, kui vajate nende indeksite andmeid. Selle kohta saate rohkem lugeda siit.

Sõlme topoloogia:

Elastsete otsingusõlmede võib jagada kolme kategooriasse: peasõlm, andmesõlm, kliendisõlm.

  1. Üldsõlm: peasõlm võib olla väike, kui see pole ka andmesõlm, kuna see ei salvesta ühtegi indeksit / kihti. Selle vastutus on klastri üksikasjaliku oleku salvestamine ning abiandmete ja muude sõlmede abistamine metaandmete otsingus. Elastsel otsingul peaks aju jagatud probleemide vältimiseks olema mitu peasõlme.
  2. Andmesõlm: Andmesõlm vastutab tegelike indeksi andmete salvestamise / päringute eest.
  3. Kliendisõlm: kliendisõlme kasutatakse indekseerimise ja otsimise puhverserverina. See on väga soovitatav, kui agregaate kasutatakse palju. Need on spetsiaalsed ElasticSearchi sõlmed, mis ei ole andmete ega ülemkõlblikud. Kliendisõlmed on klastriteadlikud ja võivad seetõttu tegutseda nutikate koormuse tasakaalustajatena. Võite saata oma päringud kliendisõlmedele, kes saavad seejärel kuluka ülesande koguda päringu tulemustele vastuseid igast andmeüksusest.

lisage need sätted vastavate sõlmede jaoks elastsearch.yml-faili.

Põhisõlm: node.master: true node.data:false
Andmesõlm: node.master: vale node.data:true
Kliendi sõlm: node.master: false node.data:false

Nõuanded tõrkeotsingu kohta:

Elastse otsingu jõudlus sõltub suuresti masinast, millele see on paigaldatud. CPU, mälukasutus ja ketta sisend / väljund on iga Elasticsearchi sõlme põhilised operatsioonisüsteemi mõõdikud. Kui protsessori kasutamine tõuseb, on soovitatav uurida Java virtuaalmasina (JVM) mõõdikuid. Järgnevas näites oli ora põhjuseks suurem prügivedu.

  1. Kõrgrõhk: kõrge mälurõhk toimib klastrite jõudluse vastu kahel viisil: kuna mälurõhk tõuseb 75% -ni ja rohkem, jääb mäluruumi vähem ja teie klaster peab nüüd kulutama ka mõned protsessori ressursid, et mälu taaskasutada prügikoristuse kaudu. Need protsessoritsüklid pole kasutajate taotluste töötlemiseks saadaval, kui prügivedu on sisse lülitatud. Selle tulemusel pikeneb kasutajate päringutele reageerimise aeg, kuna süsteem muutub üha ressursimahukamaks. Kui mälurõhk tõuseb jätkuvalt ja jõuab 100% lähedale, kasutatakse prügiveo palju agressiivsemat vormi, mis omakorda mõjutab klastrite reageerimisaegu dramaatiliselt. Indeksi reageerimisaegade mõõdik näitab, et kõrge mälurõhk mõjutab märkimisväärselt jõudlust.
  2. Kasv JVM-i mitte-hunnikus mälus, sööb ära lehe vahemälu jaoks mõeldud mälu ja võib põhjustada kerneli tasemel OOM-i reapimise.
  3. Vältige lõhenenud ajuprobleeme. Jagatud aju on stsenaarium, kus klaster lõheneb. Näiteks teil on 6 sõlme klastrit. 2 sõlme eralduvad klastrist, kuid nad suudavad siiski üksteist näha. Need 2 sõlme loovad siis uue klastri. Nad valivad isegi oma seast uue meistri. Nüüd on meil kaks samanimelist klastrit, üks 4 sõlmega ja teine ​​2 sõlmega. Ka kummalgi on peasõlm. Seda nimetatakse ES-klastrite jagatud aju probleemiks. Selle vältimiseks seadke ES-i parameeter discovery.zen.minimum_master_nodes poolele sõlmede arvust + 1.
  4. Kuna Elasticsearch kasutab palju salvestusseadmeid, tagab ketta I / O jälgimine selle põhivajaduse täitmise. Ketta I / O vähendatud põhjustel on palju põhjuseid, seda peetakse peamiseks mõõdikuks mitmesuguste probleemide ennustamiseks. Indekseerimise ja päringu toimivuse tõhususe kontrollimiseks on hea mõõdik. Lugemis- ja kirjutamisoperatsioonide analüüsimine näitab otseselt, mida süsteem konkreetsel kasutamisel vajab. Ketta I / O operatsioonisüsteemi sätted on kõigi muude optimeerimiste aluseks, ketta I / O häälestamine aitab vältida võimalikke probleeme. Kui ketta sisend / väljund ei ole ikka veel piisav, tuleks vastumeetmeid, nagu kildude arvu ja nende suuruse optimeerimine, drosselklapi ühendamine, aeglaste ketaste asendamine, SSD-dele liikumine või uute sõlmede lisamine, hinnata vastavalt I / O põhjustanud asjaoludele. kitsaskohad.
  5. Otsimisel põhinevate rakenduste puhul on kasutajakogemus korrelatsioonis otsingupäringute latentsusega. Päringu jõudlust võivad mõjutada paljud asjad, näiteks konstrueeritud päringud, valesti konfigureeritud Elasticsearchi klaster, JVM-i mälu ja prügiveo probleemid, ketta IO jne. Päringu latentsus on mõõdik, mis mõjutab kasutajaid otseselt, seega pange sellele kindlasti mõned teated.
  6. Enamik Elasticsearchi filtreid on vaikimisi vahemällu salvestatud. See tähendab, et filtreeritud päringu esimese täitmise käigus leiab Elasticsearch filtrile vastavad dokumendid ja loob selle teabe abil struktuuri nimega bitset. Bitsetti salvestatud andmed sisaldavad dokumendi identifikaatorit ja seda, kas antud dokument sobib filtriga. Sama filtriga päringute hilisemad täitmised kasutavad uuesti bitsetti salvestatud teavet, muutes päringu täitmise kiiremaks, salvestades I / O toimingud ja CPU tsüklid. Soovitatav on filtri kasutamine päringus. Lisateavet leiate siit.
  7. Värskendusaeg ja ühendamisaeg on tihedalt seotud toimivuse indekseerimisega, lisaks mõjutavad need klastri üldist jõudlust. Värskendusaeg suureneb Lucene'i indeksi (shard) failitoimingute arvuga.
  8. Aeglase päringu logimise lubamine aitab välja selgitada, millised päringud on aeglased ja mida saab nende parandamiseks ära teha, eriti kasulik metamärgi päringute korral.
  9. Maksimaalsete failide lubamiseks suurendage ulimiti suurust.
  10. ElasticSearchi jõudlus võib kannatada, kui OS otsustab kasutamata rakenduse mälu välja vahetada. Keela vahetamine, määrates OS-i taseme sätted, või seadke ElasticSearchi konfiguratsioonis bootstrap.mlockall järgmised sätted: true
  11. Keelake kõigi indeksite kustutamine metamärgi abil. Veenduge, et keegi ei väljasta kõigi indeksite (* või _all) puhul DELETE-operatsiooni, seadke action.destructive_requires_name väärtuseks true.

Enne lõpetamist on siin URL-ide loend, mis on kasulikud mõõdikute vaatamiseks.

  • / _klaster / tervis? ilus: klastri tervisenäitaja jaoks.
  • / _status? ilus: kogu teabe jaoks kõigi indeksite kohta.
  • / _nodes? päris: kogu teabe saamiseks sõlmede kohta.
  • / _cat / master? ilus: peasõlme jaoks.
  • / _stats? päris: kihilise jaotuse jaoks on indeksid statistika.
  • / _nodes / stats? päris: Üksikute sõlmede statistika puhul hõlmab see sõlme jvm, http, io statistikat.

Elasticsearchi mõõdikute liitmist toetavad enamus süsteemijälgimisriistu, näiteks Datadog, TICK. Selliste tööriistade kasutamine on soovitatav ja lehtri loomine on tungivalt soovitatav Elasticsearchi pidevaks jälgimiseks.

Järeldus:

Elasticsearch on hajutatud täistekstiotsing ja -analüüsimootor, mis võimaldab mitmel üürnikul enneolematu kiirusega otsida kogu oma andmekogust, olenemata suurusest. Lisaks täistekstiotsinguvõimalustele toimib ElasticSearch ka analüüsisüsteemina ja hajutatud andmebaasina. ElasticSearchil on alustamiseks suured vaikeseaded. Kuid pärast esialgset katseetappi peate kulutama aega oma vajaduste seadete kohandamiseks. Kui soovite klastri konfigureerida teie vajadustele vastavaks, on soovitatav oma konfiguratsioon koos ametliku dokumentatsiooniga hiljem uuesti läbi vaadata.