{"id":80775,"date":"2020-05-08T13:42:47","date_gmt":"2020-05-08T11:42:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah"},"modified":"2020-05-08T13:42:47","modified_gmt":"2020-05-08T11:42:47","slug":"clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","title":{"rendered":"ClickHouse pre pokro\u010dil\u00fdch pou\u017e\u00edvate\u013eov v ot\u00e1zkach a odpovediach","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>V apr\u00edli sa in\u017einieri Avita chystali na online stretnutie s hlavn\u00fdm v\u00fdvoj\u00e1rom ClickHouse Alexejom Milovidovom a Kirillom Shvakovom, Golang v\u00fdvoj\u00e1rom z firmy Integros. Diskutovali sme o tom, ako pou\u017e\u00edvame syst\u00e9m spr\u00e1vy datab\u00e1z a ak\u00e9 probl\u00e9my n\u00e1m vznikaj\u00fa. <\/p>\n<p><\/p>\n<p>Na z\u00e1klade stretnutia sme zostavili \u010dl\u00e1nok s odpove\u010fami expertov na na\u0161e a div\u00e1cke ot\u00e1zky oh\u013eadom z\u00e1loh, reshardingu \u00fadajov, extern\u00fdch slovn\u00edkov, Golang ovl\u00e1da\u010da a aktualiz\u00e1ci\u00ed verzi\u00ed ClickHouse. M\u00f4\u017ee by\u0165 u\u017eito\u010dn\u00fd pre v\u00fdvoj\u00e1rov, ktor\u00ed u\u017e akt\u00edvne pracuj\u00fa s DB \u201eYandexu\u201c a zauj\u00edmaj\u00fa sa o jej s\u00fa\u010dasnos\u0165 a bud\u00facnos\u0165. Odpovede Alexeja Milovidova s\u00fa predvolen\u00e9, pokia\u013e nie je uveden\u00e9 inak. <\/p>\n<p><\/p>\n<p>Pozor, pod t\u00fdmto niektor\u00fdmi textami sa nach\u00e1dza ve\u013ea textu. D\u00fafame, \u017ee obsah s ot\u00e1zkami v\u00e1m pom\u00f4\u017ee sa orientova\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse pre pokro\u010dil\u00fdch pou\u017e\u00edvate\u013eov v ot\u00e1zkach a odpovediach\" src=\"\/wp-content\/uploads\/2020\/05\/242b1d8d002fe115614435c242297fd2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Obsah<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#old-data\">ClickHouse sa neust\u00e1le aktualizuje, zatia\u013e \u010do na\u0161e \u00fadaje nie. \u010co s t\u00fdm robi\u0165?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#backup-best-practicies\">Ak\u00e9 s\u00fa v s\u00fa\u010dasnosti najlep\u0161ie praktiky pre z\u00e1lohovanie \u00fadajov z ClickHouse?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#replication\">Bude mo\u017en\u00e9 organizova\u0165 kontrolovan\u00e9 oneskorenie replik v polo\u017ek\u00e1ch?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#soooo-changeable\">\u010co robi\u0165, ak sa zmenila \u0161trukt\u00fara tabu\u013eky?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-best-practices\">Ak\u00e9 s\u00fa v s\u00fa\u010dasnosti najlep\u0161ie praktiky v reshardingu \u00fadajov?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#clickhouse-copier\">V ClickHouse je n\u00e1stroj clickhouse-copier. M\u00f4\u017eete n\u00e1m o \u0148om poveda\u0165?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-tool\">Mali ste pilotn\u00fa verziu, ktor\u00e1 sa naz\u00fdvala resharding. \u010co sa s \u0148ou stalo?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#move-to-slow-disk\">M\u00f4\u017ee by\u0165 mo\u017en\u00e9 zl\u00fa\u010di\u0165 v\u0161etky \u010dasti \u00fadajov dokopy pred presunom na pomal\u00e9 disky?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#up-to-date\">Ako prejs\u0165 na nov\u00e9 verzie ClickHouse, ak nie je mo\u017en\u00e9 vopred skontrolova\u0165 kompatibilitu?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#kill-query\">Kill query by mal zabi\u0165 po\u017eiadavky, ale nerob\u00ed to. Pre\u010do?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reading-time\">Ako vypo\u010d\u00edta\u0165 \u010das odpovede pri \u010d\u00edtacej z\u00e1\u0165a\u017ei?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pimp-my-clickhouse\">\u010co upravi\u0165 v ClickHouse, aby bolo vo vyrovn\u00e1vacej pam\u00e4ti viac \u00fadajov?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#storage-configuration\">Ako nastavi\u0165 storage_configuration pre uchov\u00e1vanie v pam\u00e4ti?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#low-cardinality\">Do ak\u00e9ho po\u010dtu unik\u00e1tnych hodn\u00f4t je Low Cardinality efekt\u00edvny?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#fulltext-search\">Ak\u00e9 s\u00fa najlep\u0161ie praktiky pre fulltextov\u00e9 vyh\u013ead\u00e1vanie v tabu\u013eke s piatimi miliardami riadkov?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#hello-and-welcome\">Ako lep\u0161ie zorganizova\u0165 pr\u00edstup do ClickHouse pre ve\u013ek\u00e9 mno\u017estvo pou\u017e\u00edvate\u013eov?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#smorgasbord\">Je mo\u017en\u00e9 odovzda\u0165 v\u00fdsledky jedn\u00e9ho dotazu desiatim klientom?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#asynchronous\">Ako nalo\u017ei\u0165 s asynchr\u00f3nnymi oper\u00e1ciami a materializovan\u00fdmi poh\u013eadmi?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dashboard\">V ClickHouse je mno\u017estvo protokolov. Ako m\u00f4\u017eem vidie\u0165 v\u0161etko, \u010do sa deje so serverom v danom momente?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zen\">Ak\u00fdm sp\u00f4sobom ovplyvni\u0165 mergovanie, aby server nespadal do OOM?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#go\">Ak\u00fdm sp\u00f4sobom bude prebieha\u0165 v\u00fdvoj Golang ovl\u00e1da\u010da pre ClickHouse?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#lazy-load\">Extern\u00fd slovn\u00edk sa nezobraz\u00ed po re\u0161tarte so zapnutou nastaven\u00edm lazy_load. \u010co robi\u0165?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reload-dictionaries\">Ako sa vysporiada\u0165 s t\u00fdm, \u017ee system reload dictionaries nenahr\u00e1va \u017eiaden z mnoh\u00fdch slovn\u00edkov, ak aspo\u0148 jeden z nich spadne s chybou?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#connection\">Existuje sp\u00f4sob, ako konfigurova\u0165 pr\u00edstupov\u00e9 \u00fadaje v&nbsp;konfigura\u010dnom s\u00fabore ClickHouse, ale nezverejni\u0165 ich pri&nbsp;chybn\u00fdch hl\u00e1seniach?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zoom-backgrounds\">Bonus: pozadia pre Zoom z&nbsp;ve\u010dierkov<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p>Ak sa v\u00e1m nechce \u010d\u00edta\u0165 text, m\u00f4\u017eete si pozrie\u0165 z\u00e1znam posed\u00e1vania <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=n1tm4j4W8ZQ&amp;t=8147s\">na&nbsp;na\u0161om youtube kan\u00e1li<\/a><\/noindex>. \u010casov\u00e9 k\u00f3dy \u2013 v&nbsp;prvom koment\u00e1ri pod&nbsp;videom.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"anchorold-dataanchorclickhouse-postoyanno-obnovlyaetsya-a-nashi-dannyenbsp-net-chto-snbspetim-delat\"><noindex><a rel=\"nofollow\" name=\"old-data\"><\/a><\/noindex>ClickHouse sa neust\u00e1le aktualizuje, ale na\u0161e \u00fadaje&nbsp;\u2014 nie. \u010co s&nbsp;t\u00fdm robi\u0165?<\/h2>\n<p><\/p>\n<blockquote><p>ClickHouse sa neust\u00e1le aktualizuje, ale na\u0161e \u00fadaje, ktor\u00e9 boli spracovan\u00e9 pomocou optimaliz\u00e1cie final, sa neaktualizuj\u00fa a s\u00fa ulo\u017een\u00e9 v&nbsp;z\u00e1lohe. <\/p>\n<p>Predpokladajme, \u017ee sme mali nejak\u00fd probl\u00e9m a \u00fadaje sa stratili. Rozhodli sme sa obnovi\u0165, a uk\u00e1zalo sa, \u017ee star\u00e9 part\u00edcie, ktor\u00e9 s\u00fa ulo\u017een\u00e9 na&nbsp;z\u00e1lohov\u00fdch serveroch, sa ve\u013emi l\u00ed\u0161ia od&nbsp;aktu\u00e1lnej verzie ClickHouse. \u010co robi\u0165 v&nbsp;takej situ\u00e1cii, a je to v\u00f4bec mo\u017en\u00e9?<\/p><\/blockquote>\n<p>Situ\u00e1cia, pri&nbsp;ktorej ste obnovili \u00fadaje zo&nbsp;z\u00e1lohy v&nbsp;starom form\u00e1te, a na&nbsp;nov\u00fa verziu sa nepripojia, nie je mo\u017en\u00e1. Sna\u017e\u00edme sa, aby form\u00e1t \u00fadajov v&nbsp;ClickHouse v\u017edy zost\u00e1val sp\u00e4tne kompatibiln\u00fd. To je ove\u013ea d\u00f4le\u017eitej\u0161ie, ako sp\u00e4tna kompatibilita funkcie, ak sa zmenilo spr\u00e1vanie nejakej zriedkavo pou\u017e\u00edvan\u00e9 funkcie. \u00dadaje ulo\u017een\u00e9 na&nbsp;disku by mala nov\u00e1 verzia ClickHouse v\u017edy vedie\u0165 \u010d\u00edta\u0165. To je z\u00e1kon. <\/p>\n<p><\/p>\n<h2 id=\"anchorbackup-best-practiciesanchorkakie-luchshie-praktiki-est-nanbspdannyy-moment-ponbsprezervnomu-kopirovaniyu-dannyh-iznbspclickhouse\"><noindex><a rel=\"nofollow\" name=\"backup-best-practicies\"><\/a><\/noindex>Ak\u00e9 s\u00fa v s\u00fa\u010dasnosti najlep\u0161ie praktiky pre z\u00e1lohovanie \u00fadajov z ClickHouse?<\/h2>\n<p><\/p>\n<blockquote><p>Ako robi\u0165 z\u00e1lohy s&nbsp;oh\u013eadom na to, \u017ee m\u00e1me oper\u00e1cie optimaliz\u00e1cie final, obrovsk\u00fa datab\u00e1zu na&nbsp;terabajty, a \u00fadaje, ktor\u00e9 sa aktualizuj\u00fa, predpokladajme, za&nbsp;posledn\u00e9 tri dni, a \u010falej s&nbsp;nimi \u017eiadne proced\u00fary neprebiehaj\u00fa? <\/p>\n<p>M\u00f4\u017eeme vyvin\u00fa\u0165 vlastn\u00e9 rie\u0161enie a na&nbsp;bash nap\u00edsa\u0165: zachyt\u00e1vanie z\u00e1loh takto a takto. Mo\u017eno \u017eiadne vynaliezanie nepotrebujeme, a bicykel je u\u017e d\u00e1vno vyn\u00e1jden\u00fd? <\/p><\/blockquote>\n<p>Na&nbsp;za\u010diatku \u010do sa t\u00fdka najlep\u0161\u00edch prakt\u00edk. Moji kolegovia v\u017edy odpor\u00fa\u010daj\u00fa pri&nbsp;ot\u00e1zkach o&nbsp;z\u00e1loh\u00e1ch pripomen\u00fa\u0165 slu\u017ebu 'Yandex.Cloud', kde je t\u00e1to \u00faloha u\u017e vyrie\u0161en\u00e1. Tak\u017ee ju vyu\u017e\u00edvajte, ak je to mo\u017en\u00e9. <\/p>\n<p><\/p>\n<p>\u00dapln\u00e9 rie\u0161enie, ktor\u00e9 by bolo na&nbsp;sto percent integrovan\u00e9 v&nbsp;ClickHouse, pre z\u00e1lohy neexistuje. Existuj\u00fa niektor\u00e9 \u0161abl\u00f3ny, ktor\u00e9 sa daj\u00fa vyu\u017ei\u0165. Aby ste z\u00edskali \u00fapln\u00e9 rie\u0161enie, budete musie\u0165 bu\u010f tro\u0161ku ru\u010dne pracova\u0165, alebo urobi\u0165 ob\u00e1lky vo&nbsp;forme skriptov.<\/p>\n<p><\/p>\n<p>Za\u010dnem s&nbsp;najjednoduch\u0161\u00edmi rie\u0161eniami a skon\u010d\u00edm s&nbsp;komplexnej\u0161\u00edmi v&nbsp;z\u00e1vislosti od objemu d\u00e1t a ve\u013ekosti klastru. \u010c\u00edm v\u00e4\u010d\u0161\u00ed klaster, t\u00fdm zlo\u017eitej\u0161ie rie\u0161enie.<\/p>\n<p><\/p>\n<p>Ak tabu\u013eka s&nbsp;d\u00e1tami zaber\u00e1 len nieko\u013eko gigabajtov, z\u00e1lohu m\u00f4\u017eete vykona\u0165 takto: <\/p>\n<p><\/p>\n<ol>\n<li>Ulo\u017ei\u0165 defin\u00edcie tabuliek, teda metadata \u2014 <strong>show create table<\/strong>.<\/li>\n<li>Vytvorte dump pomocou klienta ClickHouse \u2014 <strong>select<\/strong> * <strong>from table<\/strong> do s\u00faboru. Pod\u013ea predvolen\u00e9ho nastavenia z\u00edskate s\u00fabor vo form\u00e1te TabSeparated. Ak chcete efekt\u00edvnej\u0161ie, m\u00f4\u017eete pou\u017ei\u0165 form\u00e1t Native. <\/li>\n<\/ol>\n<p><\/p>\n<p>Ak objem d\u00e1t je v\u00e4\u010d\u0161\u00ed, z\u00e1loha zaberie viac \u010dasu a miesta. Toto sa naz\u00fdva logick\u00e1 z\u00e1loha, nie je viazan\u00e1 na form\u00e1t d\u00e1t ClickHouse. Ak existuje, v&nbsp;najextr\u00e9mnej\u0161\u00edch pr\u00edpadoch m\u00f4\u017eete vzia\u0165 z\u00e1lohu a na\u010d\u00edta\u0165 ju do MySQL pre obnovenie. <\/p>\n<p><\/p>\n<p>Pre pokro\u010dilej\u0161ie pr\u00edpady m\u00e1 ClickHouse zabudovan\u00fa mo\u017enos\u0165 vytvori\u0165 snapshot part\u00edci\u00ed v&nbsp;lok\u00e1lnom s\u00faborovom syst\u00e9me. T\u00e1to funkcia je dostupn\u00e1 formou dotazu <strong>alter table freeze partition<\/strong>. Alebo jednoducho <strong>alter table freeze<\/strong> \u2014 to je sn\u00edmka celej tabu\u013eky. <\/p>\n<p><\/p>\n<p>Snapshot bude vytvoren\u00fd konzistentne pre&nbsp;jednu tabu\u013eku na&nbsp;jednom shardu, to znamen\u00e1, \u017ee nie je mo\u017en\u00e9 vytvori\u0165 konzistentn\u00fd snapshot cel\u00e9ho klastru t\u00fdmto sp\u00f4sobom. Av\u0161ak pre&nbsp;v\u00e4\u010d\u0161inu \u00faloh nie je tak\u00e1 potreba, a sta\u010d\u00ed na&nbsp; ka\u017edom sharde vykona\u0165 dotaz a z\u00edska\u0165 konzistentn\u00fd snapshot. Vytv\u00e1ra sa vo forme hardlinkov, a preto nezaber\u00e1 \u010fal\u0161ie miesto. Potom tento snapshot kop\u00edrujete na&nbsp;z\u00e1lo\u017en\u00fd server alebo do \u00falo\u017eiska, ktor\u00e9 pou\u017e\u00edvate pre&nbsp;z\u00e1lohy.<\/p>\n<p><\/p>\n<p>Obnovi\u0165 tak\u00fato z\u00e1lohu je dos\u0165 jednoduch\u00e9. Prv\u00e9&nbsp;\u2014 vytvor\u00edte tabu\u013eky pod\u013ea existuj\u00facich defin\u00edci\u00ed tabuliek. \u010ealej skop\u00edrujete ulo\u017een\u00e9 snapshoty part\u00edci\u00ed do Directory-Detached pre&nbsp;dan\u00e9 tabu\u013eky a vykon\u00e1te dotaz <strong>attach partition<\/strong>. Toto rie\u0161enie je vhodn\u00e9 pre&nbsp;naozaj v\u00e1\u017ene objemy d\u00e1t. <\/p>\n<p><\/p>\n<p>Niekedy je potrebn\u00e9 nie\u010do e\u0161te sofistikovanej\u0161ie&nbsp;\u2014 v&nbsp;t\u00fdch pr\u00edpadoch, ke\u010f m\u00e1te desiatky alebo dokonca stovky terabajtov na&nbsp;ka\u017edom serveri a stovky serverov. Tu existuje rie\u0161enie, ktor\u00e9 som si v\u0161imol u&nbsp;kolegov z&nbsp;\u201eYandex.Metrix\u201c. Neodpor\u00fa\u010dal by som ho ka\u017ed\u00e9mu \u2014 pre\u010d\u00edtajte si a sami sa rozhodnite, \u010di je vhodn\u00e9 alebo nie. <\/p>\n<p><\/p>\n<p>Najprv je potrebn\u00e9 vytvori\u0165 nieko\u013eko serverov s ve\u013ek\u00fdmi diskov\u00fdmi poli\u010dkami. Potom na t\u00fdchto serveroch nastavi\u0165 nieko\u013eko serverov ClickHouse a nakonfigurova\u0165 ich tak, aby fungovali ako \u010fal\u0161ia replik\u00e1cia pre tie ist\u00e9 shard. A \u010falej pou\u017e\u00edva\u0165 na t\u00fdchto serveroch s\u00faborov\u00fd syst\u00e9m alebo nejak\u00fd n\u00e1stroj, ktor\u00fd umo\u017e\u0148uje vytv\u00e1ra\u0165 snapshoty. Existuj\u00fa dve mo\u017enosti. Prv\u00e1 mo\u017enos\u0165 s\u00fa LVM snapshoty, druh\u00e1 mo\u017enos\u0165 je ZFS na Linuxe. <\/p>\n<p><\/p>\n<p>Po tom ka\u017ed\u00fd de\u0148 je potrebn\u00e9 vytvori\u0165 snapshot, ktor\u00fd bude le\u017ea\u0165 a zaber\u00e1 nejak\u00e9 miesto. Samozrejme, ak sa \u00fadaje menia, \u010dasom sa objem miesta bude zvy\u0161ova\u0165. Tento snapshot je mo\u017en\u00e9 obnovi\u0165 kedyko\u013evek a obnovi\u0165 d\u00e1ta, tak\u00e9to zvl\u00e1\u0161tne rie\u0161enie. Navy\u0161e je potrebn\u00e9 obmedzi\u0165 tieto repliky v konfigur\u00e1cii, aby sa nepok\u00fa\u0161ali sta\u0165 sa l\u00eddrami.<\/p>\n<p><\/p>\n<h2 id=\"anchorreplicationanchormozhno-li-budet-organizovat-kontroliruemoe-otstavanie-replik-vnbspvalah\"><noindex><a rel=\"nofollow\" name=\"replication\"><\/a><\/noindex>Bude mo\u017en\u00e9 organizova\u0165 kontrolovan\u00e9 oneskorenie replik v polo\u017ek\u00e1ch?<\/h2>\n<p><\/p>\n<blockquote><p>Tento rok pl\u00e1nujete robi\u0165 vlny v ClickHouse. Bude mo\u017en\u00e9 v nich usporiada\u0165 kontrolovan\u00e9 oneskorenie replik? Radi by sme sa s jeho pomocou ochr\u00e1nili od negat\u00edvnych scen\u00e1rov s alternat\u00edvami a in\u00fdmi zmenami. <\/p>\n<p>M\u00f4\u017ee sa urobi\u0165 nejak\u00fd rollback pre alternat\u00edvy? Napr\u00edklad v existuj\u00facej vlne vzia\u0165 a poveda\u0165, \u017ee do tohto bodu uplatnia sa zmeny, a od tohto bodu sa prestan\u00fa uplat\u0148ova\u0165?<\/p>\n<p>Ak do n\u00e1\u0161ho klastru pri\u0161la t\u00edm a rozbila ho, m\u00e1me podmienkov\u00fa replik\u00e1ciu s oneskoren\u00edm jednej hodiny, kde m\u00f4\u017eeme poveda\u0165, \u017ee teraz pou\u017eijeme pr\u00e1ve ju, ale posledn\u00fdch desa\u0165 min\u00fat zmien v nej nebudeme aplikova\u0165? <\/p><\/blockquote>\n<p>Na za\u010diatok o kontrolovanom oneskoren\u00ed replik. Tak\u00fdto po\u017eiadavok od pou\u017e\u00edvate\u013eov pri\u0161iel, a vytvorili sme probl\u00e9m na GitHub-e s prosbou: \u201eAk to niekto potrebuje, dajte like, dajte srdce\u201c. Nikto nedal, a probl\u00e9m bol uzavret\u00fd. Napriek tomu, u\u017e teraz je mo\u017en\u00e9 z\u00edska\u0165 tak\u00fato mo\u017enos\u0165 nastaven\u00edm ClickHouse. Pravda, len od verzie 20.3.<\/p>\n<p><\/p>\n<p>ClickHouse neust\u00e1le na pozad\u00ed vykon\u00e1va zl\u00fa\u010denie d\u00e1t \u2013 merge. Ke\u010f je merge vykonan\u00fd, niektor\u00e1 sada kusov d\u00e1t je nahraden\u00e1 v\u00e4\u010d\u0161\u00edm kusom. Pritom kusy d\u00e1t, ktor\u00e9 boli predt\u00fdm, na disku zost\u00e1vaj\u00fa na ur\u010dit\u00fd \u010das.<\/p>\n<p><\/p>\n<p>Po prv\u00e9, zost\u00e1vaj\u00fa uchov\u00e1van\u00e9, k\u00fdm s\u00fa tu dotazy select, ktor\u00e9 ich pou\u017e\u00edvaj\u00fa, aby sa zabezpe\u010dila neblokuj\u00faca pr\u00e1ca. Dotazy select bez probl\u00e9mov \u010d\u00edtaj\u00fa zo star\u0161\u00edch blokov.<\/p>\n<p><\/p>\n<p>Po druh\u00e9, existuje aj \u010dasov\u00fd prah - star\u00e9 bloky \u00fadajov zost\u00e1vaj\u00fa na disku osem min\u00fat. T\u00fdchto osem min\u00fat sa d\u00e1 nastavi\u0165 a dokonca pred\u013a\u017ei\u0165 a\u017e na jeden de\u0148. To si vy\u017eaduje miesto na disku: v z\u00e1vislosti od toku \u00fadajov sa m\u00f4\u017ee sta\u0165, \u017ee za posledn\u00fd de\u0148 sa \u00fadaje nielen zdvojn\u00e1sobia, ale m\u00f4\u017ee ich by\u0165 a\u017e p\u00e4\u0165kr\u00e1t viac. Ale pri v\u00e1\u017enych probl\u00e9moch m\u00f4\u017eete zastavi\u0165 server ClickHouse a v\u0161etko vyrie\u0161i\u0165.<\/p>\n<p><\/p>\n<p>Teraz je ot\u00e1zka, ako to chr\u00e1ni pred altermi. Tu sa oplat\u00ed pozrie\u0165 hlb\u0161ie, preto\u017ee v star\u00fdch verzi\u00e1ch ClickHouse alter fungoval tak, \u017ee priamo menil bloky. Existuje blok \u00fadajov s nejak\u00fdmi s\u00fabormi, a my rob\u00edme napr\u00edklad, <strong>alter drop column<\/strong>. Potom sa tento st\u013apec fyzicky odstr\u00e1ni zo v\u0161etk\u00fdch blokov.<\/p>\n<p><\/p>\n<p>Ale od verzie 20.3 bol mechanizmus alterov \u00faplne zmenen\u00fd a teraz s\u00fa bloky \u00fadajov v\u017edy nemenn\u00e9. Ani sa nemenia - alty teraz funguj\u00fa podobne ako mergy. Namiesto toho, aby sme menili blok na mieste, vytv\u00e1rame nov\u00fd. V novom bloku s\u00fa s\u00fabory, ktor\u00e9 sa nezmenili, hardlinkmi a ak odstr\u00e1nime nejak\u00fd st\u013apec, jednoducho nebude v novom bloku. Star\u00fd blok sa predvolene odstr\u00e1ni po \u00f4smich min\u00fatach a tu m\u00f4\u017eete upravi\u0165 nastavenia uveden\u00e9 vy\u0161\u0161ie. <\/p>\n<p><\/p>\n<p>Obdobne to plat\u00ed aj pre alteri typu mut\u00e1ci\u00ed. Ke\u010f rob\u00edte <strong>alter delete<\/strong> alebo <strong>alter update<\/strong>, nemen\u00ed sa kus, ale vytv\u00e1ra sa nov\u00fd. A potom sa vyma\u017ee star\u00fd.<\/p>\n<p><\/p>\n<h2 id=\"anchorsoooo-changeableanchorkak-byt-esli-struktura-tablicy-pomenyalas\"><noindex><a rel=\"nofollow\" name=\"soooo-changeable\"><\/a><\/noindex>\u010co robi\u0165, ak sa zmenila \u0161trukt\u00fara tabu\u013eky?<\/h2>\n<p><\/p>\n<blockquote><p>Ako obnovi\u0165 z\u00e1lohu, ktor\u00e1 bola vytvoren\u00e1 so starou sch\u00e9mou? A druh\u00e1 ot\u00e1zka t\u00fdkaj\u00faca sa pr\u00edpadu so snapshotmi a prostriedkami s\u00faborov\u00e9ho syst\u00e9mu. Je tu Btrfs vhodn\u00e9 namiesto ZFS na Linux LVM?<\/p><\/blockquote>\n<p>Ak rob\u00edte <strong>attach partition<\/strong> partition with a different structure, ClickHouse v\u00e1m povie, \u017ee to nie je povolen\u00e9. Rie\u0161enie je tak\u00e9. Prv\u00e9 - vytvori\u0165 do\u010dasn\u00fa tabu\u013eku typu MergeTree so starou \u0161trukt\u00farou, pripoji\u0165 tam \u00fadaje pomocou attach, vykona\u0165 dotaz alter. Potom m\u00f4\u017eete bu\u010f skop\u00edrova\u0165 alebo prenies\u0165 tieto \u00fadaje a znovu urobi\u0165 attach, alebo pou\u017ei\u0165 dotaz <strong>alter table move partition<\/strong>.<\/p>\n<p><\/p>\n<p>Teraz druh\u00e1 ot\u00e1zka \u2014 je mo\u017en\u00e9 pou\u017ei\u0165 Btrfs. Na za\u010diatok, ak m\u00e1te LVM, posta\u010duj\u00fa LVM sn\u00edmky, a s\u00faborov\u00fd syst\u00e9m m\u00f4\u017ee by\u0165 aj ext4, na tom nez\u00e1le\u017e\u00ed. Pri Btrfs v\u0161etko z\u00e1vis\u00ed od v\u00e1\u0161ho sk\u00fasenosti s jeho pou\u017e\u00edvan\u00edm. Ide o zrel\u00fd s\u00faborov\u00fd syst\u00e9m, ale st\u00e1le existuj\u00fa ur\u010dit\u00e9 obavy o tom, ako v\u0161etko funguje v praxi v konkr\u00e9tnom scen\u00e1ri. Odpor\u00fa\u010dal by som to nepou\u017e\u00edva\u0165, ak nem\u00e1te Btrfs v produkcii.<\/p>\n<p><\/p>\n<h2 id=\"anchorresharding-best-practicesanchorkakie-seychas-luchshie-praktiki-vnbspreshardinge-dannyh\"><noindex><a rel=\"nofollow\" name=\"resharding-best-practices\"><\/a><\/noindex>Ak\u00e9 s\u00fa v s\u00fa\u010dasnosti najlep\u0161ie praktiky v reshardingu \u00fadajov?<\/h2>\n<p><\/p>\n<p>Ot\u00e1zka o pre\u0161ardovan\u00ed je zlo\u017eit\u00e1 a mnohostrann\u00e1. Tu je mo\u017en\u00e9 odpoveda\u0165 hne\u010f nieko\u013ek\u00fdmi sp\u00f4sobmi. M\u00f4\u017eeme sa pozrie\u0165 z jednej strany a poveda\u0165 \u2014 v ClickHouse neexistuje zabudovan\u00e1 mo\u017enos\u0165 pre\u0161ardovania. Ale ob\u00e1vam sa, \u017ee t\u00e1to odpove\u010f nikoho neuspokoj\u00ed. Preto m\u00f4\u017eeme z druhej strany poveda\u0165, \u017ee v ClickHouse existuje mnoho sp\u00f4sobov, ako pre\u0161ardova\u0165 d\u00e1ta. <\/p>\n<p><\/p>\n<p>Ak sa skon\u010d\u00ed miesto na klastri alebo ak sa s n\u00edm nedok\u00e1\u017eete vyrovna\u0165 s n\u00e1kladom, prid\u00e1te nov\u00e9 servery. Ale tieto servery s\u00fa predvolene pr\u00e1zdne, nemaj\u00fa \u017eiadne d\u00e1ta a nenes\u00fa \u017eiadnu z\u00e1\u0165a\u017e. Mus\u00edte presun\u00fa\u0165 d\u00e1ta, aby sa rovnomerne rozlo\u017eili po novom, roz\u0161\u00edrenom klastri.<\/p>\n<p><\/p>\n<p>Prv\u00fd sp\u00f4sob, ako to mo\u017eno urobi\u0165, je skop\u00edrova\u0165 \u010das\u0165 part\u00edci\u00ed na nov\u00e9 servery pomocou dotazu. <strong>alter table fetch partition<\/strong>. Napr\u00edklad, ak ste mali part\u00edcie pod\u013ea mesiacov, a vezmete prv\u00fd mesiac roku 2017 a skop\u00edrujete na nov\u00fd server, potom - tret\u00ed mesiac skop\u00edrujete na nejak\u00fd \u010fal\u0161\u00ed nov\u00fd server. A tak to rob\u00edte, k\u00fdm to nebude viac-menej rovnomern\u00e9.<\/p>\n<p><\/p>\n<p>Presun mo\u017eno uskuto\u010dni\u0165 iba pre tie part\u00edcie, ktor\u00e9 sa nemenia pri z\u00e1pise. Pre \u010derstv\u00e9 part\u00edcie je potrebn\u00e9 z\u00e1pis vypn\u00fa\u0165, preto\u017ee ich presun nie je atom\u00e1rny. Inak dostanete duplik\u00e1ty alebo medzery v d\u00e1tach. Napriek tomu je tento sp\u00f4sob praktick\u00fd a funguje dostato\u010dne efekt\u00edvne. Po sieti s\u00fa pren\u00e1\u0161an\u00e9 u\u017e hotov\u00e9 komprimovan\u00e9 part\u00edcie, teda d\u00e1ta sa nepren\u00e1\u0161aj\u00fa a neprekodov\u00e1vaj\u00fa.<\/p>\n<p><\/p>\n<p>Tento zp\u016fsob m\u00e1 jednu nev\u00fdhodu, a to z\u00e1vis\u00ed na sch\u00e9matu shardov\u00e1n\u00ed, na kter\u00e9 jste se spol\u00e9hali, jak\u00fd byl v\u00e1\u0161 kl\u00ed\u010d shardov\u00e1n\u00ed. Ve va\u0161em p\u0159\u00edkladu pro p\u0159\u00edpad s metrikami je kl\u00ed\u010d shardov\u00e1n\u00ed hash z cesty. Kdy\u017e prov\u00e1d\u00edte select v distribuovan\u00e9 tabulce, b\u011b\u017e\u00ed to okam\u017eit\u011b na v\u0161echny shardy clusteru a z\u00edsk\u00e1v\u00e1 data odtud. <\/p>\n<p><\/p>\n<p>To znamen\u00e1, \u017ee pro v\u00e1s vlastn\u011b nez\u00e1le\u017e\u00ed na tom, jak\u00e1 data se na jak\u00e9m shardu nach\u00e1zej\u00ed. Hlavn\u00ed je, \u017ee data podle jedn\u00e9 cesty se nach\u00e1zej\u00ed na jednom shardu, a na tom, na kter\u00e9m p\u0159esn\u011b, nez\u00e1le\u017e\u00ed. V takov\u00e9m p\u0159\u00edpad\u011b se skv\u011ble hod\u00ed p\u0159enos hotov\u00fdch partition, proto\u017ee p\u0159i select dotazech tak\u00e9 \u2014 a\u0165 u\u017e p\u0159ed shards nebo po, sch\u00e9ma hodnoty nijak nehraje roli \u2014 obdr\u017e\u00edte \u00fapln\u00e1 data.<\/p>\n<p><\/p>\n<p>Ale existuj\u00ed p\u0159\u00edpady, kter\u00e9 jsou slo\u017eit\u011bj\u0161\u00ed. Pokud na \u00farovni logiky aplikace po\u010d\u00edt\u00e1te se speci\u00e1ln\u00edm sch\u00e9matem shardov\u00e1n\u00ed, \u017ee tento klient je um\u00edst\u011bn na ur\u010dit\u00e9m shardu, a dotaz m\u016f\u017ee b\u00fdt okam\u017eit\u011b odesl\u00e1n tam, a ne do distribuovan\u00e9 tabulky. Nebo pou\u017e\u00edv\u00e1te dostate\u010dn\u011b novou verzi ClickHouse a zahrnuli jste nastaven\u00ed. <strong>optimize skip unused shards<\/strong>. V tomto p\u0159\u00edpad\u011b, b\u011bhem dotazu select, bude v\u00fdraz v sekci where analyzov\u00e1n, a bude vypo\u010dteno, na kter\u00e9 shardy je t\u0159eba j\u00edt podle sch\u00e9matu shardov\u00e1n\u00ed. To funguje za podm\u00ednky, \u017ee data jsou rozlo\u017eena pr\u00e1v\u011b podle tohoto sch\u00e9matu shardov\u00e1n\u00ed. Pokud jste je p\u0159ehodili ru\u010dn\u011b, shoda se m\u016f\u017ee zm\u011bnit.<\/p>\n<p><\/p>\n<p>Tak\u017ee, to je zp\u016fsob \u010d\u00edslo jedna. A \u010dek\u00e1m na va\u0161i odpov\u011b\u010f, zda tento zp\u016fsob vyhovuje, nebo jdeme d\u00e1l.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev, lead system administrator na Avito<\/strong>: Alexeji, zp\u016fsob, kter\u00fd jste zm\u00ednili, se nehod\u00ed p\u0159\u00edli\u0161 dob\u0159e, kdy\u017e je t\u0159eba rozlo\u017eit z\u00e1t\u011b\u017e i na \u010dten\u00ed. M\u016f\u017eeme vz\u00edt m\u011bs\u00ed\u010dn\u00ed partition a m\u016f\u017eeme p\u0159en\u00e9st p\u0159edchoz\u00ed m\u011bs\u00edc na jinou uzel, ale kdy\u017e p\u0159ijde dotaz na tato data, budeme zat\u011b\u017eovat pouze ji. A cht\u011blo by se zat\u011b\u017eovat cel\u00fd cluster, proto\u017ee jinak celou z\u00e1t\u011b\u017e na \u010dten\u00ed n\u011bjakou dobu zpracov\u00e1vaj\u00ed pouze dv\u011b shardy.<\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> Odpov\u011b\u010f zde je podivn\u00e1 \u2014 ano, \u0161patn\u011b, ale m\u016f\u017ee to proj\u00edt. Vysv\u011btl\u00edm, jak p\u0159esn\u011b. Je t\u0159eba se pod\u00edvat na sc\u00e9n\u00e1\u0159 z\u00e1t\u011b\u017ee, kter\u00fd jde za va\u0161imi daty. Pokud jsou to data monitorov\u00e1n\u00ed, t\u00e9m\u011b\u0159 jist\u011b lze \u0159\u00edci, \u017ee drtiv\u00e1 v\u011bt\u0161ina dotaz\u016f jde za \u010derstv\u00fdmi daty. <\/p>\n<p><\/p>\n<p>Nain\u0161talovali ste nov\u00e9 servery, preniesli star\u00e9 part\u00edcie, ale tie\u017e ste zmenili sp\u00f4sob, ak\u00fdm sa zapisuj\u00fa \u010derstv\u00e9 \u00fadaje. A \u010derstv\u00e9 \u00fadaje bud\u00fa rozlo\u017een\u00e9 po celom klasteri. Tak\u017ee u\u017e za p\u00e4\u0165 min\u00fat bud\u00fa dotazy za posledn\u00fdch p\u00e4\u0165 min\u00fat rovnomerne za\u0165a\u017eova\u0165 klaster, po dni dotazy za 24 hod\u00edn rovnomerne za\u0165a\u017eia klaster. A dotazy za predch\u00e1dzaj\u00faci mesiac, \u017eia\u013e, bud\u00fa smerova\u0165 len na \u010das\u0165 serverov klastera.<\/p>\n<p><\/p>\n<p>Ale \u010dasto nebudete ma\u0165 dotazy presne za febru\u00e1r 2019. Pravdepodobne, ak dotazy prich\u00e1dzaj\u00fa do roku 2019, bud\u00fa za cel\u00fd rok 2019 \u2014 za dlh\u00fd \u010dasov\u00fd interval, a nie za nejak\u00fd mal\u00fd rozsah. A tak\u00e9to dotazy bud\u00fa tie\u017e schopn\u00e9 rovnomerne za\u0165a\u017ei\u0165 klaster. Ale v celku m\u00e1te pravdu, je to tak\u00e9 ad hoc rie\u0161enie, ktor\u00e9 nie je \u00faplne rovnomern\u00e9.<\/p>\n<p><\/p>\n<p>M\u00e1m e\u0161te nieko\u013eko bodov na odpove\u010f na ot\u00e1zku. Jeden z nich sa t\u00fdka toho, ako p\u00f4vodne vytvori\u0165 sch\u00e9mu shardovania tak, aby prehodnocovanie sp\u00f4sobovalo menej probl\u00e9mov. To nie je v\u017edy mo\u017en\u00e9.<\/p>\n<p><\/p>\n<p>Napr\u00edklad m\u00e1te d\u00e1ta monitoringu. D\u00e1ta monitoringu rast\u00fa z troch d\u00f4vodov. Prv\u00fd \u2014 akumul\u00e1cia historick\u00fdch d\u00e1t. Druh\u00fd \u2014 rast prev\u00e1dzky. A tret\u00ed \u2014 zvy\u0161ovanie po\u010dtu vec\u00ed, ktor\u00e9 s\u00fa podliehaj\u00fa monitorovaniu. Objavuj\u00fa sa nov\u00e9 mikroservisy a metriky, ktor\u00e9 je potrebn\u00e9 uchov\u00e1va\u0165. <\/p>\n<p><\/p>\n<p>Mo\u017eno, \u017ee z nich najv\u00e4\u010d\u0161\u00ed rast s\u00favis\u00ed pr\u00e1ve s tret\u00edm d\u00f4vodom \u2014 zvy\u0161ovan\u00edm pou\u017e\u00edvania monitoringu. A v takom pr\u00edpade stoj\u00ed za to pozrie\u0165 sa na charakter za\u0165a\u017eenia, ak\u00e9 s\u00fa hlavn\u00e9 dotazy na select. Hlavn\u00e9 dotazy na select pravdepodobne p\u00f4jdu po niektorom podmno\u017estve metr\u00edk.<\/p>\n<p><\/p>\n<p>Napr\u00edklad, pou\u017eitie CPU na niektor\u00fdch serveroch nejakou slu\u017ebou. Zd\u00e1 sa, \u017ee existuje ur\u010dit\u00e9 podmno\u017estvo k\u013e\u00fa\u010dov, na z\u00e1klade ktor\u00fdch tieto d\u00e1ta z\u00edskavate. A samotn\u00fd dotaz na tieto d\u00e1ta pravdepodobne bude dos\u0165 jednoduch\u00fd a vykon\u00e1va sa za nieko\u013eko milisek\u00fand. Pou\u017e\u00edva sa pre monitorovacie slu\u017eby, pre dashboardy. D\u00fafam, \u017ee tomu spr\u00e1vne rozumiem.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Ide o to, \u017ee ve\u013emi \u010dasto odkazujeme na historick\u00e9 \u00fadaje, preto\u017ee v re\u00e1lnom \u010dase porovn\u00e1vame aktu\u00e1lnu situ\u00e1ciu s historick\u00fdmi. Pre n\u00e1s je d\u00f4le\u017eit\u00e9 ma\u0165 r\u00fdchly pr\u00edstup k ve\u013ek\u00e9mu objemu \u00fadajov a ClickHouse s t\u00fdm exceluje.<\/p>\n<p><\/p>\n<p>M\u00e1te pravdu, v\u00e4\u010d\u0161ina \u010d\u00edtac\u00edch dopytov, ktor\u00e9 za\u017e\u00edvame, prich\u00e1dza za posledn\u00fd de\u0148, rovnako ako ka\u017ed\u00e1 monitoringov\u00e1 s\u00fastava. Ale st\u00e1le je tu aj ve\u013ek\u00e1 z\u00e1\u0165a\u017e na historick\u00e9 \u00fadaje. T\u00e1 poch\u00e1dza predov\u0161etk\u00fdm zo syst\u00e9mu alertingu, ktor\u00fd ka\u017ed\u00fd tridsiaty sek\u00fand oslovuje ClickHouse: \u201eDaj mi \u00fadaje za posledn\u00fdch \u0161es\u0165 t\u00fd\u017ed\u0148ov. A teraz mi z nich vytvor nejak\u00fd k\u013azav\u00fd priemer a porovnaj aktu\u00e1lnu hodnotu s historickou.\u201c <\/p>\n<p><\/p>\n<p>Chcel by som poveda\u0165, \u017ee m\u00e1me pre tak\u00e9to ve\u013emi \u010derstv\u00e9 dopyty e\u0161te jednu mal\u00fa tabu\u013eku, v ktorej uchov\u00e1vame iba dva dni \u00fadajov, a hlavn\u00e9 dopyty id\u00fa do nej. Do ve\u013ekej shardovanej tabu\u013eky posielame len ve\u013ek\u00e9 historick\u00e9 dopyty.<\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> \u017dia\u013e, pre v\u00e1\u0161 scen\u00e1r to vyzer\u00e1, \u017ee je aplikovate\u013en\u00e9 zle, ale poviem v\u00e1m opis dvoch zl\u00fdch a komplikovan\u00fdch sch\u00e9m shardovania, ktor\u00e9 by sa nemali pou\u017e\u00edva\u0165, ale s\u00fa pou\u017e\u00edvan\u00e9 v slu\u017ebe mojich priate\u013eov. <\/p>\n<p><\/p>\n<p>Existuje hlavn\u00fd klaster so z\u00e1znamami \u201eYandex.Metriky\u201c. Z\u00e1znamy s\u00fa: zhliadnutia str\u00e1nok, kliknutia a prechody. V\u00e4\u010d\u0161ina dopytov sa t\u00fdka konkr\u00e9tneho webu. Otvor\u00edte si slu\u017ebu \u201eYandex.Metrika\u201c, m\u00e1te web \u2014 avito.ru, prejdete do spr\u00e1vy a ide dopyt pod\u013ea v\u00e1\u0161ho webu.<\/p>\n<p><\/p>\n<p>Ale s\u00fa aj \u010fal\u0161ie dopyty \u2014 analytick\u00e9 a glob\u00e1lne, ktor\u00e9 robia intern\u00ed analytici. Pre ka\u017ed\u00fd pr\u00edpad poznamen\u00e1m, \u017ee intern\u00ed analytici robia dopyty len na slu\u017eb\u00e1ch \u201eYandexu\u201c. Napriek tomu v\u0161ak aj slu\u017eby \u201eYandexu\u201c zaberaj\u00fa podstatn\u00fd podiel zo v\u0161etk\u00fdch \u00fadajov. Ide o dopyty nie na konkr\u00e9tne po\u010d\u00edtadl\u00e1, ale na \u0161ir\u0161iu filtr\u00e1ciu.<\/p>\n<p><\/p>\n<p>Ako organizova\u0165 \u00fadaje tak, aby v\u0161etko efekt\u00edvne fungovalo na jednom po\u010d\u00edtadle a aj glob\u00e1lne dopyty? Taktie\u017e je tu zlo\u017eitost, \u017ee po\u010det dopytov v ClickHouse na klaster \u201eMetriky\u201c je nieko\u013eko tis\u00edc za sekundu. Pri tom netrivi\u00e1lne dopyty, napr\u00edklad, nieko\u013eko tis\u00edc za sekundu, jeden server ClickHouse nezvl\u00e1da.<\/p>\n<p><\/p>\n<p>Ve\u013ekos\u0165 klastrov&nbsp;\u2014 nie\u010do cez \u0161eststo serverov. Ak by sme len natiahli nad&nbsp;tento klaster distribuovan\u00fa tabu\u013eku a posielali tam nieko\u013eko tis\u00edc po\u017eiadaviek, situ\u00e1cia by bola e\u0161te hor\u0161ia, ako keby sme ich posielali na&nbsp;jeden server. Na druhej strane, ak s\u00fa d\u00e1ta rovnomerne rozlo\u017een\u00e9 a my ich \u017eiadame zo&nbsp;v\u0161etk\u00fdch serverov, tak to hne\u010f zamie\u0148ame.<\/p>\n<p><\/p>\n<p>Existuje diametr\u00e1lne opa\u010dn\u00e1 varianta. Predstavte si, \u017ee budeme d\u00e1ta shardova\u0165 pod\u013ea&nbsp;webov\u00fdch str\u00e1nok, a po\u017eiadavka na&nbsp;jeden web p\u00f4jde na&nbsp;jeden shard. Teraz je klaster schopn\u00fd zvl\u00e1dnu\u0165 desa\u0165 tis\u00edc po\u017eiadaviek za sekundu, ale na&nbsp;jednom shardu m\u00f4\u017ee by\u0165 nejak\u00e1 po\u017eiadavka pr\u00edli\u0161 pomal\u00e1. U\u017e sa nebude \u0161k\u00e1lova\u0165 pod\u013ea priepustnosti. Najm\u00e4 ak ide o&nbsp;webov\u00fa str\u00e1nku avito.ru. Nebude to tajomstvom, ak poviem, \u017ee Avito&nbsp;\u2014 to je jedna z&nbsp;najnav\u0161tevovanej\u0161\u00edch str\u00e1nok v&nbsp;RUNE. A spracov\u00e1va\u0165 ju na&nbsp;jednom shardu by bolo \u0161ialenstvo.<\/p>\n<p><\/p>\n<p>Preto je sch\u00e9ma shardovania navrhnut\u00e1 sofistikovanej\u0161\u00edm sp\u00f4sobom. Cel\u00fd klaster je rozdelen\u00fd na&nbsp;ur\u010dit\u00fd po\u010det klasterkov, ktor\u00e9 naz\u00fdvame vrstvami. Vn\u00fatri ka\u017ed\u00e9ho klasterka je od&nbsp;desiatok po&nbsp;nieko\u013eko desiatok shardov. A tak\u00fdch klasterkov je celkovo tridsa\u0165 dev\u00e4\u0165. <\/p>\n<p><\/p>\n<p>Ako sa to cel\u00e9 \u0161k\u00e1luje? Po\u010det klasterkov sa nemen\u00ed&nbsp;\u2014 ako bolo pred nieko\u013ek\u00fdmi rokmi tridsa\u0165 dev\u00e4\u0165, tak to zostalo. Ale vo vn\u00fatri ka\u017ed\u00e9ho z&nbsp;nich postupne zvy\u0161ujeme po\u010det shardov s&nbsp;rast\u00facim mno\u017estvom d\u00e1t. A sch\u00e9ma shardovania je celkovo tak\u00e1&nbsp;\u2014 rozdelenie na&nbsp;tie klasterky sa deje pod\u013ea&nbsp;webov\u00fdch str\u00e1nok, a na&nbsp;to, aby sme pochopili, ktor\u00fd web patr\u00ed do&nbsp;ktor\u00e9ho klastera, sa pou\u017e\u00edva \u00faplne zvl\u00e1\u0161tna datab\u00e1za v&nbsp;MySQL. Jeden web&nbsp;\u2014 na&nbsp;jeden klasterok. A vo vn\u00fatri neho prebieha shardovanie pod\u013ea&nbsp;identifik\u00e1torov n\u00e1v\u0161tevn\u00edkov.<\/p>\n<p><\/p>\n<p>Pri&nbsp;z\u00e1zname ich del\u00edme pod\u013ea&nbsp;zbytku z&nbsp;delenia identifik\u00e1tora n\u00e1v\u0161tevn\u00edka. Av\u0161ak pri&nbsp;pridan\u00ed nov\u00e9ho shardu sa sch\u00e9ma shardovania men\u00ed, st\u00e1le del\u00edme, ale pod\u013ea&nbsp;in\u00e9ho \u010d\u00edsla. To znamen\u00e1, \u017ee jeden n\u00e1v\u0161tevn\u00edk m\u00f4\u017ee by\u0165 umiestnen\u00fd na&nbsp;viacer\u00fdch serveroch, \u010do je nemo\u017en\u00e9 predpoklada\u0165. Toto je vykonan\u00e9 v\u00fdhradne preto, aby sa d\u00e1ta lep\u0161ie komprimovali. A pri&nbsp;po\u017eiadavk\u00e1ch ideme do&nbsp;Distributed tabu\u013eky, ktor\u00e1 sa pozrie na&nbsp;klaster a obracia sa na&nbsp;desiatky serverov. Tak\u00e1to nesmyseln\u00e1 sch\u00e9ma.<\/p>\n<p><\/p>\n<p>Ale m\u00f4j pr\u00edbeh nebude \u00fapln\u00fd, ak nepoviem, \u017ee sme sa tejto sch\u00e9my vzdali. V&nbsp;novom pl\u00e1ne sme v\u0161etko zmenili a v\u0161etky d\u00e1ta skop\u00edrovali pomocou clickhouse-copier.<\/p>\n<p><\/p>\n<p>V&nbsp;novom pl\u00e1ne s\u00fa v\u0161etky weby rozdelen\u00e9 do&nbsp;dvoch kateg\u00f3ri\u00ed&nbsp;\u2014 ve\u013ek\u00e9 a mal\u00e9. Neviem, ako stanovili prah, ale nakoniec sa uk\u00e1zalo, \u017ee ve\u013ek\u00e9 weby s\u00fa zaznamenan\u00e9 na&nbsp;jeden klaster, kde je 120&nbsp;shardov s&nbsp;troch replikami v&nbsp;ka\u017edom&nbsp;\u2014 teda 360&nbsp;serverov. A sch\u00e9ma shardovania je tak\u00e1, \u017ee ak\u00e1ko\u013evek po\u017eiadavka ide okam\u017eite na&nbsp;v\u0161etky shardy. Ak teraz v&nbsp;\u201eYandex.Metrike\u201c otvor\u00edte ak\u00fako\u013evek str\u00e1nku spr\u00e1vy pre&nbsp;avito.ru, po\u017eiadavka p\u00f4jde na&nbsp;120&nbsp;serverov. Ve\u013ek\u00fdch webov v&nbsp;ru-nete je m\u00e1lo. A po\u017eiadaviek je menej ako tis\u00edc za sekundu, dokonca menej ne\u017e sto. V\u0161etko to pokojne spracov\u00e1va Distributed tabu\u013eka, ktor\u00fa ka\u017ed\u00fd z&nbsp;nich spracov\u00e1va s&nbsp;120&nbsp;servermi.<\/p>\n<p><\/p>\n<p>Druh\u00fd klaster&nbsp;\u2014 pre&nbsp;mal\u00e9 weby. Tu je sch\u00e9ma shardovania pod\u013ea&nbsp;identifik\u00e1tora webu, a ka\u017ed\u00e1 po\u017eiadavka ide presne na&nbsp;jeden shard.<\/p>\n<p><\/p>\n<h2 id=\"anchorclickhouse-copieranchorv-clickhouse-est-utilita-clickhouse-copier-mozhete-pronbspneyo-rasskazat\"><noindex><a rel=\"nofollow\" name=\"clickhouse-copier\"><\/a><\/noindex>V ClickHouse je n\u00e1stroj clickhouse-copier. M\u00f4\u017eete n\u00e1m o \u0148om poveda\u0165?<\/h2>\n<p><\/p>\n<p>Hne\u010f poviem, \u017ee toto rie\u0161enie je viac objemn\u00e9 a trochu menej v\u00fdkonne. V\u00fdhodou je, \u017ee \u00faplne rozde\u013euje d\u00e1ta pod\u013ea sch\u00e9my, ktor\u00fa ur\u010d\u00edte. Ale nev\u00fdhodou tohto n\u00e1stroja je, \u017ee v\u00f4bec nerob\u00ed pre-shardovanie. Kop\u00edruje d\u00e1ta z&nbsp;jednej sch\u00e9my klasteru do&nbsp;druhej sch\u00e9my klasteru.<\/p>\n<p><\/p>\n<p>To znamen\u00e1, \u017ee na&nbsp;jeho fungovanie by ste mali ma\u0165 dva klastre. M\u00f4\u017eu by\u0165 umiestnen\u00e9 na&nbsp;rovnak\u00fdch serveroch, ale aj tak, d\u00e1ta sa nebud\u00fa pres\u00fava\u0165 inkrement\u00e1lne, ale bud\u00fa skop\u00edrovan\u00e9. <\/p>\n<p><\/p>\n<p>Napr\u00edklad, bolo \u0161tyri servery, teraz je osem. Vytv\u00e1rate na v\u0161etk\u00fdch serveroch nov\u00fa distribuovan\u00fa tabu\u013eku, nov\u00e9 lok\u00e1lne tabu\u013eky a sp\u00fa\u0161\u0165ate clickhouse-copier, pri\u010dom ur\u010dujete v \u0148om sch\u00e9mu fungovania, \u017ee m\u00e1 \u010d\u00edta\u0165 odtia\u013e, prija\u0165 nov\u00fa sch\u00e9mu shardovania a pres\u00fava\u0165 d\u00e1ta tam. A na star\u00fdch serveroch budete potrebova\u0165 miesto o 50 % viac, ako je teraz, preto\u017ee star\u00e9 d\u00e1ta musia na nich zosta\u0165, a nad nimi pr\u00edde polovi\u010dka t\u00fdch ist\u00fdch star\u00fdch d\u00e1t. Ak ste sa vopred zamysleli nad t\u00fdm, \u017ee d\u00e1ta je potrebn\u00e9 pre\u0161ardova\u0165 a miesto je, potom je tento sp\u00f4sob vhodn\u00fd.<\/p>\n<p><\/p>\n<p>Ako funguje clickhouse-copier? Rozde\u013euje cel\u00fa pr\u00e1cu na s\u00fabor \u00faloh na spracovanie jednej partition jednej tabu\u013eky na jednom shard. V\u0161etky tieto \u00falohy m\u00f4\u017eu by\u0165 vykon\u00e1van\u00e9 paralelne a clickhouse-copier m\u00f4\u017ee by\u0165 spusten\u00fd na r\u00f4znych strojoch v nieko\u013ek\u00fdch in\u0161tanci\u00e1ch, ale to, \u010do rob\u00ed pre jednu partition, je ni\u010d in\u00e9 ako insert select. D\u00e1ta sa \u010d\u00edtaj\u00fa, dekomprimuj\u00fa, reorganizuj\u00fa, potom sa znovu komprimuj\u00fa, zapisuj\u00fa niekam, preusporiadaj\u00fa. Toto je n\u00e1ro\u010dnej\u0161ie rie\u0161enie.<\/p>\n<p><\/p>\n<h2 id=\"anchorresharding-toolanchoru-vas-byla-pilotnaya-shtuka-kotoraya-nazyvalas-resharding-chto-snbspney\"><noindex><a rel=\"nofollow\" name=\"resharding-tool\"><\/a><\/noindex>Mali ste pilotn\u00fa verziu, ktor\u00e1 sa naz\u00fdvala resharding. \u010co sa s \u0148ou stalo?<\/h2>\n<p><\/p>\n<blockquote><p>E\u0161te v roku 2017 ste mali pilotn\u00fd projekt, ktor\u00fd sa volal re\u0161ardovanie. Existuje aj mo\u017enos\u0165 v ClickHouse. Ako ch\u00e1pem, to sa neujalo. M\u00f4\u017eete poveda\u0165, pre\u010do to tak dopadlo? Zd\u00e1 sa, \u017ee je to ve\u013emi aktu\u00e1lne.<\/p><\/blockquote>\n<p>Cel\u00fd probl\u00e9m spo\u010d\u00edva v tom, \u017ee ke\u010f je potrebn\u00e9 pre\u0161ardova\u0165 d\u00e1ta na mieste, vy\u017eaduje to pomerne zlo\u017eit\u00fa synchroniz\u00e1ciu, aby to bolo atom\u00e1rne. Ke\u010f sme sa za\u010dali pozera\u0165 na to, ak\u00fdm sp\u00f4sobom je t\u00e1to synchroniz\u00e1cia usporiadan\u00e1, bolo jasn\u00e9, \u017ee s\u00fa tu fundament\u00e1lne probl\u00e9my. A tieto fundament\u00e1lne probl\u00e9my nie s\u00fa len teoretick\u00e9, ale okam\u017eite sa za\u010dali prejavova\u0165 aj v praxi t\u00fdm, \u010do sa d\u00e1 ve\u013emi jednoducho vysvetli\u0165 \u2014 ni\u010d nefunguje.<\/p>\n<p><\/p>\n<h2 id=\"anchormove-to-slow-diskanchormozhno-li-slivat-vse-chasti-dannyh-voedino-perednbspperemescheniem-nanbspmedlennye-diski\"><noindex><a rel=\"nofollow\" name=\"move-to-slow-disk\"><\/a><\/noindex>M\u00f4\u017ee by\u0165 mo\u017en\u00e9 zl\u00fa\u010di\u0165 v\u0161etky \u010dasti \u00fadajov dokopy pred presunom na pomal\u00e9 disky?<\/h2>\n<p><\/p>\n<blockquote><p>Ot\u00e1zka oh\u013eadom TTL s mo\u017enos\u0165ou presun\u00fa\u0165 na pomal\u00fd disk v kontexte merge. Existuje nejak\u00fd sp\u00f4sob, okrem cron, ako zl\u00fa\u010di\u0165 v\u0161etky \u010dasti do jednej pred presunom na pomal\u00e9 disky?<\/p><\/blockquote>\n<p>Odpove\u010f na ot\u00e1zku, \u010di je mo\u017en\u00e9 nejak\u00fdm sp\u00f4sobom automaticky zl\u00fa\u010di\u0165 v\u0161etky k\u00fasky do jedn\u00e9ho pred ich presunom \u2014 nie. Mysl\u00edm si, \u017ee v tom nie je potreba. Nie je nutn\u00e9 zl\u00fa\u010di\u0165 v\u0161etky \u010dasti do jednej, ale jednoducho po\u010d\u00edta\u0165 s t\u00fdm, \u017ee sa bud\u00fa pres\u00fava\u0165 na pomal\u00e9 disky automaticky. <\/p>\n<p><\/p>\n<p>M\u00e1me dva krit\u00e9ri\u00e1 pravidiel presunu. Prv\u00e9 \u2014 pod\u013ea vy\u0165a\u017eenosti. Ak je na aktu\u00e1lnej \u00farovni \u00falo\u017eiska menej ako ur\u010dit\u00fd percentu\u00e1lny podiel vo\u013en\u00e9ho miesta, vyberieme jeden blok a presunieme ho na pomal\u0161ie \u00falo\u017eisko. Spr\u00e1vnej\u0161ie povedan\u00e9, nie na pomal\u0161ie, ale na nasleduj\u00face \u2014 pod\u013ea toho, ako to nastav\u00edte.<\/p>\n<p><\/p>\n<p>Druh\u00e9 krit\u00e9rium \u2014 pod\u013ea ve\u013ekosti. To sa t\u00fdka presunu ve\u013ek\u00fdch blokov. M\u00f4\u017eete nastavi\u0165 prah vo\u013en\u00e9ho miesta na r\u00fdchlom disku a d\u00e1ta sa presun\u00fa automaticky.<\/p>\n<p><\/p>\n<h2 id=\"anchorup-to-dateanchorkak-pereezzhat-nanbspnovye-versii-clickhouse-esli-net-vozmozhnosti-zaranee-proverit-sovmestimost\"><noindex><a rel=\"nofollow\" name=\"up-to-date\"><\/a><\/noindex>Ako prejs\u0165 na nov\u00e9 verzie ClickHouse, ak nie je mo\u017en\u00e9 vopred skontrolova\u0165 kompatibilitu?<\/h2>\n<p><\/p>\n<blockquote><p>T\u00e1to t\u00e9ma sa pravidelne diskutuje <noindex><a rel=\"nofollow\" href=\"https:\/\/teleg.run\/clickhouse_ru\">v telegrame chat o ClickHouse<\/a><\/noindex> s oh\u013eadom na r\u00f4zne verzie, a predsa. Ako bezpe\u010dn\u00e9 je aktualizova\u0165 z verzie 19.11 na 19.16 a, napr\u00edklad, z 19.16 na 20.3. Ako najlep\u0161ie prech\u00e1dza\u0165 na nov\u00e9 verzie, ke\u010f nie je mo\u017en\u00e9 vopred skontrolova\u0165 kompatibilitu v pieskovisku?<\/p><\/blockquote>\n<p>Tu je nieko\u013eko \u201ezlat\u00fdch\u201c pravidiel. Prv\u00e9 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/blob\/master\/CHANGELOG.md\">\u010d\u00edtajte changelog<\/a><\/noindex>. Je to ve\u013ek\u00e9, ale s\u00fa tam jednotliv\u00e9 body t\u00fdkaj\u00face sa sp\u00e4tne nekompatibiln\u00fdch zmien. Nenech\u00e1vajte sa zmias\u0165 t\u00fdmito bodmi ako \u010derven\u00fdm flagom. Zvy\u010dajne ide o drobn\u00e9 nekompatibility, ktor\u00e9 s\u00fa spojen\u00e9 s niektorou okrajovou funk\u010dnos\u0165ou, ktor\u00fa pravdepodobne nepou\u017e\u00edvate.<\/p>\n<p><\/p>\n<p>Druh\u00e9 \u2014 ak nie je mo\u017enos\u0165 skontrolova\u0165 kompatibilitu v pieskovisku a chcete sa okam\u017eite aktualizova\u0165 v produkcii, odpor\u00fa\u010danie je tak\u00e9 \u2014 nerobte to. Najprv si vytvorte pieskovisko a skontrolujte. Ak testovacia prostredie nie je k dispoz\u00edcii, pravdepodobne nem\u00e1te ve\u013emi ve\u013ek\u00fa firmu, a teda m\u00f4\u017eete skop\u00edrova\u0165 \u010das\u0165 \u00fadajov na svoj notebook a na \u0148om sa presved\u010di\u0165, \u017ee v\u0161etko spr\u00e1vne funguje. M\u00f4\u017eete dokonca vytvori\u0165 nieko\u013eko replik lok\u00e1lne na svojom po\u010d\u00edta\u010di. Alebo si m\u00f4\u017eete niekde bl\u00edzko nain\u0161talova\u0165 nov\u00fa verziu a prenies\u0165 tam \u010das\u0165 \u00fadajov \u2014 teda vytvori\u0165 improvizovan\u00e9 testovacie prostredie. <\/p>\n<p><\/p>\n<p>E\u0161te jedno pravidlo \u2014 neaktualizujte sa po\u010das t\u00fd\u017ed\u0148a po vydan\u00ed verzie kv\u00f4li odha\u013eovaniu ch\u00fdb v produkcii a n\u00e1sledn\u00fdm r\u00fdchlym oprav\u00e1m. Po\u010fme si objasni\u0165 \u010d\u00edslovanie verzi\u00ed ClickHouse, aby sme sa nestratili. <\/p>\n<p><\/p>\n<p>Existuje verzia 20.3.4. \u010c\u00edslo 20&nbsp;ozna\u010duje rok vydania&nbsp;\u2014 2020. Z&nbsp;h\u013eadiska toho, \u010do je vn\u00fatorn\u00e9, to nem\u00e1 \u017eiadny v\u00fdznam, tak\u017ee sa na&nbsp;to nebudeme s\u00fastredi\u0165. \u010ealej&nbsp;\u2014 20.3. Druh\u00e9 \u010d\u00edslo&nbsp;\u2014 v&nbsp;tomto pr\u00edpade 3 \u2014 zvy\u0161ujeme zaka\u017ed\u00fdm, ke\u010f vyd\u00e1me verziu s&nbsp;nejakou novou funkciou. Ak chceme prida\u0165 do&nbsp;ClickHouse nejak\u00fa funkcionalitu, sme povinn\u00ed zv\u00fd\u0161i\u0165 toto \u010d\u00edslo. To znamen\u00e1, \u017ee vo&nbsp;verzii 20.4 bude ClickHouse fungova\u0165 e\u0161te lep\u0161ie. Tretie \u010d\u00edslo&nbsp;\u2014 20.3.4. Tu&nbsp;4 \u2014 je po\u010det patch-verzi\u00ed, v&nbsp;ktor\u00fdch sme neprid\u00e1vali nov\u00e9 funkcionality, ale opravovali sme nejak\u00e9 chyby. A 4&nbsp;znamen\u00e1, \u017ee sme to urobili \u0161tyrikr\u00e1t.<\/p>\n<p><\/p>\n<p>Nerobte si predstavu, \u017ee to je nie\u010do hrozn\u00e9. Zvy\u010dajne si pou\u017e\u00edvate\u013e m\u00f4\u017ee nain\u0161talova\u0165 najnov\u0161iu verziu, a t\u00e1 bude fungova\u0165 bez&nbsp;probl\u00e9mov s&nbsp;dostupnos\u0165ou po cel\u00fd rok. Ale predstavte si, \u017ee v&nbsp;nejakej funkcii na&nbsp;spracovanie bitmapov, ktor\u00e1 bola pridan\u00e1 na\u0161imi \u010d\u00ednskymi kolegami, pri odovzd\u00e1van\u00ed nespr\u00e1vnych argumentov server zlyh\u00e1. Mus\u00edme to opravi\u0165. Vyd\u00e1me nov\u00fa patch-verziu, a ClickHouse sa stane stabilnej\u0161\u00edm.<\/p>\n<p><\/p>\n<p>Ak m\u00e1te ClickHouse v&nbsp;produkcii a vyjde nov\u00e1 verzia ClickHouse s&nbsp;dodato\u010dn\u00fdmi funkciami \u2014 napr\u00edklad&nbsp;20.4.1 \u2014 na prv\u00fd de\u0148 sa s&nbsp;jeho nasaden\u00edm do&nbsp;produkcie nepon\u00e1h\u013eajte. Pre\u010do je to v\u00f4bec potrebn\u00e9? Ak ClickHouse e\u0161te nepou\u017e\u00edvate, m\u00f4\u017eete si ho nain\u0161talova\u0165, a pravdepodobne v\u0161etko p\u00f4jde dobre. Ale ak ClickHouse u\u017e stabilne funguje, sledujte patchy a aktualiz\u00e1cie&nbsp;\u2014 ak\u00e9 probl\u00e9my opravujeme.<\/p>\n<p><\/p>\n<p><strong>Kiril \u0160vakov:<\/strong> Chcem trochu doplni\u0165 o&nbsp;testovac\u00edch prostrediach. V\u0161etci sa ve\u013emi boja testovac\u00edch prostred\u00ed a akosi si myslia, \u017ee ak m\u00e1te ve\u013emi ve\u013ek\u00fd klaster ClickHouse, tak aj testovacie prostredie mus\u00ed by\u0165 minim\u00e1lne tak\u00e9 ve\u013ek\u00e9 alebo aspo\u0148 desa\u0165kr\u00e1t men\u0161ie. To v\u00f4bec nie je pravda.<\/p>\n<p><\/p>\n<p>M\u00f4\u017eem poveda\u0165 na&nbsp;svojom pr\u00edklade. M\u00e1m projekt, a tam je ClickHouse. Na\u0161a testovacia verzia je presne pre&nbsp;\u0148u&nbsp;\u2014 je to mal\u00e1 virtu\u00e1lka v&nbsp;Hetzner za&nbsp;dvadsa\u0165 eur, kde je v\u0161etko nasaden\u00e9. Aby sme to robili, m\u00e1me \u00fapln\u00fa automatiz\u00e1ciu v&nbsp;Ansible, a preto v&nbsp;princ\u00edpe nie je rozdiel, \u010di nasadzujeme na&nbsp;hardv\u00e9rov\u00e9 servery alebo jednoducho na&nbsp;virtu\u00e1lky.<\/p>\n<p><\/p>\n<p>\u010co m\u00f4\u017eeme urobi\u0165? Bolo by dobr\u00e9 vytvori\u0165 v dokument\u00e1cii ClickHouse pr\u00edklad, ako si nasadi\u0165 mal\u00fd klaster \u2014 v Dockeri, v LXC, mo\u017eno vytvori\u0165 Ansible playbook, preto\u017ee r\u00f4zni \u013eudia maj\u00fa r\u00f4zne nasadenia. To by ve\u013emi u\u013eah\u010dilo pr\u00e1cu. Ke\u010f si za p\u00e4\u0165 min\u00fat nasad\u00edte klaster, je ove\u013ea jednoduch\u0161ie sa v nie\u010dom orientova\u0165. Takto je to ove\u013ea pohodlnej\u0161ie, preto\u017ee nasadi\u0165 do produkcie verziu, ktor\u00fa ste neskontrolovali \u2014 to je cesta do nikam. Niekedy to funguje, a niekedy nie. A preto d\u00fafa\u0165 v \u00faspech \u2014 je zl\u00e9.<\/p>\n<p><\/p>\n<p><strong>Maxim Kotjakov, senior backend engineer Avito:<\/strong> Trochu dopln\u00edm o testovac\u00edch prostrediach zo s\u00e9rie probl\u00e9mov ve\u013ek\u00fdch spolo\u010dnost\u00ed. M\u00e1me plne funk\u010dn\u00fd akcepta\u010dn\u00fd klaster ClickHouse, ktor\u00fd je presnou k\u00f3piou \u0161trukt\u00far d\u00e1t a nastaven\u00ed v produkcii. Tento klaster je nasaden\u00fd v relat\u00edvne slab\u00fdch kontajneroch s minimom zdrojov. P\u00ed\u0161eme tam ur\u010dit\u00fd percentu\u00e1lny podiel produk\u010dn\u00fdch d\u00e1t, na\u0161\u0165astie existuje mo\u017enos\u0165 replik\u00e1cie v Kafke. V\u0161etko je synchronizovan\u00e9 a \u0161k\u00e1lovan\u00e9 \u2014 a to \u010do sa t\u00fdka v\u00fdkonu, aj toku, a v te\u00f3rii by sa malo pod\u013ea metr\u00edk spr\u00e1va\u0165 ako produkcia. V\u0161etko potenci\u00e1lne v\u00fdbu\u0161n\u00e9 najprv prech\u00e1dza na tento testovac\u00ed stan a nieko\u013eko dn\u00ed tam zreje do pripravenosti. Ale samozrejme, toto rie\u0161enie je drah\u00e9, n\u00e1ro\u010dn\u00e9 a so zna\u010dn\u00fdmi n\u00e1kladmi na \u00fadr\u017ebu. <\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> Poviem v\u00e1m, \u010do predstavuje testovacie prostredie na\u0161ich priate\u013eov z \u201eYandex.Metriky\u201c. Jeden klaster mal viac ako 600 serverov, \u010fal\u0161\u00ed mal 360, a je tu e\u0161te tret\u00ed a nieko\u013eko klastrov. Testovacie prostredie pre jeden z nich \u2014 s\u00fa to jednoducho dva shardov so dv\u011bma replikami v ka\u017edom. Pre\u010do dva shardov? Aby nebol len jeden. A aj repliky, aby boli. Iba ur\u010dit\u00e9 minim\u00e1lne mno\u017estvo, ktor\u00e9 si m\u00f4\u017eeme dovoli\u0165.<\/p>\n<p><\/p>\n<p>Toto testovacie prostredie umo\u017e\u0148uje skontrolova\u0165 funk\u010dnos\u0165 dopytov a zisti\u0165, \u010di sa nie\u010do ve\u013ek\u00e9 nepokazilo. Ale \u010dasto sa probl\u00e9my objavuj\u00fa \u00faplne in\u00e9ho druhu, ke\u010f v\u0161etko funguje, ale s\u00fa tam ur\u010dit\u00e9 mal\u00e9 zmeny s z\u00e1\u0165a\u017eou.<\/p>\n<p><\/p>\n<p>Uv\u00e1dzam pr\u00edklad. Rozhodli sme sa nain\u0161talova\u0165 nov\u00fa verziu ClickHouse. Bola zverejnen\u00e1 v&nbsp;testovacom prostred\u00ed, pre\u0161li automatizovan\u00fdmi testami v&nbsp;samotnej \u201eYandex.Metrike\u201c, ktor\u00e9 porovn\u00e1vaj\u00fa \u00fadaje zo&nbsp;starej verzie a&nbsp;nov\u00e9ho, pri\u010dom prebehne cel\u00fd proces. A samozrejme, zelen\u00e9 testy n\u00e1\u0161ho CI. Inak by sme dokonca ani nenavrhovali t\u00fato verziu.<\/p>\n<p><\/p>\n<p>V\u0161etko je skvel\u00e9. Za\u010d\u00edname nasadzova\u0165 do&nbsp;produkcie. Dost\u00e1vam spr\u00e1vu, \u017ee z\u00e1\u0165a\u017e na&nbsp;grafikoch sa zv\u00fd\u0161ila nieko\u013ekokr\u00e1t. Vraciame verziu. Pozer\u00e1m na&nbsp;graf a vid\u00edm: z\u00e1\u0165a\u017e sa naozaj zv\u00fd\u0161ila nieko\u013ekokr\u00e1t po\u010das nasadzovania a potom sa vr\u00e1tila sp\u00e4\u0165, ke\u010f bola verzia nasaden\u00e1. Potom sme za\u010dali vraca\u0165 verziu. A z\u00e1\u0165a\u017e sa rovnako zv\u00fd\u0161ila a rovnako sa vr\u00e1tila sp\u00e4\u0165. Tak\u017ee z\u00e1ver je tak\u00fd \u2014 z\u00e1\u0165a\u017e vzr\u00e1stla v&nbsp;s\u00favislosti s nasaden\u00edm, ni\u010d prekvapuj\u00face.<\/p>\n<p><\/p>\n<p>\u010ealej bolo \u0165a\u017ek\u00e9 presved\u010di\u0165 kolegov, aby predsa len nain\u0161talovali nov\u00fa verziu. Hovor\u00edm: \u201eV\u0161etko je v&nbsp;poriadku, nasadzujte. Dr\u017ete si palce, v\u0161etko bude fungova\u0165. Teraz sa z\u00e1\u0165a\u017e na grafikoch zv\u00fd\u0161ila, ale v\u0161etko je v&amp;nbspporiadku. Zvl\u00e1dnete to\u201c. Tak sme to urobili, a v\u0161etko \u2014 verzia bola nasaden\u00e1 do&nbsp;produkcie. Ale takmer pri&nbsp;ka\u017ed\u00e9m nasaden\u00ed sa objavuj\u00fa podobn\u00e9 probl\u00e9my.<\/p>\n<p><\/p>\n<h2 id=\"anchorkill-queryanchorkill-query-dolzhen-ubivat-zaprosy-no-on-etogo-ne-delaet-pochemu\"><noindex><a rel=\"nofollow\" name=\"kill-query\"><\/a><\/noindex>Kill query by mal zabi\u0165 po\u017eiadavky, ale nerob\u00ed to. Pre\u010do?<\/h2>\n<p><\/p>\n<blockquote><p>Pri\u0161iel za mnou pou\u017e\u00edvate\u013e, nejak\u00fd analytik, a vytvoril ak\u00fdsi dopyt, ktor\u00fd polo\u017eil m\u00f4j klaster ClickHouse. Nejak\u00fd uzol alebo cel\u00fd klaster \u2014 v&nbsp;z\u00e1vislosti od toho, do&nbsp;ktorej repliky alebo shardu dopyt pri\u0161iel. Vid\u00edm, \u017ee v\u0161etky zdroje CPU na&nbsp;tomto serveri s\u00fa na maxime, v\u0161etko je \u010derven\u00e9. KlikHouse ale na dopyty odpoved\u00e1. A p\u00ed\u0161em: \u201ePros\u00edm, uk\u00e1\u017e mi process list, ak\u00fd dopyt sp\u00f4sobil tento chaos\u201c.<\/p>\n<p>N\u00e1js\u0165 tento dopyt a p\u00ed\u0161em mu kill. A vid\u00edm, \u017ee sa ni\u010d nedeje. M\u00f4j server je na maxime, ClickHouse mi na\u010falej posiela nejak\u00e9 pr\u00edkazy, ukazuje, \u017ee server \u017eije, a v\u0161etko je v&nbsp;poriadku. Ale m\u00e1m degrad\u00e1ciu vo&nbsp;v\u0161etk\u00fdch pou\u017e\u00edvate\u013esk\u00fdch dopytoch, za\u010d\u00edna degrad\u00e1cia z\u00e1pisu do&nbsp;ClickHouse a m\u00f4j kill query nefunguje. Pre\u010do? Myslel som, \u017ee kill query by mal zabi\u0165 dopyty, ale to sa nedeje.<\/p><\/blockquote>\n<p>Teraz pr\u00edde celkom zvl\u00e1\u0161tny odpove\u010f. Ide o&nbsp;to, \u017ee kill query nezab\u00edja dopyty. <\/p>\n<p><\/p>\n<p>Kill query nastav\u00ed mal\u00fa zna\u010dku s n\u00e1zvom \u201echcem, aby tento dotaz bol zru\u0161en\u00fd\u201c. A samotn\u00fd dotaz pri spracovan\u00ed ka\u017ed\u00e9ho bloku kontroluje t\u00fato zna\u010dku. Ak je nastaven\u00e1, dotaz prestane fungova\u0165. Vych\u00e1dza z toho, \u017ee nikto dotaz nezru\u0161\u00ed, on si to mus\u00ed skontrolova\u0165 a zastavi\u0165 sa s\u00e1m. A to by malo fungova\u0165 vo v\u0161etk\u00fdch pr\u00edpadoch, ke\u010f sa dotaz nach\u00e1dza v stave spracovania blokov \u00fadajov. Spracuje \u010fal\u0161\u00ed blok \u00fadajov, skontroluje zna\u010dku a zastav\u00ed sa.<\/p>\n<p><\/p>\n<p>To nefunguje v pr\u00edpadoch, ak je dotaz zablokovan\u00fd na nejakej oper\u00e1cii. Pravda, pravdepodobne to nie je v\u00e1\u0161 pr\u00edpad, preto\u017ee pod\u013ea va\u0161ich slov vyu\u017e\u00edva hromadu serverov\u00fdch zdrojov. Mo\u017eno, \u017ee to nefunguje v pr\u00edpade vonkaj\u0161ieho triedenia a e\u0161te v niektor\u00fdch detailoch. Ale v celku by to tak by\u0165 nemalo, je to chyba. A jedin\u00e9, \u010do m\u00f4\u017eem odporu\u010di\u0165, je aktualizova\u0165 ClickHouse.<\/p>\n<p><\/p>\n<h2 id=\"anchorreading-timeanchorkak-rasschitat-vremya-otveta-pri-chitayuschey-nagruzke\"><noindex><a rel=\"nofollow\" name=\"reading-time\"><\/a><\/noindex>Ako vypo\u010d\u00edta\u0165 \u010das odpovede pri \u010d\u00edtacej z\u00e1\u0165a\u017ei?<\/h2>\n<p><\/p>\n<blockquote><p>Existuje tabu\u013eka, v ktorej s\u00fa ulo\u017een\u00e9 agreg\u00e1ty pod\u013ea item \u2014 r\u00f4zne po\u010d\u00edtadl\u00e1. Po\u010det riadkov je pribli\u017ene sto mili\u00f3nov. M\u00f4\u017ee sa po\u010d\u00edta\u0165 s predv\u00eddate\u013en\u00fdm \u010dasom odpovede, ak sa nalije 1K RPS na 1K itemov? <\/p><\/blockquote>\n<p>S\u00fad pod\u013ea kontextu ide o \u010d\u00edtaciu z\u00e1\u0165a\u017e, preto\u017ee pri z\u00e1pise nie s\u00fa \u017eiadne probl\u00e9my \u2014 m\u00f4\u017eete vklada\u0165 hoci tis\u00edc, hoci sto tis\u00edc, a niekedy aj nieko\u013eko mili\u00f3nov riadkov. <\/p>\n<p><\/p>\n<p>\u010c\u00edtacie dotazy m\u00f4\u017eu by\u0165 r\u00f4zne. V select 1 ClickHouse m\u00f4\u017ee vykon\u00e1va\u0165 pribli\u017ene desiatky tis\u00edc dotazov za sekundu, preto aj dotazy pod\u013ea jedn\u00e9ho k\u013e\u00fa\u010da u\u017e bud\u00fa vy\u017eadova\u0165 ur\u010dit\u00e9 zdroje. A tak\u00e9to bodov\u00e9 dotazy bud\u00fa zlo\u017eitej\u0161ie ako v nejak\u00fdch key-value datab\u00e1zach, preto\u017ee pri ka\u017edom \u010d\u00edtan\u00ed je potrebn\u00e9 pre\u010d\u00edta\u0165 blok \u00fadajov pod\u013ea indexu. Index u n\u00e1s neadresuje ka\u017ed\u00fa z\u00e1znam, ale ka\u017ed\u00fd rozsah. To znamen\u00e1, \u017ee bude potrebn\u00e9 pre\u010d\u00edta\u0165 cel\u00fd rozsah \u2014 to je 8192 riadkov predvolene. A bude potrebn\u00e9 dekomprimova\u0165 komprimovan\u00fd blok \u00fadajov s 64 kB na 1 MB. Zvy\u010dajne tak\u00e9to bodov\u00e9 dotazy trvaj\u00fa nieko\u013eko milisek\u00fand. Ale to je najjednoduch\u0161ia verzia.<\/p>\n<p><\/p>\n<p>Po\u010fme sa pok\u00fasi\u0165 o jednoduch\u00fa aritmetiku. Ak vyn\u00e1sob\u00edme nieko\u013eko milisek\u00fand tis\u00edc, dostaneme nieko\u013eko sek\u00fand. Ako keby sa nedalo zvl\u00e1dnu\u0165 tis\u00edc po\u017eiadaviek za sekundu, ale v skuto\u010dnosti je to mo\u017en\u00e9, preto\u017ee m\u00e1me nieko\u013eko procesorov\u00fdch jadier. Tak\u017ee v z\u00e1sade 1000 RPS ClickHouse ob\u010das zvl\u00e1dne, ale len pri kr\u00e1tkych dopytoch, konkr\u00e9tne bodov\u00fdch.<\/p>\n<p><\/p>\n<p>Ak potrebujete \u0161k\u00e1lova\u0165 cluster ClickHouse pod\u013ea po\u010dtu jednoduch\u00fdch po\u017eiadaviek, odpor\u00fa\u010dam najjednoduch\u0161ie rie\u0161enie \u2014 zv\u00fd\u0161i\u0165 po\u010det replik a posiela\u0165 po\u017eiadavky na n\u00e1hodn\u00fa replik\u00e1ciu. Ak jedna replik\u00e1cia zvl\u00e1da p\u00e4\u0165sto po\u017eiadaviek za sekundu, \u010do je \u00faplne realistick\u00e9, tak tri replik\u00e1cie bud\u00fa zvl\u00e1da\u0165 p\u00e4tn\u00e1s\u0165sto.<\/p>\n<p><\/p>\n<p>Ob\u010das je mo\u017en\u00e9 aj ClickHouse nastavi\u0165 na maxim\u00e1lny po\u010det bodov\u00fdch \u010d\u00edtan\u00ed. \u010co na to potrebujete? Prv\u00e9 \u2014 zn\u00ed\u017ei\u0165 granul\u00e1ciu indexu. Pri tom ju treba zni\u017eova\u0165 nie na jednotku, ale s oh\u013eadom na to, \u017ee po\u010det z\u00e1znamov v indexe sa bude pohybova\u0165 v nieko\u013ek\u00fdch mili\u00f3noch alebo desiatkach mili\u00f3nov na server. Ak m\u00e1 tabu\u013eka sto mili\u00f3nov riadkov, tak ako granul\u00e1ciu m\u00f4\u017eete nastavi\u0165 64.<\/p>\n<p><\/p>\n<p>M\u00f4\u017eete zmen\u0161i\u0165 ve\u013ekos\u0165 komprimovan\u00e9ho bloku. Na to s\u00fa nastavenia, <strong>min compress block size<\/strong>, <strong>max compress block size<\/strong>. M\u00f4\u017eete ich zmen\u0161i\u0165, preprostredkova\u0165 \u00fadaje a vtedy bud\u00fa bodov\u00e9 dopyty r\u00fdchlej\u0161ie. Ale aj tak ClickHouse nie je datab\u00e1za typu key-value. Ve\u013ek\u00e9 mno\u017estvo mal\u00fdch dopytov je antipat\u00e9rnom z\u00e1\u0165a\u017ee.<\/p>\n<p><\/p>\n<p><strong>Kiril \u0160vakov:<\/strong> D\u00e1m radu pre pr\u00edpad, ak s\u00fa tam be\u017en\u00e9 ekountre. Je to dos\u0165 \u0161tandardn\u00e1 situ\u00e1cia, ke\u010f v ClickHouse uchov\u00e1vaj\u00fa nejak\u00fd \u010d\u00edta\u010d. M\u00e1m pou\u017e\u00edvate\u013ea, je z ur\u010ditej krajiny, plus nejak\u00e9 tretie pole, a treba nie\u010do inkrement\u00e1lne zvy\u0161ova\u0165. Vezmete MySQL, urob\u00edte jedine\u010dn\u00fd k\u013e\u00fa\u010d \u2014 v MySQL to je duplicate key, a v PostgreSQL je to conflict \u2014 a prid\u00e1vate s plusom. To bude fungova\u0165 ove\u013ea lep\u0161ie. <\/p>\n<p><\/p>\n<p>Ke\u010f m\u00e1te m\u00e1lo \u00fadajov, nem\u00e1 zmysel pou\u017e\u00edva\u0165 ClickHouse, najm\u00e4 nie. Existuj\u00fa be\u017en\u00e9 datab\u00e1zy a tie s t\u00fdm dobre zvl\u00e1daj\u00fa. <\/p>\n<p><\/p>\n<h2 id=\"anchorpimp-my-clickhouseanchorchto-podtyunit-v-clickhouse-chtoby-bolshe-dannyh-bylo-vnbspkeshe\"><noindex><a rel=\"nofollow\" name=\"pimp-my-clickhouse\"><\/a><\/noindex>\u010co doladi\u0165 v ClickHouse, aby viac \u00fadajov bolo v cache?<\/h2>\n<p><\/p>\n<blockquote><p>Predstavme si situ\u00e1ciu \u2014 na serveroch je 256 GB RAM, v ka\u017edodennej rutine ClickHouse berie pribli\u017ene 60\u201480 GB, v maxime \u2014 a\u017e 130. \u010co m\u00f4\u017eete zapn\u00fa\u0165 a doladi\u0165, aby bolo viac \u00fadajov v cache a t\u00fdm p\u00e1dom menej pr\u00edstupov na disk?<\/p><\/blockquote>\n<p>Vo v\u0161eobecnosti opera\u010dn\u00fd syst\u00e9m s page cache dobre zvl\u00e1da t\u00fato \u00falohu. Ak sa pozer\u00e1te do topu, sledujte tam cached alebo free \u2014 tam je tie\u017e uveden\u00e9, ko\u013eko je zak cached \u2014 m\u00f4\u017eete si v\u0161imn\u00fa\u0165, \u017ee v\u0161etka vo\u013en\u00e1 pam\u00e4\u0165 je vyu\u017eit\u00e1 na cache. A tieto d\u00e1ta sa pri \u010d\u00edtan\u00ed \u010d\u00edtaj\u00fa nie z disku, ale z opera\u010dnej pam\u00e4te. M\u00f4\u017eem poveda\u0165, \u017ee cache sa efekt\u00edvne vyu\u017e\u00edva, preto\u017ee sa ukladaj\u00fa pr\u00e1ve komprimovan\u00e9 d\u00e1ta.<\/p>\n<p><\/p>\n<p>Napriek tomu, ak chcete e\u0161te viac ur\u00fdchli\u0165 niektor\u00e9 jednoduch\u00e9 dotazy, m\u00e1te mo\u017enos\u0165 povoli\u0165 v ClickHouse cache v rozbalen\u00fdch d\u00e1tach. Toto sa naz\u00fdva <strong>uncompressed cache<\/strong>. V konfigura\u010dnom s\u00fabore config.xml nastavte uncompressed cache size na po\u017eadovan\u00fa hodnotu \u2014 odpor\u00fa\u010dam nie viac ako polovicu vo\u013enej opera\u010dnej pam\u00e4te, preto\u017ee zvy\u0161ok p\u00f4jde na page cache. <\/p>\n<p><\/p>\n<p>Okrem toho existuj\u00fa dve nastavenia \u00farovne po\u017eiadaviek. Prv\u00e9 nastavenie je <strong>pou\u017ei\u0165 nekomprimovan\u00fa cache<\/strong> \u2014 zahr\u0148uje jej pou\u017eitie. Odpor\u00fa\u010da sa ju aktivova\u0165 pre v\u0161etky dotazy, okrem \u0165a\u017ek\u00fdch, ktor\u00e9 m\u00f4\u017eu pre\u010d\u00edta\u0165 v\u0161etky \u00fadaje a vypr\u00e1zdni\u0165 t\u00fato cache. A druh\u00e9 nastavenie \u2014 to je nie\u010do ako maxim\u00e1lny po\u010det riadkov pre pou\u017eitie cache. Automaticky obmedzuje ve\u013ek\u00e9 dotazy, aby \u0161li mimo cache.<\/p>\n<p><\/p>\n<h2 id=\"anchorstorage-configurationanchorkak-mozhno-nastroit-storage_configuration-dlya-hraneniya-v-operativke\"><noindex><a rel=\"nofollow\" name=\"storage-configuration\"><\/a><\/noindex>Ako nastavi\u0165 storage_configuration pre uchov\u00e1vanie v pam\u00e4ti?<\/h2>\n<p><\/p>\n<blockquote><p>V novej dokument\u00e1cii ClickHouse som na\u0161iel \u010das\u0165 s\u00favisiacu <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/single\/#table_engine-mergetree-multiple-volumes\">s data storage<\/a><\/noindex>. V popise je pr\u00edklad s r\u00fdchlym SSD. <\/p>\n<p>Zauj\u00edmav\u00e9, ako je mo\u017en\u00e9 konfigurova\u0165 to ist\u00e9 s volume hot memory. A e\u0161te jedna ot\u00e1zka. Ako funguje select s takouto organiz\u00e1ciou d\u00e1t, bude \u010d\u00edta\u0165 cel\u00fd s\u00fabor alebo len ten, ktor\u00fd le\u017e\u00ed na disku, a komprimuj\u00fa sa tieto d\u00e1ta v pam\u00e4ti? A ako pracuje sekcia prewhere pri takejto organiz\u00e1cii d\u00e1t?<\/p><\/blockquote>\n<p>Toto nastavenie ovplyv\u0148uje ukladanie blokov d\u00e1t, a ich form\u00e1t sa v\u00f4bec nemen\u00ed.<br \/>\nPo\u010fme sa na to pozrie\u0165 podrobnej\u0161ie. <\/p>\n<p><\/p>\n<p>Nastavi\u0165 ukladanie d\u00e1t v opera\u010dnej pam\u00e4ti je mo\u017en\u00e9. V\u0161etko, \u010do sa konfiguruje pre disk \u2014 to je jeho cesta. Vytvor\u00edte tmpfs oddiel, ktor\u00fd je pripojen\u00fd na ur\u010dit\u00fa cestu v s\u00faborovom syst\u00e9me. T\u00fato cestu uvediete ako cestu pre ukladanie d\u00e1t pre najhor\u00facej\u0161\u00ed oddiel, tam za\u010dn\u00fa prich\u00e1dza\u0165 a zapisova\u0165 sa bloky d\u00e1t, v\u0161etko je v poriadku. <\/p>\n<p><\/p>\n<p>Ale neodpor\u00fa\u010dam to robi\u0165 kv\u00f4li&nbsp;n\u00edzkej spo\u013eahlivosti, hoci ak m\u00e1te aspo\u0148 tri repliky v&nbsp;r\u00f4znych d\u00e1tov\u00fdch centr\u00e1ch, je to mo\u017en\u00e9. Ak sa nie\u010do stane, d\u00e1ta bud\u00fa obnoven\u00e9. Predpokladajme, \u017ee server sa n\u00e1hle vypol a znova zapol. Oddiel sa op\u00e4\u0165 pripojil, ale je tam pr\u00e1zdnota. ClickHouse server pri&nbsp;spusten\u00ed vid\u00ed, \u017ee mu tieto kusy ch\u00fdbaj\u00fa, hoci pod\u013ea metad\u00e1t ZooKeeper by mali by\u0165 pr\u00edtomn\u00e9. Pozrie sa, na ktor\u00fdch replik\u00e1ch s\u00fa pr\u00edtomn\u00e9, po\u017eiada o&nbsp;ne a stiahne ich. Takto bud\u00fa d\u00e1ta obnoven\u00e9. <\/p>\n<p><\/p>\n<p>V tomto zmysle sa ukladanie d\u00e1t v&nbsp;opera\u010dnej pam\u00e4ti z\u00e1sadne nel\u00ed\u0161i od ich uchov\u00e1vania na&nbsp;disku, preto\u017ee pri&nbsp;zapisovan\u00ed d\u00e1t na&nbsp;disk najprv prech\u00e1dzaj\u00fa do&nbsp;cache str\u00e1nok a fyzicky sa zapisuj\u00fa oneskorene. Z\u00e1vis\u00ed to od&nbsp;varianty pripojenia s\u00faborov\u00e9ho syst\u00e9mu. Ale pre istotu poviem, \u017ee ClickHouse nevykon\u00e1va fsync pri&nbsp;insert.<\/p>\n<p><\/p>\n<p>Pri tom s\u00fa d\u00e1ta v&nbsp;opera\u010dnej pam\u00e4ti uchov\u00e1van\u00e9 v&nbsp;presne tomto form\u00e1te, ako aj na&nbsp;disku. Dotaz select presne takisto vyber\u00e1 kusy, ktor\u00e9 je potrebn\u00e9 \u010d\u00edta\u0165, vyber\u00e1 potrebn\u00e9 rozsahy d\u00e1t a \u010d\u00edta ich. A prewhere funguje \u00faplne rovnako, bez oh\u013eadu na to, \u010di boli d\u00e1ta v&nbsp;opera\u010dnej pam\u00e4ti alebo na&nbsp;disku.<\/p>\n<p><\/p>\n<h2 id=\"anchorlow-cardinalityanchordo-kakogo-kolichestva-unikalnyh-znacheniy-effektiven-low-cardinality\"><noindex><a rel=\"nofollow\" name=\"low-cardinality\"><\/a><\/noindex>Do ak\u00e9ho po\u010dtu unik\u00e1tnych hodn\u00f4t je Low Cardinality efekt\u00edvny?<\/h2>\n<p><\/p>\n<p>Low Cardinality je chytr\u00fd syst\u00e9m. Tvor\u00ed lok\u00e1lne d\u00e1tov\u00e9 slovn\u00edky. Po prv\u00e9, slovn\u00edky s\u00fa vlastn\u00e9 pre&nbsp;ka\u017ed\u00fd kus, po druh\u00e9, dokonca aj v&nbsp;jednom kuse m\u00f4\u017eu by\u0165 r\u00f4zne pre&nbsp;ka\u017ed\u00fd rozsah. Ke\u010f po\u010det jedine\u010dn\u00fdch hodn\u00f4t dosiahne prahov\u00fa hodnotu \u2014 mysl\u00edm, \u017ee jeden mili\u00f3n \u2014 slovn\u00edk sa jednoducho odlo\u017e\u00ed a vytvor\u00ed sa nov\u00fd.<\/p>\n<p><\/p>\n<p>Odpove\u010f v&nbsp;celku: pre&nbsp; ka\u017ed\u00fd lok\u00e1lny rozsah \u2014 povedzme, pre&nbsp;ka\u017ed\u00fd de\u0148 \u2014 niekde do&nbsp;mili\u00f3na jedine\u010dn\u00fdch hodn\u00f4t je Low Cardinality efekt\u00edvny. Po tomto bude jednoducho fallback, pri ktorom sa pou\u017eije ve\u013ea r\u00f4znych slovn\u00edkov, nie jeden. Fungova\u0165 to bude asi tak, ako be\u017en\u00fd st\u013apec typu string, mo\u017eno o&nbsp;nie\u010do menej efekt\u00edvne, ale v\u00e1\u017ena degrad\u00e1cia v\u00fdkonu nenastane. <\/p>\n<p><\/p>\n<h2 id=\"anchorfulltext-searchanchorkakie-luchshie-praktiki-ponbsppolnotekstovomu-poisku-ponbsptablice-snbsppyatyu-milliardami-strok\"><noindex><a rel=\"nofollow\" name=\"fulltext-search\"><\/a><\/noindex>Ak\u00e9 s\u00fa najlep\u0161ie praktiky pre fulltextov\u00e9 vyh\u013ead\u00e1vanie v tabu\u013eke s piatimi miliardami riadkov?<\/h2>\n<p><\/p>\n<p>Existuj\u00fa r\u00f4zne mo\u017enosti odpovede. Prv\u00e1&nbsp;\u2014 poveda\u0165, \u017ee ClickHouse&nbsp;nie je syst\u00e9m ur\u010den\u00fd na&nbsp;plnotextov\u00e9 vyh\u013ead\u00e1vanie. Na to existuj\u00fa \u0161peci\u00e1lne syst\u00e9my, napr\u00edklad, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/enterprise-search\">Elasticsearch<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"http:\/\/sphinxsearch.com\/\">Sphinx<\/a><\/noindex>. Napriek tomu \u010doraz \u010dastej\u0161ie stret\u00e1vam \u013eud\u00ed, ktor\u00ed tvrdia, \u017ee prech\u00e1dzaj\u00fa z&nbsp;Elasticsearch na&nbsp;ClickHouse.<\/p>\n<p><\/p>\n<p>Pre\u010do sa to deje? Vysvet\u013euj\u00fa to t\u00fdm, \u017ee Elasticsearch prest\u00e1va zvl\u00e1da\u0165 niektor\u00e9 objemy za\u0165a\u017eenia, najm\u00e4 pokia\u013e ide o vytv\u00e1ranie indexov. Indexy sa st\u00e1vaj\u00fa pr\u00edli\u0161 rozsiahl\u00fdmi a ak jednoducho presuniete \u00fadaje do ClickHouse, uk\u00e1\u017ee sa, \u017ee sa uchov\u00e1vaj\u00fa nieko\u013ekokr\u00e1t efekt\u00edvnej\u0161ie z h\u013eadiska objemu. Po\u017eiadavky na vyh\u013ead\u00e1vanie \u010dasto neboli tak\u00e9, \u017ee by bolo potrebn\u00e9 n\u00e1js\u0165 v celom objeme \u00fadajov nejak\u00fa fr\u00e1zu s oh\u013eadom na morfol\u00f3giu, ale \u00faplne in\u00e9. Napr\u00edklad n\u00e1js\u0165 za posledn\u00e9 nieko\u013eko hod\u00edn v logoch nie\u010do pod\u013ea ur\u010ditej podposloupnosti bajtov.<\/p>\n<p><\/p>\n<p>V tomto pr\u00edpade vytvor\u00edte v ClickHouse index, kde prv\u00fdm po\u013eom bude d\u00e1tum so \u010dasom. A najv\u00e4\u010d\u0161ie z\u00fa\u017eenie \u00fadajov bude pr\u00e1ve pod\u013ea rozsahu d\u00e1tumov. Vo vybranom rozsahu d\u00e1tumov je mo\u017en\u00e9 zvy\u010dajne vykona\u0165 fulltextov\u00e9 vyh\u013ead\u00e1vanie dokonca aj bruteforce met\u00f3dou s pomocou like. Oper\u00e1tor like v ClickHouse je najefekt\u00edvnej\u0161\u00ed oper\u00e1tor like, ktor\u00fd m\u00f4\u017eete n\u00e1js\u0165. Ak n\u00e1jdete lep\u0161\u00ed, dajte mi vedie\u0165. <\/p>\n<p><\/p>\n<p>Ale aj tak like je full scan. A full scan m\u00f4\u017ee by\u0165 pomal\u00fd nielen z poh\u013eadu CPU, ale aj z poh\u013eadu disku. Ak m\u00e1te jeden terabajt \u00fadajov denne a za de\u0148 h\u013ead\u00e1te nejak\u00e9 slovo, budete musie\u0165 skenova\u0165 terabajt. A to iste je na be\u017en\u00fdch pevn\u00fdch diskoch, a nakoniec bud\u00fa tak za\u0165a\u017een\u00e9, \u017ee sa na tento server cez SSH nedostanete.<\/p>\n<p><\/p>\n<p>V tomto pr\u00edpade som pripraven\u00fd navrhn\u00fa\u0165 e\u0161te jeden mal\u00fd trik. Je to z kateg\u00f3rie experiment\u00e1lnych \u2014 m\u00f4\u017ee to fungova\u0165, m\u00f4\u017ee to nefungova\u0165. V ClickHouse s\u00fa fulltextov\u00e9 indexy vo forme trigramov\u00fdch Bloon filterov. Na\u0161i kolegovia z firmy Arenadata u\u017e tieto indexy vysk\u00fa\u0161ali a \u010dasto funguj\u00fa presne tak, ako s\u00fa ur\u010den\u00e9.<\/p>\n<p><\/p>\n<p>Aby ste ich mohli spr\u00e1vne vyu\u017ei\u0165, mus\u00edte dobre rozumie\u0165, ako presne funguj\u00fa: \u010do predstavuje trigramov\u00fd Bloom filter a ako zvoli\u0165 jeho ve\u013ekos\u0165. M\u00f4\u017eem poveda\u0165, \u017ee pom\u00f4\u017eu pri po\u017eiadavk\u00e1ch na niektor\u00e9 zriedkav\u00e9 fr\u00e1zy, podre\u0165azce, ktor\u00e9 sa v \u00fadajoch zriedka vyskytuj\u00fa. V tomto pr\u00edpade bud\u00fa vybran\u00e9 podrozsahy pod\u013ea indexov a pre\u010d\u00edta sa menej \u00fadajov.<\/p>\n<p><\/p>\n<p>Ned\u00e1vno sa v ClickHouse objavili e\u0161te pokro\u010dilej\u0161ie funkcie pre fulltextov\u00e9 vyh\u013ead\u00e1vanie. To zah\u0155\u0148a vyh\u013ead\u00e1vanie viacer\u00fdch podre\u0165azcov naraz, vr\u00e1tane variantov s oh\u013eadom na ve\u013ekos\u0165 p\u00edsmen, bez oh\u013eadu na ve\u013ekos\u0165 p\u00edsmen, s podporou UTF-8 alebo len pre ASCII. Vyberte si t\u00fa najefekt\u00edvnej\u0161iu mo\u017enos\u0165, ktor\u00fa potrebujete. <\/p>\n<p><\/p>\n<p>Objavilo sa tie\u017e vyh\u013ead\u00e1vanie nieko\u013ek\u00fdch regul\u00e1rnych v\u00fdrazov v jednom prechode. Nemus\u00edte p\u00edsa\u0165 X like jeden podre\u0165azec or X like druh\u00fd podre\u0165azec. Len nap\u00ed\u0161ete a v\u0161etko sa vykon\u00e1 maxim\u00e1lne efekt\u00edvne.<\/p>\n<p><\/p>\n<p>Tretie \u2014 teraz existuje aproximovan\u00e9 vyh\u013ead\u00e1vanie regexov a aproximovan\u00e9 vyh\u013ead\u00e1vanie podre\u0165azcov. Ak niekto nap\u00edsal slovo s preklepom, bude sa h\u013eada\u0165 pod\u013ea maxim\u00e1lneho zhody.<\/p>\n<p><\/p>\n<h2 id=\"anchorhello-and-welcomeanchorkak-luchshe-organizovat-dostup-vnbspclickhouse-dlyanbspbolshogo-kolichestva-polzovateley\"><noindex><a rel=\"nofollow\" name=\"hello-and-welcome\"><\/a><\/noindex>Ako lep\u0161ie zorganizova\u0165 pr\u00edstup do ClickHouse pre ve\u013ek\u00e9 mno\u017estvo pou\u017e\u00edvate\u013eov?<\/h2>\n<p><\/p>\n<blockquote><p>Povedzte, ako najlep\u0161ie organizova\u0165 pr\u00edstup pre ve\u013ek\u00e9 mno\u017estvo pou\u017e\u00edvate\u013eov a analytikov. Ako vytvori\u0165 frontu, priorizova\u0165 po\u017eiadavky max concurrent queries, a ak\u00e9 n\u00e1stroje pou\u017ei\u0165?<\/p><\/blockquote>\n<p>Ak je klaster dostato\u010dne ve\u013ek\u00fd, dobr\u00fdm rie\u0161en\u00edm bude nastavi\u0165 \u010fal\u0161ie dva servery, ktor\u00e9 sa stan\u00fa vstupn\u00fdm bodom pre analytikov. Teda nep\u00fa\u0161\u0165a\u0165 analytikov na konkr\u00e9tne shardov\u00e9 klastre, ale jednoducho vytvori\u0165 dva pr\u00e1zdne servery, bez d\u00e1t, na ktor\u00fdch sa u\u017e nastav\u00ed pr\u00e1va pr\u00edstupu. Pri tom sa nastavenia pou\u017e\u00edvate\u013eov pri distribuovan\u00fdch po\u017eiadavk\u00e1ch pren\u00e1\u0161aj\u00fa na vzdialen\u00e9 servery. To znamen\u00e1, \u017ee v\u0161etko nastav\u00edte na t\u00fdchto dvoch serveroch a nastavenia bud\u00fa ma\u0165 \u00fa\u010dinok na celom klastri.<\/p>\n<p><\/p>\n<p>V podstate s\u00fa tieto servery bez d\u00e1t, ale objem RAM na nich je ve\u013emi d\u00f4le\u017eit\u00fd pre vykon\u00e1vanie po\u017eiadaviek. Disk m\u00f4\u017ee by\u0165 tie\u017e vyu\u017e\u00edvan\u00fd pre do\u010dasn\u00e9 \u00fadaje, ak je zapnut\u00e1 vonkaj\u0161ia agreg\u00e1cia alebo vonkaj\u0161ie triedenie.<\/p>\n<p><\/p>\n<p>Je d\u00f4le\u017eit\u00e9 sa pozrie\u0165 na nastavenia, ktor\u00e9 s\u00favisia so v\u0161etk\u00fdmi mo\u017en\u00fdmi limitmi. Ak teraz vojdete do klastra \u201eYandex.Metriky\u201c ako analytik a zad\u00e1te po\u017eiadavku <strong>select count from hits<\/strong>, okam\u017eite dostanem v\u00fdnimku, \u017ee nie je mo\u017en\u00e9 vykona\u0165 po\u017eiadavku. Maxim\u00e1lny po\u010det riadkov, ktor\u00e9 m\u00f4\u017eem skenova\u0165, je sto mili\u00e1rd, a celkovo ich v klastri je p\u00e4\u0165desiat bili\u00f3nov v jednej tabu\u013eke. To je prv\u00e9 obmedzenie. <\/p>\n<p><\/p>\n<p>Predpokladajme, \u017ee odstr\u00e1nim obmedzenie po\u010dtu riadkov a op\u00e4\u0165 vykon\u00e1m po\u017eiadavku. Potom uvid\u00edm nasleduj\u00facu v\u00fdnimku \u2014 je zapnut\u00e9 nastavenie <strong>force index by date<\/strong>. Nem\u00f4\u017eem vykona\u0165 po\u017eiadavku, ak nie je zadan\u00fd d\u00e1tumov\u00fd rozsah. Netreba sa spolieha\u0165 na to, \u017ee analytici ho zadaj\u00fa ru\u010dne. Typick\u00fd pr\u00edpad&nbsp;\u2014 nap\u00edsan\u00fd d\u00e1tumov\u00fd rozsah where event date between t\u00fd\u017ede\u0148. A potom len nespr\u00e1vne ozna\u010dili z\u00e1tvorku, a namiesto and to bolo or \u2014 or URL match. Ak neexistuj\u00fa \u017eiadne obmedzenia, za\u010dne preh\u013ead\u00e1va\u0165 st\u013apec URL a jednoducho preinvestuje obrovsk\u00e9 mno\u017estvo zdrojov.<\/p>\n<p><\/p>\n<p>Okrem toho, v ClickHouse s\u00fa dve nastavenia prior\u00edt. \u017dia\u013e, s\u00fa ve\u013emi primit\u00edvne. Jedno sa naz\u00fdva jednoducho <strong>priority<\/strong>. Ak priority&nbsp;\u2260&nbsp;0 a vykon\u00e1vaj\u00fa sa po\u017eiadavky s&nbsp;nejakou prioritou, ale z\u00e1rove\u0148 sa vykon\u00e1va po\u017eiadavka s&nbsp;prioritou, ktor\u00e1 m\u00e1 hodnotu ni\u017e\u0161iu, \u010do znamen\u00e1 vy\u0161\u0161iu prioritu, tak po\u017eiadavka s&nbsp;prioritou vy\u0161\u0161ou, \u010do ozna\u010duje ni\u017e\u0161iu prioritu, sa jednoducho pozastav\u00ed a po\u010das tohto \u010dasu nebude fungova\u0165.<\/p>\n<p><\/p>\n<p>Je to ve\u013emi hrub\u00e9 nastavenie a nie je vhodn\u00e9 pre&nbsp;pr\u00edpady, ke\u010f je na&nbsp;klastri trval\u00e1 z\u00e1\u0165a\u017e. Ale ak m\u00e1te kr\u00e1tke, impulsn\u00e9 po\u017eiadavky, ktor\u00e9 s\u00fa d\u00f4le\u017eit\u00e9, zatia\u013e \u010do v\u00e4\u010d\u0161inou je klastra ne\u010dinn\u00fd, tak\u00e9to nastavenie bude vyhovova\u0165.<\/p>\n<p><\/p>\n<p>\u010eal\u0161ie nastavenie prior\u00edt sa naz\u00fdva <strong>OS thread priority<\/strong>. Jednoducho nastavuje pre&nbsp;v\u0161etky vl\u00e1kna vykon\u00e1vania po\u017eiadavky hodnotu nice pre&nbsp;scheduler Linuxu. Funguje to tak nejako, ale predsa len funguje. Ak nastav\u00edte najni\u017e\u0161\u00ed mo\u017en\u00fd hodnotu nice&nbsp;\u2014 to je najvy\u0161\u0161ie z h\u013eadiska hodnoty, a znamen\u00e1 to najni\u017e\u0161iu prioritu&nbsp;\u2014 a po\u017eiadavk\u00e1m s&nbsp;vysokou prioritou nastav\u00edte -19, tak CPU bude spracov\u00e1va\u0165 n\u00edzkopr\u00edznakov\u00e9 po\u017eiadavky pribli\u017ene \u0161tyrikr\u00e1t menej ako vysoko prioritn\u00e9. <\/p>\n<p><\/p>\n<p>E\u0161te je potrebn\u00e9 nastavi\u0165 maxim\u00e1lny \u010das vykonania po\u017eiadavky&nbsp;\u2014 povedzme, p\u00e4\u0165 min\u00fat. Minim\u00e1lnu r\u00fdchlos\u0165 vykonania po\u017eiadavky&nbsp;\u2014 to je naozaj skvel\u00e9. Toto nastavenie existuje u\u017e dlh\u00fa dobu a je potrebn\u00e9, aby sme nehovorili iba, \u017ee ClickHouse nezastavuje, ale aby sme to skuto\u010dne presadili.<\/p>\n<p><\/p>\n<p>Predstavte si, \u017ee nastavujete: ak nejak\u00e1 po\u017eiadavka spracov\u00e1va menej ako mili\u00f3n riadkov za&nbsp;sekundu&nbsp;\u2014 takto to robi\u0165 nemo\u017eno. To hanb\u00ed na\u0161e dobr\u00e9 meno, na\u0161u dobr\u00fa datab\u00e1zu. Po\u010fme to jednoducho zak\u00e1za\u0165. V skuto\u010dnosti existuj\u00fa dve nastavenia. Jedno sa naz\u00fdva <strong>min execution speed<\/strong> \u2014 v&nbsp;riadkoch za&nbsp;sekundu, a druh\u00e1 sa naz\u00fdva timeout pred kontrolou minim\u00e1lnej vykon\u00e1vacej r\u00fdchlosti&nbsp;\u2014 predvolene p\u00e4tn\u00e1s\u0165 sek\u00fand. To znamen\u00e1, \u017ee p\u00e4tn\u00e1s\u0165 sek\u00fand m\u00f4\u017eete, a potom, ak je to pomal\u00e9, jednoducho hodi\u0165 v\u00fdnimku&nbsp;\u2014 preru\u0161i\u0165 po\u017eiadavku.<\/p>\n<p><\/p>\n<p>E\u0161te je potrebn\u00e9 nastavi\u0165 kv\u00f3ty. V&nbsp;ClickHouse je zabudovan\u00e1 mo\u017enos\u0165 kv\u00f3t, ktor\u00e1 po\u010d\u00edta spotrebu zdrojov. Ale, bohu\u017eia\u013e, nie \u017eelezn\u00fdch zdrojov ako CPU, diskov, ale logick\u00fdch&nbsp;\u2014 po\u010det spracovan\u00fdch po\u017eiadaviek, riadkov a pre\u010d\u00edtan\u00fdch bajtov. A m\u00f4\u017eete nastavi\u0165, napr\u00edklad, maximum sto po\u017eiadaviek po\u010das piatich min\u00fat a tis\u00edc po\u017eiadaviek hodinu.<\/p>\n<p><\/p>\n<p>Pre\u010do je to d\u00f4le\u017eit\u00e9? Preto\u017ee niektor\u00e9 analytick\u00e9 po\u017eiadavky bud\u00fa vykon\u00e1van\u00e9 manu\u00e1lne priamo z&nbsp;ClickHouse klienta. A v\u0161etko bude v poriadku. Ale ak m\u00e1te vo&nbsp;va\u0161ej spolo\u010dnosti pokrokov\u00fdch analytikov, nap\u00ed\u0161u skript, a v&nbsp;skripte m\u00f4\u017ee by\u0165 chyba. A t\u00e1to chyba sp\u00f4sob\u00ed, \u017ee po\u017eiadavka sa vykon\u00e1 v&nbsp;nekone\u010dnom cykle. Od toho sa treba chr\u00e1ni\u0165.<\/p>\n<p><\/p>\n<h2 id=\"anchorsmorgasbordanchormozhno-li-otdat-rezultaty-odnogo-zaprosa-desyati-klientam\"><noindex><a rel=\"nofollow\" name=\"smorgasbord\"><\/a><\/noindex>Je mo\u017en\u00e9 odovzda\u0165 v\u00fdsledky jedn\u00e9ho dotazu desiatim klientom?<\/h2>\n<p><\/p>\n<blockquote><p>M\u00e1me nieko\u013eko pou\u017e\u00edvate\u013eov, ktor\u00ed radi prich\u00e1dzaj\u00fa s&nbsp;ve\u013emi ve\u013ek\u00fdmi po\u017eiadavkami v&nbsp;rovnakom okamihu. Po\u017eiadavka je ve\u013ek\u00e1, vykon\u00e1va sa v&nbsp;princ\u00edpe r\u00fdchlo, ale kv\u00f4li mnoh\u00fdm tak\u00fdmto po\u017eiadavk\u00e1m s\u00fa\u010dasne je to ve\u013emi bolestiv\u00e9. Je mo\u017en\u00e9 rovnak\u00fa po\u017eiadavku, ktor\u00e1 pri\u0161la desa\u0165kr\u00e1t po sebe, vykona\u0165 raz a v\u00fdsledok odovzda\u0165 desiatim klientom?<\/p><\/blockquote>\n<p>Probl\u00e9m je v tom, \u017ee nem\u00e1me v\u00fdsledky cache alebo cache medzi v\u00fdsledkami. Existuje page cache opera\u010dn\u00e9ho syst\u00e9mu, ktor\u00fd umo\u017en\u00ed znovu ne\u010d\u00edta\u0165 d\u00e1ta z&nbsp;disku, ale, bohu\u017eia\u013e, d\u00e1ta sa aj tak bud\u00fa musie\u0165 dekomprimova\u0165, deserializova\u0165 a spracova\u0165 znovu. <\/p>\n<p><\/p>\n<p>Dalo by sa tomu nejako vyhn\u00fa\u0165, bu\u010f cacheovan\u00edm medzi v\u00fdsledkami, alebo usporiadan\u00edm podobn\u00fdch po\u017eiadaviek do nejakej fronty a pridan\u00edm cache v\u00fdsledkov. Teraz m\u00e1me v&nbsp;v\u00fdvoji jeden pull request, ktor\u00fd prid\u00e1va cache po\u017eiadaviek, ale iba pre podpo\u017eiadavky v sekcii in a join \u2013 to znamen\u00e1, \u017ee to nie je \u00fapln\u00e9 rie\u0161enie.<\/p>\n<p><\/p>\n<p>Av\u0161ak aj u n\u00e1s sa objavuje tak\u00e1to situ\u00e1cia. Obzvl\u00e1\u0161\u0165 kanonick\u00fd pr\u00edklad s\u00fa dotazy s pagin\u00e1ciou. Existuje spr\u00e1va, v ktorej je nieko\u013eko str\u00e1nok, a prebieha dotaz limit 10. Potom to ist\u00e9, ale limit 10,10. N\u00e1sledne \u010fal\u0161ia str\u00e1nka. A p\u00fdta sa, pre\u010do to v\u0161etko po\u010d\u00edtame na ka\u017ed\u00fa jednu str\u00e1nku? Ale v s\u00fa\u010dasnosti neexistuje \u017eiadne rie\u0161enie a nie je mo\u017en\u00e9 sa tomu vyhn\u00fa\u0165.<\/p>\n<p><\/p>\n<p>Existuje alternat\u00edvne rie\u0161enie, ktor\u00e9 sa in\u0161taluje ako sidcar ved\u013ea ClickHouse \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/chproxy\">ClickHouse Proxy<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Kiril \u0160vakov:<\/strong> V ClickHouse Proxy je zabudovan\u00fd rate limiter a zabudovan\u00fd cache v\u00fdsledkov. Existuje tam ve\u013ea nastaven\u00ed, preto\u017ee sa rie\u0161il podobn\u00fd probl\u00e9m. Proxy umo\u017e\u0148uje limitova\u0165 dotazy, usporad\u00favaj\u00fac ich do fronty, a nastavi\u0165, ako dlho zost\u00e1va cache dotazov. Ak boli dotazy naozaj rovnak\u00e9, Proxy ich vr\u00e1ti viackr\u00e1t, a do ClickHouse sa chyst\u00e1 len raz.<\/p>\n<p><\/p>\n<p>Aj v Nginx je k dispoz\u00edcii cache vo verzii zadarmo a to tie\u017e funguje. Nginx m\u00e1 dokonca nastavenia, \u017ee ak dotazy prich\u00e1dzaj\u00fa s\u00fa\u010dasne, spomal\u00ed \u010fal\u0161ie, k\u00fdm jeden nedokon\u010d\u00ed. Ale konkr\u00e9tne v ClickHouse Proxy je nastavenie uroben\u00e9 ove\u013ea lep\u0161ie. Bol navrhnut\u00fd \u0161peci\u00e1lne pre ClickHouse, pre tieto dotazy, tak\u017ee je to viac vhodn\u00e9. A in\u0161taluje sa jednoducho. <\/p>\n<p><\/p>\n<h2 id=\"anchorasynchronousanchorkak-byt-snbspasinhronnymi-operaciyami-i-materializovannymi-predstavleniyami\"><noindex><a rel=\"nofollow\" name=\"asynchronous\"><\/a><\/noindex>Ako nalo\u017ei\u0165 s asynchr\u00f3nnymi oper\u00e1ciami a materializovan\u00fdmi poh\u013eadmi?<\/h2>\n<p><\/p>\n<blockquote><p>Existuje tak\u00fd probl\u00e9m, \u017ee oper\u00e1cie s replika\u010dn\u00fdm enginom s\u00fa asynchr\u00f3nne \u2014 najprv sa zapisuj\u00fa \u00fadaje, potom prebieha ich zhutnenie. Ak pod tabu\u013ekou \u017eije materializovan\u00e1 tabu\u013eka s nejak\u00fdmi agreg\u00e1tmi, tak sa do nej zap\u00ed\u0161u duplicity. A ak neexistuje nejak\u00e1 zlo\u017eit\u00e1 logika, \u00fadaje bud\u00fa zdvojen\u00e9. \u010co s t\u00fdm m\u00f4\u017eeme urobi\u0165?<\/p>\n<p>Existuje zjavn\u00e9 rie\u0161enie \u2014 implementova\u0165 sp\u00fa\u0161\u0165a\u010d na ur\u010dit\u00fa triedu materializovan\u00fdch poh\u013eadov pri asynchr\u00f3nnej oper\u00e1cii zhutnenia. Existuj\u00fa nejak\u00e9 \"strieborn\u00e9 n\u00e1boje\", pl\u00e1ny na implement\u00e1ciu podobn\u00fdch funk\u010dnost\u00ed?<\/p><\/blockquote>\n<p>Stoj\u00ed za to sa zamyslie\u0165 nad t\u00fdm, ako funguje deduplik\u00e1cia. To, o \u010dom teraz hovor\u00edm, sa net\u00fdka ot\u00e1zky, ale pre istotu je dobr\u00e9 na to pam\u00e4ta\u0165.<\/p>\n<p><\/p>\n<p>Pri vkladan\u00ed do&nbsp;replikovanej tabulky doch\u00e1dza k deduplik\u00e1cii cel\u00fdch vlo\u017een\u00fdch blokov. Ak znova vlo\u017e\u00edte ten ist\u00fd blok, ktor\u00fd obsahuje rovnak\u00fd po\u010det rovnak\u00fdch riadkov v&nbsp;tom istom porad\u00ed, \u00fadaje sa deduplikuj\u00fa. Dostanete \"Ok\" ako odpove\u010f na&nbsp;insert, ale v skuto\u010dnosti bude zap\u00edsan\u00e1 len jedna d\u00e1vka \u00fadajov a nebude duplicitne z\u00e1znamovan\u00e1.<\/p>\n<p><\/p>\n<p>To je potrebn\u00e9 pre&nbsp;ur\u010ditos\u0165. Ak ste po\u010das vkladania dostali \"Ok\", znamen\u00e1 to, \u017ee va\u0161e \u00fadaje boli vlo\u017een\u00e9. Ak ste dostali chybu od&nbsp;ClickHouse, znamen\u00e1 to, \u017ee neboli vlo\u017een\u00e9 a treba vkladanie zopakova\u0165. Ale ak sa po\u010das vkladania preru\u0161\u00ed pripojenie, nem\u00e1te istotu, \u010di boli \u00fadaje vlo\u017een\u00e9 alebo nie. Jedinou mo\u017enos\u0165ou je zopakova\u0165 vkladanie. Ak spom\u00ednan\u00e9 \u00fadaje skuto\u010dne boli vlo\u017een\u00e9 a vy ich vlo\u017e\u00edte znova, existuje deduplik\u00e1cia blokov. T\u00e1 je potrebn\u00e1 na&nbsp;vyhnutie sa duplicite. <\/p>\n<p><\/p>\n<p>A je d\u00f4le\u017eit\u00e9, ako to funguje pre&nbsp;materializovan\u00e9 poh\u013eady. Ak boli \u00fadaje deduplikovan\u00e9 pri&nbsp;vkladan\u00ed do&nbsp;hlavnej tabulky, tak do&nbsp;materializovan\u00e9ho poh\u013eadu tie\u017e nep\u00f4jdu.<\/p>\n<p><\/p>\n<p>Teraz k&nbsp;ot\u00e1zke. M\u00e1te zlo\u017eitej\u0161iu situ\u00e1ciu, preto\u017ee zapisujete duplicity jednotliv\u00fdch riadkov. To znamen\u00e1, \u017ee cel\u00e1 d\u00e1vka nie je duplicitne zaznamenan\u00e1, ale konkr\u00e9tne riadky sa kompaktizuj\u00fa na&nbsp;pozad\u00ed. Skuto\u010dne, \u00fadaje sa zhutnia v&nbsp;hlavnej tabulke, a do&nbsp;materializovan\u00e9ho poh\u013eadu p\u00f4jdu nezl\u00fa\u010den\u00e9, a pri&nbsp;meran\u00ed sa ni\u010d s&nbsp;materializovan\u00fdmi poh\u013eadmi nestane. Preto\u017ee materializovan\u00fd poh\u013ead&nbsp;je ni\u010d in\u00e9 ako sp\u00fa\u0161\u0165a\u010d na&nbsp;insert. Pri&nbsp;in\u00fdch oper\u00e1ci\u00e1ch sa s&nbsp;n\u00edm ni\u010d dodato\u010dne nedeje.<\/p>\n<p><\/p>\n<p>A tu v\u00e1s nem\u00f4\u017eem pote\u0161i\u0165. Treba len h\u013eada\u0165 konkr\u00e9tne rie\u0161enie pre&nbsp;tento pr\u00edpad. Napr\u00edklad, existuje mo\u017enos\u0165 vykona\u0165 jeho nahradenie aj v&nbsp;materializovanom poh\u013eade, a sp\u00f4sob deduplik\u00e1cie mo\u017eno bude fungova\u0165 rovnako. Ale bohu\u017eia\u013e, nie v\u017edy. Ak je agreguj\u00faci, tak to nevyjde. <\/p>\n<p><\/p>\n<p><strong>Kiril \u0160vakov:<\/strong> Aj my sme mali svoje \u0165a\u017ekosti s kostyliz\u00e1ciou. Bolo \u0165a\u017ek\u00e9, \u017ee existovali zobrazenia reklamy a niektor\u00e9 d\u00e1ta, ktor\u00e9 sme mohli zobrazi\u0165 v re\u00e1lnom \u010dase - boli to len zobrazenia. Tieto sa zriedka duplikovali, ale ak sa to stalo, aj tak ich nakoniec zma\u017eeme. A boli veci, ktor\u00e9 sa duplikova\u0165 nemohli - kliknutia a cel\u00e1 t\u00e1to hist\u00f3ria. Ale chceli sme ich zobrazi\u0165 takmer okam\u017eite.<\/p>\n<p><\/p>\n<p>Ako boli vytvoren\u00e9 materializovan\u00e9 poh\u013eady? Existovali poh\u013eady, do ktor\u00fdch sa zapisovalo priamo - prebiehal z\u00e1pis do surov\u00fdch d\u00e1t a zapisovalo sa do poh\u013eadov. Tam nejak\u00fd \u010das neboli d\u00e1ta ve\u013emi presn\u00e9, duplikovali sa a podobne. A je tu druh\u00e1 \u010das\u0165 tabu\u013eky, kde vyzeraj\u00fa \u00faplne rovnako ako materializovan\u00e9 poh\u013eady, to znamen\u00e1, \u017ee po \u0161trukt\u00fare s\u00fa \u00faplne identick\u00e9. Raz za \u010das prepo\u010d\u00edtavame d\u00e1ta, dodato\u010dne prepo\u010d\u00edtavame d\u00e1ta bez duplik\u00e1tov a zapisujeme ich do t\u00fdchto tabuliek. <\/p>\n<p><\/p>\n<p>Prech\u00e1dzali sme cez API - s ClickHouse manu\u00e1lne to nebude fungova\u0165. A API sleduje: ke\u010f m\u00e1m d\u00e1tum posledn\u00e9ho pridan\u00e9ho \u00fadaju do tabu\u013eky, kde s\u00fa zaru\u010dene u\u017e spr\u00e1vne, vypo\u010d\u00edtan\u00e9 d\u00e1ta, a rob\u00ed dotaz na jednu tabu\u013eku a na druh\u00fa tabu\u013eku. Z jednej tabu\u013eky vyber\u00e1 do ur\u010dit\u00e9ho \u010dasu, a z druhej dop\u013a\u0148a to, \u010do e\u0161te nebolo vypo\u010d\u00edtan\u00e9. A toto funguje, ale nie pomocou jedn\u00e9ho ClickHouse.<\/p>\n<p><\/p>\n<p>Ak m\u00e1te nejak\u00e9 API - pre analytikov, pre pou\u017e\u00edvate\u013eov - tak to v podstate je mo\u017enos\u0165. V\u017edy pri prepo\u010d\u00edtavan\u00ed, v\u017edy znova prepo\u010d\u00edtavaj\u00fa. Toto sa d\u00e1 robi\u0165 raz denne alebo v nejakom inom \u010dase. Vy si sami vyber\u00e1te rozsah, ktor\u00fd nepotrebujete a ktor\u00fd nie je kritick\u00fd.<\/p>\n<p><\/p>\n<h2 id=\"anchordashboardanchorv-clickhouse-mnogo-logov-kak-ya-mogu-videt-vsyo-chto-proishodit-s-serverom-vnbspmomente\"><noindex><a rel=\"nofollow\" name=\"dashboard\"><\/a><\/noindex>V ClickHouse je mno\u017estvo logov. Ako m\u00f4\u017eem vidie\u0165 v\u0161etko, \u010do sa deje so serverom, v danom momente?<\/h2>\n<p><\/p>\n<blockquote><p>V ClickHouse existuje ve\u013emi ve\u013ek\u00e9 mno\u017estvo r\u00f4znych logov, a toto mno\u017estvo sa zvy\u0161uje. V nov\u00fdch verzi\u00e1ch s\u00fa niektor\u00e9 z nich dokonca predvolene zapnut\u00e9, v star\u0161\u00edch verzi\u00e1ch ich treba zap\u00edna\u0165 pri aktualiz\u00e1cii. Napriek tomu ich st\u00e1le prib\u00fada. R\u00e1d by som videl v kone\u010dnom d\u00f4sledku, \u010do sa teraz deje s moj\u00edm serverom, mo\u017eno na nejakom preh\u013eadnom dashboarde. <\/p>\n<p>Nem\u00e1te v t\u00edmto ClickHouse, nebo v t\u00fdmech va\u0161ich p\u0159\u00e1tel, kte\u0159\u00ed podporuj\u00ed n\u011bjakou funk\u010dnost hotov\u00fdch dashboard\u016f, kter\u00e9 by tyto logy zobrazovaly ve form\u011b ji\u017e hotov\u00e9ho produktu? Nakonec, jen tak sledovat logy v ClickHouse \u2014 to je super. Ale bylo by skv\u011bl\u00e9, kdyby to bylo ji\u017e p\u0159ipraveno ve form\u011b dashboardu. Z toho bych m\u011bl radost. <\/p><\/blockquote>\n<p>Dashboardy existuj\u00ed, i kdy\u017e nejsou standardizovan\u00e9. U n\u00e1s ve firm\u011b pou\u017e\u00edv\u00e1 ClickHouse asi 60 t\u00fdm\u016f, a nejpodivn\u011bj\u0161\u00ed je, \u017ee mnoz\u00ed z nich maj\u00ed dashboardy, kter\u00e9 si sami vytvo\u0159ili, a jsou trochu jin\u00e9. N\u011bkter\u00e9 t\u00fdmy pou\u017e\u00edvaj\u00ed intern\u00ed instalaci \u201eYandex.Cloud\u201c. Tam jsou n\u011bjak\u00e9 hotov\u00e9 reporty, i kdy\u017e ne v\u0161echny pot\u0159ebn\u00e9. U jin\u00fdch maj\u00ed sv\u00e9 vlastn\u00ed. <\/p>\n<p><\/p>\n<p>Moji kolegov\u00e9 z \u201eMetrix\u201c maj\u00ed sv\u016fj dashboard v Grafan\u011b, a j\u00e1 m\u00e1m sv\u016fj pro jejich klastr. D\u00edv\u00e1m se tam na v\u011bci jako cache hit pro cache timestamp\u016f. A dokonce slo\u017eit\u011bj\u0161\u00ed je to, \u017ee pou\u017e\u00edv\u00e1me r\u016fzn\u00e9 n\u00e1stroje. Sv\u016fj dashboard jsem vytvo\u0159il na velmi star\u00e9m n\u00e1stroji, kter\u00fd se jmenuje Graphite-web. Je \u00fapln\u011b o\u0161kliv\u00fd. A tak ho pou\u017e\u00edv\u00e1m dodnes, i kdy\u017e Grafana by pravd\u011bpodobn\u011b byla pohodln\u011bj\u0161\u00ed a hez\u010d\u00ed. <\/p>\n<p><\/p>\n<p>Z\u00e1kladn\u00ed v\u011bc na dashboardech je stejn\u00e1. To jsou syst\u00e9mov\u00e9 metriky pro klastr: CPU, pam\u011b\u0165, disk, s\u00ed\u0165. Dal\u0161\u00ed \u2014 po\u010det sou\u010dasn\u00fdch dotaz\u016f, po\u010det sou\u010dasn\u00fdch merge, po\u010det dotaz\u016f za sekundu, maxim\u00e1ln\u00ed po\u010det kousk\u016f pro partition tabulek MergeTree, zpo\u017ed\u011bn\u00ed replikace, velikost repli\u010dn\u00ed fronty, po\u010det vlo\u017een\u00fdch \u0159\u00e1dk\u016f za sekundu, po\u010det vlo\u017een\u00fdch blok\u016f za sekundu. To v\u0161e, co nen\u00ed z log\u016f, ale z metrik.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Alexei, cht\u011bl bych to trochu upravit. Existuje Grafana. Grafana m\u00e1 datov\u00fd zdroj, kter\u00fdm je ClickHouse. To znamen\u00e1, \u017ee mohu z Grafany d\u011blat dotazy p\u0159\u00edmo do ClickHouse. V ClickHouse je tabulka s logy, ta je stejn\u00e1 pro v\u0161echny. Chci, abych v Grafan\u011b mohl p\u0159istupovat k t\u00e9to tabulce log\u016f a vid\u011bt ty dotazy, kter\u00e9 m\u016fj server pos\u00edl\u00e1. Bylo by skv\u011bl\u00e9 m\u00edt takov\u00fd dashboard.<\/p>\n<p><\/p>\n<p>S\u00e1m jsem si ho ud\u011blal. Ale m\u00e1m ot\u00e1zku \u2014 pokud je to v\u0161echno standardizovan\u00e9 a Grafana se pou\u017e\u00edv\u00e1 v\u0161emi, pro\u010d v \u201eYandexu\u201c neexistuje takov\u00fd ofici\u00e1ln\u00ed dashboard?<\/p>\n<p><\/p>\n<p><strong>Kiril \u0160vakov:<\/strong> V skuto\u010dnosti datasource, ktor\u00fd je k ClickHouse, v s\u00fa\u010dasnosti podporuje Altinity. A ja sa chcem len vyda\u0165 smerom, kam treba kopn\u00fa\u0165 a koho posun\u00fa\u0165. M\u00f4\u017eete sa ich op\u00fdta\u0165, preto\u017ee \u201eYandex\u201c predsa rob\u00ed ClickHouse, a nie pr\u00edbeh okolo neho. Altinity je hlavn\u00e1 spolo\u010dnos\u0165, ktor\u00e1 v s\u00fa\u010dasnosti podporuje ClickHouse. Nezanechaj\u00fa ho, ale bud\u00fa ho \u010falej podporova\u0165. Preto\u017ee v\u0161eobecne, na na\u010d\u00edtanie dashboardu na str\u00e1nku Grafana je potrebn\u00e9 sa len zaregistrova\u0165 a nahra\u0165 ho \u2014 nie s\u00fa tu \u017eiadne ve\u013ek\u00e9 probl\u00e9my. <\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> Za posledn\u00fd rok sa v ClickHouse pridalo ve\u013ea mo\u017enost\u00ed na profilovanie dopytov. Existuj\u00fa metriky pre ka\u017ed\u00fd dopyt pod\u013ea vyu\u017eitia zdrojov. A ned\u00e1vno bol pridan\u00fd e\u0161te ni\u017e\u0161ie\u00farov\u0148ov\u00fd profiler dopytov, aby sa pozrel, kde dopyt tr\u00e1vi ka\u017ed\u00fa milisekundu. Ale aby som vyu\u017eil t\u00fato funkciu, mus\u00edm otvori\u0165 konzolov\u00e9ho klienta a zada\u0165 dopyt, na ktor\u00fd neust\u00e1le zab\u00fadam. Niekde som si ho ulo\u017eil a neust\u00e1le zab\u00fadam, kam presne. <\/p>\n<p><\/p>\n<p>Chcel by som, aby existoval n\u00e1stroj, v ktorom by bolo jednoducho nap\u00edsan\u00e9 \u2014 tu s\u00fa va\u0161e \u0165a\u017ek\u00e9 dopyty, zoraden\u00e9 pod\u013ea tried dopytov. Kliknete na nejak\u00fd a povedali by mi, \u017ee je \u0165a\u017ek\u00fd preto. V s\u00fa\u010dasnosti tak\u00e9to rie\u0161enie neexistuje. A naozaj je dos\u0165 zvl\u00e1\u0161tne, \u017ee ke\u010f sa ma \u013eudia p\u00fdtaj\u00fa: \u201ePovedzte, existuj\u00fa nejak\u00e9 hotov\u00e9 dashboardy pre Grafana?\u201c, hovor\u00edm: \u201ePrejdite na str\u00e1nku Grafana, tam je komunita 'Dashboardy', a tam je dashboard od Dima, je tam dashboard od Kostyana. \u010co to je, neviem, s\u00e1m som to nepou\u017e\u00edval\u201c.<\/p>\n<p><\/p>\n<h2 id=\"anchorzenanchorkak-vozdeystvovat-na-merdzhi-chtoby-server-ne-padal-vnbspoom\"><noindex><a rel=\"nofollow\" name=\"zen\"><\/a><\/noindex>Ako ovplyvni\u0165 merge, aby server nespadol do OOM?<\/h2>\n<p><\/p>\n<blockquote><p>M\u00e1m tabu\u013eku, v ktorej je len jedna part\u00edcia, je to ReplacingMergeTree. Do nej zapisujem d\u00e1ta u\u017e \u0161tyri roky. Potreboval som urobi\u0165 v nej alter a odstr\u00e1ni\u0165 niektor\u00e9 d\u00e1ta.<\/p>\n<p>Urobil som to a po\u010das spracovania tohto dopytu bola pou\u017eit\u00e1 cel\u00e1 pam\u00e4\u0165 na v\u0161etk\u00fdch serveroch klastera, a v\u0161etky servery klastera sa jednotne dostali do OOM. Potom sa v\u0161etky znova spustili, za\u010dali vykon\u00e1va\u0165 merge tej istej oper\u00e1cie, toho bloku d\u00e1t, a znova spadli do OOM. Potom sa znova spustili a znova spadli. A t\u00e1to vec sa nikdy nezastavila.<\/p>\n<p>N\u00e1sledn\u011b se uk\u00e1zalo, \u017ee to byl ve skute\u010dnosti bug, kter\u00fd kluci opravili. To je skv\u011bl\u00e9, moc d\u011bkuji. Ale n\u011bjak\u00fd pocit viny z\u016fstal. A te\u010f, kdy\u017e p\u0159em\u00fd\u0161l\u00edm o tom, \u017ee bych m\u011bl ud\u011blat n\u011bjak\u00fd merge v tabulce, m\u00e1m ot\u00e1zku \u2013 pro\u010d nemohu n\u011bjak ovlivnit tyto merge? Nap\u0159\u00edklad omezit je podle mno\u017estv\u00ed pot\u0159ebn\u00e9 opera\u010dn\u00ed pam\u011bti, nebo obecn\u011b podle jejich po\u010dtu, kter\u00fd zpracov\u00e1v\u00e1 konkr\u00e9tn\u011b tato tabulka.<\/p>\n<p>M\u00e1m tabulku, kter\u00e1 se jmenuje \"Metriky\", pros\u00edm, zpracuj ji ve dvou vl\u00e1knech. Nen\u00ed pot\u0159eba m\u00edt najednou deset nebo p\u011bt merge, ud\u011blej to ve dvou. Mysl\u00edm, \u017ee na dva m\u00e1m dost pam\u011bti, ale na to, abych zpracov\u00e1val deset, mo\u017en\u00e1 nebude sta\u010dit. Pro\u010d z\u016fst\u00e1v\u00e1 strach? Proto\u017ee tabulka roste, a n\u011bkdy se setk\u00e1m se situac\u00ed, \u017ee u\u017e ne kv\u016fli bugu, ale proto\u017ee se data m\u011bn\u00ed v tak velk\u00e9m mno\u017estv\u00ed, \u017ee na serveru prost\u011b nebude dost pam\u011bti. A pak server spadne do OOM p\u0159i merge. A mutaci mohu zru\u0161it, ale merge u\u017e ne.<\/p><\/blockquote>\n<p>V\u00edte, p\u0159i merge server nespadne do OOM, proto\u017ee b\u011bhem merge se pou\u017e\u00edv\u00e1 mno\u017estv\u00ed pam\u011bti jen na jeden mal\u00fd rozsah dat. Tak\u017ee v\u0161echno bude v po\u0159\u00e1dku bez ohledu na objem dat.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Dob\u0159e. Je tu takov\u00fd moment, \u017ee po proveden\u00ed opravy bugu jsem si st\u00e1hl novou verzi a na jin\u00e9 tabulce, men\u0161\u00ed, kde je hodn\u011b partition, jsem provedl podobnou operaci. A b\u011bhem merge bylo na serveru spot\u0159ebov\u00e1no kolem 100 GB opera\u010dn\u00ed pam\u011bti. M\u011bl jsem 150 GB obsazeno, 100 GB vzalo, a z\u016fstalo mi okno na 50 GB, tak\u017ee jsem nespadl do OOM.<\/p>\n<p><\/p>\n<p>Co m\u011b v tuto chv\u00edli chr\u00e1n\u00ed, abych nespadl do OOM, pokud opravdu spot\u0159ebov\u00e1v\u00e1 kolem 100 GB opera\u010dn\u00ed pam\u011bti? Jak se m\u00e1m zachovat v situaci, kdy\u017e najednou dojde opera\u010dn\u00ed pam\u011b\u0165 p\u0159i merge?<\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> Existuje tak\u00fd probl\u00e9m, \u017ee spotreba opera\u010dnej pam\u00e4te pri&nbsp;merd\u017eovan\u00ed sa nekon\u010d\u00ed. A druh\u00fd probl\u00e9m spo\u010d\u00edva v&nbsp;tom, \u017ee ak bol nejak\u00fd merd\u017e napl\u00e1novan\u00fd, je potrebn\u00e9 ho vykona\u0165, preto\u017ee je zap\u00edsan\u00fd v&nbsp;logu replik\u00e1cie. Log replik\u00e1cie&nbsp;\u2014 to s\u00fa tie akcie, ktor\u00e9 s\u00fa potrebn\u00e9 na to, aby sa replik\u00e1cia dostala do&nbsp;konzistentn\u00e9ho stavu. Ak sa neurobia ru\u010dn\u00e9 manipul\u00e1cie, ktor\u00e9 vr\u00e1ti tento log replik\u00e1cie sp\u00e4\u0165, merd\u017e bude musie\u0165 by\u0165 vykonan\u00fd, tak \u010di onak.<\/p>\n<p><\/p>\n<p>Samozrejme, nebolo by na \u0161kodu ma\u0165 obmedzenie pre&nbsp;opera\u010dn\u00fa pam\u00e4\u0165, ktor\u00e9 'pre ka\u017ed\u00fd pr\u00edpad' chr\u00e1ni konkr\u00e9tne pred OOM. Nepom\u00f4\u017ee to vykonaniu merd\u017eu, ten sa za\u010dne znova, dosiahne nejak\u00fd prah, vyhod\u00ed v\u00fdnimku a potom sa znova za\u010dne&nbsp;\u2014 z toho ni\u010d dobr\u00e9 nevznikne. Ale v&nbsp;princ\u00edpe by bolo u\u017eito\u010dn\u00e9 toto obmedzenie zavies\u0165.<\/p>\n<p><\/p>\n<h2 id=\"anchorgoanchorkak-budet-proishodit-razrabotka-golang-drayvera-dlya-clickhouse\"><noindex><a rel=\"nofollow\" name=\"go\"><\/a><\/noindex>Ako bude prebieha\u0165 v\u00fdvoj ovl\u00e1da\u010da Golang pre ClickHouse?<\/h2>\n<p><\/p>\n<blockquote><p>Ovl\u00e1da\u010d Golang, ktor\u00fd nap\u00edsal Kirill Shvakov, je teraz ofici\u00e1lne podporovan\u00fd t\u00edmom ClickHouse. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/clickhouse-go\">v repozit\u00e1ri ClickHouse<\/a><\/noindex>, teraz je ve\u013ek\u00fd a prav\u00fd.<\/p>\n<p>Mal\u00e1 pozn\u00e1mka. Existuje \u00fa\u017easn\u00e9 a v\u0161etk\u00fdmi ob\u013e\u00faben\u00e9 \u00falo\u017eisko norm\u00e1lnych foriem nekone\u010dn\u00e9ho poradia \u2014 to je Vertica. Maj\u00fa aj svoj ofici\u00e1lny python ovl\u00e1da\u010d, ktor\u00fd je podporovan\u00fd v\u00fdvoj\u00e1rmi Vertica. A nieko\u013ekokr\u00e1t sa stalo, \u017ee verzie \u00falo\u017eiska a verzie ovl\u00e1da\u010da sa dos\u0165 z\u00e1sadne rozch\u00e1dzali, a ovl\u00e1da\u010d v istom momente prestal fungova\u0165. A druh\u00fd bod. Podpora tohto ofici\u00e1lneho ovl\u00e1da\u010da, zd\u00e1 sa mi, prebieha syst\u00e9mom \"nippl\" \u2014 nap\u00ed\u0161e\u0161 im ot\u00e1zku a t\u00e1 vis\u00ed ve\u010dne.<\/p>\n<p>M\u00e1m dve ot\u00e1zky. Teraz je Golang ovl\u00e1da\u010d Kirilla takmer predvolen\u00fd sp\u00f4sob, ako komunikova\u0165 z Golang s ClickHouse. Akur\u00e1t, \u017ee niekto cez http rozhranie st\u00e1le komunikuje, lebo sa mu to tak p\u00e1\u010di. Ako prebieha v\u00fdvoj tohto ovl\u00e1da\u010da? Bude synchronizovan\u00fd s nejak\u00fdmi zlomy v samotnom \u00falo\u017eisku? A ak\u00fd je postup pri prehliadan\u00ed ot\u00e1zok? <\/p><\/blockquote>\n<p><strong>Kiril \u0160vakov:<\/strong> Prv\u00e9&nbsp;\u2014 ako je to v\u0161etko usporiadan\u00e9 byrokraticky. Tento bod nebol diskutovan\u00fd, tak\u017ee nem\u00f4\u017eem na to odpoveda\u0165.<\/p>\n<p><\/p>\n<p>Aby som mohol odpoveda\u0165 na&nbsp;ot\u00e1zku o&nbsp;issue, potrebujem mal\u00fa hist\u00f3riu ovl\u00e1da\u010da. Pracoval som v&nbsp;spolo\u010dnosti, ktor\u00e1 mala ve\u013ea d\u00e1t. Bolo to reklamn\u00e9 to\u010denie s&nbsp;obrovsk\u00fdm mno\u017estvom udalost\u00ed, ktor\u00e9 bolo potrebn\u00e9 niekde ulo\u017ei\u0165. A v&nbsp;nejakom momente sa objavil ClickHouse. Naliali sme tam d\u00e1ta a spo\u010diatku to fungovalo dobre, ale potom ClickHouse spadol. V&nbsp;tom okamihu sme sa rozhodli, \u017ee to nepotrebujeme. <\/p>\n<p><\/p>\n<p>O rok sme sa vr\u00e1tili k&nbsp;idei pou\u017e\u00edvania ClickHouse a potrebovali sme nejak\u00fdm sp\u00f4sobom zapisova\u0165 d\u00e1ta. \u00davodn\u00e1 situ\u00e1cia bola tak\u00e1&nbsp;\u2014 hardv\u00e9r bol ve\u013emi slab\u00fd, zdrojov bolo m\u00e1lo. Ale v\u017edy sme takto pracovali, a preto sme sa pozreli na nat\u00edvny protokol.<\/p>\n<p><\/p>\n<p>Ke\u010f\u017ee sme pracovali na&nbsp;Go, bolo jasn\u00e9, \u017ee potrebujeme ovl\u00e1da\u010d na&nbsp;Go. Robil som ho prakticky na pln\u00fd \u00fav\u00e4zok&nbsp;\u2014 to bola moja pracovn\u00e1 \u00faloha. Do&nbsp;nejak\u00e9ho momentu sme ho dokon\u010dili a v&nbsp;principu nikto si nemyslel, \u017ee by ho niekto in\u00fd pou\u017e\u00edval. Potom pri\u0161iel CloudFlare s&nbsp;presne tou istou probl\u00e9mom a nejak\u00fd \u010das sme s&nbsp;nimi pracovali ve\u013emi hladko, preto\u017ee mali rovnak\u00e9 \u00falohy. A robili sme to aj v&nbsp;ClickHouse samotnom, aj v&nbsp;ovl\u00e1da\u010di. <\/p>\n<p><\/p>\n<p>V ur\u010ditom momente som sa jednoducho prestal venova\u0165 tomuto, preto\u017ee moja aktivita v oblasti ClickHouse a pr\u00e1ca sa trochu zmenila. Preto sa issue nezatv\u00e1raj\u00fa. Pravidelne do repozit\u00e1ra commituj\u00fa \u013eudia, ktor\u00ed to potrebuj\u00fa. Potom sa pozriem na pull request a ob\u010das aj nie\u010do s\u00e1m oprav\u00edm, ale to sa st\u00e1va zriedkavo.<\/p>\n<p><\/p>\n<p>Chcem sa vr\u00e1ti\u0165 k ovl\u00e1da\u010du. Pred nieko\u013ek\u00fdmi rokmi, ke\u010f sa to cel\u00e9 za\u010d\u00ednalo, bol ClickHouse tie\u017e in\u00fd a mal in\u00e9 mo\u017enosti. Teraz v\u0161ak u\u017e vieme, ako prepracova\u0165 ovl\u00e1da\u010d, aby bol dobr\u00fd. Ak sa to stane, verzia 2 bude v ka\u017edom pr\u00edpade nekompatibiln\u00e1 kv\u00f4li nahromaden\u00fdm workaroundom. <\/p>\n<p><\/p>\n<p>Ako to zorganizova\u0165, neviem. S\u00e1m nem\u00e1m ve\u013ea \u010dasu. Ak sa niektor\u00ed \u013eudia rozhodn\u00fa prepracova\u0165 ovl\u00e1da\u010d, m\u00f4\u017eem im pom\u00f4c\u0165 a poveda\u0165, \u010do robi\u0165. Ale akt\u00edvne zapojenie Yandexu do rozvoja projektu zatia\u013e nebolo diskutovan\u00e9. <\/p>\n<p><\/p>\n<p><strong>Alexei Milovidov:<\/strong> V skuto\u010dnosti zatia\u013e neexistuje \u017eiadna byrokracia oh\u013eadom t\u00fdchto ovl\u00e1da\u010dov. Jedin\u00e1 vec je, \u017ee s\u00fa vy\u017eaduje ofici\u00e1lnu organiz\u00e1ciu, teda tento ovl\u00e1da\u010d je uznan\u00fd ako ofici\u00e1lne rie\u0161enie pre Go. Existuj\u00fa aj in\u00e9 ovl\u00e1da\u010de, ale tie s\u00fa separ\u00e1tne. <\/p>\n<p><\/p>\n<p>U n\u00e1s vn\u00fatri nie je \u017eiadny rozvoj t\u00fdchto ovl\u00e1da\u010dov. Ot\u00e1zka je, \u010di dok\u00e1\u017eeme naja\u0165 samostatn\u00e9ho \u010dloveka, nie \u0161pecificky pre tento ovl\u00e1da\u010d, ale na rozvoj v\u0161etk\u00fdch komunitn\u00fdch ovl\u00e1da\u010dov, alebo n\u00e1js\u0165 niekoho zvonku. <\/p>\n<p><\/p>\n<h2 id=\"anchorlazy-loadanchorvneshniy-slovar-ne-podnimaetsya-posle-perezagruzki-snbspvklyuchennoy-nastroykoy-lazy_load-chto-delat\"><noindex><a rel=\"nofollow\" name=\"lazy-load\"><\/a><\/noindex>Extern\u00fd slovn\u00edk sa nezvy\u0161uje po re\u0161tarte so zapnutou vo\u013ebou lazy_load. \u010co robi\u0165?<\/h2>\n<p><\/p>\n<blockquote><p>M\u00e1me zapnut\u00fa vo\u013ebu lazy_load a po re\u0161tarte servera sa slovn\u00edk s\u00e1m nezvy\u0161uje. Zvy\u0161uje sa len po tom, \u010do sa k nemu pou\u017e\u00edvate\u013e obr\u00e1ti. A pri prvom pokuse vr\u00e1ti chybu. Je mo\u017en\u00e9 automaticky na\u010d\u00edta\u0165 slovn\u00edky pomocou ClickHouse, alebo mus\u00edme v\u017edy sami kontrolova\u0165 ich pripravenos\u0165, aby pou\u017e\u00edvatelia nedost\u00e1vali chyby?<\/p>\n<p>Mo\u017eno m\u00e1me star\u00fa verziu ClickHouse, preto sa slovn\u00edk automaticky nenahral. M\u00f4\u017ee to by\u0165?<\/p><\/blockquote>\n<p>Po prv\u00e9, slovn\u00edky je mo\u017en\u00e9 n\u00fatene na\u010d\u00edta\u0165 pomocou dotazu. <strong>system reload dictionaries<\/strong>. Po druh\u00e9, \u010do sa t\u00fdka chyby \u2014 ak je slovn\u00edk u\u017e na\u010d\u00edtan\u00fd, tak po\u017eiadavky bud\u00fa fungova\u0165 na t\u00fdch \u00fadajoch, ktor\u00e9 boli na\u010d\u00edtan\u00e9. Ak slovn\u00edk e\u0161te nebol na\u010d\u00edtan\u00fd, tak sa na\u010d\u00edta priamo po\u010das po\u017eiadavky.<\/p>\n<p><\/p>\n<p>Pre \u0165a\u017ek\u00e9 slovn\u00edky to nie je ve\u013emi pohodln\u00e9. Napr\u00edklad, potrebujete vytiahnu\u0165 mili\u00f3n riadkov z MySQL. Niekto vykon\u00e1 jednoduch\u00fd select, ale tento select bude \u010daka\u0165 na t\u00fdch mili\u00f3n riadkov. Tu s\u00fa dve rie\u0161enia. Prv\u00e9 \u2014 vypn\u00fa\u0165 lazy_load. Druh\u00e9 \u2014 ke\u010f sa server sp\u00fa\u0161\u0165a, predt\u00fdm ako mu za\u010dnete d\u00e1va\u0165 z\u00e1\u0165a\u017e, urobi\u0165 <strong>system reload dictionary<\/strong> alebo jednoducho vykona\u0165 po\u017eiadavku, ktor\u00e1 pou\u017e\u00edva slovn\u00edk. Potom sa slovn\u00edk na\u010d\u00edta. Mus\u00edte sami kontrolova\u0165 dostupnos\u0165 slovn\u00edkov so zapnut\u00fdm nastaven\u00edm lazy_load, preto\u017ee ClickHouse ich automaticky nenaklad\u00e1.<\/p>\n<p><\/p>\n<p>Na posledn\u00fa ot\u00e1zku odpove\u010f \u2014 bu\u010f je verzia star\u00e1, alebo je potrebn\u00e9 debuggova\u0165. <\/p>\n<p><\/p>\n<h2 id=\"anchorreload-dictionariesanchorkak-byt-snbsptem-chto-system-reload-dictionaries-ne-podgruzhaet-ni-odin-iznbspmnozhestva-slovarey-esli-hotya-by-odin-iznbspnih-padaet-snbsposhibkoy\"><noindex><a rel=\"nofollow\" name=\"reload-dictionaries\"><\/a><\/noindex>Ako sa vysporiada\u0165 s t\u00fdm, \u017ee system reload dictionaries nenahr\u00e1va \u017eiaden z mnoh\u00fdch slovn\u00edkov, ak aspo\u0148 jeden z nich spadne s chybou?<\/h2>\n<p><\/p>\n<blockquote><p>Je tu e\u0161te ot\u00e1zka oh\u013eadom system reload dictionaries. M\u00e1me dva slovn\u00edky \u2014 jeden sa nena\u010d\u00edta, druh\u00fd sa na\u010d\u00edta. System reload dictionaries v takom pr\u00edpade nenaklad\u00e1 \u017eiadny slovn\u00edk, a mus\u00edme naklada\u0165 konkr\u00e9tny pod\u013ea jeho n\u00e1zvu s pomocou system reload dictionary. S\u00favis\u00ed to tie\u017e s verziou ClickHouse?<\/p><\/blockquote>\n<p>Chcem v\u00e1s pote\u0161i\u0165. Toto spr\u00e1vanie sa menilo. To znamen\u00e1, ak aktualizujete ClickHouse, zmen\u00ed sa aj to. Ak v\u00e1m aktu\u00e1lne spr\u00e1vanie nevyhovuje <strong>system reload dictionaries<\/strong>, aktualizujte sa a budeme d\u00fafa\u0165, \u017ee sa to zmen\u00ed k lep\u0161iemu.<\/p>\n<p><\/p>\n<h2 id=\"anchorconnectionanchorest-li-sposob-konfigurirovat-rekvizity-vnbspkonfige-clickhouse-no-ne-svetit-ih-prinbsposhibkah\"><noindex><a rel=\"nofollow\" name=\"connection\"><\/a><\/noindex>Existuje sp\u00f4sob, ako konfigurova\u0165 pr\u00edstupov\u00e9 \u00fadaje v&nbsp;konfigura\u010dnom s\u00fabore ClickHouse, ale nezverejni\u0165 ich pri&nbsp;chybn\u00fdch hl\u00e1seniach?<\/h2>\n<p><\/p>\n<blockquote><p>\u010eal\u0161ia ot\u00e1zka je o chyb\u00e1ch s\u00favisiacich so slovn\u00edkom, a to konkr\u00e9tne o pr\u00edstupov\u00fdch \u00fadajoch. Nap\u00edsali sme pr\u00edstupov\u00e9 \u00fadaje v konfigur\u00e1cii ClickHouse k slovn\u00edku, a pri chybe tieto pr\u00edstupov\u00e9 \u00fadaje a heslo dost\u00e1vame v odpovedi. <\/p>\n<p>T\u00fato chybu sme vyrie\u0161ili presunut\u00edm pr\u00edstupov\u00fdch \u00fadajov do konfigur\u00e1cie ODBC. Existuje nejak\u00fd sp\u00f4sob, ako skonfigurova\u0165 pr\u00edstupov\u00e9 \u00fadaje v konfigur\u00e1cii ClickHouse, ale neodhali\u0165 tieto pr\u00edstupov\u00e9 \u00fadaje pri chyb\u00e1ch?<\/p><\/blockquote>\n<p>Rie\u0161en\u00edm je skuto\u010dne uvies\u0165 tieto credentials v odbc.ini, a v samotnom ClickHouse uvies\u0165 len ODBC Data Source Name. Pre ostatn\u00e9 zdroje slovn\u00edkov to nebude mo\u017en\u00e9 \u2014 ani pre slovn\u00edk s MySQL, ani pre ostatn\u00e9 by ste nemali vidie\u0165 heslo pri chybovom hl\u00e1sen\u00ed. Pre ODBC sa na to tie\u017e pozriem \u2014 ak je to tak, treba to jednoducho odstr\u00e1ni\u0165.<\/p>\n<p><\/p>\n<h2 id=\"anchorzoom-backgroundsanchorbonus-fony-dlya-zuma-snbspposidelok\"><noindex><a rel=\"nofollow\" name=\"zoom-backgrounds\"><\/a><\/noindex>Bonus: pozadia pre Zoom z&nbsp;ve\u010dierkov<\/h2>\n<p><\/p>\n<p>Kliknut\u00edm na&nbsp;obr\u00e1zok sa pre&nbsp;najvytrvalej\u0161\u00edch \u010ditate\u013eov otvoria bonusov\u00e9 pozadia z&nbsp;poseden\u00ed. Uhas\u00edme po\u017eiar spolu s&nbsp;mascotmi technol\u00f3gi\u00ed Avito, pora\u010fme sa s&nbsp;kolegami z&nbsp;izby sysadmina alebo starosvetsk\u00e9ho po\u010d\u00edta\u010dov\u00e9ho klubu a usporiadajme de\u0165mi pod&nbsp;mostom na&nbsp;pozad\u00ed grafitti.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/amp.gs\/KvUr\"><img decoding=\"async\" alt=\"ClickHouse pre pokro\u010dil\u00fdch pou\u017e\u00edvate\u013eov v ot\u00e1zkach a odpovediach\" src=\"\/wp-content\/uploads\/2020\/05\/38b2ea076283285d934913c395863eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/500678\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430&nbsp;\u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437&nbsp;\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros. \u041e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443&nbsp;\u043d\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442. \u041f\u043e&nbsp;\u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u0441&nbsp;\u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432 \u043d\u0430&nbsp;\u043d\u0430\u0448\u0438 \u0438 \u0437\u0440\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e&nbsp;\u0431\u044d\u043a\u0430\u043f\u044b, \u0440\u0435\u0448\u0430\u0440\u0434\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438, Golang-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 ClickHouse. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80776,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80775","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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.\" \/>\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\/sk\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\udd47ClickHouse \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah\" \/>\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-05-08T11:42:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-08T11:42:47+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\udd47ClickHouse pre pokro\u010dil\u00fdch pou\u017e\u00edvate\u013eov v ot\u00e1zkach a odpovediach | ProHoster","description":"V apr\u00edli sa in\u017einieri Avita chystali na online stretnutie s hlavn\u00fdm v\u00fdvoj\u00e1rom ClickHouse Alexejom Milovidovom a Kirillom Shvakovom, v\u00fdvoj\u00e1rom v Go z firmy Integros.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\udd47ClickHouse \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 | ProHoster","og:description":"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","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-05-08T11:42:47+00:00","article:modified_time":"2020-05-08T11:42:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80775","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 16:11:22","updated":"2022-09-28 05:48:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/80775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=80775"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/80775\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/80776"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=80775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=80775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=80775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}