Elasticsearch ražošanā - ieviešanas paraugprakse

Elasticsearch ir ļoti optimizēta meklētājprogramma mūsdienu datu analītikai.

Elasticsearch ir pārsteidzošs reāllaika meklēšanas un analīzes dzinējs. Tā ir veidota uz Apache Lucene. Tas ir izplatīts, RESTful, viegli lietojams un ļoti pieejams. Elastīgās meklēšanas izmantošanas gadījumi ietver meklēšanas nodrošināšanu, darījumu uzraudzību un kļūdu noteikšanu, satura atklāšanu, žurnālu analīzi, izplūdušo meklēšanu, notikumu datu apkopošanu, datu vizualizāciju. Elasticsearch un pārējais Elastīgais steks ir izrādījušies ārkārtīgi universāls, un, kā redzat iepriekš minētajos lietošanas gadījumos, ir vairāki veidi, kā integrēt Elasticsearch tajā, ko jūsu produkts šodien piegādā, un pievienot tam papildu ieskatu.

Mēs to ļoti izmantojam meklēšanai un analītikai vietnē Botmetric, mēs indeksējam apmēram miljardu dokumentu dienā un reālā laikā datu vizualizēšanai izmantojam ļoti sarežģītus apkopojumus.

Tas nozīmē, ka lietojumprogrammas sāknēšana un tās palaišana ražošanā un uzturēšanā ir pilnīgi atšķirīgas. Šis arikls aptver daudzus no šiem faktiskās dzīves faktoriem un ir galvenie kopējie priekšmeti, kas jums jāņem vērā, lai Elasticsearch darbotos ražošanā.

Atmiņa:

Elasticsearch un Lucene ir rakstīti Java, kas nozīmē, ka jums jāpievērš uzmanība lielapjoma un JVM statistikai. Jo vairāk kaudzes ir pieejama Elasticsearch, jo vairāk atmiņas tā var izmantot filtru un citu kešatmiņu saglabāšanai, lai palielinātu vaicājuma veiktspēju. Bet ņemiet vērā, ka pārāk daudz kaudzes var pakļaut ilgstošām atkritumu savākšanas pauzēm. Neuzstādiet Xmx virs robežas, ko JVM izmanto saspiestu objektu rādītājiem (saspiestā opija); precīza robeža atšķiras, bet ir tuvu 32 GB.

Bieži sastopama problēma ir pārāk lielas kaudzes konfigurēšana. Jums ir 64 GB mašīna - un, godīgi sakot, jūs vēlaties Elasticsearch atvēlēt visu 64 GB atmiņu. Vairāk ir labāk! Kaudzes noteikti ir svarīgas Elasticsearch. To izmanto daudzas atmiņā esošās datu struktūras, lai nodrošinātu ātru darbību. Bet, ņemot vērā iepriekš teikto, ir vēl viens liels atmiņas lietotājs, kura rīcībā vairs nav kaudzes: OS faila kešatmiņa.

Lucene ir paredzēts, lai izmantotu pamatā esošo OS atmiņu datu struktūru kešatmiņā. Lucenes segmenti tiek glabāti atsevišķos failos. Tā kā segmenti nav mainīgi, šie faili nekad nemainās. Tas padara tos ļoti kešatmiņā draudzīgus, un pamatā esošā operētājsistēma labprāt saglabās atmiņā esošos segmentus, lai tie būtu ātrāk pieejami. Šajos segmentos ietilpst gan apgrieztais indekss (pilna teksta meklēšanai), gan doc vērtības (apkopojumiem). Lucenes sniegums ir atkarīgs no šīs mijiedarbības ar OS. Bet, ja Elasticsearch kaudzei piešķirat visu pieejamo atmiņu, OS failu kešatmiņā nepaliks pāri. Tas var nopietni ietekmēt izpildījumu. Standarta ieteikums ir piešķirt Elasticsearch kaudzei 50% no pieejamās atmiņas, bet pārējos 50% atstāt brīvus. Tas netiks izmantots; Lucene labprāt patērēs visu, kas palicis failu kešatmiņā. Elastīgo meklētāju kaudzi var konfigurēt, izmantojot šādus veidus:

eksportēt ES_HEAP_SIZE = 10 g

vai

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

PROCESORS:

Elasticsearch atbalsta apkopojumus un filtrētus vaicājumus. Sarežģītu filtrētu vaicājumu vadīšanai, intensīvai indeksēšanai, perkolācijai un vaicājumiem pret indeksiem ir nepieciešams smags CPU, tāpēc pareizā izvēlēšanās ir kritiska. Jāsaprot CPU specifikācijas un tas, kā viņi uzvedas ar Java, kad vaicājumi darbojas JVM.

Katrā baseinā darbojas vairāki pavedieni, kurus var konfigurēt, un tiem ir rinda. Tas nav ieteicams mainīt, ja vien jums nav ļoti īpašu prasību, jo Elasticsearch serdes piešķir dinamiski.

Vītņu baseinu veidi:

Elasticsearch ir 3 veidu pavedienu baseini.

  1. Kešatmiņā saglabāts: kešatmiņā saglabātu pavedienu fonds ir neierobežots pavedienu fonds, kas radīs pavedienu, ja ir neapstiprināti pieprasījumi. Šis pavedienu fonds tiek izmantots, lai šajā blokā iesniegtie pieprasījumi netiktu bloķēti vai noraidīti. Neizmantotie pavedieni šajā pavedienu fondā tiks izbeigti pēc uzturēšanās termiņa beigām (noklusējums ir piecas minūtes). Kešatmiņā saglabāto pavedienu fonds ir paredzēts vispārējam pavedienu fondam.
  2. Fiksēts: fiksētam pavedienu fonam ir fiksēts pavedienu lielums, lai apstrādātu pieprasījumus ar rindu (pēc izvēles ierobežotu) gaidāmajiem pieprasījumiem, kuriem nav pavedienu, lai tos apkalpotu. Lieluma parametrs kontrolē pavedienu skaitu un pēc noklusējuma norāda serdu skaitu 5 reizes.
  3. Mērogošana: mērogošanas pavedienu fonds satur dinamisku pavedienu skaitu. Šis skaitlis ir proporcionāls darba slodzei un svārstās starp 1 un lieluma parametra vērtību.

Elasticsearch sadala CPU izmantošanu dažāda veida pavedienu portfeļos:

  • vispārējs: standarta darbībām, piemēram, atklāšanai un pavedienu kopas veidam, tiek saglabāts kešatmiņā.
  • indekss: indeksēšanas / dzēšanas darbībām. Vītnes baseina tips ir fiksēts.
  • meklēšana: skaita / meklēšanas operācijām. Vītnes baseina tips ir fiksēts.
  • saņemt: operāciju iegūšanai. Vītnes baseina tips ir fiksēts.
  • beztaras: beztaras operācijām, piemēram, beztaras indeksēšanai. Vītnes baseina tips ir fiksēts. Vislabākā lielapjoma dokumentu konfigurācija ir atkarīga no klastera konfigurācijas. To var noteikt, izmēģinot vairākas vērtības.
  • perkola: perkolācijai. Vītnes baseina tips ir fiksēts.
  • atsvaidzināt: lai atsvaidzinātu operācijas. Vītņu kopas tips ir mērogojošs.

Konkrēta pavedienu kopuma maiņu var veikt, iestatot tā tipam raksturīgos parametrus.

Lasīt vairāk https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Shard lielums:

Shard ir vienība, kurā Elasticsearch izplata datus klasterī. Ātrums, ar kādu Elasticsearch var pārvietoties pa gabaliem, līdzsvarojot datus, piem. pēc kļūmes būs atkarīgs no šķembu lieluma un skaita, kā arī tīkla un diska veiktspējas.

Elasticsearch tīklā katrs vaicājums tiek izpildīts vienā pavedienā vienā shardā. Tomēr vienlaikus var apstrādāt vairākas šķembas, tāpat kā vairākus vaicājumus un apkopojumus pret vienu un to pašu slānis.

Tas nozīmē, ka minimālais vaicājuma latentums, kad kešatmiņa netiek iesaistīta, būs atkarīgs no datiem, vaicājuma veida, kā arī no shard lieluma. Ja vaicājat daudz mazu šķembu, apstrāde pa slāni tiks padarīta ātrāka, taču, tā kā daudz vairāk uzdevumu jāveido rindā un jāapstrādā secīgi, tas ne vienmēr būs ātrāks par vaicāšanu mazākam skaitam lielāku šķembu. Ja ir daudz mazu šķembu, vaicājumu caurlaidspēju var samazināt arī tad, ja ir vairāki vienlaicīgi vaicājumi.

Katrā shardā ir dati, kas jāpatur atmiņā, un tajā tiek izmantota kaudzes telpa. Tas ietver datu struktūras, kas satur informāciju shard līmenī un arī segmenta līmenī, lai noteiktu, kur dati atrodas diskā. Šo datu struktūru lielums nav noteikts un mainās atkarībā no izmantošanas gadījuma. Tomēr viena svarīga ar segmentu saistītā pieskaitāmo īpašība ir tā, ka tā nav stingri proporcionāla segmenta lielumam. Tas nozīmē, ka lielākiem segmentiem ir mazāks pieskaitāmais datu apjoms salīdzinājumā ar mazākiem segmentiem. Atšķirība var būt ievērojama. Pareiza skatu skaita izvēle ir sarežģīta, jo jūs nekad nezināt, cik daudz dokumentu jūs saņemsiet pirms darba sākšanas. Ja ir daudz šķembu, tas var būt gan labs, gan briesmīgs kopai. Indeksi un šķembu pārvaldība var pārslogot galveno mezglu, kas var nereaģēt, izraisot dīvainu un nejauku uzvedību. Piešķiriet galvenajiem mezgliem pietiekami daudz resursu, lai tiktu galā ar klastera lielumu.

Slikti ir tas, ka šķembu skaits nav mainīgs, un tas tiek noteikts, veidojot indeksu. Kad indekss ir izveidots, vienīgais veids, kā mainīt šķembu skaitu, ir izdzēst savus indeksus, tos atkal izveidot un atkārtoti indeksēt.

Replikācija

Elasticsearch atbalsta replikāciju, dati tiek replicēti starp datu mezgliem, lai mezgla zudums neradītu datu zudumu. Pēc noklusējuma replikācijas koeficients ir 1, bet atkarībā no jūsu produkta prasībām to var palielināt. Jo vairāk būs replikas, jo izturīgāki pret katastrofām. Vēl viena priekšrocība, kurai ir vairāk repliku, ir tā, ka katrā mezglā ir replicas shard, kas uzlabo vaicājuma veiktspēju, jo arī replikas tiek izmantotas vaicāšanai.

Atkārtošanas formula, ko Elasticsearch izmanto konsekvences nodrošināšanai, ir:

(primārais + numuru_papildinājums) / 2 + 1

Pielietojuma optimizēšana

Balstoties uz produktu datu prasībām, mēs varam klasificēt datus karstā un aukstā stāvoklī. Indeksiem, kuriem piekļūst biežāk nekā citiem, var piešķirt vairāk datu mezglu, savukārt indeksiem, kuriem retāk tiek izmantoti indeksi, var būt piešķirti mazāk resursi. Šī stratēģija ir īpaši noderīga, lai saglabātu laika rindu datus, piemēram, lietojumprogrammu žurnālus (piemēram, ELK).

To var panākt, palaižot cronjob, kas ar regulāriem intervāliem pārvieto indeksus uz dažādiem mezgliem.

Karstais mezgls ir tāda veida datu mezgls, kas veic visu indeksēšanu klasterī. Tajos ir arī jaunākie indeksi, jo tos parasti mēdz jautāt visbiežāk. Tā kā indeksēšana ir intensīva CPU un IO darbība, šiem serveriem jābūt jaudīgiem un jāpapildina ar pievienoto SSD atmiņu. Lai nodrošinātu augstu pieejamību, mēs iesakām palaist vismaz 3 karstos mezglus. Atkarībā no neseno datu apjoma, kuru vēlaties apkopot un vaicāt, iespējams, jums būs jāpalielina šis skaits, lai sasniegtu savus darbības mērķus.

Siltais mezgls ir tāds datu mezgla tips, kas paredzēts, lai apstrādātu lielu daudzumu tikai lasāmu indeksu, kas, iespējams, netiek bieži uzdoti. Tā kā šie indeksi ir tikai lasāmi, siltais mezgls SSD vietā mēdz izmantot lielus pievienotus diskus (parasti vērpjošus diskus). Tāpat kā karstā mezglā, augstas pieejamības gadījumā mēs iesakām vismaz 3 siltus mezglus. Un tāpat kā iepriekš, ievērojot brīdinājumu, ka lielākam datu apjomam var būt nepieciešami papildu mezgli, lai izpildītu veiktspējas prasības. Ņemiet vērā arī to, ka CPU un atmiņas konfigurācijām bieži būs jāatspoguļo jūsu karsto mezglu iestatījumi. To var noteikt tikai, pārbaudot ar vaicājumiem, kas līdzīgi tam, ko jūs pieredzētu ražošanas situācijā.

Sīkāku informāciju par karstu un siltu mezglu skatiet šeit.

Vēl viena stratēģija, kuru varat pielāgot, ir indeksu arhivēšana s3 un atjaunošana, kad nepieciešami dati no šiem indeksiem. Vairāk par to varat lasīt šeit.

Mezgla topoloģija:

Elastīgās meklēšanas mezglus var iedalīt trīs kategorijās galvenajā mezglā, datu mezglā, klienta mezglā.

  1. Galvenais mezgls: Galvenais mezgls var būt mazs, ja tas nav arī datu mezgls, jo tas neuzglabā nekādus indeksus / šķeldas. Tās pienākums ir saglabāt detalizētu kopu stāvokli un palīdzēt datiem un citiem mezgliem indeksu / šķembu meta-datu meklējumos. Elastīgajai meklēšanai vajadzētu būt vairākiem galvenajiem mezgliem, lai izvairītos no sadalītām smadzeņu problēmām.
  2. Datu mezgls: datu mezgls ir atbildīgs par faktisko indeksa datu saglabāšanu / vaicāšanu.
  3. Klienta mezgls: klienta mezgls tiek izmantots kā starpniekserveris indeksēšanai un meklēšanai. Tas ir ļoti ieteicams, ja intensīvi izmanto agregācijas. Tie ir īpaši ElasticSearch mezgli, kuriem nav nedz datu, nedz maģistru. Klientu mezgli ir informēti par klasteriem, un tāpēc tie var darboties kā viedie slodzes līdzsvarotāji. Varat nosūtīt savus jautājumus klienta mezgliem, kas pēc tam var veikt dārgu uzdevumu - apkopot atbildes uz vaicājuma rezultātiem no katra datu mezgla.

pievienojiet šos iestatījumus elastsearch.yml failam attiecīgajiem mezgliem.

Galvenais mezgls: node.master: true node.data:false
Datu mezgls: node.master: viltus node.data:true
Klienta mezgls: node.master: viltus node.data:false

Problēmu novēršanas padomi:

Elastīgās meklēšanas veiktspēja ir ļoti atkarīga no mašīnas, uz kuras tā ir uzstādīta. CPU, atmiņas izmantošana un diska I / O ir pamata operētājsistēmas metrika katram Elasticsearch mezglam. Kad centrālā procesora lietojuma pieaugums ir ieteicams, izpētīt Java virtuālās mašīnas (JVM) metriku. Šajā piemērā smailes iemesls bija augstāka atkritumu savākšanas aktivitāte.

  1. Karsts spiediens: Augsts atmiņas spiediens ietekmē klasteru veiktspēju divos veidos: Tā kā atmiņas spiediens palielinās līdz 75% un vairāk, paliek mazāk atmiņas, un jūsu klasterim tagad arī jāpavada daži CPU resursi, lai atgūtu atmiņu, izmantojot atkritumu savākšanu. Šie CPU cikli nav pieejami lietotāju pieprasījumu apstrādei, kamēr atkritumu savākšana ir ieslēgta. Tā rezultātā lietotāju pieprasījumu reakcijas laiks palielinās, jo sistēma arvien vairāk ierobežo resursus. Ja atmiņas spiediens turpina pieaugt un sasniedz gandrīz 100%, tiek izmantots daudz agresīvāks atkritumu savākšanas veids, kas savukārt dramatiski ietekmēs kopu reakcijas laiku. Indeksa reakcijas laika rādītājs parāda, ka augsts atmiņas spiediens ievērojami ietekmē veiktspēju.
  2. Pieaugums JVM atmiņā, kas nav kaudze, izēdinot atmiņu, kas paredzēta lapas kešatmiņai, un, iespējams, izraisot kodola līmeņa OOM atkārtotu izmantošanu.
  3. Izvairieties no sadalītām smadzeņu problēmām. Sadalītās smadzenes ir scenārijs, kurā klasteris sašķeļas uz augšu. Piemēram, jums ir 6 mezglu klasteri. 2 mezgli atvienojas no kopas, bet viņi joprojām spēj redzēt viens otru. Pēc tam šie 2 mezgli izveido vēl vienu kopu. Viņi pat savā starpā ievēlēs jaunu meistaru. Mums tagad ir divas kopas ar vienādu nosaukumu, viena ar 4 mezgliem un otra ar 2 mezgliem. Katrā no tām ir arī mezgls. To sauc par smadzeņu sadalīšanas problēmu ar ES klasteriem. Lai no tā izvairītos, iestatiet ES parametru discovery.zen.minimum_master_nodes uz pusi no mezglu skaita + 1.
  4. Tā kā Elasticsearch ļoti bieži izmanto atmiņas ierīces, diska I / O uzraudzība nodrošina šīs pamatvajadzības izpildi. Samazinātam diska I / O ir daudz iemeslu, un tas tiek uzskatīts par galveno rādītāju daudzu veidu problēmu prognozēšanai. Tas ir labs rādītājs, lai pārbaudītu indeksēšanas un vaicājuma veiktspējas efektivitāti. Lasīšanas un rakstīšanas darbību analīze tieši norāda, kas konkrētajā lietošanas gadījumā sistēmai ir visvairāk nepieciešams. Operētājsistēmas iestatījumi diska I / O ir visu pārējo optimizāciju pamatā, diska I / O iestatīšana var izvairīties no iespējamām problēmām. Ja diska I / O joprojām nav pietiekams, pretpasākumi, piemēram, šķembu skaita un to lieluma optimizēšana, droseļvārsta apvienošana, lēnu disku aizstāšana, pāreja uz SSD vai papildu mezglu pievienošana, jānovērtē atbilstoši apstākļiem, kas izraisa I / O. sašaurinājumi.
  5. Lietojumprogrammām, kuras paļaujas uz meklēšanu, lietotāja pieredze ir cieši saistīta ar meklēšanas pieprasījumu latentumu. Vaicājuma veiktspēju var ietekmēt daudzas lietas, piemēram, konstruēti vaicājumi, nepareizi konfigurēts Elasticsearch klasteris, JVM atmiņas un atkritumu savākšanas problēmas, diska IO un tā tālāk. Vaicājuma latentums ir metrika, kas tieši ietekmē lietotājus, tāpēc noteikti ievietojiet tajā dažus brīdinājumus.
  6. Lielākā daļa Elasticsearch filtru pēc noklusējuma ir kešatmiņā. Tas nozīmē, ka filtrētas vaicājuma pirmās izpildes laikā Elasticsearch atradīs filtram atbilstošus dokumentus un, izmantojot šo informāciju, izveidos struktūru ar nosaukumu “bitset”. Bitsetā saglabātie dati satur dokumenta identifikatoru un to, vai dotais dokuments atbilst filtram. Turpmāka vaicājumu izpilde ar vienu un to pašu filtru atkārtoti izmantos informāciju, kas glabājas bitsetā, tādējādi padarot vaicājuma izpildi ātrāku, ietaupot I / O operācijas un CPU ciklus. Ieteicams filtru izmantot vaicājumā. Sīkāku informāciju skatīt šeit.
  7. Atjaunināšanas laiks un apvienošanas laiks ir cieši saistīti ar veiktspējas indeksēšanu, kā arī tie ietekmē kopējo klastera darbību. Atjaunināšanas laiks palielinās, palielinoties Lucene indeksa (shard) failu operāciju skaitam.
  8. Iespējojot lēnu vaicājumu reģistrēšanu, tiks noskaidrots, kuri vaicājumi ir lēni un ko var darīt, lai tos uzlabotu, īpaši noderīgi vaicājumu aizstājējzīmju gadījumā.
  9. Palieliniet ulimit lielumu, lai atļautu max failus.
  10. ElasticSearch veiktspēja var ciest, ja OS nolemj apmainīties ar neizmantoto lietojumprogrammu atmiņu. Atspējojiet apmaiņu, iestatot OS līmeņa iestatījumus, vai ElasticSearch config bootstrap.mlockall iestatiet šādus iestatījumus: true
  11. Atspējojiet visu indeksu dzēšanu, izmantojot aizstājējzīmi. Lai nodrošinātu, ka kāds neizdod DELETE operāciju visiem indeksiem (* vai _all), iestatiet action.destructive_requires_name patieso.

Pirms pabeigšanas šeit ir saraksts ar vietrāžiem URL, kas noder metrikas skatīšanai.

  • / _klasteris / veselība? diezgan: klastera veselības indikatoram.
  • / _status? glīts: lai iegūtu visu informāciju par visiem indeksiem.
  • / _nodes? diezgan: visai informācijai par mezgliem.
  • / _cat / master? diezgan: galvenajam mezglam.
  • / _stats? glīts: par shard piešķiršanu, indeksi statistika.
  • / _nodes / stats? pretty: Atsevišķu mezglu statistikā tas iekļauj mezgla jvm, http, io statistiku.

Elasticsearch metrikas apkopošanu atbalsta vairums sistēmas uzraudzības rīku, piemēram, Datadog, TICK. Ir ieteicams izmantot šādus rīkus, un, lai nepārtraukti kontrolētu Elasticsearch, ir ieteicams izveidot piltuvi.

Secinājums:

Elasticsearch ir izplatīts pilna teksta meklēšanas un analīzes dzinējs, kas ļauj vairākiem īrniekiem vēl nebijušā ātrumā meklēt visas viņu datu kopas neatkarīgi no lieluma. Papildus pilna teksta meklēšanas iespējām ElasticSearch darbojas arī kā analītikas sistēma un izplatīta datu bāze. Lai sāktu, ElasticSearch ir lielas noklusējuma vērtības. Bet, pagājis no sākotnējā eksperimenta posma, jums jāpavada laiks, lai pielāgotu iestatījumus savām vajadzībām. Ieteicams vēlāk pārskatīt konfigurāciju kopā ar oficiālo dokumentāciju, lai pārliecinātos, ka klasteris ir konfigurēts atbilstoši jūsu vajadzībām.