Elasticsearch ve výrobě - ​​nasazení osvědčených postupů

Elasticsearch je vysoce optimalizovaný vyhledávač pro moderní analýzu dat.

Elasticsearch je úžasný vyhledávací a analytický stroj v reálném čase. Je postaven na Apache Lucene. Je distribuován, RESTful, snadno použitelný a vysoce dostupný. Případy použití Elasticsearch zahrnují napájení vyhledávání, sledování transakcí a detekci chyb, zjišťování obsahu, analýzu protokolů, fuzzy vyhledávání, agregaci dat událostí, vizualizaci dat. Elasticsearch a zbytek Elastic Stack se ukázaly být velmi univerzální, a jak vidíte výše uvedené případy použití, existuje několik způsobů, jak integrovat Elasticsearch do toho, co váš produkt přináší dnes, a přidat do něj další vhled.

Používáme jej pro vyhledávání a analytiku v Botmetric, indexujeme zhruba miliardu dokumentů denně a pro vizualizaci dat v reálném čase používáme velmi komplexní agregace.

To znamená, že bootstrapping aplikace vs. spuštění v produkci a údržbě jsou zcela odlišné. Tento článek pokrývá mnoho z těchto faktorů ze skutečných životních zkušeností a jsou základní společné položky, které byste měli zvážit pro spuštění Elasticsearch ve výrobě.

Paměť:

Elasticsearch a Lucene jsou psány v Javě, což znamená, že musíte dávat pozor na statistiky haldy a JVM. Čím více haldy je k dispozici pro Elasticsearch, tím více paměti může použít pro filtr a další ukládání do mezipaměti pro zvýšení výkonu dotazu. Ale všimněte si, že příliš mnoho haldy vás může vystavit dlouhým přestávkám sběru odpadu. Nenastavujte Xmx nad mezní hodnotu, kterou JVM používá pro ukazatele komprimovaných objektů (komprimované Jejda); přesná mez se liší, ale je blízko 32 GB.

Častým problémem je konfigurace haldy, která je příliš velká. Máte 64 GB stroj - a hlavně chcete dát Elasticsearch všech 64 GB paměti. Více je lepší! Halda je pro Elasticsearch rozhodně důležitá. Používá se v mnoha datových strukturách v paměti k zajištění rychlého provozu. Ale s tím bylo řečeno, existuje další hlavní uživatel paměti, který je mimo haldu: mezipaměť souborů OS.

Lucene je navržen tak, aby využíval základní operační systém pro ukládání do mezipaměti datových struktur. Segmenty Lucene jsou uloženy v jednotlivých souborech. Protože segmenty jsou neměnné, tyto soubory se nikdy nezmění. Díky tomu jsou velmi přátelští k mezipaměti a základní operační systém šťastně udržuje horké segmenty rezidentní v paměti pro rychlejší přístup. Tyto segmenty zahrnují jak invertovaný index (pro fulltextové vyhledávání), tak doc hodnoty (pro agregace). Výkon společnosti Lucene závisí na této interakci s operačním systémem. Ale pokud přidáte veškerou dostupnou paměť do haldy Elasticsearch, nezůstanou v mezipaměti souborů OS žádné. To může mít vážný dopad na výkon. Standardním doporučením je poskytnout 50% dostupné paměti haldy Elasticsearch, zatímco zbývajících 50% zůstává volných. Nevyužije se to; Lucene šťastně spotřebuje vše, co zbylo pro mezipaměť souborů. Hromadu Elasticsearch lze konfigurovat následujícími způsoby,

export ES_HEAP_SIZE = 10g

nebo

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

PROCESOR:

Elasticsearch podporuje agregace a filtrované dotazy. Spouštění složitých filtrovaných dotazů, intenzivní indexování, perkolace a dotazy proti indexům vyžadují těžký procesor, takže výběr správného je kritický. Jeden musí pochopit specifikace CPU a jak se chovají s Javou, když dotazy běží na JVM.

Každý fond spouští řadu vláken, které lze konfigurovat, a má frontu. Změna se nedoporučuje, pokud nemáte velmi konkrétní požadavek, protože Elasticsearch dynamicky přiděluje jádra.

Typy podprocesů:

Elasticsearch má 3 typy fondů vláken.

  1. V mezipaměti: Fond podprocesů v mezipaměti je neomezený fond podprocesů, který v případě nevyřízených požadavků vytvoří podproces. Tato oblast podprocesů se používá k zabránění blokování nebo odmítnutí požadavků odeslaných do této oblasti. Nepoužitá vlákna v této oblasti vláken budou ukončena po vypršení platnosti udržení (výchozí hodnota je pět minut). Fond podprocesů v mezipaměti je vyhrazen pro obecný fond podprocesů.
  2. Opraveno: Fond pevných podprocesů má pevnou velikost podprocesů pro zpracování požadavků s frontou (volitelně ohraničenou) pro čekající žádosti, které nemají podprocesy pro jejich obsluhu. Parametr size řídí počet vláken a výchozí počet krát 5 jader.
  3. Změna měřítka: Oblast úpravy měřítka podprocesů obsahuje dynamický počet podprocesů. Toto číslo je úměrné pracovní zátěži a mění se mezi 1 a hodnotou parametru size.

Elasticsearch rozděluje využití procesoru do podprocesů různých typů:

  • obecný: pro standardní operace jako je zjišťování a typ fondu podprocesů v mezipaměti.
  • index: pro operace index / smazat. Typ fondu vláken je pevný.
  • vyhledávání: pro počet / operace vyhledávání. Typ fondu vláken je pevný.
  • get: pro získání operací. Typ fondu vláken je pevný.
  • hromadně: pro hromadné operace, jako je hromadné indexování. Typ fondu vláken je pevný. Nejlepší konfigurace hromadných dokumentů závisí na konfiguraci clusteru, což lze identifikovat vyzkoušením více hodnot.
  • perkolát: pro perkolaci. Typ fondu vláken je pevný.
  • aktualizace: Pro operace obnovení. Typ fondu vláken je měřítko.

Změna určité oblasti podprocesů lze provést nastavením jejích specifických parametrů.

Další informace https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Velikost střepu:

Střípek je jednotka, ve které Elasticsearch distribuuje data v klastru. Rychlost, s jakou může Elasticsearch pohybovat střepy kolem při opětovném vyvážení dat, např. po selhání bude záviset na velikosti a počtu střepů a výkonu sítě a disku.

V Elasticsearch je každý dotaz proveden v jednom vláknu na střep. Více střepů však může být zpracováno paralelně, stejně jako více dotazů a agregací proti stejnému střepu.

To znamená, že minimální latence dotazu, pokud není použito ukládání do mezipaměti, bude záviset na datech, typu dotazu a velikosti střepu. Dotaz na spoustu malých střepů zrychlí zpracování na střep, ale protože mnohem více úkolů musí být zařazeno do fronty a zpracováno postupně, nemusí to být nutně rychlejší než dotazování na menší počet větších střepů. Spousta malých střepů může také snížit propustnost dotazu, pokud existuje více souběžných dotazů.

Každý střep má data, která je třeba uchovávat v paměti a využívá haldy. To zahrnuje datové struktury, které uchovávají informace na úrovni střepů a také na úrovni segmentů, aby bylo možné určit, kde se data nacházejí na disku. Velikost těchto datových struktur není pevná a bude se lišit v závislosti na případu použití. Jednou důležitou charakteristikou režie související se segmentem je však to, že není přísně úměrné velikosti segmentu. To znamená, že větší segmenty mají menší režijní náklady na objem dat ve srovnání s menšími segmenty. Rozdíl může být podstatný. Výběr správného počtu střepů je složitý, protože nikdy nevíte, kolik dokumentů dostanete, než začnete. Spousta střepů může být pro klastr dobrá i hrozná. Správa indexů a střepů může přetížit hlavní uzel, což by mohlo přestat reagovat a vést k nějakému podivnému a ošklivému chování. Přiřaďte vašim hlavním uzlům dostatek prostředků, aby zvládly velikost klastru.

Špatné je, že počet střepů je neměnný a je definován při vytváření indexu. Jakmile je index vytvořen, jediným způsobem, jak změnit počet střepů, je odstranit vaše indexy, znovu je vytvořit a znovu indexovat.

Replikace

Elasticsearch podporuje replikaci, data jsou replikována mezi datovými uzly, takže ztráta uzlu nevede ke ztrátě dat. Ve výchozím nastavení je replikační faktor 1, ale v závislosti na vašich požadavcích na produkt může být zvýšen. Čím více replik bude, vaše data budou odolnější vůči katastrofám. Další výhodou většího počtu replik je to, že každý uzel má shard replik, což zlepšuje výkon dotazu, protože pro dotazování se používají také repliky.

Replikační vzorec používaný konzistencí Elasticsearch je,

(primární + číslo_replik) / 2 + 1

Optimalizace alokace

Na základě požadavků na údaje o produktu můžeme data rozdělit na horká a studená. Indexům, k nimž se přistupuje častěji než jiným, lze přiřadit více datových uzlů, zatímco indexy, které mají méně často přístupné indexy, mohou mít přiděleno méně zdrojů. Tato strategie je zvláště užitečná pro ukládání dat časových řad, jako jsou protokoly aplikací (např .: ELK).

Toho lze dosáhnout spuštěním cronjob, které v pravidelných intervalech přesouvá indexy do různých uzlů.

Horký uzel je typ datového uzlu, který provádí veškerou indexaci v klastru. Oni také drží nejnovější indexy, protože tyto obvykle mají tendenci být dotazovány nejčastěji. Protože indexování je operace náročná na CPU a IO, musí být tyto servery výkonné a podporované připojeným úložištěm SSD. Pro vysokou dostupnost doporučujeme provozovat minimálně 3 horké uzly. V závislosti na množství posledních údajů, které chcete sbírat a dotazovat, možná budete muset zvýšit toto číslo, abyste dosáhli svých výkonnostních cílů.

Teplý uzel je typ datového uzlu navrženého pro zpracování velkého množství indexů jen pro čtení, které nejsou tak často dotazovány. Protože tyto indexy jsou jen pro čtení, teplý uzel má tendenci využívat velké připojené disky (obvykle rotující disky) místo SSD. Stejně jako u horkého uzlu doporučujeme pro vysokou dostupnost minimálně 3 teplý uzel. A jako dříve, s výhradou, že větší množství dat může vyžadovat další uzly, aby splnily požadavky na výkon. Také si všimněte, že konfigurace CPU a paměti budou často muset odrážet konfigurace vašich horkých uzlů. To lze zjistit pouze testováním pomocí dotazů podobných těm, které byste zažili v produkční situaci.

Více podrobností o horkém a teplém uzlu najdete zde.

Další strategií, kterou můžete přizpůsobit, je archivace indexů na s3 a obnovení, když potřebujete data z těchto indexů. Můžete si o tom přečíst více zde.

Topologie uzlu:

Uzly Elasticsearch lze rozdělit do tří kategorií: hlavní uzel, datový uzel, klientský uzel.

  1. Hlavní uzel: Hlavní uzel může být malý, pokud není datovým uzlem, protože neukládá žádné indexy / střepy. Jeho odpovědností je ukládat podrobný stav klastru a pomáhat datům a dalším uzlům v vyhledávání metadat indexů / střepů. Elasticsearch by měl mít více hlavních uzlů, aby se zabránilo rozštěpenému mozku.
  2. Datový uzel: Datový uzel je zodpovědný za ukládání / dotazování skutečných indexových dat.
  3. Uzel klienta: Uzel klienta se používá jako proxy pro indexování a vyhledávání. To je vysoce doporučeno, pokud jsou agregace intenzivně využívány. Jedná se o speciální uzly ElasticSearch, které nejsou způsobilé pro data ani master. Klientské uzly si uvědomují klastry, a proto mohou fungovat jako inteligentní vyvažovače zátěže. Dotazy můžete odeslat klientským uzlům, které pak mohou převzít nákladný úkol shromažďování odpovědí na výsledky dotazů z každého datového uzlu.

přidejte toto nastavení do souboru elasticsearch.yml pro příslušné uzly.

Hlavní uzel: node.master: true node.data:false
Datový uzel: node.master: false node.data:true
Uzel klienta: node.master: false node.data:false

Tipy pro odstraňování problémů:

Výkon Elasticsearch silně závisí na stroji, na kterém je nainstalován. CPU, využití paměti a disk I / O jsou základní metriky operačního systému pro každý uzel Elasticsearch. Doporučujeme, abyste se podívali na metriku Java Virtual Machine (JVM), když se zvýší využití CPU. V následujícím příkladu byla příčinou špice vyšší aktivita sběru odpadu.

  1. Tlak haldy: Vysoký tlak paměti pracuje proti výkonu clusteru dvěma způsoby: Jak se tlak paměti zvyšuje na 75% a výše, zůstává k dispozici méně paměti a váš cluster nyní musí také utratit nějaké prostředky CPU, aby získal zpět paměť pomocí sběru odpadu. Tyto cykly CPU nejsou k dispozici pro vyřizování uživatelských požadavků při zapnutém sběru odpadu. Výsledkem je, že doba odezvy na požadavky uživatelů se zvyšuje s tím, jak se systém stává stále více omezeným na zdroje. Pokud tlak v paměti stále roste a dosáhne téměř 100%, použije se mnohem agresivnější forma sběru odpadu, což zase dramaticky ovlivní dobu odezvy clusteru. Metrika Index Response Times ukazuje, že vysoký tlak v paměti má významný dopad na výkon.
  2. Růst v paměti haldy JVM, stravování mimo paměť určenou pro mezipaměť stránky a pravděpodobně způsobující sklízení OOM na úrovni jádra.
  3. Vyhněte se rozštěpenému mozku. Rozdělený mozek je scénář, kde se klastr rozdělí. Například máte klastr s 6 uzly. Dva uzly se odpojí od klastru, stále se však mohou navzájem vidět. Tyto 2 uzly pak vytvoří další klastr. Dokonce si mezi sebou zvolí nového pána. Nyní máme dva klastry se stejným názvem, jeden se 4 uzly a druhý se 2 uzly. Každý má také hlavní uzel. Tomuto problému se říká clustery mozek s klastry ES. Abyste tomu zabránili, nastavte parametr ES discovery.zen.minimum_master_nodes na polovinu počtu uzlů + 1.
  4. Vzhledem k tomu, že Elasticsearch používá úložná zařízení intenzivně, monitorování vstupně-výstupních operací na disku zajišťuje splnění této základní potřeby. Existuje mnoho důvodů pro snížené I / O disky, je to považováno za klíčovou metriku pro předpovídání mnoha druhů problémů. Je dobré kontrolovat účinnost indexování a výkonu dotazů. Přímá analýza operací čtení a zápisu ukazuje, co systém v konkrétním případě použití nejvíce potřebuje. Nastavení operačního systému pro diskové vstupy / výstupy jsou základem pro všechny ostatní optimalizace, ladění diskových vstupů a výstupů může zabránit potenciálním problémům. Pokud disk I / O stále není dostačující, měla by být vyhodnocena protiopatření, jako je optimalizace počtu střepů a jejich velikosti, škrtící slučování, nahrazování pomalých disků, přesun na SSD nebo přidání dalších uzlů podle okolností způsobujících I / O úzká místa.
  5. U aplikací, které spoléhají na vyhledávání, je uživatelské prostředí vysoce korelováno s latencí požadavků na vyhledávání. Existuje mnoho věcí, které mohou ovlivnit výkon dotazu, jako jsou konstruované dotazy, nesprávně nakonfigurovaný klastr Elasticsearch, problémy s pamětí JVM a sběrem odpadu, IO disku atd. Míra zpoždění dotazu je metrika, která přímo ovlivňuje uživatele, proto se ujistěte, že na něj vložíte některá upozornění.
  6. Většina filtrů v Elasticsearch je ve výchozím nastavení uložena do mezipaměti. To znamená, že během prvního spuštění filtrovaného dotazu najde Elasticsearch dokumenty odpovídající filtru a pomocí těchto informací vytvoří strukturu nazvanou „bitset“. Data uložená v bitové sadě obsahují identifikátor dokumentu a to, zda daný dokument odpovídá filtru. Následné provádění dotazů, které mají stejný filtr, znovu použije informace uložené v bitové sadě, čímž se zrychlí provádění dotazů uložením I / O operací a cyklů CPU. Doporučujeme použít filtr v dotazu. Více informací naleznete zde.
  7. Čas aktualizace a čas sloučení úzce souvisí s výkonem indexování a navíc ovlivňují celkový výkon clusteru. Čas obnovení se zvyšuje s počtem operací se soubory pro index Lucene (střep).
  8. Povolení pomalého protokolování dotazů pomůže při zjišťování, které dotazy jsou pomalé a co lze udělat pro jejich zlepšení, zvláště užitečné pro dotazy se zástupnými znaky.
  9. Zvětšete velikost ulimitů, abyste umožnili maximální počet souborů.
  10. Výkon systému ElasticSearch může utrpět, když se operační systém rozhodne vyměnit nevyužitou paměť aplikace. Zakažte odkládání nastavením nastavení na úrovni OS nebo nastavte následující nastavení v ElasticSearch config bootstrap.mlockall: true
  11. Zakázat odstranění všech indexů pomocí dotazu zástupných znaků. Chcete-li zajistit, aby někdo nevydával operaci DELETE u všech indexů (* nebo _all), nastavte action.destructive_requires_name na true.

Před dokončením je zde uveden seznam adres URL, které jsou užitečné pro sledování metrik.

  • / _cluster / health? pretty: Pro indikátor stavu clusteru.
  • / _status? pretty: Pro všechny informace o všech indexech.
  • / _nodes? pretty: Pro všechny informace o uzlech.
  • / _cat / master? pretty: Pro hlavní uzel.
  • / _stats? pretty: Pro alokaci střepů statistiky indexů.
  • / _nodes / statistics? pretty: U statistik jednotlivých uzlů to zahrnuje statistiky jvm, http, io pro uzel.

Agregace metrik Elasticsearch je podporována většinou nástrojů pro monitorování systému, jako jsou Datadog, TICK. Použití takových nástrojů se doporučuje a vytvoření trychtýře se důrazně doporučuje pro nepřetržité monitorování Elasticsearch.

Závěr:

Elasticsearch je distribuovaný fulltextový vyhledávací a analytický stroj, který umožňuje více nájemcům prohledávat celé své soubory dat, bez ohledu na velikost, bezprecedentní rychlostí. Kromě možností fulltextového vyhledávání funguje ElasticSearch také jako analytický systém a distribuovaná databáze. ElasticSearch má skvělé výchozí hodnoty. Jakmile však projdete počáteční experimentální fází, musíte strávit nějaký čas vyladěním nastavení podle svých potřeb. Doporučujeme, abyste svou konfiguraci znovu zkontrolovali později spolu s oficiální dokumentací, abyste se ujistili, že váš klastr je nakonfigurován tak, aby vyhovoval vašim potřebám.