Elasztikus kutatás a gyártásban - Bevezetési bevált gyakorlatok

Az Elasticsearch magasan optimalizált keresőmotor a modern adatelemzéshez.

Az Elasticsearch egy csodálatos valós idejű kereső és elemző motor. Az Apache Lucene-ra épül. Elosztva, RESTful, könnyen elindítható és nagyon elérhető. Az Elasticsearch használati esetek a keresés bekapcsolását, a tranzakciók figyelését és a hibák észlelését, a tartalom felfedezését, a naplóelemzést, a fuzzy keresést, az eseményadatok összesítését, az adatok megjelenítését szolgálják. Az Elasticsearch és az Elastic Stack többi része rendkívül sokoldalúnak bizonyult, és amint láthatja a fenti felhasználási eseteket, többféle módon integrálhatja az Elasticsearch-et ahhoz, amit a termék ma szállít, és további betekintést nyújt belőle.

Erőteljesen használjuk keresésre és elemzésre a Botmetricnél, napi mintegy milliárd dokumentumot indexelünk, és nagyon összetett aggregációkat használunk az adatok megjelenítéséhez valós időben.

Ennek ellenére az alkalmazás indítása és a futtatása a termelésben és a karbantartásban teljesen különbözik. Ez az arikulus számos tényezőt lefedi a való életből származó tapasztalatok alapján, és ez az alapvető közös elem, amelyet figyelembe kell venni az Elasticsearch termelés során történő futtatásához.

Memória:

Az Elasticsearch és a Lucene Java nyelven vannak írva, ami azt jelenti, hogy vigyázzon a halomtérre és a JVM statisztikára. Minél több halom áll rendelkezésre az Elasticsearch számára, annál több memóriát tud felhasználni a szűrőhöz és egyéb gyorsítótárazáshoz a lekérdezés teljesítményének növelése érdekében. De vegye figyelembe, hogy a túl sok halom hosszú hulladékgyűjtési szünetekhez vezethet. Ne állítsa az Xmx-et olyan határérték fölé, amelyet a JVM a tömörített objektummutatókhoz használ (tömörített Oops); a pontos küszöbérték változik, de közel 32 GB-ig.

Gyakori probléma egy túl nagy halom konfigurálása. Van egy 64 GB-os gépe - és golly által az Elasticsearch-nak el akarsz adni az összes 64 GB-os memóriát. Több jobb! A halom határozottan fontos az Elasticsearch számára. Számos memóriában lévő adatszerkezet használja a gyors működés biztosításához. De ennek ellenére van egy másik nagy memóriafelhasználó, amely nem halmozódik fel: az OS fájl gyorsítótára.

A Lucene célja az alapul szolgáló operációs rendszer kihasználása a memóriában lévő adatszerkezetek gyorsítótárazásához. A Lucene szegmenseket külön fájlokban tárolják. Mivel a szegmensek változatlanok, ezek a fájlok soha nem változnak. Ez nagyon gyorsítótár-barátságossá teszi őket, és az alapul szolgáló operációs rendszer örömmel tartja a forró szegmenseket a memóriában a gyorsabb hozzáférés érdekében. Ezek a szegmensek tartalmazzák mind a fordított mutatót (a teljes szöveg kereséshez), mind a doc értékeket (az összesítésekhez). A Lucene teljesítménye ezen az interakción alapszik. De ha az összes rendelkezésre álló memóriát megadja az Elasticsearch halomának, akkor nem marad hátra az operációs rendszer fájljainak gyorsítótára. Ez súlyosan befolyásolhatja a teljesítményt. Általános javaslat az, hogy a rendelkezésre álló memória 50% -át az Elasticsearch kupachoz adják, a másik 50% -át pedig szabadon hagyva. Nem marad felhasználatlan; A Lucene boldogan el fogja fogyasztani a fennmaradó fájlokat. Az Elasticsearch halom a következő módon konfigurálható,

export ES_HEAP_SIZE = 10g

vagy

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

CPU:

Az Elasticsearch támogatja az aggregációkat és a szűrt lekérdezéseket. Az összetett szűrt lekérdezések futtatásához, az intenzív indexeléshez, perkolációhoz és az indexekkel szembeni lekérdezésekhez nehéz CPU szükséges, tehát a megfelelő kiválasztás kritikus. Meg kell értenie a CPU-specifikációkat és azt, hogyan viselkednek a Java-val, amikor a lekérdezések JVM-en futnak.

Mindegyik készlet futtat számos szálat, amelyeket konfigurálhat, és sorral rendelkezik. Ennek megváltoztatása csak akkor javasolt, ha nagyon különleges követelménye van, mivel az Elasticsearch a magokat dinamikusan osztja el.

Menetkészlet típusai:

Az Elasticsearch 3 típusú szálkészletből áll.

  1. Gyorsítótárban: A gyorsítótárazott szálkészlet nem korlátozott szálkészlet, amely egy szálat hoz létre, ha függőben lévő kérelmek vannak. Ezt a szálkészletet arra használják, hogy megakadályozzák az ehhez a készlethez benyújtott kérelmek blokkolását vagy elutasítását. Az ebben a szálkészletben lévő fel nem használt szálak az élettartam lejártát követően megszűnnek (alapértelmezés szerint öt perc). A gyorsítótárazott szálkészlet az általános szálkészlet számára van fenntartva.
  2. Javítva: A rögzített szálkészlet egy rögzített méretű szálat tart, hogy kezelje a kérelmeket egy sorral (opcionálisan korlátozva) a függőben lévő kérelmekhez, amelyeknek nincs szálak a kiszolgálásukhoz. A méret paraméter vezérli a szálak számát, és alapértelmezés szerint a magok hányszorosa.
  3. Méretezés: A méretező szálkészlet dinamikus számú szálat tart. Ez a szám arányos a munkaterheléssel, és 1 és a méret paraméter értéke között változik.

Az Elasticsearch a CPU felhasználását különféle típusú szálkészletekre osztja:

  • általános: a szokásos műveletekhez, mint például a felfedezés és a szálkészlet típusa gyorsítótárban van.
  • index: indexelési / törlési műveletekhez. A szálkészlet típusa rögzített.
  • keresés: számlálási / keresési műveletekhez. A szálkészlet típusa rögzített.
  • get: a műveletek megszerzéséhez. A szálkészlet típusa rögzített.
  • ömlesztett: tömeges műveletekhez, például tömeges indexeléshez. A szálkészlet típusa rögzített. A tömeges dokumentumok legjobb konfigurálása a fürt konfigurációjától függ, ezt több érték kipróbálásával lehet azonosítani.
  • perkola: perkolációhoz. A szálkészlet típusa rögzített.
  • frissítés: Frissítési műveletekhez. A szálkészlet típusa méretező.

Egy adott szálkészlet megváltoztatható a típus-specifikus paraméterek beállításával.

További információ https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Szilánkok mérete:

A szilánk az az egység, amelyen az Elasticsearch elosztja az adatokat a fürtön belül. Az a sebesség, amellyel az Elasticsearch képes mozogni a szilánkok körül az adatok egyensúlyba állításakor, pl. a hiba után a szilánkok méretétől és számától, valamint a hálózat és a lemez teljesítményétől függ.

Az Elasticsearch programban minden lekérdezést egy szálonként egy szálban hajtanak végre. Több réteg ugyanakkor feldolgozható párhuzamosan, akárcsak több lekérdezés és aggregáció ugyanazon szilánkra vonatkozóan.

Ez azt jelenti, hogy a lekérdezés minimális késleltetése, ha nincs gyorsítótárazás, az adatoktól, a lekérdezés típusától és a szilánk méretétől is függ. Sok kis szilánk lekérdezése gyorsabbá teszi a feldolgozást szilánkonként, de mivel még sok más feladatot sorba kell állítani és sorrendben kell feldolgozni, akkor nem feltétlenül gyorsabb, mint egy kisebb számú nagyobb réteg lekérdezése. Ha sok apró szilánk van, akkor a lekérdezés teljesítménye is csökkenthető, ha több egyidejű lekérdezés van.

Minden szilánk rendelkezik olyan adatokkal, amelyeket meg kell őrizni a memóriában, és halom helyet igényel. Ez magában foglalja az adatszerkezeteket, amelyek információt tárolnak a szilánk szintjén és a szegmens szintjén is annak meghatározása érdekében, hogy hol vannak az adatok a lemezen. Ezeknek az adatszerkezeteknek a mérete nem rögzített, és a felhasználástól függően változik. A szegmenssel kapcsolatos általános jellemzők egyik fontos jellemzője, hogy az nem szigorúan arányos a szegmens méretével. Ez azt jelenti, hogy a nagyobb szegmensek adatmennyiségenként kevesebb általános költséget mutatnak, mint a kisebb szegmensek. A különbség jelentős lehet. A megfelelő számú réteg kiválasztása bonyolult, mert soha nem tudhatja, hány dokumentumot kap megkezdése előtt. Ha sok szilánk van, a klaszter számára jó és rettenetes is lehet. Az indexek és a szilánkok kezelése túlterheli a mester csomópontot, amely nem reagál, ami furcsa és csúnya viselkedéshez vezethet. Helyezze el a fő csomópontokat elegendő erőforrást ahhoz, hogy megbirkózzon a fürt méretével.

A rossz dolog az, hogy a szilánkok száma változatlan, és az index létrehozásakor meghatározható. Az index létrehozása után az szilánkok számának megváltoztatásának egyetlen módja az indexek törlése, újból létrehozása és újraindexelése.

replikáció

Az Elasticsearch támogatja a replikációt, az adatok replikálódnak az adatcsomópontok között, így a csomópontvesztés nem vezet adatvesztéshez. Alapértelmezés szerint a replikációs tényező 1, de a termékigényektől függően megnövelhető. Minél több másolata van, annál katasztrófaállóbb lesz az adatai. További replikák további előnye, hogy mindegyik csomópont replica shardot tartalmaz, ami javítja a lekérdezés teljesítményét, mivel a replikákat is használják a lekérdezéshez.

Az Elasticsearch által alkalmazott konzisztencia replikációs formula:

(elsődleges + szám_replikáció) / 2 + 1

Az elosztás optimalizálása

A termékadat-követelmények alapján az adatokat hideg és meleg kategóriákba sorolhatjuk. Azokhoz az indexekhez, amelyekhez másoknál gyakrabban férnek hozzá, több adat csomópontot lehet hozzárendelni, míg a ritkábban hozzáférhető indexekhez kevesebb erőforrás allokálható. Ez a stratégia különösen hasznos idősor-adatok, például alkalmazásnaplók (pl. ELK) tárolására.

Ez úgy érhető el, hogy egy cronjob-ot futtatunk, amely rendszeres időközönként mozgatja az indexeket különböző csomópontokra.

A forró csomópont egy olyan típusú csomópont, amely a fürtön belüli összes indexelést végrehajtja. Ugyancsak tartják a legfrissebb indexeket, mivel ezeket általában a leggyakrabban kérdezik. Mivel az indexelés egy CPU és IO intenzív művelet, ezeknek a szervereknek nagy teljesítményűeknek kell lenniük, és csatolt SSD tárolással kell őket támogatni. A magas rendelkezésre állás érdekében javasoljuk legalább 3 forró csomópont futtatását. Attól függően, hogy mennyi új adatot szeretne gyűjteni és lekérdezni, valószínűleg növelnie kell ezt a számot a teljesítménycélok elérése érdekében.

A meleg csomópont olyan adatcsomópont, amelyet nagy mennyiségű, csak olvasható index kezelésére terveztek, és amelyet nem valószínű, hogy gyakran kérdeznek meg. Mivel ezek az indexek csak olvashatóak, a meleg csomópontok inkább nagy csatolt lemezeket (általában forgó lemezeket) használnak SSD helyett. Mint a forró csomópontoknál is, legalább 3 meleg csomópontot ajánlunk a magas rendelkezésre állás érdekében. És mint korábban, azzal a figyelmeztetéssel, hogy nagyobb adatmennyiséghez további csomópontokra lehet szükség a teljesítménykövetelmények teljesítéséhez. Azt is vegye figyelembe, hogy a CPU és a memória konfigurációinak gyakran tükrözniük kell a forró csomópontok konfigurációit. Ez csak úgy határozható meg, hogy tesztelést végez hasonló kérdésekkel, mint amelyeket egy gyártási helyzetben tapasztalhat.

A forró és meleg csomópontról bővebben itt olvashat.

Egy másik adaptálható stratégia az indexek archiválása az s3-ba és az adatok helyreállítása, amikor adatokra van szükségük az indexekből. Erről bővebben itt olvashat.

Csomópont topológia:

Az Elasticsearch csomópontokat három kategóriába lehet osztani: fő csomópont, adat csomópont, kliens csomópont.

  1. Mester csomópont: A fő csomópont kicsi lehet, ha nem is adat csomópont, mivel nem tárol semmilyen indexet / szilánkot. Felelőssége a részletes klaszterállapot tárolása, valamint az adatok és egyéb csomópontok tárolása az indexek / szilánkok metaadat-keresésében. Az elasztikus keresésnek több mester csomóponttal kell rendelkeznie, hogy elkerülhető legyen az agy megosztott problémája.
  2. Adatcsomópont: Az adatcsomópont felelős a tényleges indexadatok tárolásáért / lekérdezéséért.
  3. Ügyfélcsomópont: Az ügyfélcsomópontot proxyként használják az indexeléshez és a kereséshez. Ez erősen ajánlott, ha az aggregációkat erősen használják. Ezek olyan speciális ElasticSearch csomópontok, amelyek sem adatokra, sem masterre nem alkalmasak. Az ügyfélcsomópontok klaszter-tudatában vannak, és ezért intelligens terheléselosztókként működhetnek. Küldéseit elküldheti az ügyfélcsomópontoknak, amelyek ezt követően megtehetik a költséges feladatot, azaz az egyes csomópontokból összegyűjtik a lekérdezés eredményére adott válaszokat.

add hozzá ezeket a beállításokat az eladearch.yml fájlhoz a megfelelő csomópontokhoz.

Mester csomópont: node.master: true node.data:false
Adatcsomópont: node.master: false node.data:true
Ügyfélcsomópont: node.master: false node.data:false

Hibaelhárítási tippek:

Az elasztikus keresés teljesítménye nagyban függ attól a géptől, amelyre telepítve van. A CPU, a Memóriahasználat és a Lemez I / O alapvető operációs rendszer-mutatók az egyes Elasticsearch csomópontokhoz. Ajánlott, hogy vizsgálja meg a Java virtuális gép (JVM) mutatóit, amikor a CPU-használat növekszik. A következő példában a tüske oka a nagyobb hulladékgyűjtési tevékenység volt.

  1. Halomnyomás: A magas memórianyomás kétféleképpen működik a klaszter teljesítményével szemben: Mivel a memórianyomás 75% -ra és annál magasabbra növekszik, kevesebb memória marad rendelkezésre, és a klaszternek most is költenie kell néhány CPU-erőforrást a memória visszaszerzéséhez a szemetet gyűjtve. Ezek a CPU ciklusok nem érhetők el a felhasználói kérelmek kezeléséhez, miközben a hulladékgyűjtés be van kapcsolva. Ennek eredményeként a felhasználói kérelmekre adott válaszidő növekszik, ahogy a rendszer egyre erőforrás-korlátozottabbá válik. Ha a memória nyomása tovább növekszik, és eléri a 100% -ot, akkor a szemétgyűjtés sokkal agresszívebb formáját használják, ami viszont drámai módon befolyásolja a klaszterek válaszidejét. Az Index Response Times mutatója azt mutatja, hogy a magas memórianyomás jelentős hatást gyakorol a teljesítményre.
  2. Növekszik a JVM nem halom memóriája, elfogyasztja az oldal gyorsítótárához szánt memóriát, és esetleg a rendszermag-szintű OOM-visszaesést okozhatja.
  3. Kerülje az osztott agyproblémákat. Az agy megoszlása ​​olyan helyzet, amikor a klaszter feloszlik. Például 6 csomópontfürtjével rendelkezik. 2 csomópont leválasztja a fürtöt, de továbbra is képesek látni egymást. Ez a 2 csomópont létrehoz egy új fürtöt. Még egy új mestert is választanak köztük. Most két azonos nevű klaszterünk van, az egyik 4 csomóponttal, a másik 2 csomóponttal rendelkezik. Mindegyiknek van egy mester csomópontja. Ezt nevezzük osztott agy kérdésnek az ES klasztereknél. Ennek elkerülése érdekében állítsa az ES felfedezés.zen.minimum_master_nodes paramétert a +1 csomópontok számának felére.
  4. Mivel az Elasticsearch nagyon sok tárolóeszközt használ, a lemez I / O megfigyelése biztosítja, hogy ez az alapvető igény teljesüljön. Számos oka van a lemezes I / O csökkenésének, amelyet sokféle probléma előrejelzésének kulcsfontosságú mutatójaként tekintünk. Ez jó mutató az indexelés és a lekérdezés teljesítményének hatékonyságának ellenőrzésére. Az olvasási és írási műveletek elemzése közvetlenül megmutatja, hogy mi van a rendszerre leginkább az adott felhasználási esetben. A lemez I / O operációs rendszer beállításai minden más optimalizálás alapját képezik, a lemez I / O hangolása pedig elkerüli a lehetséges problémákat. Ha a lemez I / O továbbra sem elegendő, akkor az olyan ellenintézkedéseket, mint például a szilánkok számának és méretének optimalizálása, a fojtószelep egyesítése, a lassú lemezek cseréje, az SSD-re való áthelyezés vagy további csomópontok hozzáadása, az I / O okát okozó körülményeknek megfelelően kell értékelni. szűk.
  5. A keresésre támaszkodó alkalmazások esetében a felhasználói élmény szorosan összefügg a keresési kérelmek késleltetésével. Számos olyan tényező befolyásolhatja a lekérdezés teljesítményét, mint a felépített lekérdezések, a nem megfelelően konfigurált Elasticsearch fürt, a JVM memória és a szemétgyűjtés kérdése, a lemez IO stb. A lekérdezés késleltetése az a mutató, amely közvetlenül érinti a felhasználókat, ezért feltétlenül küldjön rá néhány figyelmeztetést.
  6. Az Elasticsearch szűrőinek nagy része alapértelmezés szerint gyorsítótárban van. Ez azt jelenti, hogy a szűrt lekérdezés első végrehajtása során az Elasticsearch megkeresi a szűrőnek megfelelő dokumentumokat, és ezen információk felhasználásával felépíti a „bitset” nevű struktúrát. A bitkészletben tárolt adatok tartalmaznak dokumentum azonosítót és azt, hogy egy adott dokumentum megegyezik-e a szűrővel. Az azonos szűrővel rendelkező lekérdezések későbbi végrehajtása újra felhasználja a bitkészletben tárolt információkat, ezáltal gyorsabban megkönnyíti a lekérdezés végrehajtását az I / O műveletek és a CPU ciklusok mentésével. A szűrő használata a lekérdezésben ajánlott. További részletek itt találhatók.
  7. A frissítési idő és az egyesítési idő szorosan kapcsolódik az indexelési teljesítményhez, plusz befolyásolják a fürt teljes teljesítményét. A frissítési idő növekszik a Lucene index (shard) fájlműveleteinek számával.
  8. A lassú lekérdezés-naplózás engedélyezése segít meghatározni, hogy mely lekérdezések lassúak, és mit lehet tenni azok javítása érdekében, különös tekintettel a helyettesítő karakterekre.
  9. Növelje az ulimit méretét a maximális fájlok engedélyezéséhez.
  10. Az ElasticSearch teljesítménye sérülhet, ha az operációs rendszer úgy dönt, hogy kicseréli a nem használt alkalmazásmemóriát. Tilos lecserélni az operációs rendszer szintjének beállításával, vagy az ElasticSearch konfigurációs fájljában a bootstrap.mlockall paranccsal állíthatja be: true
  11. Tilos letiltani az összes index törlését helyettesítő karakterekkel. Annak biztosítása érdekében, hogy valaki az összes indexnél (* vagy _all) ne adja ki a TÖRLÉS műveletet, állítsa a action.destructive_requires_name értékét true értékre.

Mielőtt befejezné, itt található a mutatók megtekintéséhez hasznos URL-ek listája.

  • / _klaszter / egészség? szép: A klaszter állapotának mutatója.
  • / _status? csinos: Az összes mutatóval kapcsolatos összes információ.
  • / _nodes? csinos: A csomópontokkal kapcsolatos összes információ.
  • / _cat / master? csinos: A master csomóponthoz.
  • / _stats? csinos: a szilánk-elosztáshoz az indexek statisztikái.
  • / _nodes / stats? csinos: Az egyes csomópont-statisztikákhoz ez tartalmazza a csomópont jvm, http, io statisztikáit.

Az Elasticsearch metrikus összesítését a legtöbb rendszerfigyelő eszköz támogatja, mint például a Datadog, a TICK. Ilyen eszközök használata ajánlott, és tölcsér létrehozása erősen ajánlott az Elasticsearch folyamatos ellenőrzéséhez.

Következtetés:

Az Elasticsearch egy elosztott, teljes szöveges kereső és elemző motor, amely lehetővé teszi több bérlő számára, hogy példátlan sebességgel kereshessen teljes adatkészletében, méretétől függetlenül. A teljes szöveges keresési képességein túl az ElasticSearch elemző rendszerként és elosztott adatbázisként is működik. Az ElasticSearch nagy alapértelmezett beállításokkal rendelkezik az induláshoz. De miután elmúlt a kísérleti szakasz kezdetén, időt kell fordítania az igényeinek megfelelő beállításra. Javasoljuk, hogy később vizsgálja felül a konfigurációt, a hivatalos dokumentációval együtt, hogy megbizonyosodjon arról, hogy a fürt az igényeinek megfelelően van-e konfigurálva.