{"id":91438,"date":"2020-08-13T19:42:36","date_gmt":"2020-08-13T17:42:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks"},"modified":"2020-08-13T19:42:36","modified_gmt":"2020-08-13T17:42:36","slug":"effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","title":{"rendered":"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8e42c1fffffcc964eacef240ea90bbc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eftersom ClickHouse \u00e4r ett specialiserat system \u00e4r det viktigt att beakta dess arkitekturvid anv\u00e4ndning. I denna presentation kommer Alexey att tala om exempel p\u00e5 typiska misstag vid anv\u00e4ndning av ClickHouse som kan leda till ineffektiv drift. Genom praktiska exempel kommer det att visas hur valet av olika databehandlingsscheman kan f\u00f6r\u00e4ndra prestandan avsev\u00e4rt.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Hej alla! Jag heter Alexey och jag jobbar med ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7f5fc01663be58d3d25e518a4169b8cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta, jag skyndar mig att gl\u00e4dja er, jag kommer inte att ber\u00e4tta vad ClickHouse \u00e4r idag. \u00c4rligt talat, jag har tr\u00f6ttnat p\u00e5 att g\u00f6ra det. Varje g\u00e5ng m\u00e5ste jag f\u00f6rklara vad det \u00e4r. Och jag tror att alla redan vet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/fae6bd07d098200643d591b8e5bf51e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ist\u00e4llet kommer jag att diskutera m\u00f6jliga f\u00e4llor, det vill s\u00e4ga hur man kan anv\u00e4nda ClickHouse felaktigt. Faktum \u00e4r att ni inte beh\u00f6ver vara r\u00e4dda, f\u00f6r vi utvecklar ClickHouse som ett system som \u00e4r enkelt, anv\u00e4ndarv\u00e4nligt och fungerar utan problem. Installera och det \u00e4r klart, inga problem. <\/p>\n<p><\/p>\n<p>Men ni m\u00e5ste \u00e4nd\u00e5 ta h\u00e4nsyn till att systemet \u00e4r specialiserat och att det \u00e4r l\u00e4tt att st\u00f6ta p\u00e5 ovanliga anv\u00e4ndningsscenarier som kan f\u00e5 systemet att k\u00e4nnas obekv\u00e4mt.<\/p>\n<p><\/p>\n<p>S\u00e5 vilka f\u00e4llor finns det? I huvudsak kommer jag att prata om uppenbara saker. Alla f\u00f6rst\u00e5r allt uppenbart, alla kan gl\u00e4dja sig \u00f6ver att de \u00e4r s\u00e5 smarta, och de som inte f\u00f6rst\u00e5r kommer att l\u00e4ra sig n\u00e5got nytt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/bffacf353ff31b361460178e911f0e16.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det f\u00f6rsta och enklaste exemplet, som tyv\u00e4rr ofta intr\u00e4ffar, \u00e4r att g\u00f6ra ett stort antal ins\u00e4ttningar med sm\u00e5 batchar, det vill s\u00e4ga ett stort antal sm\u00e5 ins\u00e4ttningar.<\/p>\n<p><\/p>\n<p>Om vi ser hur ClickHouse utf\u00f6r ins\u00e4ttningar, kan ni skicka upp till en terabyte data i ett enda anrop. Det \u00e4r inga problem. <\/p>\n<p><\/p>\n<p>L\u00e5t oss titta p\u00e5 vilken typisk prestanda vi kan f\u00f6rv\u00e4nta oss. Till exempel har vi en tabell med data fr\u00e5n Yandex.Metrics. Hits. 105 kolumner. 700 byte i okomprimerad form. Och vi ska g\u00f6ra ordentliga ins\u00e4ttningar med en miljon rader per batch. <\/p>\n<p><\/p>\n<p>Vi s\u00e4tter in i en MergeTree-tabell, vilket ger oss en halv miljon rader per sekund. Utm\u00e4rkt. I en replikerad tabell blir det lite mindre, cirka 400 000 rader per sekund. <\/p>\n<p><\/p>\n<p>Och om vi aktiverar quorum-insertning f\u00e5r vi lite mindre, men \u00e4nd\u00e5 bra prestanda, 250 000 rader per sekund. Quorum-insertningar \u00e4r en icke-dokumenterad funktion i ClickHouse*.<\/p>\n<p><\/p>\n<p>*fr\u00e5n och med 2020, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/operations\/settings\/settings\/#settings-insert_quorum\">redan dokumenterad<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/668498fc82a0f6e851d05e6e1ea67033.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad h\u00e4nder om man g\u00f6r det d\u00e5ligt? Vi l\u00e4gger in en rad i tabellen MergeTree och f\u00e5r 59 rader per sekund. Det \u00e4r 10 000 g\u00e5nger l\u00e5ngsammare. I ReplicatedMergeTree \u00e4r det 6 rader per sekund. Och om quorum aktiveras f\u00e5r vi bara 2 rader per sekund. I min mening \u00e4r det en riktig katastrof. Hur kan man f\u00f6rdr\u00f6ja s\u00e5? Till och med p\u00e5 min t-shirt st\u00e5r det att ClickHouse inte ska vara segt. Men \u00e4nd\u00e5 h\u00e4nder det ibland. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4c771eddc4e8453f60ef91123ae5d109.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I sj\u00e4lva verket \u00e4r det v\u00e5r brist. Vi skulle helt kunna f\u00e5 allt att fungera smidigt, men vi gjorde det inte. Och vi gjorde det inte f\u00f6r att det inte var n\u00f6dv\u00e4ndigt f\u00f6r v\u00e5rt scenario. Vi hade redan batchar. Data kom in i batchar, och det var inga problem. Vi l\u00e4gger in och allt fungerar som det ska. Men sj\u00e4lvklart kan olika scenarier uppst\u00e5. Till exempel, n\u00e4r ni har massor av servrar som genererar data. Och de l\u00e4gger in data inte s\u00e5 ofta, men det blir fortfarande frekventa ins\u00e4ttningar. Och man m\u00e5ste undvika det p\u00e5 n\u00e5got s\u00e4tt. <\/p>\n<p><\/p>\n<p>Ur teknisk synvinkel \u00e4r po\u00e4ngen att n\u00e4r du g\u00f6r en insert i ClickHouse s\u00e5 hamnar inte datan i n\u00e5gon memtable. Vi har inte ens en \u00e4kta log structure MergeTree, utan bara MergeTree, eftersom det varken finns en logg eller en memTable. Vi skriver helt enkelt in data direkt i filsystemet, redan sorterade i kolumner. Och om du har 100 kolumner m\u00e5ste mer \u00e4n 200 filer skrivas till en separat katalog. Allt detta \u00e4r ganska klumpigt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/24688fe3d39d81b92f12ac1b8b21425b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och fr\u00e5gan uppst\u00e5r: \"Hur g\u00f6r man det r\u00e4tt?\" Om situationen \u00e4r s\u00e5dan att man \u00e4nd\u00e5 m\u00e5ste skriva data i ClickHouse.<\/p>\n<p><\/p>\n<p>Metod 1. Det h\u00e4r \u00e4r det enklaste s\u00e4ttet. Anv\u00e4nd en distribuerad k\u00f6. Till exempel, Kafka. Du plockar helt enkelt ut data fr\u00e5n Kafka, batchar var sekund. Och allt kommer fungera bra, du skriver in, allt fungerar. <\/p>\n<p><\/p>\n<p>Nackdelarna \u00e4r att Kafka \u00e4r \u00e4nnu ett klumpigt distribuerat system. Jag f\u00f6rst\u00e5r om ni redan har Kafka i ert f\u00f6retag. Det \u00e4r bra, det \u00e4r praktiskt. Men om ni inte har det, b\u00f6r ni t\u00e4nka er f\u00f6r tre g\u00e5nger innan ni drar in \u00e4nnu ett distribuerat system i ert projekt. Och d\u00e4rf\u00f6r b\u00f6r ni \u00f6verv\u00e4ga alternativ. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4f687221e8c7443abf02fb002c4eba5b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metod 2. H\u00e4r \u00e4r ett gammaldags alternativ som \u00e4nd\u00e5 \u00e4r mycket enkelt. Har du en server som genererar dina loggar? Den skriver helt enkelt dina loggar i en fil. Och en g\u00e5ng per sekund, till exempel, byter vi namn p\u00e5 filen och \u00f6ppnar en ny. En separat skript, antingen via cron eller n\u00e5gon daemon, tar den \u00e4ldsta filen och skriver den till ClickHouse. Om loggar skrivs en g\u00e5ng per sekund kommer allt att bli utm\u00e4rkt. <\/p>\n<p><\/p>\n<p>Men nackdelen med denna metod \u00e4r att om din server, d\u00e4r loggarna genereras, pl\u00f6tsligt f\u00f6rsvinner, s\u00e5 f\u00f6rsvinner ocks\u00e5 datan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b4c28b6df87386c42b6908bdfccb6b90.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metod 3. Det finns en annan intressant metod som helt saknar tempor\u00e4ra filer. Antag att du har n\u00e5gon slags reklamshub eller en annan intressant daemon som genererar data. Du kan lagra en bunt data direkt i RAM-minnet, i bufferten. N\u00e4r tillr\u00e4ckligt med tid har g\u00e5tt, l\u00e4gger du denna buffer p\u00e5 sidan, skapar en ny, och i en separat tr\u00e5d infogar du det som redan har samlats in till ClickHouse.<\/p>\n<p><\/p>\n<p>\u00c5 andra sidan f\u00f6rsvinner \u00e4ven data om du exekverar kill -9. Om din server kraschar, f\u00f6rlorar du dessa data. Ytterligare ett problem \u00e4r att om du inte kan skriva till databasen kommer data att samlas kvar i RAM-minnet. Antingen tar RAM-minnet slut, eller s\u00e5 f\u00f6rlorar du bara datan. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/dc375b22fcb26cfa111d0bdb4563aa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metod 4. \u00c4nnu en intressant metod. Du har en serverprocess som kan skicka data till ClickHouse direkt, men g\u00f6r det i en enda anslutning. Till exempel, du skickar en http-f\u00f6rfr\u00e5gan med transfer-encoding: chunked med en insert. Och den genererar chunkar inte allt f\u00f6r s\u00e4llan; du kan skicka varje rad, \u00e4ven om det kommer att finnas overhead f\u00f6r ramverket av dessa data. <\/p>\n<p><\/p>\n<p>Men likv\u00e4l kommer data i detta fall att skickas till ClickHouse direkt. Och ClickHouse kommer att buffra dem sj\u00e4lv. <\/p>\n<p><\/p>\n<p>Men problem uppst\u00e5r ocks\u00e5. Nu kommer du att f\u00f6rlora data, s\u00e4rskilt n\u00e4r din process avslutas, och om ClickHouse-processen d\u00f6das, eftersom det kommer att bli en ofullst\u00e4ndig insert. I ClickHouse \u00e4r inserts atom\u00e4ra upp till en viss angiven tr\u00f6skel av rader. I princip \u00e4r detta en intressant metod. Kan ocks\u00e5 anv\u00e4ndas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6a18a974b9600ade377a870390e95d3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metod 5. H\u00e4r \u00e4r \u00e4nnu ett intressant s\u00e4tt. Det \u00e4r ett community-utvecklat server f\u00f6r databatching. Jag har inte tittat p\u00e5 det sj\u00e4lv, s\u00e5 jag kan inget garantera. Dock, inga garantier ges heller f\u00f6r ClickHouse. Detta \u00e4r ocks\u00e5 open source, men \u00e5 andra sidan kan du vara van vid en viss standard av kvalitet som vi f\u00f6rs\u00f6ker tillhandah\u00e5lla. F\u00f6r denna grej \u2013 jag vet inte, g\u00e5 in p\u00e5 GitHub, kolla koden. Kanske har de skrivit n\u00e5got bra. <\/p>\n<p><\/p>\n<p>* per 2020, b\u00f6r \u00e4ven beaktas <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/vk\/blog\/430168\/\">KittenHouse<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae6a04af63ae4e7fa160c002fdb6d506.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metod 6. Ett annat s\u00e4tt \u00e4r att anv\u00e4nda buffer-tabeller. F\u00f6rdelen med detta s\u00e4tt \u00e4r att det \u00e4r v\u00e4ldigt enkelt att b\u00f6rja anv\u00e4nda. Du skapar en buffer-tabell och s\u00e4tter in data i den. <\/p>\n<p><\/p>\n<p>Men nackdelen \u00e4r att problemet inte l\u00f6ses helt. Om vid ins\u00e4ttning av typ MergeTree m\u00e5ste du gruppera data till en batch per sekund, s\u00e5 m\u00e5ste du vid ins\u00e4ttning i buffer-tabellen gruppera till \u00e5tminstone flera tusen per sekund. Om det \u00f6verstiger 10 000 per sekund, kommer det fortfarande att bli d\u00e5ligt. Om du s\u00e4tter in i batchar, s\u00e5 har du sett att det kan bli hundratusentals rader per sekund. Och det \u00e4r redan med ganska tunga data. <\/p>\n<p><\/p>\n<p>Och buffer-tabeller har inte heller n\u00e5gon logg. Och om det \u00e4r n\u00e5got fel med din server, s\u00e5 kommer data att g\u00e5 f\u00f6rlorade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/9bb16bf5e8145cc8368b11e54c86c837.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och som en bonus har vi nyligen f\u00e5tt m\u00f6jligheten att h\u00e4mta data fr\u00e5n Kafka i ClickHouse. Det finns en tabellmotor \u2013 Kafka. Du skapar helt enkelt en och kan koppla materialiserade vyer till den. I s\u00e5 fall kommer den sj\u00e4lv att h\u00e4mta data fr\u00e5n Kafka och s\u00e4tta in i de tabeller du beh\u00f6ver. <\/p>\n<p><\/p>\n<p>Och det som gl\u00e4der mig s\u00e4rskilt med denna funktion \u00e4r att det inte \u00e4r vi som har gjort den. Det \u00e4r en community-funktion. Och n\u00e4r jag s\u00e4ger \"community-funktion\", s\u00e4ger jag det utan f\u00f6rakt. Vi har l\u00e4st koden, gjort granskningar, det ska fungera bra. <\/p>\n<p><\/p>\n<p>* per 2020, har liknande st\u00f6d tillkommit f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/engines\/table-engines\/integrations\/rabbitmq\/\">RabbitMQ<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15dc61dfd435f5f8640395b7de480fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad kan vara obekv\u00e4mt eller ov\u00e4ntat vid datainmatning? Om du g\u00f6r en insert values-f\u00f6rfr\u00e5gan och skriver n\u00e5gra ber\u00e4knade uttryck i values. Till exempel, now() \u2013 det \u00e4r ocks\u00e5 ett ber\u00e4knat uttryck. I det fallet m\u00e5ste ClickHouse k\u00f6ra tolkaren f\u00f6r dessa uttryck f\u00f6r varje rad, och prestandan kommer att sjunka drastiskt. B\u00e4st \u00e4r att undvika detta.<\/p>\n<p><\/p>\n<p>* f\u00f6r tillf\u00e4llet \u00e4r problemet helt l\u00f6st, det finns ingen regressionsprestanda vid anv\u00e4ndning av uttryck i VALUES l\u00e4ngre.<\/p>\n<p><\/p>\n<p>Ett annat exempel p\u00e5 n\u00e4r det kan finnas vissa problem \u00e4r n\u00e4r du har data i en batch som tillh\u00f6r flera partitioner. Som standard \u00e4r partitionerna i ClickHouse per m\u00e5nad. Om du infogar en batch med en miljon rader och data str\u00e4cker sig \u00f6ver flera \u00e5r, s\u00e5 kommer du att ha flera tiotals partitioner. Det \u00e4r likv\u00e4rdigt med att ha batcher med flera tiotals g\u00e5nger mindre storlek, eftersom de alltid f\u00f6rst bryts ner efter partitionerna.<\/p>\n<p><\/p>\n<p>* nyligen har ClickHouse i experimentellt l\u00e4ge f\u00e5tt st\u00f6d f\u00f6r kompakt format av block och block i minnet med en write-ahead log, vilket n\u00e4stan helt l\u00f6ser problemet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b8c6cecdba53559dad31ed11713a980d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss nu titta p\u00e5 den andra typen av problem \u2013 datatypning. <\/p>\n<p><\/p>\n<p>Datatypning kan vara strikt eller str\u00e4ngtyp. Str\u00e4ngtyp \u00e4r n\u00e4r du helt enkelt har deklarerat att alla dina f\u00e4lt \u00e4r av typ string. Det \u00e4r d\u00e5ligt. Man ska inte g\u00f6ra s\u00e5. <\/p>\n<p><\/p>\n<p>L\u00e5t oss f\u00f6rst\u00e5 hur man g\u00f6r det r\u00e4tt i situationer d\u00e4r man vill s\u00e4ga att ett visst f\u00e4lt \u00e4r en str\u00e4ng och l\u00e5ta ClickHouse sj\u00e4lv hantera det, utan att jag beh\u00f6ver oroa mig. Men det \u00e4r \u00e4nd\u00e5 v\u00e4rt att anstr\u00e4nga sig lite. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a0fdcf6423933293318411242fe2ede7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Till exempel har vi en IP-adress. I ett fall har vi sparat den som en str\u00e4ng, till exempel 192.168.1.1. I det andra fallet kommer det att vara ett tal av typen UInt32*. 32 bitar \u00e4r tillr\u00e4ckligt f\u00f6r en IPv4-adress.<\/p>\n<p><\/p>\n<p>F\u00f6rst och fr\u00e4mst, som inte \u00e4r \u00f6verraskande, kommer data att komprimeras ungef\u00e4r lika mycket. Det kommer att bli skillnader, f\u00f6rst\u00e5s, men inte s\u00e5 stora. S\u00e5 det finns inga speciella problem med disk I\/O. <\/p>\n<p><\/p>\n<p>Men det finns en betydande skillnad i CPU-tid och fr\u00e5gaexekveringstid. <\/p>\n<p><\/p>\n<p>L\u00e5t oss r\u00e4kna antalet unika IP-adresser om de lagras som tal. Det blir 137 miljoner rader per sekund. Om samma sak g\u00f6rs som str\u00e4ngar, blir det 37 miljoner rader per sekund. Jag vet inte varf\u00f6r s\u00e5dana \u00f6verensst\u00e4mmelser har uppst\u00e5tt. Jag har sj\u00e4lv k\u00f6rt dessa fr\u00e5gor. Men \u00e4nd\u00e5 \u00e4r det ungef\u00e4r fyra g\u00e5nger l\u00e5ngsammare. <\/p>\n<p><\/p>\n<p>Och om vi ber\u00e4knar skillnaden i lagringsutrymme p\u00e5 disken, finns det ocks\u00e5 skillnader. Och skillnaden \u00e4r n\u00e5gonstans runt en fj\u00e4rdedel, eftersom det finns tillr\u00e4ckligt m\u00e5nga unika IP-adresser. Och om det h\u00e4r var str\u00e4ngar med ett litet antal olika v\u00e4rden, skulle de enkelt komprimeras med hj\u00e4lp av en ordbok till ungef\u00e4r samma volym. <\/p>\n<p><\/p>\n<p>Och det \u00e4r en fyrdubbel tidsdifferens p\u00e5 v\u00e4gen som inte ligger och v\u00e4ntar. Kanske bryr du dig inte, men n\u00e4r jag ser en s\u00e5dan skillnad blir jag ledsen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f74dbfdab5a9e26fa044a5870a8cc00d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss titta p\u00e5 olika fall. <\/p>\n<p><\/p>\n<p>1. Ett fall d\u00e4r ni har ett par unika v\u00e4rden. I det h\u00e4r fallet anv\u00e4nder vi en enkel praxis som ni kanske k\u00e4nner till och kan anv\u00e4nda f\u00f6r alla databas-system. Det g\u00e4ller inte bara ClickHouse. Ni skriver helt enkelt in numeriska identifierare i databasen. Att konvertera till str\u00e4ngar och tillbaka kan g\u00f6ras p\u00e5 applikationssidan. <\/p>\n<p><\/p>\n<p>Tills exempel, ni har en region. Och ni f\u00f6rs\u00f6ker spara den som en str\u00e4ng. Om ni skriver: Moskva och MO. N\u00e4r jag ser att det st\u00e5r \"Moskva\", \u00e4r det okej, men n\u00e4r ocks\u00e5 MO st\u00e5r d\u00e4r, blir det verkligen sorgligt. Det \u00e4r s\u00e5 m\u00e5nga byte. <\/p>\n<p><\/p>\n<p>Ist\u00e4llet skriver vi helt enkelt in ett Ulnt32-nummer och 250. Vi har 250 i Yandex, men ni kanske har n\u00e5got annat. F\u00f6r s\u00e4kerhets skull n\u00e4mner jag att ClickHouse har inbyggt st\u00f6d f\u00f6r geodatabaser. Ni skriver helt enkelt en katalog med regioner, inklusive hierarkiska, det vill s\u00e4ga den kommer att omfatta b\u00e5de Moskva och MO, samt allt annat ni beh\u00f6ver. Och det g\u00e5r att konvertera p\u00e5 fr\u00e5geniv\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/cc6e871136dab8f8a35246a5af512cda.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det andra alternativet \u00e4r ungef\u00e4r detsamma, men redan med st\u00f6d inuti ClickHouse. Det \u00e4r datatypen Enum. Inom Enum angiver ni helt enkelt alla n\u00f6dv\u00e4ndiga v\u00e4rden. Till exempel enhetstypen d\u00e4r ni skriver: dator, mobil, surfplatta, tv. Totalt fyra alternativ. <\/p>\n<p><\/p>\n<p>En nackdel \u00e4r att man periodvis m\u00e5ste \u00e4ndra. Man har bara lagt till ett alternativ. G\u00f6r en \u00e4ndring av tabellen. Faktum \u00e4r att \u00e4ndringen av tabellen i ClickHouse \u00e4r kostnadsfri. S\u00e4rskilt kostnadsfri f\u00f6r Enum, eftersom data p\u00e5 disken inte f\u00f6r\u00e4ndras. Men \u00e4nd\u00e5, \u00e4ndringen tar blockering* p\u00e5 tabellen och m\u00e5ste v\u00e4nta tills alla selects utf\u00f6rs. Och f\u00f6rst efter det genomf\u00f6rs \u00e4ndringen, det finns \u00e4nd\u00e5 vissa ol\u00e4genheter.<\/p>\n<p><\/p>\n<p>* I de senaste versionerna av ClickHouse \u00e4r ALTER helt icke-blockerande.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7284fa5be583ab063bb6de0b60f54d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat alternativ som \u00e4r ganska unikt f\u00f6r ClickHouse \u00e4r anslutning av externa ordb\u00f6cker. Ni kan skriva in siffror i ClickHouse, medan era kataloger kan h\u00e5llas i vilket system som helst som \u00e4r bekv\u00e4mt f\u00f6r er. Till exempel kan ni anv\u00e4nda: MySQL, Mongo, Postgres. Ni kan till och med skapa er egen mikrotj\u00e4nst som via http kommer att tillhandah\u00e5lla dessa data. Och p\u00e5 ClickHouse-niv\u00e5n skriver ni en funktion som omvandlar dessa data fr\u00e5n siffror till str\u00e4ngar. <\/p>\n<p><\/p>\n<p>Det h\u00e4r \u00e4r ett specialiserat men mycket effektivt s\u00e4tt att utf\u00f6ra en join med en utomst\u00e5ende tabell. Det finns dessutom tv\u00e5 alternativ. I det ena alternativet kommer dessa data att vara helt cachade, helt n\u00e4rvarande i minnet och uppdateras med viss periodicitet. I det andra alternativet, om dessa data inte f\u00e5r plats i minnet, g\u00e5r det att cachera dem delvis. <\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett exempel. Det finns Yandex.Direct. Och d\u00e4r finns det reklamkampanjer och annonser. Det finns nog cirka tio miljoner reklamkampanjer. Och de f\u00e5r plats i minnet. Men det finns miljarder annonser, de f\u00e5r inte plats. Och vi anv\u00e4nder en cachad ordbok fr\u00e5n MySQL.<\/p>\n<p><\/p>\n<p>Det enda problemet \u00e4r att den cachade ordboken fungerar normalt om hit rate ligger n\u00e4ra 100 %. Om den \u00e4r l\u00e4gre m\u00e5ste vi vid behandling av f\u00f6rfr\u00e5gningar f\u00f6r varje datam\u00e4ngd faktiskt h\u00e4mta de saknade nycklarna och h\u00e4mta data fr\u00e5n MySQL. Jag kan fortfarande garantera att ClickHouse inte saktar ner, men jag ska inte prata om andra system.<\/p>\n<p><\/p>\n<p>Som en bonus \u00e4r ordb\u00f6cker ett mycket enkelt s\u00e4tt att uppdatera data i ClickHouse i efterhand. Det vill s\u00e4ga, om du hade en rapport om reklamkampanjer och anv\u00e4ndaren bara \u00e4ndrade reklamkampanjen, s\u00e5 skulle \u00e4ven alla tidigare data och rapporter uppdateras. Om du skriver rader direkt i tabellen kommer det att vara om\u00f6jligt att uppdatera dem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a5a2919d6be7d00c0ad5875b9a8f0f31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat s\u00e4tt, n\u00e4r du inte vet hur du ska f\u00e5 identifierare f\u00f6r dina rader, \u00e4r att helt enkelt hasha. Det enklaste alternativet \u00e4r att ta en 64-bitars hash. <\/p>\n<p><\/p>\n<p>Det enda problemet \u00e4r att om hashen \u00e4r 64-bit \u00e4r kollisioner n\u00e4stan garanterade. Eftersom om det finns en miljard rader blir sannolikheten m\u00e4rkbar. <\/p>\n<p><\/p>\n<p>Och det vore inte s\u00e5 bra att hashera namnen p\u00e5 reklamkampanjer p\u00e5 det s\u00e4ttet. Om reklamkampanjer fr\u00e5n olika f\u00f6retag blandas ihop kommer det att bli n\u00e5got oklart. <\/p>\n<p><\/p>\n<p>Och det finns ett enkelt knep. Visserligen passar det inte s\u00e5 bra f\u00f6r seri\u00f6sa data, men om det \u00e4r n\u00e5got som inte \u00e4r s\u00e5 allvarligt, s\u00e5 l\u00e4gg bara till klientens identifierare i nyckeln i ordboken. D\u00e5 kommer du att ha kollisioner, men bara inom en och samma klient. Den h\u00e4r metoden anv\u00e4nds f\u00f6r v\u00e5r l\u00e4nk-karta i Yandex.Metrica. Vi har d\u00e4r URLs, vi lagrar hashar. Och vi vet att det finns kollisioner, sj\u00e4lvklart. Men n\u00e4r sidan visas, \u00e4r sannolikheten f\u00f6r att just p\u00e5 en och samma sida en anv\u00e4ndare har n\u00e5got URL som krockar och att n\u00e5gon verkligen uppt\u00e4cker det, s\u00e5 kan man bortse fr\u00e5n det. <\/p>\n<p><\/p>\n<p>Som en bonus \u2013 f\u00f6r m\u00e5nga operationer r\u00e4cker det med bara hashar och sj\u00e4lva str\u00e4ngarna beh\u00f6ver inte lagras n\u00e5gonstans. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/abbb73aaba29d10e3b7e7650bf68e6a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat exempel \u00e4r om str\u00e4ngarna \u00e4r korta, till exempel dom\u00e4nnamn. De kan lagras som de \u00e4r. Eller till exempel spr\u00e5k i webbl\u00e4saren ru \u2013 2 byte. Sj\u00e4lvklart, jag \u00e4r v\u00e4ldigt r\u00e4dd om byte, men oroa dig inte, 2 byte g\u00f6r inget. Sn\u00e4lla, lagra dem som de \u00e4r, sk\u00f6t dig inte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/901eaed0029da6ea59630b57ccf80c25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat tillf\u00e4lle \u00e4r n\u00e4r det finns v\u00e4ldigt m\u00e5nga str\u00e4ngar och de dessutom inneh\u00e5ller m\u00e5nga unika via m\u00e4ngder som potentiellt \u00e4r o\u00e4ndliga. Ett typiskt exempel \u00e4r s\u00f6kord eller URLs. S\u00f6kord, bland annat p\u00e5 grund av stavfel. L\u00e5t oss se hur m\u00e5nga unika s\u00f6kord det finns per dag. Det visar sig att de n\u00e4stan utg\u00f6r h\u00e4lften av alla h\u00e4ndelser. Och i det h\u00e4r fallet skulle du kunna t\u00e4nka att det beh\u00f6vs normalisering av data, att r\u00e4kna identifierare och lagra i en separat tabell. Men det beh\u00f6ver du inte g\u00f6ra. Lagra helt enkelt dessa str\u00e4ngar som de \u00e4r. <\/p>\n<p><\/p>\n<p>B\u00e4ttre \u2013 hitta p\u00e5 inget, f\u00f6r om du lagrar dem separat, s\u00e5 kommer det att kr\u00e4vas join. Och denna join \u2013 \u00e4r i b\u00e4sta fall en slumpm\u00e4ssig \u00e5tkomst i minnet, om det ens kan f\u00e5 plats i minnet. Om det inte f\u00e5r plats, kommer det att bli problem. <\/p>\n<p><\/p>\n<p>Och om data lagras in place, s\u00e5 l\u00e4ses de helt enkelt ut i r\u00e4tt ordning fr\u00e5n filsystemet och allt \u00e4r bra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15f1d632083def16ccbc939579c1cf6b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om du har URLs eller n\u00e5gon annan komplicerad l\u00e5ng str\u00e4ng, s\u00e5 b\u00f6r du t\u00e4nka p\u00e5 att du kanske kan ber\u00e4kna en sammanfattning i f\u00f6rv\u00e4g och skriva den i en separat kolumn. <\/p>\n<p><\/p>\n<p>F\u00f6r URLs, till exempel, kan du lagra dom\u00e4nen separat. Och om du verkligen beh\u00f6ver dom\u00e4nen, s\u00e5 anv\u00e4nd bara den kolumnen, medan URLs kommer att ligga kvar, och du kommer inte ens r\u00f6ra dem. <\/p>\n<p><\/p>\n<p>L\u00e5t oss titta p\u00e5 vilken skillnad det blir. I ClickHouse finns det en specialiserad funktion som ber\u00e4knar dom\u00e4nen. Den \u00e4r v\u00e4ldigt snabb, vi har optimerat den. Och \u00e4rligt talat, den f\u00f6ljer inte ens RFC, men den ber\u00e4knar allt vi beh\u00f6ver. <\/p>\n<p><\/p>\n<p>Och i det ena fallet kommer vi bara att h\u00e4mta URL:er och ber\u00e4kna dom\u00e4nen. Det tar 166 millisekunder. Men om vi tar en f\u00e4rdig dom\u00e4n, blir det bara 67 millisekunder, det vill s\u00e4ga n\u00e4stan tre g\u00e5nger snabbare. Dessutom \u00e4r det inte snabbare f\u00f6r att vi beh\u00f6ver g\u00f6ra n\u00e5gra ber\u00e4kningar, utan f\u00f6r att vi l\u00e4ser mindre data. <\/p>\n<p><\/p>\n<p>Av n\u00e5gon anledning visar det sig att en av f\u00f6rfr\u00e5gningarna, som \u00e4r l\u00e5ngsammare, har h\u00f6gre hastighet i gigabyte per sekund. Eftersom den l\u00e4ser mer gigabyte. Det \u00e4r helt on\u00f6diga data. F\u00f6rfr\u00e5gningen fungerar snabbare, men tar l\u00e4ngre tid.<\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 datam\u00e4ngden p\u00e5 disken visar det sig att URL:en \u00e4r 126 megabyte och dom\u00e4nen bara 5 megabyte. Det \u00e4r 25 g\u00e5nger mindre. Men \u00e4nd\u00e5 utf\u00f6rs f\u00f6rfr\u00e5gningen bara 4 g\u00e5nger snabbare. Men det beror p\u00e5 att data \u00e4r heta. Om de vore kalla skulle det s\u00e4kert vara 25 g\u00e5nger snabbare p\u00e5 grund av disk-I\/O. <\/p>\n<p><\/p>\n<p>F\u00f6rresten, om vi bed\u00f6mer hur mycket mindre dom\u00e4nen \u00e4r \u00e4n URL:en, s\u00e5 \u00e4r det cirka 4 g\u00e5nger. Men av n\u00e5gon anledning tar data p\u00e5 disken 25 g\u00e5nger mindre. Varf\u00f6r? P\u00e5 grund av komprimering. B\u00e5de URL:en och dom\u00e4nen komprimeras. Men ofta inneh\u00e5ller URL:en massor av skr\u00e4p. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/c93d2128a41561ed7abb25d77414bc2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och sj\u00e4lvklart \u00e4r det viktigt att anv\u00e4nda r\u00e4tt datatyper som \u00e4r specifikt avsedda f\u00f6r de n\u00f6dv\u00e4ndiga v\u00e4rdena, eller som passar. Om du har IPv4, lagra UInt32*. Om det \u00e4r IPv6, anv\u00e4nd FixedString(16), eftersom IPv6-adressen \u00e4r 128 bitar, det vill s\u00e4ga lagra den direkt i bin\u00e4rt format. <\/p>\n<p><\/p>\n<p>Vad ska man g\u00f6ra om du ibland har IPv4-adresser och ibland IPv6? Ja, du kan lagra b\u00e5da. En kolumn f\u00f6r IPv4, en annan f\u00f6r IPv6. Naturligtvis finns det en m\u00f6jlighet att visa IPv4 i IPv6. Det kommer ocks\u00e5 att fungera, men om du ofta beh\u00f6ver IPv4-adressen i dina f\u00f6rfr\u00e5gningar, s\u00e5 \u00e4r det bra att l\u00e4gga den i en separat kolumn. <\/p>\n<p><\/p>\n<p>* nu finns det separata datatyper f\u00f6r IPv4 och IPv6 i ClickHouse, som lagrar data lika effektivt som siffror, men presenterar dem p\u00e5 ett bekv\u00e4mt s\u00e4tt som str\u00e4ngar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7d6342ebd6b8b4f3526b3cd8a06cf26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r ocks\u00e5 viktigt att notera att man b\u00f6r f\u00f6rbehandla data i f\u00f6rv\u00e4g. Till exempel, om det kommer r\u00e5a loggar till er. Och kanske b\u00f6r ni inte bara stoppa in dem i ClickHouse, \u00e4ven om det \u00e4r frestande att inte g\u00f6ra n\u00e5got och allt kommer att fungera. Men det \u00e4r \u00e4nd\u00e5 v\u00e4rt att utf\u00f6ra de ber\u00e4kningar som g\u00e5r.<\/p>\n<p><\/p>\n<p>Till exempel, webbl\u00e4sarversionen. I en viss n\u00e4rliggande avdelning, som jag inte vill peka ut, lagras webbl\u00e4sarversionen p\u00e5 detta s\u00e4tt, dvs. som en str\u00e4ng: 12.3. Sedan, f\u00f6r att g\u00f6ra en rapport, delar de denna str\u00e4ng p\u00e5 en array, och sedan p\u00e5 det f\u00f6rsta elementet i arrayen. Givetvis saktar allt ner. Jag fr\u00e5gade dem varf\u00f6r de g\u00f6r s\u00e5. De svarade att de inte gillar f\u00f6r tidig optimering. Men jag gillar inte f\u00f6r tidig pessimering.<\/p>\n<p><\/p>\n<p>S\u00e5 i detta fall \u00e4r det mer korrekt att dela upp i 4 kolumner. Var inte r\u00e4dd, eftersom detta \u00e4r ClickHouse. ClickHouse \u00e4r en kolumnbaserad databas. Och ju fler noggrant sm\u00e5 kolumner, desto b\u00e4ttre. Har ni 5 BrowserVersion, g\u00f6r 5 kolumner. Det \u00e4r normalt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f9a67221bf8508933d7bd336b16f9e04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu ska vi \u00f6verv\u00e4ga vad man ska g\u00f6ra om ni har m\u00e5nga mycket l\u00e5nga str\u00e4ngar, mycket l\u00e5nga arrayer. Dessa beh\u00f6ver inte lagras i ClickHouse \u00f6verhuvudtaget. Ist\u00e4llet kan ni spara endast n\u00e5got slags identifierare i ClickHouse. Dessa l\u00e5nga str\u00e4ngar kan ni lagra i n\u00e5got annat system. <\/p>\n<p><\/p>\n<p>Till exempel, i en av v\u00e5ra analytiska tj\u00e4nster finns det vissa h\u00e4ndelseparametrar. Och om m\u00e5nga parametrar kommer med h\u00e4ndelserna, sparar vi bara de f\u00f6rsta 512 som kommer. Eftersom 512 \u00e4r inte n\u00e5got att s\u00f6rja \u00f6ver. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/755271e8788ba4bd638f493bf320c820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och om ni inte kan best\u00e4mma era datatyper, kan ni ocks\u00e5 skriva data till ClickHouse, men i en tempor\u00e4r tabell av typen Log, speciellt f\u00f6r tempor\u00e4ra data. Efter detta kan ni analysera vilken v\u00e4rdef\u00f6rdelning ni har, vad som \u00f6verhuvudtaget finns och sammans\u00e4tta korrekta typer.<\/p>\n<p><\/p>\n<p>* just nu finns det en datatyp i ClickHouse <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/data-types\/lowcardinality\/\">LowCardinality<\/a><\/noindex> som g\u00f6r det m\u00f6jligt att effektivt lagra str\u00e4ngar med mindre arbetsinsats.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7e9e53d86a4189783c28ce56a669198c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu ska vi \u00f6verv\u00e4ga ett annat intressant fall. Ibland fungerar allt m\u00e4rkligt f\u00f6r folk. Jag g\u00e5r in och ser n\u00e5got som detta. Och det ger omedelbart intrycket att det gjordes av en mycket erfaren, smart administrat\u00f6r med stor erfarenhet av att konfigurera MySQL version 3.23. <\/p>\n<p><\/p>\n<p>H\u00e4r ser vi tusen tabeller, d\u00e4r var och en lagrar restv\u00e4rdet av en oklar division p\u00e5 tusen. <\/p>\n<p><\/p>\n<p>I princip respekterar jag andras erfarenheter, inklusive att jag f\u00f6rst\u00e5r vilka sv\u00e5righeter som kan ligga bakom dessa erfarenheter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3a5e21ef2076966fcc627670485c5b3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och orsakerna \u00e4r mer eller mindre f\u00f6rst\u00e5eliga. Det handlar om gamla stereotyper som kan ha samlats vid arbete med andra system. Till exempel finns det inget klusterprim\u00e4rt nyckel i MyISAM-tabeller. Och detta s\u00e4tt att dela upp data kan vara ett desperat f\u00f6rs\u00f6k att f\u00e5 samma funktionalitet. <\/p>\n<p><\/p>\n<p>En annan orsak \u00e4r att det \u00e4r sv\u00e5rt att utf\u00f6ra operationer som alter p\u00e5 stora tabeller. Allt kommer att blockeras. \u00c4ven om detta problem inte l\u00e4ngre \u00e4r s\u00e5 allvarligt i moderna versioner av MySQL. <\/p>\n<p><\/p>\n<p>Eller till exempel mikroskarding, men det kommer vi tillbaka till senare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/321b1d9caa8db7aca5b96e08c61d05b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ClickHouse beh\u00f6ver man inte g\u00f6ra p\u00e5 det s\u00e4ttet, f\u00f6r f\u00f6rst och fr\u00e4mst \u00e4r den prim\u00e4ra nyckeln klusterbaserad, och data \u00e4r ordnad efter den prim\u00e4ra nyckeln. <\/p>\n<p><\/p>\n<p>Och ibland fr\u00e5gar folk mig: \"Hur p\u00e5verkas prestandan av intervalls\u00f6kningar i ClickHouse av storleken p\u00e5 tabellen?\". Jag s\u00e4ger att det inte p\u00e5verkas alls. Till exempel, om ni har en tabell med en miljard rader och l\u00e4ser ett intervall p\u00e5 en miljon rader, fungerar det bra. Om tabellen har en triljon rader och ni l\u00e4ser en miljon rader, kommer det att vara n\u00e4stan samma sak. <\/p>\n<p><\/p>\n<p>Och f\u00f6r det andra beh\u00f6vs inga man\u00f6vrar som manuella partitioner. Om du g\u00e5r in och tittar p\u00e5 filsystemet, kommer du att se att tabellen \u00e4r en ganska komplex struktur. Inuti finns det n\u00e5got som liknar partitioner. Det vill s\u00e4ga, ClickHouse g\u00f6r allt \u00e5t dig och du beh\u00f6ver inte lida.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/652f3742ad3a44f172d0d7302abd09f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alter i ClickHouse \u00e4r gratis, om man g\u00f6r alter add\/drop column. <\/p>\n<p><\/p>\n<p>Och det \u00e4r inte v\u00e4rt att skapa sm\u00e5 tabeller, f\u00f6r om din tabell har 10 rader eller 10 000 rader spelar det ingen roll. ClickHouse \u00e4r ett system som optimerar genomfl\u00f6det, inte latensen, s\u00e5 att bearbeta 10 rader \u00e4r meningsl\u00f6st. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/144144b4740e9c5daec80c8dadc445f9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r r\u00e4tt att anv\u00e4nda en stor tabell. Sl\u00e4pp de gamla stereotyperna, s\u00e5 blir allt bra. <\/p>\n<p><\/p>\n<p>Som en bonus har vi i den senaste versionen f\u00e5tt m\u00f6jligheten att skapa godtyckliga partitionsnycklar f\u00f6r att kunna utf\u00f6ra olika underh\u00e5llsoperationer p\u00e5 individuella partitioner. <\/p>\n<p><\/p>\n<p>Till exempel om du beh\u00f6ver m\u00e5nga sm\u00e5 tabeller, som n\u00e4r det finns ett behov av att bearbeta vissa mellanliggande data, f\u00e5r du hitta chunkar och du beh\u00f6ver utf\u00f6ra transformationer p\u00e5 dem innan de skrivs till den slutliga tabellen. F\u00f6r detta fall finns det en fantastisk tabellmotor \u2013 StripeLog. Det \u00e4r ungef\u00e4r som TinyLog, fast b\u00e4ttre. <\/p>\n<p><\/p>\n<p>* just nu finns det \u00e4ven <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/table-functions\/input\/\">den tabell\u00e4ra funktionen input<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d62f0b3d29876c29c6c0ba236b200186.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En annan antipattern \u00e4r mikrosplittring. Till exempel, om du beh\u00f6ver shardera data och du har 5 servrar, men imorgon kommer det att vara 6 servrar. Och du undrar hur du ska ombalansera dessa data. Ist\u00e4llet f\u00f6r att splittra det i 5 shards, splittrar du det i 1 000 shards. Och sedan mappar du varje av dessa mikrosplitter till en separat server. Och du kan f\u00e5 200 ClickHouse p\u00e5 en server, till exempel. Separata instanser p\u00e5 olika portar eller separata databaser. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3e550ef7e338b84e4394eb9fa4538769.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men i ClickHouse \u00e4r detta inte s\u00e4rskilt bra. F\u00f6r \u00e4ven en instans av ClickHouse str\u00e4var efter att anv\u00e4nda alla tillg\u00e4ngliga resurser p\u00e5 servern f\u00f6r att bearbeta en enda fr\u00e5ga. Det vill s\u00e4ga, om du har en server som har 56 processorerk\u00e4rnor. Du utf\u00f6r en fr\u00e5ga som tar en sekund, och den kommer att anv\u00e4nda 56 k\u00e4rnor. Om du har 200 ClickHouse-instans p\u00e5 en och samma server, kommer det att resultera i att 10 000 tr\u00e5dar startas. \u00d6verlag kommer det att g\u00e5 v\u00e4ldigt d\u00e5ligt.<\/p>\n<p><\/p>\n<p>En annan anledning \u00e4r att arbetsf\u00f6rdelningen mellan dessa instanser kommer att vara oj\u00e4mn. N\u00e5gon kommer att avsluta tidigare, n\u00e5gon senare. Om allt skulle ske i en enda instans, skulle ClickHouse sj\u00e4lv kunna avg\u00f6ra hur man ska f\u00f6rdela data p\u00e5 r\u00e4tt s\u00e4tt mellan tr\u00e5darna. <\/p>\n<p><\/p>\n<p>Och en ytterligare anledning \u00e4r att du kommer att ha interprocesskommunikation \u00f6ver TCP. Data m\u00e5ste serialiseras, deserialiseras och det \u00e4r en enorm m\u00e4ngd mikrosplitter. Det kommer helt enkelt att fungera ineffektivt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/18cacc17d22ae1cb2977c6be74769896.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c4nnu en antipattern, \u00e4ven om det \u00e4r sv\u00e5rt att kalla det en antipattern. Det \u00e4r ett stort antal f\u00f6raggregat.<\/p>\n<p><\/p>\n<p>Generellt sett \u00e4r f\u00f6raggregation bra. Om du hade en miljard rader, aggregara du dem och det blir 1 000 rader, och nu utf\u00f6rs fr\u00e5gan omedelbart. Allt \u00e4r fantastiskt. S\u00e5 kan man g\u00f6ra. Och f\u00f6r detta finns det till och med en speciell typ av tabell i ClickHouse, AggregatingMergeTree, som g\u00f6r inkrementell aggregation medan data s\u00e4tts in. <\/p>\n<p><\/p>\n<p>Det finns dock fall d\u00e4r man t\u00e4nker att vi ska aggreggera data p\u00e5 det h\u00e4r s\u00e4ttet och sedan p\u00e5 ett annat. I en viss n\u00e4rliggande avdelning, som jag helst inte vill n\u00e4mna, anv\u00e4nder man SummingMergeTree-tabeller f\u00f6r att summera efter prim\u00e4rnyckeln, och som prim\u00e4rnyckel anv\u00e4nder man drygt 20 olika kolumner. Jag har av s\u00e4kerhetssk\u00e4l \u00e4ndrat namnen p\u00e5 n\u00e5gra kolumner f\u00f6r att vara diskret, men i stort sett \u00e4r det s\u00e5.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/54e3a02ab4bbce7c63ded595780ae1f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och d\u00e5 uppst\u00e5r s\u00e5dana problem. F\u00f6r det f\u00f6rsta minskar inte datavolymen s\u00e4rskilt mycket. Till exempel, den minskar med tre g\u00e5nger. Tre g\u00e5nger skulle vara ett bra pris f\u00f6r att kunna ha obegr\u00e4nsade m\u00f6jligheter f\u00f6r analys, vilket \u00e4r fallet om dina data inte \u00e4r aggregerade. Om datan \u00e4r aggregerad f\u00e5r du ist\u00e4llet bara usel statistik. <\/p>\n<p><\/p>\n<p>Och vad \u00e4r s\u00e4rskilt frustrerande? Det \u00e4r att dessa personer fr\u00e5n den n\u00e4rliggande avdelningen kommer och ber om att f\u00e5 l\u00e4gga till en kolumn i prim\u00e4rnyckeln. Det vill s\u00e4ga, vi har aggreggerat data p\u00e5 det h\u00e4r s\u00e4ttet, men nu vill vi ha lite mer. Men i ClickHouse finns det ingen m\u00f6jlighet att \u00e4ndra prim\u00e4rnyckeln. D\u00e4rf\u00f6r m\u00e5ste man skriva n\u00e5got skript i C++. Och jag gillar inte skript, \u00e4ven om de \u00e4r i C++.<\/p>\n<p><\/p>\n<p>Och om man ser p\u00e5 varf\u00f6r ClickHouse skapades, s\u00e5 \u00e4r det just f\u00f6r att hantera icke-aggregerade data \u2013 det \u00e4r det scenario f\u00f6r vilket det \u00e4r f\u00f6tt. Om du anv\u00e4nder ClickHouse f\u00f6r icke-aggregerade data g\u00f6r du helt r\u00e4tt. Om du aggregerar \u00e4r det ibland f\u00f6rl\u00e5tligt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/09fafd4c8a3ea8c22e586cb7a5cf6564.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett ytterligare intressant fall \u00e4r fr\u00e5gor i en o\u00e4ndlig loop. Jag g\u00e5r ibland in p\u00e5 n\u00e5gon produktionsserver och kollar p\u00e5 show processlist. Och varje g\u00e5ng uppt\u00e4cker jag att n\u00e5got hemskt p\u00e5g\u00e5r. <\/p>\n<p><\/p>\n<p>Till exempel n\u00e5got av detta slag. H\u00e4r blir det genast tydligt att man kunde ha genomf\u00f6rt allt med en enda fr\u00e5ga. Skriv bara url in och lista.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae03b659f178962f50e0640614517296.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varf\u00f6r \u00e4r det d\u00e5ligt med m\u00e5nga s\u00e5dana fr\u00e5gor i en o\u00e4ndlig loop? Om indexet inte anv\u00e4nds kommer det att bli m\u00e5nga genomg\u00e5ngar av samma data. Men om indexet anv\u00e4nds, till exempel om du har en prim\u00e4rnyckel p\u00e5 ru och skriver url = n\u00e5got d\u00e4r. D\u00e5 tror du att det kommer att l\u00e4sas in exakt ett url fr\u00e5n tabellen, och allt kommer att vara bra. Men i sj\u00e4lva verket \u00e4r det inte s\u00e5. F\u00f6r ClickHouse arbetar alltid med batchar. <\/p>\n<p><\/p>\n<p>N\u00e4r den beh\u00f6ver l\u00e4sa ett dataintervall l\u00e4ser den lite mer eftersom indexet i ClickHouse \u00e4r glest. Det h\u00e4r indexet till\u00e5ter inte att hitta enskilda rader i tabellen, bara vissa intervall. Och data komprimeras i block. F\u00f6r att l\u00e4sa en rad m\u00e5ste man h\u00e4mta ett helt block och dekomprimera det. Om du g\u00f6r m\u00e5nga f\u00f6rfr\u00e5gningar kommer du att ha m\u00e5nga \u00f6verlappningar, och mycket av arbetet kommer att utf\u00f6ras om och om igen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/95eef43c5b869f8b145c61ce3c616cfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Som en bonus kan man notera att man i ClickHouse inte beh\u00f6ver vara r\u00e4dd f\u00f6r att skicka \u00e4ven megabyte och till och med hundratals megabyte i IN-sektionen. Jag minns fr\u00e5n v\u00e5r praxis att om vi skickar massor av v\u00e4rden i IN-sektionen i MySQL, till exempel 100 megabyte av vissa nummer, s\u00e5 \u00e4ter MySQL upp 10 gigabyte minne och sedan h\u00e4nder det inget mer, allt fungerar d\u00e5ligt. <\/p>\n<p><\/p>\n<p>Det andra \u00e4r att i ClickHouse, om dina f\u00f6rfr\u00e5gningar anv\u00e4nder index, s\u00e5 \u00e4r det alltid inte l\u00e5ngsammare \u00e4n en fullst\u00e4ndig skanning, det vill s\u00e4ga om n\u00e4stan hela tabellen m\u00e5ste l\u00e4sas, kommer den att g\u00e5 sekventiellt och l\u00e4sa hela tabellen. I allm\u00e4nhet hanterar den sig sj\u00e4lv.<\/p>\n<p><\/p>\n<p>Men det finns \u00e4nd\u00e5 vissa sv\u00e5righeter. Till exempel anv\u00e4nds inte indexet med subfr\u00e5gor i IN. Men det \u00e4r v\u00e5rt problem och vi m\u00e5ste \u00e5tg\u00e4rda det. Det finns inget fundamentalt h\u00e4r. Vi kommer att fixa det. <\/p>\n<p><\/p>\n<p>En annan intressant sak \u00e4r att om du har en mycket l\u00e5ng f\u00f6rfr\u00e5gning och den distribuerade behandlingen av f\u00f6rfr\u00e5gningar p\u00e5g\u00e5r, s\u00e5 kommer den h\u00e4r mycket l\u00e5nga f\u00f6rfr\u00e5gningen att skickas till varje server utan komprimering. Till exempel, 100 megabyte och 500 servrar. Och d\u00e4rf\u00f6r kommer 50 gigabyte att \u00f6verf\u00f6ras \u00f6ver n\u00e4tverket. Det kommer att skickas och sedan kommer allt att utf\u00f6ras framg\u00e5ngsrikt.<\/p>\n<p><\/p>\n<p>* redan anv\u00e4nds; allt \u00e4r fixat, som lovat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/5fcde9bf04fff0645be2530daa12743f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och det \u00e4r ganska vanligt att f\u00f6rfr\u00e5gningar kommer fr\u00e5n API. Till exempel har du skapat en egen tj\u00e4nst. Och om din tj\u00e4nst beh\u00f6vs av n\u00e5gon, \u00f6ppnar du ett API och redan bokstavligt talat tv\u00e5 dagar senare ser du att n\u00e5got konstigt h\u00e4nder. Allt \u00e4r \u00f6verbelastat och det kommer fruktansv\u00e4rda f\u00f6rfr\u00e5gningar som aldrig borde ha kommit. <\/p>\n<p><\/p>\n<p>Och l\u00f6sningen h\u00e4r \u00e4r enkel. Om du har \u00f6ppnat ett API, s\u00e5 m\u00e5ste du begr\u00e4nsa det. Till exempel inf\u00f6ra kvoter. Det finns inga andra normala alternativ. Annars kommer n\u00e5gon att skriva ett skript och det kommer att bli problem. <\/p>\n<p><\/p>\n<p>I ClickHouse finns det en speciell funktion \u2013 kvotber\u00e4kning. Du kan \u00e4ven ange din egen kvotnyckel, som till exempel en intern anv\u00e4ndaridentifikator. Kvoterna r\u00e4knas oberoende f\u00f6r var och en av dem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/532438d0f116919e62f04e32ebbd3c45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu kommer vi till en intressant sak till. Det handlar om manuell replikering. <\/p>\n<p><\/p>\n<p>Jag k\u00e4nner till m\u00e5nga fall d\u00e4r, trots att ClickHouse har inbyggt st\u00f6d f\u00f6r replikering, m\u00e4nniskor repeterar ClickHouse manuellt.<\/p>\n<p><\/p>\n<p>Hur fungerar det? Du har en databehandlingspipeline som arbetar oberoende, till exempel i olika datacenter. Du skriver identiska data p\u00e5 ett identiskt s\u00e4tt till ClickHouse. Men i praktiken visar det sig att data \u00e4nd\u00e5 kommer att skingras p\u00e5 grund av vissa egenskaper i din kod, vilket jag hoppas inte g\u00e4ller f\u00f6r din. <\/p>\n<p><\/p>\n<p>Och du kommer \u00e4nd\u00e5 att beh\u00f6va synkronisera manuellt periodiskt. Till exempel g\u00f6r administrat\u00f6rer en rsync en g\u00e5ng i m\u00e5naden.<\/p>\n<p><\/p>\n<p>Det \u00e4r faktiskt mycket enklare att anv\u00e4nda den inbyggda replikeringen i ClickHouse. Men det kan finnas vissa nackdelar, eftersom det kr\u00e4ver att du anv\u00e4nder ZooKeeper. Jag t\u00e4nker inte tala illa om ZooKeeper; i grunden \u00e4r systemet fungerande, men ibland anv\u00e4nder folk det inte p\u00e5 grund av r\u00e4dslan f\u00f6r Java, eftersom ClickHouse \u00e4r ett s\u00e5 bra system skrivet i C++ som fungerar utm\u00e4rkt. Men ZooKeeper \u00e4r p\u00e5 Java. Och det k\u00e4nns som man helst vill undvika det, men d\u00e5 kan du anv\u00e4nda manuell replikation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3b5b68996daef6b8920f067b189f25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse \u00e4r ett praktiskt system. Det tar h\u00e4nsyn till dina behov. Om du har manuell replikation kan du skapa en distribuerad tabell som tittar p\u00e5 dina manuella repliker och sj\u00e4lv g\u00f6r failover mellan dem. Det finns till och med ett speciellt alternativ f\u00f6r att undvika flap, \u00e4ven om dina repliker konsekvent skingras.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/70f6630f8b14756163923a7db8dd7391.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det kan uppst\u00e5 problem om du anv\u00e4nder primitiva tabellmotorer. ClickHouse \u00e4r en slags byggsats med massor av olika tabellmotorer. F\u00f6r alla seri\u00f6sa fall, som beskrivs i dokumentationen, rekommenderas det att anv\u00e4nda tabeller fr\u00e5n MergeTree-familjen. De andra \u00e4r mer f\u00f6r speciella fall eller tester.<\/p>\n<p><\/p>\n<p>I MergeTree-tabellen beh\u00f6ver du inte n\u00f6dv\u00e4ndigtvis ha n\u00e5got datum eller tid. Du kan \u00e4nd\u00e5 anv\u00e4nda det. Om det inte finns n\u00e5got datum och tid, kan du s\u00e4tta att standarden \u00e4r 2000, s\u00e5 kommer det att fungera och inte kr\u00e4va n\u00e5gra resurser. <\/p>\n<p><\/p>\n<p>I den nya versionen av servern kan du \u00e4ven specificera att du vill ha anpassad partitionering utan partitionsnyckel. Det kommer att vara detsamma. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6d4046d11afdd1e5962d49a1612b666a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c5 andra sidan kan du anv\u00e4nda primitiva tabellmotorer. Till exempel kan du ladda data en g\u00e5ng och sedan utforska, manipulera och radera. Du kan anv\u00e4nda Log.<\/p>\n<p><\/p>\n<p>Eller lagra sm\u00e5 m\u00e4ngder f\u00f6r mellanbearbetning \u2013 detta \u00e4r StripeLog eller TinyLog.<\/p>\n<p><\/p>\n<p>Memory kan anv\u00e4ndas om datavolymen \u00e4r liten och du bara vill manipulera n\u00e5got i RAM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8a3d4e0e3a8c26dd3a2b2f64123e2bf9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse gillar inte \u00f6vernormaliserade data s\u00e4rskilt mycket. <\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett typiskt exempel. Det \u00e4r en stor m\u00e4ngd URL:er. Du har lagt dem i en n\u00e4rliggande tabell. Och sedan beslutade du att g\u00f6ra en JOIN med dem, men det kommer vanligtvis inte att fungera eftersom ClickHouse endast st\u00f6der Hash JOIN. Om det inte finns tillr\u00e4ckligt med RAM f\u00f6r de m\u00e5nga data som ska kopplas ihop, kan JOIN inte genomf\u00f6ras. <\/p>\n<p><\/p>\n<p>Om data har h\u00f6g cardinalitet, sl\u00f6sa inte tid p\u00e5 det, lagra dem i denormaliserad form, URL:er direkt inplace i huvudtabellen. <\/p>\n<p><\/p>\n<p>* Men nu finns det merge join i ClickHouse ocks\u00e5, och det fungerar under omst\u00e4ndigheter d\u00e4r mellanliggande data inte f\u00e5r plats i RAM. Men det \u00e4r ineffektivt och rekommendationen kvarst\u00e5r.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/e8160a8db17c18d48f810092c55b094c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ytterligare n\u00e5gra exempel, men jag b\u00f6rjar tvivla p\u00e5 om de verkligen \u00e4r antipatroner eller inte. <\/p>\n<p><\/p>\n<p>ClickHouse har en k\u00e4nd nackdel. Den kan inte hantera uppdateringar. P\u00e5 ett s\u00e4tt \u00e4r det faktiskt bra. Om du har viktiga data, till exempel bokf\u00f6ring, kommer ingen att kunna skicka dem eftersom det inte finns n\u00e5gra uppdateringar.<\/p>\n<p><\/p>\n<p>* St\u00f6d f\u00f6r uppdateringar och borttagningar i batchl\u00e4ge har l\u00e4nge lagts till.<\/p>\n<p><\/p>\n<p>Men det finns vissa speciella metoder som g\u00f6r att uppdateringar kan ske i bakgrunden. Till exempel tabeller av typen ReplaceMergeTree. De utf\u00f6r uppdateringar under bakgrundsmeldningar. Du kan tvinga detta med hj\u00e4lp av optimize table. Men g\u00f6r inte detta f\u00f6r ofta, eftersom det medf\u00f6r en fullst\u00e4ndig omskrivning av partitionen. <\/p>\n<p><\/p>\n<p>Distribuerade JOINs i ClickHouse \u2013 det hanteras inte bra av fr\u00e5geplaneraren. <\/p>\n<p><\/p>\n<p>D\u00e5ligt, men ibland \u00e4r det okej.<\/p>\n<p><\/p>\n<p>Att anv\u00e4nda ClickHouse endast f\u00f6r att l\u00e4sa tillbaka data med hj\u00e4lp av select.<\/p>\n<p><\/p>\n<p>Jag skulle inte rekommendera att anv\u00e4nda ClickHouse f\u00f6r tunga ber\u00e4kningar. Men det \u00e4r inte helt sant, eftersom vi redan avviker fr\u00e5n den rekommendationen. Och vi har nyligen lagt till m\u00f6jligheten att till\u00e4mpa maskininl\u00e4rningsmodeller i ClickHouse \u2013 Catboost. Och det oroar mig, f\u00f6r jag t\u00e4nker: \"Herregud. Hur m\u00e5nga cykler per byte blir det h\u00e4r!\". Jag hatar verkligen att sl\u00f6sa cykler p\u00e5 bytes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f686d5d352ccb444cd06e2ae68897137.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men var inte r\u00e4dd, installera ClickHouse, allt kommer att g\u00e5 bra. Om det \u00e4r n\u00e5got, s\u00e5 har vi en gemenskap. F\u00f6rresten, gemenskapen \u00e4r ni. Och om ni har n\u00e5gra problem kan ni \u00e5tminstone g\u00e5 in i v\u00e5r chatt, och jag hoppas att ni f\u00e5r hj\u00e4lp. <\/p>\n<p><\/p>\n<p>Fr\u00e5gor<\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen! Vart ska jag klaga p\u00e5 ClickHouse-nedg\u00e5ngar?<\/em><\/p>\n<p><\/p>\n<p>Du kan klaga till mig personligen just nu. <\/p>\n<p><\/p>\n<p><em>Jag b\u00f6rjade anv\u00e4nda ClickHouse nyligen. F\u00f6ll direkt ner kommandoradsgr\u00e4nssnittet.<\/em><\/p>\n<p><\/p>\n<p>Du har tur. <\/p>\n<p><\/p>\n<p><em>Lite senare kraschade jag servern med en liten select.<\/em><\/p>\n<p><\/p>\n<p>Du har talang. <\/p>\n<p><\/p>\n<p><em>Jag \u00f6ppnade en bugg p\u00e5 GitHub, men den ignorerades.<\/em> <\/p>\n<p><\/p>\n<p>L\u00e5t oss se. <\/p>\n<p><\/p>\n<p><em>Alexey lurade mig att delta i presentationen, han lovade att ber\u00e4tta hur ni komprimerar data.<\/em><\/p>\n<p><\/p>\n<p>V\u00e4ldigt enkelt. <\/p>\n<p><\/p>\n<p><em>Det f\u00f6rstod jag redan ig\u00e5r. Mer konkreta exempel.<\/em> <\/p>\n<p><\/p>\n<p>Det finns inga hemska knep. Det handlar helt enkelt om blockkomprimering. Som standard anv\u00e4nds LZ4, men man kan aktivera ZSTD*. Blocken \u00e4r mellan 64 kilobyte och 1 megabyte.<\/p>\n<p><\/p>\n<p>* det finns ocks\u00e5 st\u00f6d f\u00f6r specialiserade komprimeringskodar som kan anv\u00e4ndas i kedjor med andra algoritmer.<\/p>\n<p><\/p>\n<p><em>\u00c4r blocken bara r\u00e5data?<\/em><\/p>\n<p><\/p>\n<p>Inte helt r\u00e5a. D\u00e4r finns arrayer. Om du har en numerisk kolumn, s\u00e5 \u00e4r siffrorna placerade sekventiellt i en array. <\/p>\n<p><\/p>\n<p><em>F\u00f6rst\u00e5tt.<\/em> <\/p>\n<p><\/p>\n<p><em>Alexey, exemplet med uniqExact \u00f6ver IP-adresser, dvs. att uniqExact tar l\u00e4ngre tid att ber\u00e4kna \u00f6ver str\u00e4ngar \u00e4n \u00f6ver siffror och s\u00e5 vidare. Och om vi till\u00e4mpar en trick och kastar vid l\u00e4sning? Dvs. ni n\u00e4mnde att det inte skiljer sig mycket p\u00e5 disken. Om vi l\u00e4ser str\u00e4ngar fr\u00e5n disken och kastar, kommer v\u00e5ra aggregat att vara snabbare eller inte? Eller f\u00e5r vi fortfarande en obetydlig vinst h\u00e4r? Jag tycker att ni testade detta, men av n\u00e5gon anledning angav ni inte det i benchmarken.<\/em> <\/p>\n<p><\/p>\n<p>Jag tror att det kommer att vara l\u00e5ngsammare \u00e4n utan casting. I s\u00e5 fall m\u00e5ste IP-adressen parseras fr\u00e5n str\u00e4ngen. Vi har givetvis ocks\u00e5 optimerad parsing av IP-adresser i ClickHouse. Vi har gjort v\u00e5rt b\u00e4sta, men d\u00e4r \u00e4r ju siffrorna skrivna i tiotusentalsformat. Mycket besv\u00e4rligt. \u00c5 andra sidan kommer uniqExact-funktionen att fungera l\u00e5ngsammare p\u00e5 str\u00e4ngar, inte bara f\u00f6r att det \u00e4r str\u00e4ngar, utan ocks\u00e5 f\u00f6r att en annan algoritmspecialisering v\u00e4ljs. Str\u00e4ngar bearbetas helt enkelt p\u00e5 ett annat s\u00e4tt.<\/p>\n<p><\/p>\n<p><em>Men vad om vi tar en mer primitiv datatyp? Till exempel, vi har skrivit user id, som vi har in, skrivit det som en str\u00e4ng, och sedan castat, blir det roligare eller inte?<\/em><\/p>\n<p><\/p>\n<p>Jag tvivlar. Jag tror att det kommer att bli \u00e4nnu tristare, eftersom parsing av siffror \u00e4nd\u00e5 \u00e4r ett allvarligt problem. Jag tror att den h\u00e4r kollegan till och med hade en presentation om hur sv\u00e5rt det \u00e4r att parse siffror i tiotusentalsformat, eller kanske inte. <\/p>\n<p><\/p>\n<p><em>Alexey, stort tack f\u00f6r presentationen! Och stort tack f\u00f6r ClickHouse! Jag har en fr\u00e5ga om funktionerna. Finns det planer p\u00e5 en funktion f\u00f6r att uppdatera lexikonet delvis?<\/em><\/p>\n<p><\/p>\n<p>Det vill s\u00e4ga, partiell omladdning?<\/p>\n<p><\/p>\n<p><em>Ja, ja. Typ m\u00f6jligheten att ange ett MySQL-f\u00e4lt d\u00e4r man kan uppdatera efter, s\u00e5 att endast dessa data laddas om lexikonet \u00e4r v\u00e4ldigt stort.<\/em><\/p>\n<p><\/p>\n<p>Mycket intressant funktion. Och jag tycker att n\u00e5gon kille f\u00f6reslog den i v\u00e5r chatt. Kanske var det till och med du. <\/p>\n<p><\/p>\n<p><em>Jag tror inte det.<\/em><\/p>\n<p><\/p>\n<p>Utm\u00e4rkt, nu visar det sig att det \u00e4r tv\u00e5 f\u00f6rfr\u00e5gningar. Och man kan lugnt b\u00f6rja g\u00f6ra. Men jag vill genast varna er f\u00f6r att den h\u00e4r funktionen \u00e4r ganska enkel att implementera. Det vill s\u00e4ga, i teorin beh\u00f6ver man bara skriva versionsnumret i tabellen och sedan skriva: version mindre \u00e4n s\u00e5 h\u00e4r. Och det betyder att vi troligen kommer att f\u00f6resl\u00e5 att entusiasterna g\u00f6r det. \u00c4r du en entusiast? <\/p>\n<p><\/p>\n<p><em>Ja, men tyv\u00e4rr inte i C++.<\/em><\/p>\n<p><\/p>\n<p>Kan dina kollegor skriva i C++? <\/p>\n<p><\/p>\n<p><em>Jag ska hitta n\u00e5gon.<\/em><\/p>\n<p><\/p>\n<p>Utm\u00e4rkt*.<\/p>\n<p><\/p>\n<p>* m\u00f6jligheten lades till tv\u00e5 m\u00e5nader efter presentationen \u2013 den utvecklades av fr\u00e5gest\u00e4llaren och skickades in. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/pull\/1771\">pull request<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>Tack!<\/em><\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r f\u00f6redraget! Du n\u00e4mnde att ClickHouse mycket effektivt anv\u00e4nder alla tillg\u00e4ngliga resurser. Och talaren intill fr\u00e5n Luxoft ber\u00e4ttade om sin l\u00f6sning f\u00f6r PostNord. Han sa att de verkligen gillade ClickHouse, men de anv\u00e4nde det inte ist\u00e4llet f\u00f6r sin huvudsakliga konkurrent eftersom det tog upp hela processorn. Och de kunde inte f\u00e5 in det i sin arkitektur, i sin ZooKeeper med Docker. Finns det n\u00e5got s\u00e4tt att begr\u00e4nsa ClickHouse s\u00e5 att det inte utnyttjar allt som blir tillg\u00e4ngligt f\u00f6r det?<\/em><\/p>\n<p><\/p>\n<p>Ja, det kan man och det \u00e4r v\u00e4ldigt enkelt. Om du vill att det ska anv\u00e4nda f\u00e4rre k\u00e4rnor, skriv bara <code>set max_threads = 1<\/code>. Och allt, det kommer att utf\u00f6ra f\u00f6rfr\u00e5gan p\u00e5 en k\u00e4rna. Dessutom kan olika anv\u00e4ndare ges olika den h\u00e4r inst\u00e4llningen. S\u00e5 inga problem alls. Och s\u00e4g till kollegorna fr\u00e5n Luxoft att det inte \u00e4r bra att de inte hittade den h\u00e4r inst\u00e4llningen i dokumentationen. <\/p>\n<p><\/p>\n<p><em>Alexey, hej! Jag skulle vilja st\u00e4lla en fr\u00e5ga. Jag har h\u00f6rt flera g\u00e5nger nu att m\u00e5nga b\u00f6rjar anv\u00e4nda ClickHouse som lagring f\u00f6r loggar. I f\u00f6redraget sa du att man inte b\u00f6r g\u00f6ra s\u00e5, d.v.s. att man inte beh\u00f6ver lagra l\u00e5nga rader. Vad tycker du om det?<\/em><\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta, loggar \u00e4r oftast inte l\u00e5nga rader. Det finns dock undantag. Till exempel, en tj\u00e4nst skriven i java kastar ett undantag, det loggas. Och s\u00e5 i en o\u00e4ndlig loop, och det tar slut p\u00e5 utrymme p\u00e5 h\u00e5rddisken. L\u00f6sningen \u00e4r mycket enkel. Om raderna \u00e4r v\u00e4ldigt l\u00e5nga, s\u00e5 klipp dem. Men vad betyder l\u00e5nga? Tiotals kilobyte \u2013 det \u00e4r d\u00e5ligt*.<\/p>\n<p><\/p>\n<p>* \u0432 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 ClickHouse, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 &quot;\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u0430&quot;, \u0447\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p><\/p>\n<p><em>\u00c4r en kilobyte okej?<\/em><\/p>\n<p><\/p>\n<p>Okej. <\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r f\u00f6redraget! Jag har redan fr\u00e5gat om detta i chatten, men jag kommer inte ih\u00e5g om jag f\u00e5tt svar. Planerar ni att p\u00e5 n\u00e5got s\u00e4tt ut\u00f6ka sektionen WITH i stil med CTE?<\/em><\/p>\n<p><\/p>\n<p>Inte f\u00f6r tillf\u00e4llet. Sektionen WITH \u00e4r lite ofullst\u00e4ndig. Den \u00e4r mer som en liten funktion.<\/p>\n<p><\/p>\n<p><em>Jag f\u00f6rst\u00e5r. Tack!<\/em><\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r f\u00f6redraget! Mycket intressant! En \u00f6vergripande fr\u00e5ga. Planerar ni att g\u00f6ra, kanske i form av n\u00e5gra dummys, en modifiering f\u00f6r att ta bort data?<\/em><\/p>\n<p><\/p>\n<p>Absolut. Detta \u00e4r v\u00e5r f\u00f6rsta uppgift i v\u00e5r k\u00f6. Vi har nu aktivt t\u00e4nkt igenom hur man g\u00f6r allt r\u00e4tt. Och det \u00e4r dags att b\u00f6rja trycka p\u00e5 tangentbordet*.<\/p>\n<p><\/p>\n<p>* tryckte p\u00e5 knapparna p\u00e5 tangentbordet och gjorde allt.<\/p>\n<p><\/p>\n<p><em>Kommer detta att p\u00e5verka systemets prestanda p\u00e5 n\u00e5got s\u00e4tt? Kommer inmatningen att vara lika snabb som den \u00e4r nu?<\/em><\/p>\n<p><\/p>\n<p>Kanske sj\u00e4lva deletes och updates blir mycket tunga, men det p\u00e5verkar inte prestandan f\u00f6r selects och inserts.<\/p>\n<p><\/p>\n<p><em>Och en liten fr\u00e5ga till. P\u00e5 presentationen talade ni om primary key. S\u00e5ledes har vi partitionering som som standard \u00e4r m\u00e5nadsvis, eller hur? Och n\u00e4r vi st\u00e4ller in ett dataintervall som faller inom en m\u00e5nad, s\u00e5 l\u00e4ser vi endast den partitionen, eller hur?<\/em><\/p>\n<p><\/p>\n<p>Ja.<\/p>\n<p><\/p>\n<p><em>S\u00e5 h\u00e4r \u00e4r en fr\u00e5ga. Om vi inte kan s\u00e4rskilja n\u00e5gon primary key, \u00e4r det korrekt att g\u00f6ra det baserat p\u00e5 f\u00e4ltet \"Datum\" f\u00f6r att minimera omstruktureringen av dessa data s\u00e5 att de h\u00e5lls mer ordnat? Om ni inte har intervalls\u00f6kningar och inte ens kan v\u00e4lja n\u00e5gon prim\u00e4rnyckel, b\u00f6r man d\u00e5 s\u00e4tta datumet i prim\u00e4rnyckeln?<\/em><\/p>\n<p><\/p>\n<p>Ja.<\/p>\n<p><\/p>\n<p>Kanske \u00e4r det meningsfullt att inkludera ett f\u00e4lt i prim\u00e4rnyckeln d\u00e4r data komprimeras b\u00e4ttre om de sorteras p\u00e5 det f\u00e4ltet. Till exempel, anv\u00e4ndarens identifierare. Anv\u00e4ndaren bes\u00f6ker kanske samma webbplats. I det h\u00e4r fallet inkluderar ni anv\u00e4ndarens id och tiden. D\u00e5 kommer era data att komprimeras b\u00e4ttre. N\u00e4r det g\u00e4ller datum, om ni verkligen inte har och aldrig har n\u00e5gra intervalls\u00f6kningar baserad p\u00e5 datum, s\u00e5 kan ni kanske l\u00e5ta bli att s\u00e4tta datumet i prim\u00e4rnyckeln. <\/p>\n<p><\/p>\n<p><em>Tack s\u00e5 mycket!<\/em><\/p>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/514840\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91439,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Effektiv anv\u00e4ndning av ClickHouse. Alexey Milovidov (Yandex) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-13T17:42:36+00:00","article:modified_time":"2020-08-13T17:42:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91438","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:27:23","updated":"2022-09-28 17:25:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/91438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=91438"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/91438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/91439"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=91438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=91438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=91438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}