Skrz.cz: Bez Elasticu už ani ránu!

DEV tým Skrz.cz
5 min readNov 25, 2019

--

Skoro každý už o Elasticsearch slyšel, ale k čemu se dá reálně používat? A k čemu, jak a proč ho používáme ve Skrzu my?

Co se o Elasticsearch (dále jen ES) píše na jejich stránkách?

Elasticsearch is a distributed, RESTful search and analytics engine capable of addressing a growing number of use cases. As the heart of the Elastic Stack, it centrally stores your data so you can discover the expected and uncover the unexpected.

Jen u nás ve Skrzu používáme ES pro tři různé úkoly:

  • katalog nabídek,
  • statistiky,
  • zpracování logů/monitoring.

V tomto článku pouze ve stručnosti shrnu každý z nich. Více jednotlivá použití popíši v samostatných článcích.

Katalog nabídek

Tok dat z SQL DB do Elasticsearche

Máme v databázi neustále něco kolem 100 000 aktivních nabídek, ke každé desítky až stovky různých termínů a nabídky se neustále mění.

Potřebujeme být schopni v tomto katalogu rychle a kvalitně vyhledávat, dělat agregace počtu nabídek a data rychle naservírovat našim uživatelům.

V naší DB má každá nabídka hromadu různých vazeb a relací. To ale ES neumožňuje. Každé nabídce přednačteme před vložením do ES všechny její potřebné vazby a uložíme jako jeden velký dokument. Pro data na výpisech pak už nemusíme (příliš) sahat do DB.

Jaké problémy a otázky řešíme u tohoto použití?

Co všechno za data do ES ukládat?

Máme do ES ukládat jen informace, podle kterých budeme hledat? Víme dopředu, které informace to budou? Nebo tam toho nalít co nejvíc? Protože co kdyby se to hodilo? My ukládáme (skoro) všechno, ale indexujeme jen to, co je potřeba. Přidat a začít indexovat nový field je totiž jednoduché. Ale změnit nastavení již existujícího indexu je trochu… pakárna.

Co všechno za data z ES tahat?

Myslím, že existují dvě možnosti, jak se k tomu postavit. Zkoušeli jsme je nedávno testovat a samotné nás překvapilo, že nebyl rozdíl v celkové rychlosti.

Z ES vytáhnout pouze IDčka a následně si o položky říct z DB podle primárního klíče. Zde je pak nutné kvůli dalším relacím dělat další dotazy do DB. Ale nikde nám nemůže nic chybět.

Z ES vytáhnout kompletní serializované entity. Máme v ES serializované entity i s jejich vazbami a dalšími navázanými entitami. Ale tyhle vazby musíme někde “useknout”, abychom v každém dokumentu neměli celou databázi. Pokud vazby zpřetrháme příliš brzo, můžou nějaká data chybět.

Neustálá aktualizace katalogu, aby byl konzistentní s DB

Pravda je u nás vždy v SQL databázi. Nabídky se pořád mění a je potřeba data v ES udržovat pořád aktuální a synchronizovat je s DB. Zde můžete narazit na problém s rychlostí indexování. ES totiž i při updatu pouze jednoho fieldu vezme celý dokument, zahodí ho a zaindexuje kompletně znovu.

Správné nastavení fulltextového vyhledávání

Není to vůbec jednoduchá věc. Každý projekt podle svého zaměření bude mít potřebu různých stop slov, speciálních výrazů atp. ES se snaží slova pro fulltextové vyhledávání předzpracovat a dostat do nějakých základních tvarů. Což nás třeba potrápilo u různých názvů měst. Protože základní tvar pro “Karlovy Vary” je přeci “karel” a “var”. A člověk postupně odhaluje a opravuje mnoho dalších podobných záludností.

Jak správně data pro ES připravit, aby se daly psát jednoduché a zároveň efektivní dotazy a agregace?

Pokud jste zvyklí pracovat s relačními DB a nerelační jsou pro vás něco nového, dejte si pozor na to, jak píšete dotazy! Můžete mít tendence se držet stejné struktury a logiky, jakou máte ve vaší SQL databázi. Často si ale drobným předzpracováním před nalitím dat do ES ušetříte mnoho času při psaní dotazů. A také díky tomu můžete nějaké zbytečně složité dotazy i několikrát zrychlit.

Statistiky

O každé nabídce sbíráme velké množství informací, které pak potřebujeme v reálném čase vyhodnocovat, zpracovávat, agregovat atp. Je to úplně jiné použití než katalog, ale ES se nám na to osvědčil také více než dobře.

Zatímco u katalogu platí 1 index = 1 tabulka v DB, pro statistiky máme indexy postavené úplně jinak. 1 index = 1 den. A jeden dokument v tomto indexu = statistiky jedné nabídky za daný den.

Tento přístup nám umožňuje velmi snadný přístup pouze k datům, která nás zrovna zajímají. Elasticsearch také umožňuje dělat velmi snadno agregace podle libovolných parametrů a kritérií v reálném čase.

Na jaké problémy narážíme zde?

Ztráta “katalogových” informací o nabídce

Na indexy v minulosti už nešaháme (nebo tedy pouze je-li to opravdu nutné). Informace o nabídce (název, zařazení do kategorie, GPS pozice atd.) se ale můžou kdykoliv změnit. Museli bychom pak měnit zpětně i všechny záznamy. Ukládáme tedy jen věci, co se zpravidla mění jen v rámci aktuálního dne (přibývají prokliky, imprese, konverze). Ukládáme tedy pouze ID nabídky + všechny její metriky, které sledujeme. A ostatní data zahodíme. Můžeme je podle ID kdykoliv dostat z DB.

Ztráta informace o konkrétním čase (máme pouze den, ztrácíme přesnost hodin, minut a vteřin)

V ES máme pouze uloženo, kolik kterých událostí nastalo ve který den. Nevíme, kolik z daných prokliků bylo ráno a kolik večer. Pokud takováto data potřebujeme, šáhneme si pro ně do SQL DB. Ale na druhou stranu nám to umožňuje velmi rychle přistupovat k agregovaným datům za delší časové období.

Změny v historický datech

Rádi bychom historická data neměnili vůbec. Ale holt se stává, že si někdo něco objedná a objednávku následně zruší. I my tedy musíme tu a tam na nějaký historický index šáhnout a data v něm zaktualizovat.

Logy

Všechny možné skripty a requesty vytváří obrovské množství logů. Ale kdo se v nich má vyznat a něco v nich najít? Samozřejmě je zde vždy možnost pomocí cat a grep hledat v jednotlivých souborech chyby… Ale to bychom potřebovali tým lidí jen na procházení logů.

Pro automatické zpracování logů používáme elastic stack, který nám umožňuje prohledávat logy na jednom místě, nějakým způsobem textový výstup logů předzpracovat a vytvářet z nich poměrně jednoduše hezké a přehledné dashboardy a reporty.

Více jsem se o Elastic Stacku rozepsal v článku:
Jak se nezbláznit z logů? Aneb Elastic Stack ve Skrz.cz.

A co vy a ES?

K čemu a jak ho používáte? Chtěli byste se dozvědět více informací k některým ze zmíněných částí? Používáte na nějaký z popisovaných problémů jiné řešení?

Napište nám níže do komentářů nebo k příspěvku na Twitteru.

A pokud byste se chtěli zdokonalit nebo naučit práci s Elasticsearch, tak máte skvělou příležitost - hledáme nové parťáky do týmu.

--

--

DEV tým Skrz.cz

Blogují vývojáři Skrz.cz o všem, co zajímavého řeší při programování Skrz.cz / Sortado.pl (PHP, Front-end, Javascript, NodeJS, Redis, MySQL, Nginx, Elastic,..)