{"id":91438,"date":"2020-08-13T19:42:36","date_gmt":"2020-08-13T17:42:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks"},"modified":"2020-08-13T19:42:36","modified_gmt":"2020-08-13T17:42:36","slug":"effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","title":{"rendered":"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8e42c1fffffcc964eacef240ea90bbc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mivel a ClickHouse egy specializ\u00e1lt rendszer, fontos figyelembe venni az architekt\u00far\u00e1j\u00e1nak saj\u00e1toss\u00e1gait a haszn\u00e1lata sor\u00e1n. Ebben a besz\u00e1mol\u00f3ban Alexej tipikus hib\u00e1s p\u00e9ld\u00e1kr\u00f3l fog besz\u00e9lni, amelyek a ClickHouse haszn\u00e1lat\u00e1val kapcsolatosak, \u00e9s amelyek a hat\u00e9konys\u00e1g cs\u00f6kken\u00e9s\u00e9hez vezethetnek. A gyakorlat p\u00e9ld\u00e1in kereszt\u00fcl megmutatjuk, hogy az adatok feldolgoz\u00e1s\u00e1nak k\u00fcl\u00f6nb\u00f6z\u0151 s\u00e9m\u00e1i mik\u00e9nt v\u00e1ltoztathatj\u00e1k meg a teljes\u00edtm\u00e9ny m\u00e9rt\u00e9k\u00e9t.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>\u00dcdv mindenkinek! A nevem Alexej, a ClickHouse-t fejlesztem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7f5fc01663be58d3d25e518a4169b8cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>El\u0151sz\u00f6r is, \u00f6r\u00f6mmel k\u00f6zl\u00f6m, hogy ma nem fogom elmondani, mi a ClickHouse. \u0150szint\u00e9n sz\u00f3lva m\u00e1r unom ezt. Minden alkalommal elmondom, hogy mi ez. \u00c9s val\u00f3sz\u00edn\u0171leg m\u00e1r mindenki tudja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/fae6bd07d098200643d591b8e5bf51e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ehelyett arr\u00f3l fogok besz\u00e9lni, hogy milyen buktat\u00f3k vannak, azaz hogyan lehet helytelen\u00fcl haszn\u00e1lni a ClickHouse-t. Val\u00f3j\u00e1ban nem \u00e9rdemes f\u00e9lni, mert a ClickHouse-t \u00fagy fejlesztj\u00fck, mint egy egyszer\u0171, k\u00e9nyelmes rendszert, ami dobozb\u00f3l kiv\u00e9ve m\u0171k\u00f6dik. Feltelep\u00edted, \u00e9s k\u00e9sz, nincsenek probl\u00e9m\u00e1k. <\/p>\n<p><\/p>\n<p>De mindenk\u00e9ppen figyelembe kell venni, hogy ez a rendszer specializ\u00e1lt, \u00e9s k\u00f6nnyen tal\u00e1lkozhatunk szokatlan haszn\u00e1lati forgat\u00f3k\u00f6nyvekkel, amelyek a rendszert k\u00e9nyelmetlen helyzetbe hozhatj\u00e1k.<\/p>\n<p><\/p>\n<p>Teh\u00e1t, mik a buktat\u00f3k? F\u0151k\u00e9nt nyilv\u00e1nval\u00f3 dolgokr\u00f3l fogok besz\u00e9lni. Mindenkinek evidens, mindenki \u00e9rt mindent, \u00e9s \u00f6r\u00fclnek annak, hogy ilyen okosak, m\u00edg akik nem \u00e9rtik, \u00faj dolgokat tanulnak. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/bffacf353ff31b361460178e911f0e16.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az els\u0151 \u00e9s legnyilv\u00e1nval\u00f3bb p\u00e9lda, amit sajnos gyakran tapasztalunk, a sok kis batch-b\u0151l \u00e1ll\u00f3 insert, teh\u00e1t sok kis insert.<\/p>\n<p><\/p>\n<p>Ha megvizsg\u00e1ljuk, hogyan hajtja v\u00e9gre a ClickHouse az insertet, akkor egyetlen k\u00e9r\u00e9s keret\u00e9ben ak\u00e1r terab\u00e1jt adatfolyamot is k\u00fcldhetsz. Ez nem probl\u00e9ma. <\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, hogyan n\u00e9z ki a tipikus teljes\u00edtm\u00e9ny. P\u00e9ld\u00e1ul, van egy t\u00e1bl\u00e1nk a Yandex.Metrik\u00e1b\u00f3l. Tal\u00e1latok. 105 oszlopa van. 700 byte t\u00f6m\u00f6r\u00edtetlen\u00fcl. \u00c9s akkor egy milli\u00f3 sort fogunk batchenk\u00e9nt korrekt m\u00f3don besz\u00farni. <\/p>\n<p><\/p>\n<p>A MergeTree t\u00e1bl\u00e1ba t\u00f6rt\u00e9n\u0151 besz\u00far\u00e1ssal f\u00e9lmilli\u00f3 sort kapunk m\u00e1sodpercenk\u00e9nt. Remek. A replik\u00e1lt t\u00e1bl\u00e1ba \u2013 egy kicsit kevesebbet, k\u00f6r\u00fclbel\u00fcl 400 000 sort m\u00e1sodpercenk\u00e9nt. <\/p>\n<p><\/p>\n<p>Ha kv\u00f3rum besz\u00far\u00e1st haszn\u00e1lunk, az egy kicsit kevesebb lesz, de m\u00e9g mindig tisztess\u00e9ges teljes\u00edtm\u00e9ny, 250 000 sort m\u00e1sodpercenk\u00e9nt. A kv\u00f3rum besz\u00far\u00e1s egy nem dokument\u00e1lt lehet\u0151s\u00e9g a ClickHouse*-ban.<\/p>\n<p><\/p>\n<p>* 2020-as \u00e1llapot szerint, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/operations\/settings\/settings\/#settings-insert_quorum\">m\u00e1r dokument\u00e1lva van<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/668498fc82a0f6e851d05e6e1ea67033.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi fog t\u00f6rt\u00e9nni, ha rosszul csin\u00e1ljuk? Egyes\u00e9vel besz\u00farva a MergeTree t\u00e1bl\u00e1ba 59 sor m\u00e1sodpercenk\u00e9nt. Ez 10 000-szer lassabb. A ReplicatedMergeTree-n\u00e9l 6 sor m\u00e1sodpercenk\u00e9nt. Ha pedig a kv\u00f3rum is bekapcsol\u00f3dik, akkor 2 sor m\u00e1sodpercenk\u00e9nt. V\u00e9lem\u00e9nyem szerint ez egy katasztrof\u00e1lis helyzet. Hogyan lehets\u00e9ges ennyire belassulni? M\u00e9g a p\u00f3l\u00f3mon is \u00fagy van \u00edrva, hogy a ClickHouse-nak nem szabad elakadnia. De n\u00e9ha m\u00e9gis el\u0151fordul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4c771eddc4e8453f60ef91123ae5d109.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban ez a mi hib\u00e1nk. Teljesen meg tudtuk volna csin\u00e1lni, hogy minden j\u00f3l m\u0171k\u00f6dj\u00f6n, de nem tett\u00fck. \u00c9s nem tett\u00fck, mert a mi forgat\u00f3k\u00f6nyv\u00fcnkben erre nem volt sz\u00fcks\u00e9g. \u00cdgy is voltak batch-\u00fcnk. Csak bej\u00f6ttek a batch-ek, \u00e9s nem volt probl\u00e9ma. Besz\u00farjuk, \u00e9s minden rendben m\u0171k\u00f6dik. De persze k\u00fcl\u00f6nf\u00e9le forgat\u00f3k\u00f6nyvek lehets\u00e9gesek. P\u00e9ld\u00e1ul amikor rengeteg szerver van, ahol az adatok gener\u00e1l\u00f3dnak. \u00c9s ritk\u00e1bban sz\u00farnak be adatokat, de \u00edgy is gyakori besz\u00far\u00e1sok keletkeznek. Ezt valahogyan el kell ker\u00fclni. <\/p>\n<p><\/p>\n<p>Technikai szempontb\u00f3l a l\u00e9nyeg az, hogy amikor insert-et hajt v\u00e9gre a ClickHouse-ban, az adatok nem ker\u00fclnek memtable-be. N\u00e1lunk val\u00f3j\u00e1ban nincs val\u00f3s log structure MergeTree, hanem egyszer\u0171en MergeTree, mert nincs sem log, sem memTable. Az adatokat k\u00f6zvetlen\u00fcl a f\u00e1jlrendszerbe \u00edrjuk, m\u00e1r oszlopok szerint rendezve. Ha 100 oszlop van, akkor t\u00f6bb mint 200 f\u00e1jlt kell majd \u00edrni egy k\u00fcl\u00f6n k\u00f6nyvt\u00e1rba. Ez az eg\u00e9sz meglehet\u0151sen terjedelmes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/24688fe3d39d81b92f12ac1b8b21425b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s felmer\u00fcl a k\u00e9rd\u00e9s: \"Hogyan kell helyesen csin\u00e1lni?\", ha olyan helyzet \u00e1ll el\u0151, hogy mindenk\u00e9ppen valahogyan adatokat kell \u00edrni a ClickHouse-ba.<\/p>\n<p><\/p>\n<p>1. m\u00f3dszer. Ez a legegyszer\u0171bb m\u00f3d. Haszn\u00e1ljon valamilyen elosztott \u00fczenetsorozatot. P\u00e9ld\u00e1ul Kafka. Csak kiemeli az adatokat a Kafk\u00e1b\u00f3l, batch-eli m\u00e1sodpercenk\u00e9nt. \u00c9s minden rendben lesz, \u00edrja be, minden j\u00f3l m\u0171k\u00f6dik. <\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1nyok az, hogy a Kafka egy \u00fajabb terjedelmes elosztott rendszer. M\u00e9g \u00e9rtem, ha a c\u00e9g\u00e9ben m\u00e1r van Kafka. Ez j\u00f3, ez k\u00e9nyelmes. De ha nincs, akkor \u00e9rdemes h\u00e1romszor is megfontolni, miel\u0151tt m\u00e9g egy elosztott rendszert hozna a projektj\u00e9be. \u00cdgy alternat\u00edv\u00e1kat kell keresni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4f687221e8c7443abf02fb002c4eba5b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f3dszer 2. Itt van egy r\u00e9gi iskola alternat\u00edva, ami nagyon egyszer\u0171. Van egy szervered, ami gener\u00e1lja a napl\u00f3idat. Ez egyszer\u0171en ki\u00edrja a napl\u00f3idat egy f\u00e1jlba. \u00c9s m\u00e1sodpercenk\u00e9nt, p\u00e9ld\u00e1ul \u00e1tnevezz\u00fck ezt a f\u00e1jlt, \u00e9s \u00faj f\u00e1jlt nyitunk. Egy k\u00fcl\u00f6n szkript vagy cron, vagy valamilyen daemon pedig elviszi a leg\u00f6regebb f\u00e1jlt, \u00e9s be\u00edrja a ClickHouse-ba. Ha a napl\u00f3kat m\u00e1sodpercenk\u00e9nt \u00edrjuk, akkor minden j\u00f3l fog m\u0171k\u00f6dni. <\/p>\n<p><\/p>\n<p>De ennek a m\u00f3dszernek a h\u00e1tr\u00e1nya, hogy ha a szervered, ahol a napl\u00f3kat gener\u00e1lj\u00e1k, elt\u0171nik, akkor az adatok is elt\u0171nnek.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b4c28b6df87386c42b6908bdfccb6b90.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f3dszer 3. Van m\u00e9g egy \u00e9rdekes m\u00f3dszer, ami teljesen id\u0151szakos f\u00e1jlok n\u00e9lk\u00fcl m\u0171k\u00f6dik. P\u00e9ld\u00e1ul van egy rekl\u00e1mforgat\u00f3 vagy valamilyen \u00e9rdekes daemon, ami adatokat gener\u00e1l. \u00c9s te egy csom\u00f3 adatot felhalmozhatsz k\u00f6zvetlen\u00fcl a mem\u00f3ri\u00e1ban, a bufferben. Amikor elegend\u0151 id\u0151 telik el, ezt a buffert f\u00e9lreteszed, \u00fajat hozol l\u00e9tre, \u00e9s egy k\u00fcl\u00f6n sz\u00e1lban az \u00f6sszegy\u0171lt adatokat be\u00edrod a ClickHouse-ba.<\/p>\n<p><\/p>\n<p>M\u00e1sr\u00e9szr\u0151l viszont az adatok a kill -9 parancs alatt is elt\u0171nnek. Ha a szervered le\u00e1ll, akkor ezeket az adatokat elvesz\u00edted. Egy m\u00e1sik probl\u00e9ma pedig az, hogy ha nem tudt\u00e1l be\u00edrni az adatb\u00e1zisba, akkor az adatok felhalmoz\u00f3dnak a mem\u00f3ri\u00e1ban. \u00c9s vagy elfogy a mem\u00f3ria, vagy egyszer\u0171en elvesz\u00edted az adatokat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/dc375b22fcb26cfa111d0bdb4563aa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f3dszer 4. Van egy m\u00e1sik \u00e9rdekes m\u00f3dszer. Van egy szerveroldali folyamatod. \u00c9s ez a folyamat azonnal k\u00fcldhet adatokat a ClickHouse-ba, de ezt egyetlen kapcsolatban kell megtennie. P\u00e9ld\u00e1ul HTTP-k\u00e9r\u00e9st k\u00fcld\u00f6tt transfer-encoding: chunked-tel egy insert-tel. \u00c9s a darabokat m\u00e1r nem t\u00fal ritk\u00e1n gener\u00e1lja, lehet, hogy minden egyes sort elk\u00fcld, b\u00e1r ez t\u00falterhel\u00e9st jelent az adatok keretez\u00e9s\u00e9n\u00e9l. <\/p>\n<p><\/p>\n<p>De ennek ellen\u00e9re ebben az esetben az adatok azonnal el lesznek k\u00fcldve a ClickHouse-ba. \u00c9s a ClickHouse mag\u00e1t\u00f3l fogja ezeket a bufferelni. <\/p>\n<p><\/p>\n<p>De ez is probl\u00e9m\u00e1kat okoz. Most elvesz\u00edtheted az adatokat, k\u00fcl\u00f6n\u00f6sen, ha a folyamatod meg\u00f6l\u0151dik, \u00e9s ha a ClickHouse folyamata meg\u00f6l\u0151dik, mert ez egy befejezetlen insert lesz. A ClickHouse-ban az insert-ek atomikusak egy bizonyos sormennyis\u00e9gig. Elvileg ez egy \u00e9rdekes m\u00f3dszer. Ezt is lehet haszn\u00e1lni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6a18a974b9600ade377a870390e95d3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>5. m\u00f3dszer. Itt van m\u00e9g egy \u00e9rdekes m\u00f3dszer. Ez egy k\u00f6z\u00f6ss\u00e9g \u00e1ltal fejlesztett szerver az adatok batch-eltet\u00e9s\u00e9hez. \u00c9n magam nem n\u00e9ztem meg, ez\u00e9rt semmit sem tudok garant\u00e1lni. Azonban a ClickHouse eset\u00e9ben sem adnak garanci\u00e1t. Ez is ny\u00edlt forr\u00e1sk\u00f3d\u00fa, de m\u00e1sr\u00e9szt lehet, hogy megszoktad a min\u0151s\u00e9gi standardokat, amelyeket megpr\u00f3b\u00e1lunk biztos\u00edtani. Ezzel kapcsolatban viszont nem tudom, n\u00e9zz ut\u00e1na a GitHub-on, n\u00e9zd meg a k\u00f3dot. Tal\u00e1n \u00edrtak valamit norm\u00e1lisat. <\/p>\n<p><\/p>\n<p>* 2020-as \u00e1llapot szerint, azt is \u00e9rdemes megfontolni <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/vk\/blog\/430168\/\">KittenHouse<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae6a04af63ae4e7fa160c002fdb6d506.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>6. m\u00f3dszer. Egy m\u00e1sik m\u00f3dszer a Buffer t\u00e1bl\u00e1k haszn\u00e1lata. Ennek a m\u00f3dszernek az el\u0151nye, hogy nagyon egyszer\u0171 elkezdeni. L\u00e9trehozol egy Buffer t\u00e1bl\u00e1t, \u00e9s beilleszted az adatokat. <\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1nya viszont az, hogy a probl\u00e9ma nem old\u00f3dik meg teljesen. Ha az inser\u00e1l\u00e1s MergeTree t\u00edpus\u00fa, akkor egy m\u00e1sodperc alatt egy batch-re kell csoportos\u00edtanod az adatokat, de Buffer t\u00e1bl\u00e1ba val\u00f3 beilleszt\u00e9skor legal\u00e1bb t\u00f6bb ezerre kell csoportos\u00edtanod m\u00e1sodpercenk\u00e9nt. Ha ez meghaladja a 10 000-et m\u00e1sodpercenk\u00e9nt, akkor az is rossz. Ha pedig batch-k\u00e9nt illesztesz, akkor azt l\u00e1ttad, hogy ott sz\u00e1zas ezrek sor van m\u00e1sodpercenk\u00e9nt. \u00c9s ez m\u00e1r el\u00e9g neh\u00e9z adatokkal. <\/p>\n<p><\/p>\n<p>A Buffer t\u00e1bl\u00e1k nem rendelkeznek loggal sem. Ha valami gond van a szervereddel, akkor az adatok el fognak veszni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/9bb16bf5e8145cc8368b11e54c86c837.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s b\u00f3nuszk\u00e9nt nemr\u00e9giben a ClickHouse-ban megjelent a lehet\u0151s\u00e9g, hogy adatokat nyerj\u00fcnk ki a Kafka-b\u00f3l. Van egy Kafka nev\u0171 t\u00e1blag\u00e9pk\u00e9nt ismert motor. Csak l\u00e9trehozod, \u00e9s anyagolt n\u00e9zeteket is lehet hozz\u00e1 csatolni. Ebben az esetben automatikusan kivonja az adatokat a Kafka-b\u00f3l, \u00e9s besz\u00farja a k\u00edv\u00e1nt t\u00e1bl\u00e1kba. <\/p>\n<p><\/p>\n<p>\u00c9s k\u00fcl\u00f6n\u00f6sen \u00f6rvendetes ebben a lehet\u0151s\u00e9gben, hogy ezt nem mi csin\u00e1ltuk. Ez egy k\u00f6z\u00f6ss\u00e9gi funkci\u00f3. Amikor azt mondom, hogy \"k\u00f6z\u00f6ss\u00e9gi funkci\u00f3\", erre semmif\u00e9le megvet\u00e9ssel nem utalok. A k\u00f3dot \u00e1tn\u00e9zt\u00fck, a fel\u00fclvizsg\u00e1latokat elv\u00e9gezt\u00fck, norm\u00e1lisan kell m\u0171k\u00f6dnie. <\/p>\n<p><\/p>\n<p>* 2020-as \u00e1llapot szerint, hasonl\u00f3 t\u00e1mogat\u00e1s jelent meg <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/engines\/table-engines\/integrations\/rabbitmq\/\">RabbitMQ<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15dc61dfd435f5f8640395b7de480fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milyen m\u00e1s k\u00e9nyelmetlens\u00e9gek vagy v\u00e1ratlan dolgok mer\u00fclhetnek fel az adatok besz\u00far\u00e1sakor? Ha insert values k\u00e9r\u00e9st v\u00e9gzel, \u00e9s a values-ban valamilyen sz\u00e1m\u00edtott kifejez\u00e9s tal\u00e1lhat\u00f3. P\u00e9ld\u00e1ul a now() is egy sz\u00e1m\u00edtott kifejez\u00e9s. Ilyen esetben a ClickHouse-nak minden egyes sorra el kell ind\u00edtania ezen kifejez\u00e9sek \u00e9rtelmez\u0151j\u00e9t, \u00e9s a teljes\u00edtm\u00e9ny jelent\u0151sen cs\u00f6kken. Jobb ezt elker\u00fclni.<\/p>\n<p><\/p>\n<p>* Jelenleg a probl\u00e9m\u00e1t teljesen megoldott\u00e1k, a teljes\u00edtm\u00e9ny visszaes\u00e9se a VALUES kifejez\u00e9sek haszn\u00e1latakor m\u00e1r nincs.<\/p>\n<p><\/p>\n<p>Egy m\u00e1sik p\u00e9lda, amikor probl\u00e9m\u00e1k mer\u00fclhetnek fel, ha egy batch-ben az adatok sz\u00e1mos part\u00edci\u00f3hoz tartoznak. Alap\u00e9rtelmez\u00e9s szerint a ClickHouse-ban a part\u00edci\u00f3k h\u00f3napokra vannak osztva. Ha egy milli\u00f3 soros batch-t sz\u00farsz be, \u00e9s azok t\u00f6bb \u00e9vnyi adatot tartalmaznak, akkor t\u00f6bb tucat part\u00edci\u00f3d lesz. Ez azt jelenti, hogy a batch-ek t\u00f6bb tucat m\u00e9rettel kisebbek lesznek, mert bel\u00fcl mindig el\u0151sz\u00f6r a part\u00edci\u00f3k szerint oszt\u00f3dnak.<\/p>\n<p><\/p>\n<p>* Nemr\u00e9giben a ClickHouse-ban k\u00eds\u00e9rleti m\u00f3dban bevezett\u00e9k a szegmensek \u00e9s a mem\u00f3riaalap\u00fa szegmensek t\u00f6m\u00f6r\u00edtett form\u00e1tum\u00e1nak t\u00e1mogat\u00e1s\u00e1t write-ahead log-gal, ami szinte teljesen megoldja a probl\u00e9m\u00e1t.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b8c6cecdba53559dad31ed11713a980d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most n\u00e9zz\u00fck meg a probl\u00e9m\u00e1k m\u00e1sodik t\u00edpus\u00e1t \u2013 az adatok t\u00edpus\u00e1t. <\/p>\n<p><\/p>\n<p>Az adatok t\u00edpusa lehet szigor\u00fa, vagy karakterl\u00e1nc. A karakterl\u00e1nc az, amikor egyszer\u0171en csak bejelented, hogy minden mez\u0151d string t\u00edpus\u00fa. Ez pocs\u00e9k. Ezt nem szabad csin\u00e1lni. <\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, hogyan lehet helyesen csin\u00e1lni olyan esetekben, amikor szeretn\u00e9nk mondani, hogy egy mez\u0151nk karakterl\u00e1nc, \u00e9s hagyjuk, hogy a ClickHouse maga megoldja, \u00e9n nem akarok ezzel foglalkozni. De mindenk\u00e9ppen \u00e9rdemes n\u00e9mi er\u0151fesz\u00edt\u00e9st tenni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a0fdcf6423933293318411242fe2ede7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul van egy IP-c\u00edm\u00fcnk. Az egyik esetben string-k\u00e9nt t\u00e1roltuk, p\u00e9ld\u00e1ul 192.168.1.1. A m\u00e1sik esetben pedig UInt32* t\u00edpus\u00fa sz\u00e1m lesz. A 32 bit elegend\u0151 az IPv4 c\u00edmekhez.<\/p>\n<p><\/p>\n<p>El\u0151sz\u00f6r is, nem meglep\u0151 m\u00f3don, az adatok k\u00f6r\u00fclbel\u00fcl azonos m\u00e9rt\u00e9kben t\u00f6m\u00f6r\u00fclnek. Lesz k\u00fcl\u00f6nbs\u00e9g, persze, de nem t\u00fal nagy. Teh\u00e1t a lemez be- \u00e9s kimenet\u00e9vel nem lesznek k\u00fcl\u00f6n\u00f6sebb probl\u00e9m\u00e1k. <\/p>\n<p><\/p>\n<p>De jelent\u0151s k\u00fcl\u00f6nbs\u00e9g van a processzorteljes\u00edtm\u00e9ny \u00e9s a lek\u00e9rdez\u00e9s v\u00e9grehajt\u00e1si ideje k\u00f6z\u00f6tt. <\/p>\n<p><\/p>\n<p>Sz\u00e1m\u00edtsuk ki az egyedi IP-c\u00edmek sz\u00e1m\u00e1t, ha sz\u00e1mok form\u00e1j\u00e1ban t\u00e1roljuk \u0151ket. Ez 137 milli\u00f3 sort jelent m\u00e1sodpercenk\u00e9nt. Ugyanez stringek form\u00e1j\u00e1ban 37 milli\u00f3 sor m\u00e1sodpercenk\u00e9nt. Nem tudom, mi\u00e9rt j\u00f6tt ki ilyen egyez\u00e9s. \u00c9n magam hajtottam v\u00e9gre ezeket a lek\u00e9rdez\u00e9seket. De mindenesetre k\u00f6r\u00fclbel\u00fcl 4-szer lassabb. <\/p>\n<p><\/p>\n<p>Ha pedig a lemezhely k\u00fcl\u00f6nbs\u00e9g\u00e9t n\u00e9zz\u00fck, akkor ott is van elt\u00e9r\u00e9s. A k\u00fcl\u00f6nbs\u00e9g k\u00f6r\u00fclbel\u00fcl egynegyed, mert el\u00e9g sok egyedi IP-c\u00edm van. \u00c9s ha itt olyan sorok lenn\u00e9nek, amelyekben kev\u00e9s k\u00fcl\u00f6nb\u00f6z\u0151 \u00e9rt\u00e9k tal\u00e1lhat\u00f3, akkor azok nyugodtan t\u00f6m\u00f6r\u00fclhettek volna sz\u00f3t\u00e1r form\u00e1j\u00e1ban, k\u00f6r\u00fclbel\u00fcl azonos m\u00e9retre. <\/p>\n<p><\/p>\n<p>\u00c9s a n\u00e9gyes id\u0151eltol\u00f3d\u00e1s az \u00faton nem t\u0171nik el. Tal\u00e1n \u00f6nnek ez nem sz\u00e1m\u00edt, de amikor ilyen k\u00fcl\u00f6nbs\u00e9get l\u00e1tok, szomor\u00fa leszek.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f74dbfdab5a9e26fa044a5870a8cc00d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg a k\u00fcl\u00f6nb\u00f6z\u0151 eseteket. <\/p>\n<p><\/p>\n<p>1. Egy eset, amikor csak n\u00e9h\u00e1ny k\u00fcl\u00f6nb\u00f6z\u0151 egyedi \u00e9rt\u00e9ke van. Ebben az esetben egy egyszer\u0171 gyakorlatot alkalmazunk, amit val\u00f3sz\u00edn\u0171leg ismer \u00e9s b\u00e1rhol haszn\u00e1lhat b\u00e1rmilyen adatb\u00e1zis-kezel\u0151 rendszerben. Ez nem csak a ClickHouse-ra vonatkozik. Egyszer\u0171en be\u00edrja a sz\u00e1mokat az adatb\u00e1zisba. A karakterl\u00e1ncokra t\u00f6rt\u00e9n\u0151 konvert\u00e1l\u00e1s m\u00e1r a saj\u00e1t alkalmaz\u00e1s\u00e1nak oldal\u00e1n t\u00f6rt\u00e9nhet. <\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul, van egy r\u00e9gi\u00f3ja. \u00c9s megpr\u00f3b\u00e1lja karakterl\u00e1nck\u00e9nt t\u00e1rolni. Azt fogja r\u00f3la \u00edrni: Moszkva \u00e9s MO. Amikor azt l\u00e1tom, hogy \u00abMoszkva\u00bb, az m\u00e9g semmi, de amikor m\u00e1r MO is, akkor valahogy nagyon szomor\u00fa leszek. Mennyi b\u00e1jt ez m\u00e1r. <\/p>\n<p><\/p>\n<p>Ehelyett egyszer\u0171en elt\u00e1rolunk egy Ulnt32 sz\u00e1mot \u00e9s 250-et. N\u00e1lunk 250 tal\u00e1lhat\u00f3 a Yandexban, de \u00f6nn\u00e9l tal\u00e1n m\u00e1s. Egy kis el\u0151vigy\u00e1zatoss\u00e1gk\u00e9nt elmondom, hogy a ClickHouse-ban van be\u00e9p\u00edtett lehet\u0151s\u00e9g a geoadatb\u00e1zisok kezel\u00e9s\u00e9re. Csak be\u00edrja a r\u00e9gi\u00f3kat, bele\u00e9rtve a hierarchikusakat is, teh\u00e1t ott lesz Moszkva, MO, \u00e9s minden, amire sz\u00fcks\u00e9ge van. A lek\u00e9rdez\u00e9s szintj\u00e9n konvert\u00e1lhat\u00f3. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/cc6e871136dab8f8a35246a5af512cda.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A m\u00e1sodik megold\u00e1s k\u00f6r\u00fclbel\u00fcl hasonl\u00f3, de m\u00e1r a ClickHouse-on bel\u00fcli t\u00e1mogat\u00e1ssal rendelkezik. Ez az Enum adatt\u00edpus. Egyszer\u0171en felsorolja az \u00f6sszes sz\u00fcks\u00e9ges \u00e9rt\u00e9ket az Enum-on bel\u00fcl. P\u00e9ld\u00e1ul az eszk\u00f6z t\u00edpusa, \u00e9s ott van: asztali, mobil, tablet, t\u00e9v\u00e9. \u00d6sszesen 4 v\u00e1ltozat. <\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1ny az, hogy id\u0151nk\u00e9nt m\u00f3dos\u00edtani kell. Csak egy \u00faj opci\u00f3t adtunk hozz\u00e1. M\u00f3dos\u00edtsa a t\u00e1bl\u00e1t. Val\u00f3j\u00e1ban a ClickHouse-ban a t\u00e1bla m\u00f3dos\u00edt\u00e1sa ingyenes. K\u00fcl\u00f6n\u00f6sen ingyenes az Enum eset\u00e9ben, mert az adatok a lemezen nem v\u00e1ltoznak. Ennek ellen\u00e9re a m\u00f3dos\u00edt\u00e1s z\u00e1rolja a t\u00e1bl\u00e1t \u00e9s v\u00e1rnia kell, am\u00edg minden SELECT v\u00e9grehajt\u00f3dik. Csak ezut\u00e1n hajt\u00f3dik v\u00e9gre a m\u00f3dos\u00edt\u00e1s, teh\u00e1t l\u00e9nyeg\u00e9ben bizonyos kellemetlens\u00e9gek vannak.<\/p>\n<p><\/p>\n<p>* Az \u00fajabb ClickHouse verzi\u00f3kban az ALTER teljesen blokkol\u00e1smentes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7284fa5be583ab063bb6de0b60f54d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00e9g egy meglehet\u0151sen egyedi megold\u00e1s a ClickHouse sz\u00e1m\u00e1ra \u2013 k\u00fcls\u0151 sz\u00f3t\u00e1rak csatlakoztat\u00e1sa. \u00cdrhat sz\u00e1mokat a ClickHouse-ba, m\u00edg az \u00d6n sz\u00f3t\u00e1rai b\u00e1rmilyen k\u00e9nyelmes rendszerben t\u00e1rolhat\u00f3k. P\u00e9ld\u00e1ul haszn\u00e1lhat: MySQL, Mongo, Postgres. M\u00e9g egy saj\u00e1t mikroszolg\u00e1ltat\u00e1st is l\u00e9trehozhat, amely http-n kereszt\u00fcl adja vissza ezeket az adatokat. A ClickHouse szintj\u00e9n egy funkci\u00f3t \u00edr, amely \u00e1talak\u00edtja ezeket az adatokat sz\u00e1mokb\u00f3l karakterl\u00e1ncokk\u00e1. <\/p>\n<p><\/p>\n<p>Ez egy specializ\u00e1lt, de nagyon hat\u00e9kony m\u00f3dja annak, hogy csatlakoztassunk egy k\u00fcls\u0151 t\u00e1bl\u00e1zathoz. R\u00e1ad\u00e1sul k\u00e9t lehet\u0151s\u00e9g van. Az egyik lehet\u0151s\u00e9g, hogy ezek az adatok teljesen gyors\u00edt\u00f3t\u00e1razva vannak, teljes m\u00e9rt\u00e9kben a mem\u00f3ri\u00e1ban \u00e9s egy bizonyos id\u0151k\u00f6z\u00f6nk\u00e9nt friss\u00fclnek. A m\u00e1sik lehet\u0151s\u00e9g, ha ezek az adatok nem f\u00e9rnek el a mem\u00f3ri\u00e1ban, akkor r\u00e9szlegesen lehet \u0151ket gyors\u00edt\u00f3t\u00e1razni. <\/p>\n<p><\/p>\n<p>Itt egy p\u00e9lda. Van a Yandex.Direct. Ott van egy rekl\u00e1mkamp\u00e1ny \u00e9s bannerek. A rekl\u00e1mkamp\u00e1nyokb\u00f3l val\u00f3sz\u00edn\u0171leg k\u00f6r\u00fclbel\u00fcl t\u00edzmilli\u00f3 van. Ezek elt\u00e1rolhat\u00f3k a mem\u00f3ri\u00e1ban. A bannerekb\u0151l viszont milli\u00e1rdok vannak, ezek nem f\u00e9rnek el. \u00c9s haszn\u00e1lunk egy gyors\u00edt\u00f3t\u00e1razott sz\u00f3t\u00e1rt a MySQL-b\u0151l.<\/p>\n<p><\/p>\n<p>Az egyetlen probl\u00e9ma az, hogy a gyors\u00edt\u00f3t\u00e1razott sz\u00f3t\u00e1r csak akkor m\u0171k\u00f6dik j\u00f3l, ha a tal\u00e1lati ar\u00e1ny k\u00f6zel 100%-os. Ha enn\u00e9l alacsonyabb, akkor minden adatcsomag feldolgoz\u00e1sakor val\u00f3s\u00e1ggal kell beszerezni a hi\u00e1nyz\u00f3 kulcsokat \u00e9s adatokat kell k\u00e9rni a MySQL-b\u00f3l. A ClickHouse-ra m\u00e9g azt mondhatom, hogy igen, nem lassul le, m\u00e1s rendszerekr\u0151l nem besz\u00e9ln\u00e9k.<\/p>\n<p><\/p>\n<p>B\u00f3nuszk\u00e9nt az is el\u0151ny, hogy a sz\u00f3t\u00e1rak nagyon egyszer\u0171 m\u00f3dot k\u00edn\u00e1lnak az adatok friss\u00edt\u00e9s\u00e9re a ClickHouse-ban a m\u00faltban. Teh\u00e1t ha volt egy jelent\u00e9se a rekl\u00e1mkamp\u00e1nyokr\u00f3l, a felhaszn\u00e1l\u00f3 egyszer\u0171en megv\u00e1ltoztatja a rekl\u00e1mkamp\u00e1nyt, \u00e9s az \u00f6sszes r\u00e9gi adatban, az \u00f6sszes jelent\u00e9sben ezek az adatok szint\u00e9n megv\u00e1ltoznak. Ha k\u00f6zvetlen\u00fcl a t\u00e1bl\u00e1zatba \u00edrunk sorokat, akkor friss\u00edteni \u0151ket lehetetlen lesz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a5a2919d6be7d00c0ad5875b9a8f0f31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00e9g egy m\u00f3dja van, amikor nem tudja, honnan szerezzen azonos\u00edt\u00f3kat a soraidhoz. Egyszer\u0171en csak hash-elheti \u0151ket. R\u00e1ad\u00e1sul a legegyszer\u0171bb megold\u00e1s, ha egy 64 bites hash-t haszn\u00e1l. <\/p>\n<p><\/p>\n<p>Az egyetlen probl\u00e9ma az, hogy ha a hash 64 bites, akkor \u00fctk\u00f6z\u00e9sek szinte biztosan el\u0151 fognak fordulni. Mert ha milli\u00e1rd sor van, a val\u00f3sz\u00edn\u0171s\u00e9g m\u00e1r \u00e9rezhet\u0151v\u00e9 v\u00e1lik. <\/p>\n<p><\/p>\n<p>\u00c9s nem lenne t\u00fal j\u00f3 \u00edgy hash-elni a rekl\u00e1mkamp\u00e1nyok nev\u00e9t. Ha a rekl\u00e1mkamp\u00e1nyok k\u00fcl\u00f6nb\u00f6z\u0151 c\u00e9gekn\u00e9l \u00f6sszezavarodnak, akkor valami \u00e9rthetetlen dolog fog kis\u00fclni. <\/p>\n<p><\/p>\n<p>\u00c9s van egy egyszer\u0171 tr\u00fckk. Igaz, a komoly adatokhoz nem nagyon megfelel\u0151, de ha valami nem annyira komoly, akkor egyszer\u0171en csak adjunk hozz\u00e1 a sz\u00f3t\u00e1r kulcs\u00e1hoz egy \u00fcgyf\u00e9l azonos\u00edt\u00f3t. \u00c9s akkor \u00fctk\u00f6z\u00e9sek lesznek, de csak egy \u00fcgyf\u00e9l keretein bel\u00fcl. Ilyen m\u00f3dszert haszn\u00e1lunk a hivatkoz\u00e1sok t\u00e9rk\u00e9p\u00e9n a Yandex.Metrik\u00e1ban. Ott vannak url-ek, t\u00e1roljuk a hash-eket. \u00c9s tudjuk, hogy term\u00e9szetesen l\u00e9teznek \u00fctk\u00f6z\u00e9sek. De amikor a lap megjelenik, akkor a val\u00f3sz\u00edn\u0171s\u00e9ge annak, hogy egy lapon bel\u00fcl egy felhaszn\u00e1l\u00f3n\u00e1l valamilyen url-\u00f6k \u00f6sszekapcsol\u00f3dnak \u00e9s ezt m\u00e9g \u00e9szre is veszik, elhanyagolhat\u00f3. <\/p>\n<p><\/p>\n<p>B\u00f3nuszk\u00e9nt - sok m\u0171velethez elegend\u0151 csak a hashek, \u00e9s magukat a sz\u00f6vegeket nem is sz\u00fcks\u00e9ges t\u00e1rolni sehol. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/abbb73aaba29d10e3b7e7650bf68e6a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy m\u00e1sik p\u00e9lda, ha a sz\u00f6vegek r\u00f6videk, p\u00e9ld\u00e1ul a weboldalak domainjei. Azokat t\u00e1rolhatjuk \u00fagy, ahogy vannak. Vagy p\u00e9ld\u00e1ul, ha a b\u00f6ng\u00e9sz\u0151 nyelve ru - 2 b\u00e1jt. Persze nagyon sajn\u00e1lom a kis b\u00e1jtokat, de ne agg\u00f3djon, a 2 b\u00e1jt nem vesztes\u00e9g. K\u00e9rem, t\u00e1rolja azokat \u00edgy, ne bonyol\u00edtsa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/901eaed0029da6ea59630b57ccf80c25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00e1s helyzet, amikor \u00e9ppen ellenkez\u0151leg, nagyon sok sor van, \u00e9s azokban sok egyedi is, s\u0151t a potenci\u00e1lisan nem korl\u00e1tozott mennyis\u00e9g. A tipikus p\u00e9lda - keres\u00e9si kifejez\u00e9sek vagy url-ek. Keres\u00e9si kifejez\u00e9sek, bele\u00e9rtve a g\u00e9pel\u00e9si hib\u00e1kat is. N\u00e9zz\u00fck meg, h\u00e1ny egyedi keres\u00e9si kifejez\u00e9s van naponta. \u00c9s kider\u00fcl, hogy ez szinte a fele az \u00f6sszes esem\u00e9nynek. \u00c9s ebben az esetben gondolkodhatna rajta, hogy az adatokat normaliz\u00e1lni kellene, azonos\u00edt\u00f3kat sz\u00e1molni, \u00e9s k\u00fcl\u00f6n t\u00e1bl\u00e1zatba gy\u0171jteni. De ezt nem szabad csin\u00e1lni. Egyszer\u0171en t\u00e1rolja ezeket a sorokat \u00fagy, ahogy vannak. <\/p>\n<p><\/p>\n<p>Jobb - ne tal\u00e1ljon ki semmit, mert ha k\u00fcl\u00f6n t\u00e1rolja, akkor join-t kell csin\u00e1lni. \u00c9s ez a join - a legjobban esetben v\u00e9letlenszer\u0171 mem\u00f3ria hozz\u00e1f\u00e9r\u00e9st jelent, ha m\u00e9g a mem\u00f3ria is elf\u00e9r. Ha nem f\u00e9r el, akkor teljesen probl\u00e9m\u00e1k lesznek. <\/p>\n<p><\/p>\n<p>Ha az adatok in place t\u00e1rol\u00f3dnak, akkor csak a megfelel\u0151 sorrendben olvass\u00e1k be a f\u00e1jlrendszerb\u0151l, \u00e9s minden rendben van.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15f1d632083def16ccbc939579c1cf6b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha url-jei vagy b\u00e1rmilyen m\u00e1s bonyolult hossz\u00fa sz\u00f6vege van, akkor \u00e9rdemes elgondolkodnia azon, hogy el\u0151re sz\u00e1molhatna valamilyen kivonatot, \u00e9s k\u00fcl\u00f6n oszlopba r\u00f6gz\u00edthetn\u00e9. <\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul url-ek eset\u00e9n a domain-t k\u00fcl\u00f6n t\u00e1rolhatja. \u00c9s ha val\u00f3ban sz\u00fcks\u00e9ge van a domainekre, akkor egyszer\u0171en haszn\u00e1lja ezt az oszlopot, m\u00edg az url-ek \u00e1llni fognak, \u00e9s nem is fog hozz\u00e1juk ny\u00falni. <\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, mekkora a k\u00fcl\u00f6nbs\u00e9g. A ClickHouse-ban van egy speci\u00e1lis f\u00fcggv\u00e9ny, amely az domain-t sz\u00e1molja. Nagyon gyors, optimaliz\u00e1ltuk. \u00c9s \u0151szint\u00e9n sz\u00f3lva, m\u00e9g az RFC-nek sem felel meg, de m\u00e9gis mindent sz\u00e1mol, amire sz\u00fcks\u00e9g\u00fcnk van. <\/p>\n<p><\/p>\n<p>Az egyik esetben egyszer\u0171en csak az URL-eket fogjuk kinyerni \u00e9s az domain-t sz\u00e1molni. Ez 166 milliszekundumot vesz ig\u00e9nybe. Ha viszont a m\u00e1r megl\u00e9v\u0151 domain-t vessz\u00fck, akkor csak 67 milliszekundumot jelent, ami majdnem h\u00e1romszor gyorsabb. Ez az\u00e9rt van, mert nem kell sz\u00e1m\u00edt\u00e1sokat v\u00e9gezni, hanem kevesebb adatot olvasunk. <\/p>\n<p><\/p>\n<p>Valami\u00e9rt egy lassabb lek\u00e9rdez\u00e9sn\u00e9l a m\u00e1sodpercenk\u00e9nti gigab\u00e1jt sebess\u00e9g magasabb. Mert t\u00f6bb gigab\u00e1jtot olvas. Ezek teljesen felesleges adatok. A lek\u00e9rdez\u00e9s gyorsabban m\u0171k\u00f6dik, de hosszabb ideig tart a v\u00e9grehajt\u00e1sa.<\/p>\n<p><\/p>\n<p>Ha megn\u00e9zz\u00fck a lemezre \u00edrt adatokat, akkor az URL 126 megab\u00e1jtot, m\u00edg a domain csak 5 megab\u00e1jtot foglal el. Ez 25-sz\u00f6r kevesebb. De ennek ellen\u00e9re a lek\u00e9rdez\u00e9s csak 4-szer gyorsabb. De ez az\u00e9rt van, mert az adatok forr\u00f3k. Ha hidegek lenn\u00e9nek, akkor val\u00f3sz\u00edn\u0171leg 25-sz\u00f6r gyorsabb lenne a lemez I\/O miatt. <\/p>\n<p><\/p>\n<p>Egy\u00e9bk\u00e9nt, ha megn\u00e9zz\u00fck, mennyivel kisebb a domain, mint az URL, akkor 4-szerese. De valami\u00e9rt a lemezen az adatok 25-sz\u00f6r kevesebb helyet foglalnak. Mi\u00e9rt? A t\u00f6m\u00f6r\u00edt\u00e9s miatt. Az URL t\u00f6m\u00f6r\u00fcl, \u00e9s a domain is. De gyakran az URL tele van szem\u00e9ttel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/c93d2128a41561ed7abb25d77414bc2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Term\u00e9szetesen fontos a megfelel\u0151 adat t\u00edpusok haszn\u00e1lata, amelyek kifejezetten a sz\u00fcks\u00e9ges \u00e9rt\u00e9kekhez k\u00e9sz\u00fcltek, vagy amelyek megfelelnek. Ha IPv4-r\u0151l van sz\u00f3, akkor t\u00e1rolj UInt32*-t. Ha IPv6, akkor FixedString(16), mert az IPv6 c\u00edm 128 bit, teh\u00e1t k\u00f6zvetlen\u00fcl bin\u00e1ris form\u00e1tumban t\u00e1rold. <\/p>\n<p><\/p>\n<p>Mi a teend\u0151, ha n\u00e9ha IPv4 c\u00edmek, n\u00e9ha pedig IPv6 c\u00edmek vannak? Igen, t\u00e1rolhatod mindkett\u0151t. Egy oszlop az IPv4-nek, m\u00e1sik az IPv6-nak. Persze van lehet\u0151s\u00e9g az IPv4-et IPv6-ra \u00e1tt\u00e9rni. Ez is m\u0171k\u00f6dni fog, de ha a lek\u00e9rdez\u00e9sekben gyakran van sz\u00fcks\u00e9ged kifejezetten az IPv4 c\u00edmre, akkor j\u00f3 lenne k\u00fcl\u00f6n oszlopba tenni. <\/p>\n<p><\/p>\n<p>* most m\u00e1r a ClickHouse-ban k\u00fcl\u00f6n adatszerkezetek vannak az IPv4 \u00e9s IPv6 sz\u00e1m\u00e1ra, amelyek ugyanolyan hat\u00e9konyan t\u00e1rolj\u00e1k az adatokat, mint a sz\u00e1mok, de olyan k\u00e9nyelmesen mutatj\u00e1k be \u0151ket, mint a karakterl\u00e1ncok.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7d6342ebd6b8b4f3526b3cd8a06cf26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fontos megeml\u00edteni, hogy az adatokat el\u0151re \u00e9rdemes el\u0151k\u00e9sz\u00edteni. P\u00e9ld\u00e1ul, ha nyers napl\u00f3k \u00e9rkeznek hozz\u00e1d, lehet, hogy nem \u00e9rdemes \u0151ket azonnal a ClickHouse-ba helyezni, b\u00e1r nagyon cs\u00e1b\u00edt\u00f3, hogy ne csin\u00e1lj semmit, \u00e9s minden m\u0171k\u00f6dni fog. De az\u00e9rt \u00e9rdemes elv\u00e9gezni azokat a sz\u00e1m\u00edt\u00e1sokat, amiket lehet.<\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul a b\u00f6ng\u00e9sz\u0151 verzi\u00f3ja. Egy k\u00f6zeli oszt\u00e1lyban, amelyre nem szeretn\u00e9k mutogatni, a b\u00f6ng\u00e9sz\u0151 verzi\u00f3ja \u00edgy t\u00e1rolj\u00e1k, azaz string form\u00e1j\u00e1ban: 12.3. Azt\u00e1n, hogy jelent\u00e9st k\u00e9sz\u00edtsenek, ezt a stringet veszik \u00e9s osztj\u00e1k egy t\u00f6mbbel, majd az els\u0151 t\u00f6mb elemmel. Nyilv\u00e1nval\u00f3, hogy minden lelassul. Megk\u00e9rdeztem, mi\u00e9rt csin\u00e1lj\u00e1k \u00edgy. Azt v\u00e1laszolt\u00e1k, hogy nem szeretik a korai optimaliz\u00e1ci\u00f3t. \u00c9n pedig nem szeretem a korai pessimizmust.<\/p>\n<p><\/p>\n<p>Ez\u00e9rt ebben az esetben helyesebb lenne n\u00e9gy oszlopra osztani. Itt ne f\u00e9lj, mert ez ClickHouse. A ClickHouse oszlop alap\u00fa adatb\u00e1zis. Min\u00e9l t\u00f6bb apr\u00f3, rendezett oszlopod van, ann\u00e1l jobb. Ha van 5 BrowserVersion-ed, k\u00e9sz\u00edts 5 oszlopot. Ez norm\u00e1lis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f9a67221bf8508933d7bd336b16f9e04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most n\u00e9zz\u00fck meg, mit tegy\u00fcnk, ha sok nagyon hossz\u00fa stringed vagy nagyon hossz\u00fa t\u00f6mb\u00f6d van. Ezeket nem szabad t\u00e1rolni a ClickHouse-ban. Ehelyett csak egy azonos\u00edt\u00f3t menthetsz el a ClickHouse-ba. A hossz\u00fa stringeket tedd valamilyen m\u00e1s rendszerbe. <\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul az egyik analitikai szolg\u00e1ltat\u00e1sunkban vannak bizonyos esem\u00e9nyparam\u00e9terek. Ha az esem\u00e9nyekhez sok param\u00e9ter \u00e9rkezik, egyszer\u0171en csak az els\u0151 512-t mentj\u00fck el. Mert az 512 \u2013 nem sajn\u00e1ljuk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/755271e8788ba4bd638f493bf320c820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha pedig nem tudod eld\u00f6nteni, milyen adatt\u00edpusokra van sz\u00fcks\u00e9ged, az adatokat a ClickHouse-ba is r\u00f6gz\u00edtheted, de egy Log t\u00edpus\u00fa ideiglenes t\u00e1bl\u00e1ba, amely kifejezetten ideiglenes adatokhoz k\u00e9sz\u00fclt. Ezt k\u00f6vet\u0151en elemezheted, hogy milyen \u00e9rt\u00e9kmegoszl\u00e1sod van, hogy mi van ott, \u00e9s meghat\u00e1rozhatod a megfelel\u0151 t\u00edpusokat.<\/p>\n<p><\/p>\n<p>* Jelenleg a ClickHouse-ban van egy adatt\u00edpus <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/data-types\/lowcardinality\/\">LowCardinality<\/a><\/noindex> amely hat\u00e9konyan t\u00e1rolja a stringeket kevesebb er\u0151forr\u00e1ssal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7e9e53d86a4189783c28ce56a669198c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most n\u00e9zz\u00fcnk egy m\u00e1sik \u00e9rdekes esetet. N\u00e9ha az emberek rendszere furcs\u00e1n m\u0171k\u00f6dik. Bel\u00e9pek, \u00e9s ilyet l\u00e1tok. Azonnal felmer\u00fcl, hogy ezt valami nagyon tapasztalt, okos admin k\u00e9sz\u00edtette, akinek nagy tapasztalata van a MySQL 3.23 be\u00e1ll\u00edt\u00e1s\u00e1ban. <\/p>\n<p><\/p>\n<p>Itt ezer t\u00e1bl\u00e1t l\u00e1tunk, mindegyikben valaminek az ezerrel val\u00f3 oszt\u00e1s\u00e1nak marad\u00e9ka van r\u00f6gz\u00edtve. <\/p>\n<p><\/p>\n<p>Alapvet\u0151en tiszteletben tartom m\u00e1sok tapasztalatait, bele\u00e9rtve azt is, hogy milyen szenved\u00e9seken kereszt\u00fcl ezek a tapasztalatok keletkeztek. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3a5e21ef2076966fcc627670485c5b3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s az okok t\u00f6bb\u00e9-kev\u00e9sb\u00e9 vil\u00e1gosak. Ezek r\u00e9gi sztereot\u00edpi\u00e1k, amelyek felhalmoz\u00f3dhattak m\u00e1s rendszerekkel val\u00f3 munka sor\u00e1n. P\u00e9ld\u00e1ul az MyISAM t\u00e1bl\u00e1kban nincs klaszterezett els\u0151dleges kulcs. Ez a fajta adatmegoszt\u00e1s k\u00e9ts\u00e9gbeesett pr\u00f3b\u00e1lkoz\u00e1s lehet arra, hogy megkapjuk ugyanazt a funkcionalit\u00e1st. <\/p>\n<p><\/p>\n<p>Egy m\u00e1sik ok az, hogy a nagy t\u00e1bl\u00e1kon v\u00e9gzett alter m\u0171veletek nehezen v\u00e9gezhet\u0151k. Minden blokkol\u00f3dni fog. B\u00e1r a modern MySQL verzi\u00f3kban ez a probl\u00e9ma m\u00e1r nem olyan komoly. <\/p>\n<p><\/p>\n<p>Vagy p\u00e9ld\u00e1ul a mikrosharding, de err\u0151l kicsit k\u00e9s\u0151bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/321b1d9caa8db7aca5b96e08c61d05b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ClickHouse-ban ezt nem sz\u00fcks\u00e9ges csin\u00e1lni, mert egyr\u00e9szt az els\u0151dleges kulcs klaszterezett, az adatok pedig az els\u0151dleges kulcs szerint rendezettek. <\/p>\n<p><\/p>\n<p>N\u00e9ha megk\u00e9rdezik t\u0151lem: \u201eHogyan v\u00e1ltozik a ClickHouse-ban a tartom\u00e1nyos lek\u00e9rdez\u00e9sek teljes\u00edtm\u00e9nye a t\u00e1bl\u00e1zat m\u00e9ret\u00e9t\u0151l f\u00fcgg\u0151en?\u201d A v\u00e1laszom az, hogy semennyire. P\u00e9ld\u00e1ul ha van egy milli\u00e1rd soros t\u00e1bl\u00e1zata, \u00e9s egymilli\u00f3 sort olvas, akkor minden rendben van. Ha a t\u00e1bl\u00e1zatban trilli\u00f3 sor van, \u00e9s egymilli\u00f3 sort olvas, akkor az szinte ugyanolyan lesz. <\/p>\n<p><\/p>\n<p>M\u00e1sr\u00e9szt k\u00fcl\u00f6nb\u00f6z\u0151 manu\u00e1lis part\u00edci\u00f3kra sincs sz\u00fcks\u00e9g. Ha bel\u00e9psz \u00e9s megn\u00e9zed, mi tal\u00e1lhat\u00f3 a f\u00e1jlrendszeren, l\u00e1thatod, hogy a t\u00e1bl\u00e1zat el\u00e9g komoly dolog. \u00c9s ott bel\u00fcl van valami, ami a part\u00edci\u00f3khoz hasonl\u00edthat\u00f3. Vagyis a ClickHouse mindent elv\u00e9gez helyetted, \u00e9s neked nem kell szenvedned.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/652f3742ad3a44f172d0d7302abd09f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az alter a ClickHouse-ban ingyenes, ha alter add\/drop column. <\/p>\n<p><\/p>\n<p>Nem \u00e9rdemes kis t\u00e1bl\u00e1kat l\u00e9trehozni, mert ha a t\u00e1bl\u00e1zatodban 10 sor vagy 10 000 sor van, az teljesen l\u00e9nyegtelen. A ClickHouse egy olyan rendszer, amely az \u00e1tereszt\u0151k\u00e9pess\u00e9get optimaliz\u00e1lja, nem a k\u00e9sleltet\u00e9st, \u00edgy 10 sort feldolgozni nem sok \u00e9rtelme van. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/144144b4740e9c5daec80c8dadc445f9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Helyes, ha egy nagy t\u00e1bl\u00e1t haszn\u00e1lsz. Szabadulj meg a r\u00e9gi sztereot\u00edpi\u00e1kt\u00f3l, minden rendben lesz. <\/p>\n<p><\/p>\n<p>B\u00f3nuszk\u00e9nt az utols\u00f3 verzi\u00f3ban megjelent a lehet\u0151s\u00e9g, hogy tetsz\u0151leges part\u00edcion\u00e1l\u00e1si kulcsot hozz l\u00e9tre, hogy k\u00fcl\u00f6nf\u00e9le karbantart\u00e1si m\u0171veleteket v\u00e9gezhess az egyes part\u00edci\u00f3kon. <\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul sok kis t\u00e1bl\u00e1zatra van sz\u00fcks\u00e9ge, p\u00e9ld\u00e1ul amikor k\u00f6ztes adatok feldolgoz\u00e1s\u00e1ra van sz\u00fcks\u00e9ge, chunkok \u00e9rkeznek, \u00e9s \u00e1talak\u00edtania kell azokat, miel\u0151tt a v\u00e9gs\u0151 t\u00e1bl\u00e1zatba \u00edrn\u00e1. Erre az esetre van egy csod\u00e1latos t\u00e1bl\u00e1zatmotor \u2013 StripeLog. Olyasmi, mint a TinyLog, csak jobb. <\/p>\n<p><\/p>\n<p>* most a ClickHouse-ban van m\u00e9g <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/table-functions\/input\/\">a t\u00e1bl\u00e1zatos f\u00fcggv\u00e9ny input<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d62f0b3d29876c29c6c0ba236b200186.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy m\u00e1sik antipattern a mikrosherel\u00e9s. P\u00e9ld\u00e1ul az adatait shardolnia kell, \u00e9s \u00f6t szervere van, de holnap hat szervere lesz. \u00c9s gondolkodik, hogyan kellene \u00fajraelosztani ezeket az adatokat. \u00c9s ehelyett nem 5 shardra bontja, hanem 1000 shardra. \u00c9s tov\u00e1bbra is minden mikrosherdet egy k\u00fcl\u00f6n szerverre ir\u00e1ny\u00edt. \u00cdgy p\u00e9ld\u00e1ul az egyik szerveren 200 ClickHouse lesz, k\u00fcl\u00f6nb\u00f6z\u0151 instance-\u00f6k k\u00fcl\u00f6nb\u00f6z\u0151 portokon vagy k\u00fcl\u00f6nb\u00f6z\u0151 adatb\u00e1zisokban. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3e550ef7e338b84e4394eb9fa4538769.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De a ClickHouse-ban ez nem igaz\u00e1n m\u0171k\u00f6dik j\u00f3l. Mert m\u00e9g egy ClickHouse p\u00e9ld\u00e1ny is megpr\u00f3b\u00e1lja felhaszn\u00e1lni a kiszolg\u00e1l\u00f3 \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 er\u0151forr\u00e1s\u00e1t egy k\u00e9r\u00e9s feldolgoz\u00e1s\u00e1hoz. Teh\u00e1t ha van egy szervere, mondjuk 56 processzormaggal. V\u00e9grehajt egy lek\u00e9rdez\u00e9st, ami egy m\u00e1sodpercig tart, \u00e9s ez 56 magot fog haszn\u00e1lni. Ha pedig 200 ClickHouse-t helyezett el egy szerveren, akkor 10 000 sz\u00e1l fog elindulni. \u00d6sszess\u00e9g\u00e9ben minden nagyon rosszul fog m\u0171k\u00f6dni.<\/p>\n<p><\/p>\n<p>A m\u00e1sik ok az, hogy a munka eloszt\u00e1sa ezek k\u00f6z\u00f6tt az instance-\u00e1k k\u00f6z\u00f6tt egyenl\u0151tlen lesz. Az egyik kor\u00e1bban befejez\u0151dik, a m\u00e1sik k\u00e9s\u0151bb. Ha mindez egy instance-ban t\u00f6rt\u00e9nne, a ClickHouse egyed\u00fcl is el tudn\u00e1 d\u00f6nteni, hogyan kellene helyesen elosztani az adatokat a sz\u00e1lak k\u00f6z\u00f6tt. <\/p>\n<p><\/p>\n<p>\u00c9s egy tov\u00e1bbi ok, hogy TCP-n kereszt\u00fcli interprocess kommunik\u00e1ci\u00f3s kapcsolat lesz. Az adatokat sorba kell \u00e1ll\u00edtani, visszaalak\u00edtani, \u00e9s ez \u00f3ri\u00e1si sz\u00e1m\u00fa mikrosherdet jelent. Egyszer\u0171en nem hat\u00e9konyan fog m\u0171k\u00f6dni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/18cacc17d22ae1cb2977c6be74769896.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy \u00fajabb antipattern, b\u00e1r neh\u00e9z antipatternnek nevezni. Ez a nagy mennyis\u00e9g\u0171 preaggreg\u00e1ci\u00f3.<\/p>\n<p><\/p>\n<p>\u00c1ltal\u00e1ban a preaggreg\u00e1ci\u00f3 j\u00f3. Volt egy milli\u00e1rd sor, aggreg\u00e1lta, \u00e9s lett bel\u0151le 1000 sor, \u00e9s most a lek\u00e9rdez\u00e9s azonnal v\u00e9grehajt\u00f3dik. Minden csod\u00e1latos. \u00cdgy lehet csin\u00e1lni. Erre a ClickHouse-ban van egy speci\u00e1lis t\u00e1blasorozat, az AggregatingMergeTree, amely folyamatos aggreg\u00e1l\u00e1st v\u00e9gez az adatok beilleszt\u00e9se sor\u00e1n. <\/p>\n<p><\/p>\n<p>De vannak esetek, amikor azt hiszed, hogy \u00edgy aggreg\u00e1ljuk az adatokat, \u00e9s m\u00e9g \u00edgy aggreg\u00e1ljuk az adatokat. Egy szomsz\u00e9dos oszt\u00e1lyban, szint\u00e9n nem szeretn\u00e9k mondani, hogy melyikben, SummingMergeTree t\u00e1bl\u00e1kat haszn\u00e1lnak az els\u0151dleges kulcs alapj\u00e1n t\u00f6rt\u00e9n\u0151 \u00f6sszegz\u00e9shez, \u00e9s az els\u0151dleges kulcsk\u00e9nt kb. 20 oszlopot haszn\u00e1lnak. K\u00fcl\u00f6nb\u00f6z\u0151 esetek miatt megv\u00e1ltoztattam n\u00e9h\u00e1ny oszlop nev\u00e9t, de nagyj\u00e1b\u00f3l \u00edgy van.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/54e3a02ab4bbce7c63ded595780ae1f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy ilyen probl\u00e9m\u00e1k mer\u00fclnek fel. El\u0151sz\u00f6r is, az adatok mennyis\u00e9ge nem cs\u00f6kken t\u00fal dr\u00e1maian. P\u00e9ld\u00e1ul h\u00e1romszoros\u00e1ra cs\u00f6kken. H\u00e1romszor \u2013 ez m\u00e1r j\u00f3 \u00e1r lenne, hogy korl\u00e1tlan elemz\u00e9si lehet\u0151s\u00e9geket engedhess\u00fcnk meg, amelyek akkor mer\u00fclnek fel, ha az adatok nem aggreg\u00e1ltak. Ha az adatok aggreg\u00e1ltak, akkor az elemz\u00e9s helyett csup\u00e1n sz\u00e1nalmas statisztik\u00e1t kapsz. <\/p>\n<p><\/p>\n<p>\u00c9s mi zavar k\u00fcl\u00f6n\u00f6sen? Az, hogy ezek az emberek a szomsz\u00e9dos oszt\u00e1lyb\u00f3l id\u0151nk\u00e9nt j\u00f6nnek \u00e9s k\u00e9rik, hogy adjunk hozz\u00e1 egy oszlopot az els\u0151dleges kulcshoz. Teh\u00e1t \u00edgy aggreg\u00e1ltuk az adatokat, \u00e9s most egy kicsit t\u00f6bbet akarunk. De a ClickHouse-ban nincs m\u00f3d az els\u0151dleges kulcs m\u00f3dos\u00edt\u00e1s\u00e1ra. Ez\u00e9rt valamilyen C++-ban \u00edrt szkripteket kell \u00edrni. \u00c9n nem szeretem a szkripteket, m\u00e9g akkor sem, ha C++-ban vannak.<\/p>\n<p><\/p>\n<p>\u00c9s ha megn\u00e9zz\u00fck, mi\u00e9rt k\u00e9sz\u00fclt a ClickHouse, akkor az aggreg\u00e1latlan adatok \u00e9ppen az a forgat\u00f3k\u00f6nyv, ami\u00e9rt sz\u00fcletett. Ha a ClickHouse-t aggreg\u00e1latlan adatokhoz haszn\u00e1lod, akkor mindent helyesen csin\u00e1lsz. Ha aggreg\u00e1lsz, az n\u00e9ha megbocs\u00e1that\u00f3. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/09fafd4c8a3ea8c22e586cb7a5cf6564.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy m\u00e1sik \u00e9rdekes eset a v\u00e9gtelen ciklusban zajl\u00f3 lek\u00e9rdez\u00e9sek. N\u00e9ha belen\u00e9zek egy production szerverbe, \u00e9s megn\u00e9zem ott a show processlist-et. \u00c9s mindig felfedezem, hogy valami borzalmas t\u00f6rt\u00e9nik. <\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul ez. Azonnal l\u00e1that\u00f3, hogy mindezt egy lek\u00e9rdez\u00e9sben is v\u00e9grehajthatt\u00e1k volna. Egyszer\u0171en \u00edrd be a url in \u00e9s a lista.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae03b659f178962f50e0640614517296.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi\u00e9rt rossz sok ilyen v\u00e9gtelen ciklusban fut\u00f3 lek\u00e9rdez\u00e9s? Ha az index nem haszn\u00e1latos, akkor sokszor \u00e1tfutsz ugyanazon adatokon. De ha az index haszn\u00e1latban van, p\u00e9ld\u00e1ul van egy els\u0151dleges kulcsod ru-ra, \u00e9s te url = valamire \u00edrsz. \u00c9s azt hiszed, hogy egy url-t pontosan olvasni fog a t\u00e1bl\u00e1b\u00f3l, akkor minden rendben lesz. De val\u00f3j\u00e1ban nem. Mert a ClickHouse mindent adagokban csin\u00e1l. <\/p>\n<p><\/p>\n<p>Amikor egy adott adatsort kell olvasnia, egy kicsit t\u00f6bbet olvas, mert a ClickHouse indexe ritk\u00e1s. Ez az index nem teszi lehet\u0151v\u00e9 egy egyedi sor megtal\u00e1l\u00e1s\u00e1t a t\u00e1bl\u00e1ban, csak egy adott tartom\u00e1nyt. Az adatok blokkokban t\u00f6m\u00f6r\u00fclnek. Ahhoz, hogy egy sort elolvasson, egy eg\u00e9sz blokkot kell gy\u0171jtenie \u00e9s kicsomagolnia. Ha sok lek\u00e9rdez\u00e9st hajt v\u00e9gre, akkor sok ilyen \u00e1tfed\u00e9s lesz, \u00e9s sok munka fog \u00fajra \u00e9s \u00fajra elv\u00e9gez\u0151dni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/95eef43c5b869f8b145c61ce3c616cfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>B\u00f3nuszk\u00e9nt megjegyezhetj\u00fck, hogy a ClickHouse-ban nem \u00e9rdemes f\u00e9ln\u00fcnk t\u00f6bb megab\u00e1jtnyi, ak\u00e1r t\u00f6bb sz\u00e1z megab\u00e1jtnyi adat tov\u00e1bb\u00edt\u00e1s\u00e1t\u00f3l az IN szekci\u00f3ban. Eml\u00e9kszem, hogy a gyakorlatunk sor\u00e1n, ha a MySQL-ben sok \u00e9rt\u00e9ket adunk meg az IN szekci\u00f3ban, p\u00e9ld\u00e1ul 100 megab\u00e1jtnyi sz\u00e1mot, akkor a MySQL ak\u00e1r 10 gigab\u00e1jt mem\u00f3ri\u00e1t is felhaszn\u00e1l, \u00e9s ut\u00e1na m\u00e1r semmi nem t\u00f6rt\u00e9nik, minden rosszul m\u0171k\u00f6dik. <\/p>\n<p><\/p>\n<p>A m\u00e1sodik pedig az, hogy a ClickHouse-ban, ha a lek\u00e9rdez\u00e9sek haszn\u00e1lj\u00e1k az indexet, az mindig nem lassabb, mint a teljes \u00e1tvizsg\u00e1l\u00e1s, teh\u00e1t ha a t\u00e1bl\u00e1zat szinte teljes tartalm\u00e1t el kell olvasni, akkor az sorban halad \u00e9s az eg\u00e9sz t\u00e1bl\u00e1t olvassa. Az \u00f6sszess\u00e9g\u00e9ben mag\u00e1t\u00f3l megold\u00f3dik.<\/p>\n<p><\/p>\n<p>Mindazon\u00e1ltal vannak bizonyos neh\u00e9zs\u00e9gek. P\u00e9ld\u00e1ul az, hogy az IN al-lek\u00e9rdez\u00e9ssel nem haszn\u00e1l indexet. De ez a mi probl\u00e9m\u00e1nk, \u00e9s nek\u00fcnk kell ezt helyrehozni. Nincs itt semmi alapvet\u0151. Meg fogjuk jav\u00edtani. <\/p>\n<p><\/p>\n<p>\u00c9s egy \u00fajabb \u00e9rdekes dolog \u2013 ha nagyon hossz\u00fa lek\u00e9rdez\u00e9s van, \u00e9s elosztott lek\u00e9rdez\u00e9sfeldolgoz\u00e1s zajlik, akkor ez a nagyon hossz\u00fa lek\u00e9rdez\u00e9s minden szerverre t\u00f6m\u00f6r\u00edt\u00e9s n\u00e9lk\u00fcl ker\u00fcl tov\u00e1bb\u00edt\u00e1sra. P\u00e9ld\u00e1ul 100 megab\u00e1jt \u00e9s 500 szerver. Ennek megfelel\u0151en 50 gigab\u00e1jtot fogunk \u00e1tadni az h\u00e1l\u00f3zaton. \u00c1t fogj\u00e1k adni, majd minden sikeresen v\u00e9grehajt\u00f3dik.<\/p>\n<p><\/p>\n<p>* m\u00e1r haszn\u00e1latban van; mindent megjav\u00edtottunk, ahogy \u00edg\u00e9rt\u00fck.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/5fcde9bf04fff0645be2530daa12743f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s el\u00e9gg\u00e9 gyakori eset, hogy a lek\u00e9rdez\u00e9sek az API-b\u00f3l \u00e9rkeznek. P\u00e9ld\u00e1ul k\u00e9sz\u00edtett egy szolg\u00e1ltat\u00e1st. Ha az \u00d6n szolg\u00e1ltat\u00e1s\u00e1ra sz\u00fcks\u00e9ge van valakinek, akkor megnyitotta az API-t, \u00e9s m\u00e1r k\u00e9t nappal k\u00e9s\u0151bb l\u00e1tja, hogy valami \u00e9rthetetlen t\u00f6rt\u00e9nik. Minden t\u00falterhelt, \u00e9s borzalmas lek\u00e9rdez\u00e9sek \u00e9rkeznek, amelyek soha nem kellett volna bek\u00f6vetkezni\u00fck. <\/p>\n<p><\/p>\n<p>Itt egy megold\u00e1s l\u00e9tezik. Ha megnyitotta az API-t, akkor azt bizony m\u00f3dos\u00edtania kell. P\u00e9ld\u00e1ul be kell vezetnie valamilyen kv\u00f3t\u00e1t. Nincs m\u00e1s norm\u00e1lis lehet\u0151s\u00e9g. Ellenkez\u0151 esetben azonnal \u00edrn\u00e1nak egy szkriptet, \u00e9s probl\u00e9m\u00e1k mer\u00fcln\u00e9nek fel. <\/p>\n<p><\/p>\n<p>A ClickHouse-ban lehet\u0151s\u00e9g van a kv\u00f3t\u00e1k sz\u00e1m\u00edt\u00e1s\u00e1ra. R\u00e1ad\u00e1sul saj\u00e1t kv\u00f3takulcsot is megadhatunk. Ez p\u00e9ld\u00e1ul egy bels\u0151 felhaszn\u00e1l\u00f3i azonos\u00edt\u00f3. A kv\u00f3t\u00e1k sz\u00e1m\u00edt\u00e1sa f\u00fcggetlen\u00fcl t\u00f6rt\u00e9nik mindegyik\u00fck sz\u00e1m\u00e1ra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/532438d0f116919e62f04e32ebbd3c45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most egy m\u00e1sik \u00e9rdekes dolog. Ez a k\u00e9zi meghajt\u00e1s\u00fa replik\u00e1ci\u00f3. <\/p>\n<p><\/p>\n<p>Tudok sok esetr\u0151l, amikor, annak ellen\u00e9re, hogy a ClickHouse be\u00e9p\u00edtett replik\u00e1ci\u00f3t t\u00e1mogat, az emberek manu\u00e1lisan replik\u00e1lj\u00e1k a ClickHouse-t.<\/p>\n<p><\/p>\n<p>Mi ennek az elve? Van egy adatfeldolgoz\u00f3 pipeline-od. Ez f\u00fcggetlen\u00fcl m\u0171k\u00f6dik, p\u00e9ld\u00e1ul k\u00fcl\u00f6nb\u00f6z\u0151 adatk\u00f6zpontokban. Az azonos adatokat azonos m\u00f3don \u00edrod be a ClickHouse-ba. Az igazs\u00e1g az, hogy a gyakorlat azt mutatja, hogy az adatok m\u00e9gis elt\u00e9rhetnek a k\u00f3dod saj\u00e1toss\u00e1gai miatt. Rem\u00e9lem, hogy nem a ti\u00e9d. <\/p>\n<p><\/p>\n<p>Id\u0151r\u0151l id\u0151re m\u00e9gis k\u00e9zzel kell szinkroniz\u00e1lnod. P\u00e9ld\u00e1ul havonta egyszer az adminisztr\u00e1torok rsync-et v\u00e9geznek.<\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban sokkal egyszer\u0171bb a ClickHouse be\u00e9p\u00edtett replik\u00e1ci\u00f3j\u00e1t haszn\u00e1lni. De itt lehetnek bizonyos ellenjavallatok, mert ehhez ZooKeeper-t kell haszn\u00e1lni. Nem mondok rosszat a ZooKeeper-r\u0151l, alapvet\u0151en a rendszer m\u0171k\u00f6dik, de el\u0151fordul, hogy az emberek nem haszn\u00e1lj\u00e1k, mert java-f\u00f3bi\u00e1juk van, mivel a ClickHouse egy olyan j\u00f3 rendszer, amit C++-ban \u00edrtak, amely m\u0171k\u00f6dik \u00e9s minden rendben lesz. A ZooKeeper pedig Java. \u00c9s valahogy m\u00e9g csak nem is szeretn\u00e9m megn\u00e9zni, de akkor haszn\u00e1lhatod a k\u00e9zi meghajt\u00e1s\u00fa replik\u00e1ci\u00f3t. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3b5b68996daef6b8920f067b189f25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ClickHouse egy praktikus rendszer. Figyelembe veszi az ig\u00e9nyeidet. Ha k\u00e9zi meghajt\u00e1s\u00fa replik\u00e1ci\u00f3t haszn\u00e1lsz, l\u00e9trehozhatsz egy Distributed t\u00e1bl\u00e1t, amely a k\u00e9zi replik\u00e1idra n\u00e9z, \u00e9s mag\u00e1t\u00f3l v\u00e9grehajtja a failover-t k\u00f6z\u00f6tt\u00fck. M\u00e9g egy speci\u00e1lis opci\u00f3 is van, amely lehet\u0151v\u00e9 teszi, hogy elker\u00fcld a flappokat, m\u00e9g akkor is, ha a replik\u00e1id rendszeresen elt\u00e9rnek egym\u00e1st\u00f3l.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/70f6630f8b14756163923a7db8dd7391.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tov\u00e1bb\u00e1 probl\u00e9m\u00e1k ad\u00f3dhatnak, ha primit\u00edv t\u00e1blamotorokat haszn\u00e1lsz. A ClickHouse egy olyan \u00e9p\u00edt\u0151elem, amelyben sok k\u00fcl\u00f6nb\u00f6z\u0151 t\u00e1blamotor tal\u00e1lhat\u00f3. Minden komolyabb esethez, ahogy a dokument\u00e1ci\u00f3 is \u00edrja, a MergeTree csal\u00e1d t\u00e1bl\u00e1it kell haszn\u00e1lnod. Minden m\u00e1s \u2013 csak k\u00fcl\u00f6n esetekre vagy tesztekhez val\u00f3.<\/p>\n<p><\/p>\n<p>A MergeTree t\u00e1bl\u00e1ban nem sz\u00fcks\u00e9ges, hogy legyen valamilyen d\u00e1tum \u00e9s id\u0151. Akkor is haszn\u00e1lhatod \u0151ket. Ha nincs d\u00e1tum \u00e9s id\u0151, \u00edrd be, hogy az alap\u00e9rtelmezett \u2013 2000-es \u00e9v. Ez m\u0171k\u00f6dni fog, \u00e9s nem ig\u00e9nyel sok er\u0151forr\u00e1st. <\/p>\n<p><\/p>\n<p>Az \u00faj szerver verzi\u00f3ban ak\u00e1r testreszabott part\u00edcion\u00e1l\u00e1st is megadhat, kulcs n\u00e9lk\u00fcli part\u00edci\u00f3val. Ez ugyanaz lesz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6d4046d11afdd1e5962d49a1612b666a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00e1sr\u00e9szt primit\u00edv t\u00e1blamotorokat is haszn\u00e1lhat. P\u00e9ld\u00e1ul egyszer t\u00f6lti fel az adatokat, megn\u00e9zi, elforgatja \u00e9s t\u00f6rli. Haszn\u00e1lhat Log-ot.<\/p>\n<p><\/p>\n<p>Vagy kis mennyis\u00e9gek t\u00e1rol\u00e1s\u00e1ra az intermedier feldolgoz\u00e1shoz \u2013 ez a StripeLog vagy TinyLog.<\/p>\n<p><\/p>\n<p>A Memory-t haszn\u00e1lhatja, ha kis mennyis\u00e9g\u0171 adat van, \u00e9s csak valamit forgatna a mem\u00f3ri\u00e1ban. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8a3d4e0e3a8c26dd3a2b2f64123e2bf9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ClickHouse nem nagyon kedveli a t\u00falnormaliz\u00e1lt adatokat. <\/p>\n<p><\/p>\n<p>Itt egy tipikus p\u00e9lda. Ez egy hatalmas URL mennyis\u00e9g. Beletette \u0151ket a szomsz\u00e9dos t\u00e1bl\u00e1ba. Azt\u00e1n \u00fagy d\u00f6nt\u00f6tt, hogy JOIN-t szeretne v\u00e9grehajtani vel\u00fck, de \u00e1ltal\u00e1ban ez nem fog m\u0171k\u00f6dni, mert a ClickHouse csak Hash JOIN-t t\u00e1mogat. Ha nincs elegend\u0151 mem\u00f3ria a sok adat \u00f6sszekapcsol\u00e1s\u00e1hoz, akkor a JOIN nem hajthat\u00f3 v\u00e9gre*. <\/p>\n<p><\/p>\n<p>Ha az adatok nagy kardin\u00e1lis\u00e1g\u00faak, akkor ne agg\u00f3djon, t\u00e1rolja \u0151ket denormaliz\u00e1lt form\u00e1ban, az URL-eket k\u00f6zvetlen\u00fcl a f\u0151 t\u00e1bl\u00e1ban. <\/p>\n<p><\/p>\n<p>* Most a ClickHouse-ban m\u00e1r merge join is van, \u00e9s ez olyan k\u00f6rnyezetben m\u0171k\u00f6dik, ahol a k\u00f6zbens\u0151 adatok nem f\u00e9rnek el a mem\u00f3ri\u00e1ban. De ez nem hat\u00e9kony, \u00e9s a javaslat tov\u00e1bbra is \u00e9rv\u00e9nyes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/e8160a8db17c18d48f810092c55b094c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00e9g p\u00e1r p\u00e9lda, de m\u00e1r k\u00e9telkedem, hogy anti-mint\u00e1sak-e vagy sem. <\/p>\n<p><\/p>\n<p>A ClickHouse-nak van egy ismert h\u00e1tr\u00e1nya. Nem tud friss\u00edt\u00e9seket v\u00e9gezni*. Bizonyos \u00e9rtelemben ez m\u00e9g j\u00f3nak is tekinthet\u0151. Ha fontos adatai vannak, p\u00e9ld\u00e1ul a k\u00f6nyvel\u00e9s, akkor senki sem tudja \u0151ket elk\u00fcldeni, mert nincsenek friss\u00edt\u00e9sek.<\/p>\n<p><\/p>\n<p>* A friss\u00edt\u00e9si \u00e9s t\u00f6rl\u00e9si t\u00e1mogat\u00e1s m\u00e1r r\u00e9g\u00f3ta hozz\u00e1 lett adva batch m\u00f3dba.<\/p>\n<p><\/p>\n<p>De van n\u00e9h\u00e1ny k\u00fcl\u00f6nleges m\u00f3dszer, amely lehet\u0151v\u00e9 teszi a friss\u00edt\u00e9seket szinte a h\u00e1tt\u00e9rben. P\u00e9ld\u00e1ul a ReplaceMergeTree t\u00edpus\u00fa t\u00e1bl\u00e1k. Ezek a h\u00e1tt\u00e9rbeli \u00f6sszevon\u00e1sok sor\u00e1n v\u00e9gzik a friss\u00edt\u00e9seket. Ezt a optimize table-vel k\u00e9nyszer\u00edtheti. De ne tegye ezt t\u00fal gyakran, mert az teljes \u00fajra\u00edr\u00e1st jelent a part\u00edci\u00f3ra. <\/p>\n<p><\/p>\n<p>A terjesztett JOIN-ok a ClickHouse-ban szint\u00e9n rosszul kezelhet\u0151k a lek\u00e9rdez\u00e9s\u2013tervez\u0151 \u00e1ltal. <\/p>\n<p><\/p>\n<p>Rossz, de n\u00e9ha rendben van.<\/p>\n<p><\/p>\n<p>A ClickHouse haszn\u00e1lata kiz\u00e1r\u00f3lag arra, hogy az adatokat visszaolvassa select*-t\u00e1l.<\/p>\n<p><\/p>\n<p>Nem aj\u00e1nlan\u00e1m a ClickHouse haszn\u00e1lat\u00e1t nagym\u00e9ret\u0171 sz\u00e1m\u00edt\u00e1sokhoz. De ez nem teljesen igaz, mert m\u00e1r elt\u00e1volodunk ett\u0151l az aj\u00e1nl\u00e1st\u00f3l. Nemr\u00e9giben lehet\u0151s\u00e9g ny\u00edlt g\u00e9pi tanul\u00e1si modellek alkalmaz\u00e1s\u00e1ra a ClickHouse-ban \u2013 Catboost. Ez aggaszt, mert azt gondolom: \u201eMicsoda sz\u00f6rny\u0171s\u00e9g. H\u00e1ny ciklus van egy byte-ra!\u201d. Nagyon sajn\u00e1lom, hogy ciklusokat pazarolok byte-okkal. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hat\u00e9kony ClickHouse haszn\u00e1lat. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f686d5d352ccb444cd06e2ae68897137.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De ne f\u00e9ljetek, telep\u00edts\u00e9tek a ClickHouse-t, minden rendben lesz. Ha b\u00e1rmi baj van, van k\u00f6z\u00f6ss\u00e9g\u00fcnk. Egy\u00e9bk\u00e9nt, a k\u00f6z\u00f6ss\u00e9g \u2013 az ti vagytok. \u00c9s ha probl\u00e9m\u00e1itok vannak, legal\u00e1bb csatlakozhattok a chat\u00fcnkhez, \u00e9s rem\u00e9lem, seg\u00edtenek nektek. <\/p>\n<p><\/p>\n<p>K\u00e9rd\u00e9sek<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m az el\u0151ad\u00e1st! Hova lehet panaszt tenni a ClickHouse le\u00e1ll\u00e1s\u00e1ra?<\/em><\/p>\n<p><\/p>\n<p>Szem\u00e9lyesen nekem is panaszolhattok most. <\/p>\n<p><\/p>\n<p><em>Nemr\u00e9g kezdtem el haszn\u00e1lni a ClickHouse-t. Azonnal le\u00e1ll\u00edtottam a CLI interf\u00e9szt.<\/em><\/p>\n<p><\/p>\n<p>Szerencs\u00e9d van. <\/p>\n<p><\/p>\n<p><em>K\u00e9s\u0151bb egy kis select-tel le\u00e1ll\u00edtottam a szervert.<\/em><\/p>\n<p><\/p>\n<p>Tehets\u00e9ged van. <\/p>\n<p><\/p>\n<p><em>Hib\u00e1t nyitottam a GitHub-on, de figyelmen k\u00edv\u00fcl hagyt\u00e1k.<\/em> <\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg. <\/p>\n<p><\/p>\n<p><em>Alexey becsapott, hogy r\u00e9szt vegyek az el\u0151ad\u00e1son, meg\u00edg\u00e9rve, hogy elmondja, hogyan t\u00f6m\u00f6r\u00edtitek az adatokat bel\u00fcl.<\/em><\/p>\n<p><\/p>\n<p>Nagyon egyszer\u0171. <\/p>\n<p><\/p>\n<p><em>Ezt m\u00e1r tegnap meg\u00e9rtettem. T\u00f6bb konkr\u00e9tumot szeretn\u00e9k.<\/em> <\/p>\n<p><\/p>\n<p>Nincsenek ott sz\u00f6rny\u0171 tr\u00fckk\u00f6k. Csak blokk alap\u00fa t\u00f6m\u00f6r\u00edt\u00e9s van. Alap\u00e9rtelmez\u00e9s szerint LZ4-t haszn\u00e1lunk, de lehet ZSTD-t is bekapcsolni*. A blokkok 64 kilobajt\u00f3l 1 megab\u00e1jtig terjednek.<\/p>\n<p><\/p>\n<p>* emellett van t\u00e1mogat\u00e1s speci\u00e1lis t\u00f6m\u00f6r\u00edt\u00e9si kodekekhez, amelyeket m\u00e1s algoritmusokkal kombin\u00e1lva lehet haszn\u00e1lni.<\/p>\n<p><\/p>\n<p><em>A blokkokban csak nyers adatok vannak?<\/em><\/p>\n<p><\/p>\n<p>Nem teljesen nyers adatokr\u00f3l van sz\u00f3. Ott t\u00f6mb\u00f6k vannak. Ha van egy numerikus oszlopod, akkor a sz\u00e1mok egym\u00e1s ut\u00e1n t\u00f6mb\u00f6kbe vannak rendezve. <\/p>\n<p><\/p>\n<p><em>\u00c9rtem.<\/em> <\/p>\n<p><\/p>\n<p><em>Alexey, p\u00e9ld\u00e1ul a uniqExact eset\u00e9ben az IP c\u00edmek felett, hogy az uniqExact sorok szerint lassabban sz\u00e1mol\u00f3dik, mint a sz\u00e1mok. Mi van, ha az olvas\u00e1skor konvert\u00e1lunk? Teh\u00e1t, \u00fagy t\u0171nik, azt mondtad, hogy a lemezen nem nagyon k\u00fcl\u00f6nb\u00f6zik. Ha a lemezr\u0151l olvasunk sorokat \u00e9s konvert\u00e1lunk, akkor gyorsabban lesznek az aggreg\u00e1tumaink, vagy nem? Vagy itt nem nyerhet\u00fcnk jelent\u0151sen? \u00dagy t\u0171nik, hogy ezt tesztelted, de valami\u00e9rt nem jel\u00f6lted meg a benchmarkon.<\/em> <\/p>\n<p><\/p>\n<p>Azt hiszem, hogy lassabb lesz, mint a cast n\u00e9lk\u00fcl. Ebben az esetben az IP-c\u00edmet ki kell parsolni a sorb\u00f3l. N\u00e1lunk, term\u00e9szetesen, a ClickHouse-ban is optimaliz\u00e1lva van az IP-c\u00edmek parse-ol\u00e1sa. Nagyon er\u0151sen igyekezt\u00fcnk, de ott ugye a sz\u00e1mok t\u00edzezres form\u00e1ban vannak feljegyezve. Nagyon k\u00e9nyelmetlen. M\u00e1sr\u00e9szt a uniqExact f\u00fcggv\u00e9ny lassabban fog m\u0171k\u00f6dni a sorokon, nemcsak az\u00e9rt, mert azok sorok, hanem mert az algoritmus m\u00e1s specializ\u00e1ci\u00f3t v\u00e1laszt. A sorokat egyszer\u0171en m\u00e1sk\u00e9pp dolgozz\u00e1k fel.<\/p>\n<p><\/p>\n<p><em>De mi van, ha egy primit\u00edvebb adat t\u00edpust v\u00e1lasztunk? P\u00e9ld\u00e1ul, feljegyezt\u00fck a felhaszn\u00e1l\u00f3i azonos\u00edt\u00f3t, amely n\u00e1lunk in, fel\u00edrtuk sorban, majd castoltuk, viccesebb lesz vagy sem?<\/em><\/p>\n<p><\/p>\n<p>K\u00e9tlem. Azt hiszem, hogy m\u00e9g szomor\u00fabb lesz, mert a sz\u00e1mok parse-ol\u00e1sa komoly probl\u00e9ma. \u00dagy t\u0171nik, hogy ennek a koll\u00e9g\u00e1nak volt egy el\u0151ad\u00e1sa arr\u00f3l, hogy mennyire neh\u00e9z a sz\u00e1mokat t\u00edzes form\u00e1ban parse-olni, de lehet, hogy nem. <\/p>\n<p><\/p>\n<p><em>Alexei, k\u00f6sz\u00f6n\u00f6m sz\u00e9pen az el\u0151ad\u00e1st! \u00c9s k\u00f6sz\u00f6n\u00f6m sz\u00e9pen a ClickHouse-t! Van egy k\u00e9rd\u00e9sem a tervekkel kapcsolatban. Terveznek-e olyan funkci\u00f3t, ami nem teljesen friss\u00edti a sz\u00f3t\u00e1rakat?<\/em><\/p>\n<p><\/p>\n<p>Teh\u00e1t r\u00e9szleges \u00fajraind\u00edt\u00e1s?<\/p>\n<p><\/p>\n<p><em>Igen-igen. Olyan lehet\u0151s\u00e9g, hogy megadhassuk a MySQL mez\u0151t, teh\u00e1t friss\u00edteni az aftert, hogy csak ezek az adatok t\u00f6lthet\u0151k be, ha a sz\u00f3t\u00e1r nagyon nagy.<\/em><\/p>\n<p><\/p>\n<p>Nagyon \u00e9rdekes funkci\u00f3. \u00c9s \u00fagy t\u0171nik, hogy valaki azt javasolta a chaten. Tal\u00e1n ez ak\u00e1r \u00f6n volt. <\/p>\n<p><\/p>\n<p><em>Nem hiszem, hogy \u00e9n lenn\u00e9k.<\/em><\/p>\n<p><\/p>\n<p>Remek, most pedig \u00fagy t\u0171nik, hogy k\u00e9t lek\u00e9rdez\u00e9s van. \u00c9s nyugodtan el lehet kezdeni csin\u00e1lni. De azonnal figyelmeztetni szeretn\u00e9m, hogy ez a funkci\u00f3 meglehet\u0151sen egyszer\u0171en megval\u00f3s\u00edthat\u00f3. Teh\u00e1t elvileg csak annyit kell tenni, hogy be\u00edrjuk a t\u00e1bl\u00e1ba a verzi\u00f3sz\u00e1mot, \u00e9s ut\u00e1na: verzi\u00f3 kisebb, mint ez meg ez. Ez azt jelenti, hogy val\u00f3sz\u00edn\u0171leg ezt a lelkesed\u0151knek fogjuk aj\u00e1nlani. \u00d6n lelkesed\u0151? <\/p>\n<p><\/p>\n<p><em>Igen, de sajnos nem C++-ban.<\/em><\/p>\n<p><\/p>\n<p>A koll\u00e9g\u00e1i tudnak C++-ban programozni? <\/p>\n<p><\/p>\n<p><em>Meg fogok tal\u00e1lni valakit.<\/em><\/p>\n<p><\/p>\n<p>Remek*.<\/p>\n<p><\/p>\n<p>* a lehet\u0151s\u00e9g k\u00e9t h\u00f3nappal az el\u0151ad\u00e1s ut\u00e1n lett hozz\u00e1adva \u2013 a k\u00e9rd\u00e9s szerz\u0151je fejlesztette, \u00e9s elk\u00fcldte a saj\u00e1tj\u00e1t <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/pull\/1771\">pull requestemr\u0151l<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m!<\/em><\/p>\n<p><\/p>\n<p><em>\u00dcdv\u00f6zl\u00f6m! K\u00f6sz\u00f6n\u00f6m az el\u0151ad\u00e1st! Emlegette, hogy a ClickHouse nagyon j\u00f3l kihaszn\u00e1lja az \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 er\u0151forr\u00e1st. A Luxoft szomsz\u00e9dos el\u0151ad\u00f3ja a megold\u00e1s\u00e1r\u00f3l besz\u00e9lt a Orosz Posta sz\u00e1m\u00e1ra. Azt mondta, hogy nekik nagyon tetszett a ClickHouse, de nem haszn\u00e1lt\u00e1k az alapvet\u0151 konkurens\u00fck helyett, pontosan az\u00e9rt, mert teljesen elfogyasztja a processzort. Nem tudt\u00e1k integr\u00e1lni a saj\u00e1t architekt\u00far\u00e1jukba, a ZooKeeper-j\u00fckbe a dockerekkel. Van lehet\u0151s\u00e9g arra, hogy korl\u00e1tozzuk a ClickHouse-t, hogy ne fogyassa el mindazt, ami el\u00e9rhet\u0151 neki?<\/em><\/p>\n<p><\/p>\n<p>Igen, lehet, \u00e9s nagyon egyszer\u0171. Ha kevesebb magot szeretne haszn\u00e1lni, akkor egyszer\u0171en \u00edrja be <code>set max_threads = 1<\/code>. \u00c9s k\u00e9sz, egy magon v\u00e9gzi a lek\u00e9rdez\u00e9seket. R\u00e1ad\u00e1sul k\u00fcl\u00f6nb\u00f6z\u0151 felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra be\u00e1ll\u00edthat k\u00fcl\u00f6nb\u00f6z\u0151 param\u00e9tereket. Teh\u00e1t ezzel nincs probl\u00e9ma. \u00c9s az Luxoft munkat\u00e1rsainak is mondja el, hogy nem helyes, hogy nem tal\u00e1lt\u00e1k meg ezt a be\u00e1ll\u00edt\u00e1st a dokument\u00e1ci\u00f3ban. <\/p>\n<p><\/p>\n<p><em>Alexej, \u00fcdv\u00f6zl\u00f6m! Szeretn\u00e9k egy k\u00e9rd\u00e9st feltenni. M\u00e1r nem el\u0151sz\u00f6r hallom, hogy sokan a ClickHouse-t kezdt\u00e9k el logok t\u00e1rol\u00e1s\u00e1ra haszn\u00e1lni. Az el\u0151ad\u00e1sban azt mondta, hogy ezt nem k\u00e9ne csin\u00e1lni, azaz nem kell hossz\u00fa sorokat t\u00e1rolni. Mit gondol err\u0151l?<\/em><\/p>\n<p><\/p>\n<p>El\u0151sz\u00f6r is, a logok \u00e1ltal\u00e1ban nem hossz\u00fa sorok. Persze vannak kiv\u00e9telek. P\u00e9ld\u00e1ul egy Java nyelven \u00edrt szolg\u00e1ltat\u00e1s dob egy exception-t, ami napl\u00f3z\u00e1sra ker\u00fcl. \u00c9s ez v\u00e9gtelen ciklusban zajlik, v\u00e9g\u00fcl pedig elfogy a hely a merevlemezen. A megold\u00e1s nagyon egyszer\u0171. Ha a sorok t\u00fal hossz\u00faak, akkor v\u00e1gja le \u0151ket. De mit jelent, hogy hossz\u00fa? T\u00edzes kilob\u00e1jt \u2013 ez rossz*.<\/p>\n<p><\/p>\n<p>* A friss ClickHouse verzi\u00f3kban enged\u00e9lyezve van az \"alkalmazkod\u00f3 index szemcsem\u00e9ret\", ami l\u00e9nyeg\u00e9ben megoldja a hossz\u00fa sorok t\u00e1rol\u00e1si probl\u00e9m\u00e1j\u00e1t.<\/p>\n<p><\/p>\n<p><em>\u00c9s a kilob\u00e1jt \u2013 az norm\u00e1lis?<\/em><\/p>\n<p><\/p>\n<p>Norm\u00e1lis. <\/p>\n<p><\/p>\n<p><em>\u00dcdv\u00f6zl\u00f6m! K\u00f6sz\u00f6n\u00f6m az el\u0151ad\u00e1st! M\u00e1r k\u00e9rdeztem err\u0151l a csatorn\u00e1ban, de nem eml\u00e9kszem, kaptam-e v\u00e1laszt. Tervezik-e valamikor b\u0151v\u00edteni a WITH szekci\u00f3t hasonl\u00f3an a CTE-hez?<\/em><\/p>\n<p><\/p>\n<p>Jelenleg nem. A WITH szekci\u00f3nk kicsit komolytalan. Egy kicsi funkci\u00f3k\u00e9nt kezelj\u00fck.<\/p>\n<p><\/p>\n<p><em>Meg\u00e9rtettem. K\u00f6sz\u00f6n\u00f6m!<\/em><\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m az el\u0151ad\u00e1st! Nagyon \u00e9rdekes! Glob\u00e1lis k\u00e9rd\u00e9s. Tervezik-e valamilyen m\u00f3don a t\u00f6rl\u00e9s funkci\u00f3 m\u00f3dos\u00edt\u00e1s\u00e1t, esetleg valamilyen helyettes\u00edt\u0151 haszn\u00e1lat\u00e1val?<\/em><\/p>\n<p><\/p>\n<p>K\u00e9ts\u00e9gtelen\u00fcl. Ez a feladatunk az els\u0151 helyen a sorban. Jelenleg akt\u00edvan kidolgozzuk, hogyan csin\u00e1ljuk j\u00f3l. \u00c9s el kell kezdeni \u00fct\u00f6getni a billenty\u0171zetet*.<\/p>\n<p><\/p>\n<p>* megnyomkodtuk a billenty\u0171ket a billenty\u0171zeten, \u00e9s mindent megcsin\u00e1ltunk.<\/p>\n<p><\/p>\n<p><em>Foly\u00e1solja ez valamilyen m\u00f3don a rendszer teljes\u00edtm\u00e9ny\u00e9t, vagy nem? A besz\u00far\u00e1s olyan gyors lesz, mint most?<\/em><\/p>\n<p><\/p>\n<p>Lehets\u00e9ges, hogy maguk a t\u00f6rl\u00e9sek \u00e9s friss\u00edt\u00e9sek nagyon neh\u00e9znek bizonyulnak, de ez semmilyen hat\u00e1ssal nem lesz a lek\u00e9rdez\u00e9sek \u00e9s a besz\u00far\u00e1sok teljes\u00edtm\u00e9ny\u00e9re.<\/p>\n<p><\/p>\n<p><em>\u00c9s m\u00e9g egy kis k\u00e9rd\u00e9s. Az el\u0151ad\u00e1son eml\u00edtetted a primer kulcsot. Teh\u00e1t van egy part\u00edcion\u00e1l\u00e1s, amely alap\u00e9rtelmez\u00e9s szerint havi, ugye? Amikor megadunk egy d\u00e1tumtartom\u00e1nyt, ami belef\u00e9r egy h\u00f3napba, akkor csak ezt a part\u00edci\u00f3t olvassuk le, igaz?<\/em><\/p>\n<p><\/p>\n<p>Igen.<\/p>\n<p><\/p>\n<p><em>Egy ilyen k\u00e9rd\u00e9s. Ha nem tudunk megnevezni egy primer kulcsot, helyes-e a \"D\u00e1tum\" mez\u0151 alapj\u00e1n kialak\u00edtani, hogy a h\u00e1tt\u00e9rben kevesebb \u00e1tszervez\u00e9s t\u00f6rt\u00e9njen, \u00e9s a adatok rendezettebben legyenek? Ha nincsenek tartom\u00e1nyos lek\u00e9rdez\u00e9sek, \u00e9s m\u00e9g csak egy primer kulcsot sem tudunk v\u00e1lasztani, akkor \u00e9rdemes-e a d\u00e1tumot a primer kulcsba tenni?<\/em><\/p>\n<p><\/p>\n<p>Igen.<\/p>\n<p><\/p>\n<p>Lehet, hogy van \u00e9rtelme a primer kulcsba tenni egy olyan mez\u0151t, amely alapj\u00e1n az adatok jobban t\u00f6m\u00f6r\u00edthet\u0151k, ha azokat aszerint rendezik. P\u00e9ld\u00e1ul a felhaszn\u00e1l\u00f3 azonos\u00edt\u00f3ja. A felhaszn\u00e1l\u00f3 p\u00e9ld\u00e1ul ugyanarra az oldalra l\u00e1togat. Ebben az esetben tedd bele a felhaszn\u00e1l\u00f3 azonos\u00edt\u00f3j\u00e1t \u00e9s az id\u0151t. \u00c9s akkor az adatok jobban t\u00f6m\u00f6r\u00edthet\u0151k. A d\u00e1tumot illet\u0151en, ha val\u00f3ban nincsenek \u00e9s soha nem is voltak tartom\u00e1nyos lek\u00e9rdez\u00e9sek a d\u00e1tumokkal kapcsolatban, akkor nem sz\u00fcks\u00e9ges a d\u00e1tumot a primer kulcsba tenni. <\/p>\n<p><\/p>\n<p><em>Rendben, nagyon k\u00f6sz\u00f6n\u00f6m!<\/em><\/p>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/514840\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91439,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47A ClickHouse hat\u00e9kony haszn\u00e1lata. Alekszej Milovidov (Yandex) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-13T17:42:36+00:00","article:modified_time":"2020-08-13T17:42:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91438","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:27:23","updated":"2022-09-28 17:25:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/91438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=91438"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/91438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/91439"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=91438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=91438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=91438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}