{"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\/et\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","title":{"rendered":"ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8e42c1fffffcc964eacef240ea90bbc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kuna ClickHouse on spetsialiseeritud s\u00fcsteem, on selle kasutamisel oluline arvesse v\u00f5tta selle arhitektuuri omadusi. Selles ettekandes r\u00e4\u00e4gib Aleksei n\u00e4idetest t\u00fc\u00fcpilistest vigadest ClickHouse'i kasutamisel, mis v\u00f5ivad viia ebaefektiivse t\u00f6\u00f6ni. Praktikast toome n\u00e4iteid, kuidas andmete t\u00f6\u00f6tlemise erineva skeemi valik v\u00f5ib tootlikkust dramaatiliselt muuta.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Tere k\u00f5igile! Minu nimi on Aleksei, ma teen ClickHouse'i.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7f5fc01663be58d3d25e518a4169b8cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esiteks, kiirustan teid r\u00f5\u00f5mustama, et ma ei hakka t\u00e4na r\u00e4\u00e4kima, mis on ClickHouse. Ausalt \u00f6eldes on see mul juba t\u00fc\u00fctuks muutunud. Ma r\u00e4\u00e4gin sellega iga kord. Ja ilmselt teavad k\u00f5ik juba. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/fae6bd07d098200643d591b8e5bf51e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kohapeal r\u00e4\u00e4gin hoopis sellest, millised on v\u00f5imalikud takistused, st kuidas ClickHouse'i valesti kasutada. Tegelikult ei ole m\u00f5tet karta, kuna me arendame ClickHouse'i s\u00fcsteemina, mis on lihtne, mugav ja t\u00f6\u00f6tab kohe. Paigaldad ja k\u00f5ik, mingeid probleeme ei ole. <\/p>\n<p><\/p>\n<p>Kuid siiski tuleb arvestada, et see s\u00fcsteem on spetsialiseeritud ja v\u00f5ib kerge vaevaga sattuda ebatavalisse kasutusskeemi, mis viib selle s\u00fcsteemi mugavustsoonist v\u00e4lja.<\/p>\n<p><\/p>\n<p>Nii et, millised on takistused? Peamiselt r\u00e4\u00e4gin ma ilmselgetest asjadest. K\u00f5igile on k\u00f5ik ilmselge, k\u00f5ik m\u00f5istavad ja saavad r\u00f5\u00f5mustada, et nad on nii targad, ja kes ei m\u00f5ista, need saavad midagi uut teada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/bffacf353ff31b361460178e911f0e16.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esimene, k\u00f5ige lihtsam n\u00e4ide, mida kahjuks sageli kohtab, on suur arv sisendeid v\u00e4ikeste partiitide kaupa, st suur arv v\u00e4ikseid sisendeid.<\/p>\n<p><\/p>\n<p>Kui vaadata, kuidas ClickHouse sisestusi t\u00e4idab, saate \u00fche p\u00e4ringu kaudu saata kas v\u00f5i terabaidi andmevoo. See ei ole probleem. <\/p>\n<p><\/p>\n<p>Vaadakem, milline oleks t\u00fc\u00fcpiline tootlikkus. N\u00e4iteks on meil tabel Yandex.Metrikast. K\u00fcllused. 105 mingisugust veergu. 700 baiti uncompressed. Ja sisestame \u00f5igesti partiitide kaupa miljon rida. <\/p>\n<p><\/p>\n<p>Sisestame tabelisse MergeTree, tulemuseks on 500 000 rida sekundis. Suurep\u00e4rane. Replitseeritud tabelisse \u2013 veidi v\u00e4hem, umbes 400 000 rida sekundis. <\/p>\n<p><\/p>\n<p>Ja kui sisse l\u00fclitada h\u00e4\u00e4ltega sisestamine, siis on tulemuseks veidi v\u00e4hem, kuid siiski korralik tootlikkus, 250 000 rida sekundis. H\u00e4\u00e4ltega sisestamine on ClickHouse's dokumenteerimata funktsionaalsus.<\/p>\n<p><\/p>\n<p>* 2020. aasta seisuga, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/operations\/settings\/settings\/#settings-insert_quorum\">on juba dokumenteeritud<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/668498fc82a0f6e851d05e6e1ea67033.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mis juhtub, kui teeme halvasti? Me sisestame rida kaupa MergeTree tabelisse ja saame 59 rida sekundis. See on 10 000 korda aeglasem. ReplicatedMergeTree puhul on see 6 rida sekundis. Ja kui veel kvorum sisse l\u00fclitada, siis saame 2 rida sekundis. Minu arust on see t\u00e4ielik jama. Kuidas saab nii aeglaselt t\u00f6\u00f6tada? Mul on isegi T-s\u00e4rgil kirjutatud, et ClickHouse ei tohiks aeglustada. Kuid vahel juhtub ikkagi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4c771eddc4e8453f60ef91123ae5d109.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tegelikult on see meie puudus. Me oleksime t\u00e4iesti v\u00f5inud teha nii, et k\u00f5ik toimib normaalselt, aga me ei teinud. Ja me ei teinud seda, sest meie stsenaariumis ei olnud see vajalik. Meil olid nagunii partiid. Lihtsalt me saime sisendi partiidena ning sellega ei olnud probleeme. Sisestame ja k\u00f5ik t\u00f6\u00f6tab normaalselt. Kuid muidugi on v\u00f5imalikud erinevad stsenaariumid. N\u00e4iteks, kui teil on palju servereid, kus andmed genereeritakse. Ja nad sisestavad andmeid mitte nii tihti, kuid saadud on ikkagi sagedased sisestused. Ja seda tuleks kuidagi v\u00e4ltida. <\/p>\n<p><\/p>\n<p>Tehnilisest vaatepunktist on asi selles, et kui teete ClickHouse\u2019is sisestamise, siis andmed ei satu \u00fchtegi memtable\u2019i. Meil ei ole isegi t\u00f5elist log structure MergeTree\u2019d, vaid lihtsalt MergeTree, kuna puudub nii log kui memTable. Me lihtsalt salvestame andmed otse failis\u00fcsteemi, juba veergude kaupa jaotatuna. Ja kui teil on 100 veergu, siis tuleb salvestada rohkem kui 200 faili eraldi kausta. K\u00f5ik see on \u00fcsna mahukas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/24688fe3d39d81b92f12ac1b8b21425b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja tekib k\u00fcsimus: \u201eKuidas teha \u00f5igesti?\u201c, kui on selline olukord, kus on ikkagi vaja kuidagi andmeid ClickHouse\u2019i salvestada.<\/p>\n<p><\/p>\n<p>Meetod 1. See on k\u00f5ige lihtsam meetod. Kasutage m\u00f5nda hajutatud j\u00e4rjekorda. N\u00e4iteks, Kafka. Lihtsalt v\u00f5tate andmed Kafkast v\u00e4lja, bat\u0161ite kord sekundis. Ja k\u00f5ik l\u00e4heb normaalselt, te salvestate, k\u00f5ik t\u00f6\u00f6tab h\u00e4sti. <\/p>\n<p><\/p>\n<p>Puuduseks on see, et Kafka on veel \u00fcks mahukas hajutatud s\u00fcsteem. Ma saan aru, kui teie ettev\u00f5ttes juba on Kafka. See on hea, see on mugav. Kuid kui seda ei ole, siis m\u00f5elge kolm korda, enne kui t\u00f5mbate endale projekti veel \u00fche hajutatud s\u00fcsteemi. Seega tasub kaaluda alternatiive. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4f687221e8c7443abf02fb002c4eba5b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meetod 2. Siin on selline vanakooli alternatiiv, mis on samas v\u00e4ga lihtne. Teil on server, mis genereerib teie logid. See lihtsalt salvestab teie logid faili. Ja iga sekundi j\u00e4rel, n\u00e4iteks, nimetame selle faili \u00fcmber, loome uue. Ja eraldi skript, kas cronilt v\u00f5i m\u00f5ni demon, v\u00f5tab k\u00f5ige vanema faili ja salvestab selle ClickHouse'i. Kui logid salvestada iga sekundi tagant, siis k\u00f5ik t\u00f6\u00f6tab suurep\u00e4raselt. <\/p>\n<p><\/p>\n<p>Aga selle meetodi puudus on see, et kui teie server, kus logid genereeritakse, mingil p\u00f5hjusel kaob, kaovad ka andmed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b4c28b6df87386c42b6908bdfccb6b90.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meetod 3. On veel \u00fcks huvitav meetod, mis ei vaja \u00fcldse ajutisi faile. N\u00e4iteks, teil v\u00f5ib olla mingi reklaamik\u00e4ivitaja v\u00f5i m\u00f5ni muu huvitav demon, mis genereerib andmeid. Ja te saate koguda hunniku andmeid otse m\u00e4llu, puhvri sisse. Ja kui m\u00f5\u00f5dukas aeg on m\u00f6\u00f6dunud, eraldate selle puhvri, loote uue ja eraldi l\u00f5imes sisestate ClickHouse'i juba kogunenud andmed.<\/p>\n<p><\/p>\n<p>Teiselt poolt kaovad andmed samuti kill -9 korral. Kui teie server kukub, kaotate need andmed. Ja veel \u00fcheks probleemiks on see, et kui te ei saa andmeid andmebaasi salvestada, hakkavad need andmed kogunema m\u00e4llu. Ja kas m\u00e4lu saab otsa v\u00f5i kaotate lihtsalt andmed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/dc375b22fcb26cfa111d0bdb4563aa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meetod 4. Veel \u00fcks huvitav meetod. Teil on mingisugune serveriprotsess. Ja see v\u00f5ib saata andmeid ClickHouse'i kohe, kuid teha seda \u00fches \u00fchenduses. N\u00e4iteks saata HTTP-p\u00e4ring transfer-encoding: chunked koos insert\u2019iga. Ja genereerida chunk'e mitte liiga harva, saab saata iga rida, kuigi see lisab \u00fclekoormust nende andmete raamistamisele. <\/p>\n<p><\/p>\n<p>Aga ikkagi, sellisel juhul saadetakse andmed ClickHouse'i kohe. Ja ClickHouse ise hakkab neid puhvritama. <\/p>\n<p><\/p>\n<p>Aga probleemid ilmnevad ka. N\u00fc\u00fcd kaotate andmed, sealhulgas siis, kui teie protsess tapetakse ja kui ClickHouse'i protsess tapetakse, kuna see on l\u00f5petamata insert. Ja ClickHouse'is on insertid aatomilised kuni teatud m\u00e4\u00e4ratud ridade arvuni. \u00dcldiselt on see huvitav meetod. Seda saab samuti kasutada.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6a18a974b9600ade377a870390e95d3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meetod 5. Siin on veel \u00fcks huvitav meetod. See on mingi community arendatud server, mis on m\u00f5eldud andmete t\u00f6\u00f6tlemiseks. Ma pole seda ise vaadanud, seega ei saa ma midagi garantii alla v\u00f5tta. Siiski, isegi ClickHouse ei paku mingeid tagatisi. See on samuti avatud l\u00e4htekoodiga, kuid teisest k\u00fcljest olete v\u00f5ib-olla harjunud teatud kvaliteedistandardiga, mida me p\u00fc\u00fcame tagada. Selle t\u00f6\u00f6riista osas - ma ei tea, minge GitHubi, vaadake koodi. V\u00f5ib-olla on seal midagi normaalset kirjutatud. <\/p>\n<p><\/p>\n<p>* seisuga 2020. aasta, tuleks ka kaaluda <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=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae6a04af63ae4e7fa160c002fdb6d506.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meetod 6. Veel \u00fcks meetod on Buffer tabelite kasutamine. Selle meetodi eeliseks on see, et selle kasutamine on v\u00e4ga lihtne. Loote Buffer tabeli ja lisate sinna andmed. <\/p>\n<p><\/p>\n<p>Aga puuduseks on see, et probleem ei lahene t\u00e4ielikult. Kui MergeTree t\u00fc\u00fcpi sisestamisel peate andmeid r\u00fchmitama \u00fche partii kohta sekundis, siis Buffer tabelisse sisestamisel peate r\u00fchmitama v\u00e4hemalt paar tuhat sekundis. Kui on rohkem kui 10 000 sekundis, siis l\u00e4heb ikkagi halvasti. Ja kui sisestada partii kaupa, siis n\u00e4gite, et v\u00f5ib saada sadu tuhandeid ridu sekundis. Ja see juba raskete andmete puhul. <\/p>\n<p><\/p>\n<p>Ja ka Buffer tabelitel ei ole logi. Kui teie serveriga juhtub midagi, siis andmed kaotatakse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/9bb16bf5e8145cc8368b11e54c86c837.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja boonuseks, hiljuti ilmus ClickHouse'is v\u00f5imalus andmeid Kafka'ist saada. On olemas tabelimootor - Kafka. Lihtsalt loote selle. Ja sellele saab kinnitada materialiseeritud vaateid. Sel juhul toob see ise andmed Kafka'st ja sisestab need teie soovitud tabelitesse. <\/p>\n<p><\/p>\n<p>Ja eriti r\u00f5\u00f5mustav on selles v\u00f5imaluses see, et seda ei teinud meie. See on community funktsioon. Ja kui ma r\u00e4\u00e4gin 'community funktsioonist', siis ma ei r\u00e4\u00e4gi mingisuguse \u00fcleolekuga. Koodi oleme lugenud, \u00fclevaate teinud, peaks t\u00f6\u00f6le hakkama. <\/p>\n<p><\/p>\n<p>* seisuga 2020. aasta, ilmus sarnane tugi <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=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15dc61dfd435f5f8640395b7de480fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mis veel v\u00f5ib olla ebamugav v\u00f5i \u00fcllatav andmete sisestamisel? Kui teete insert values p\u00e4ringu ja values'is kirjutate m\u00f5ningaid arvutuse v\u00e4ljendeid. N\u00e4iteks now() - see on samuti arvutuse v\u00e4ljend. Ja sel juhul peab ClickHouse igal real k\u00e4ivitama nende v\u00e4ljendite t\u00f5lgendi, ja j\u00f5udlus langeb j\u00e4rsult. Parem seda v\u00e4ltida.<\/p>\n<p><\/p>\n<p>* hetkel on probleem t\u00e4ielikult lahendatud, v\u00e4\u00e4rtuste m\u00f5istuslike v\u00e4ljendite kasutamisel ei ole enam j\u00f5udlusprobleeme.<\/p>\n<p><\/p>\n<p>Teine n\u00e4ide, kui v\u00f5ivad esineda m\u00f5ned probleemid, kui \u00fches partiiandmete seas kuuluvad andmed mitmesse partitsiooni. ClickHouse'is on partitsioonid vaikimisi kuude kaupa. Ja kui sisestate partii miljonist reast, kus on andmed mitme aasta jooksul, siis on teil seal mitu k\u00fcmnendat partitsiooni. Ja see on ekvivalentne sellega, et partiid on mitmek\u00fcmne v\u00f5rra v\u00e4iksemad, kuna need jagunevad k\u00f5igepealt partitsioonide kaupa.<\/p>\n<p><\/p>\n<p>* hiljuti lisati ClickHouse'is eksperimentaalses re\u017eiimis toimetamise toetuseks kompaktne formaadi t\u00fckid ja t\u00fckid m\u00e4lus koos eelneva logimisfailiga, mis lahendab probleemi peaaegu t\u00e4ielikult.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b8c6cecdba53559dad31ed11713a980d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd vaatame teist t\u00fc\u00fcpi probleemi \u2013 andmete t\u00fcpiseerimine. <\/p>\n<p><\/p>\n<p>Andmete t\u00fcpiseerimine v\u00f5ib olla range v\u00f5i struktuurne. Struktuurne on see, kui te lihtsalt v\u00f5tate ja kuulutate, et k\u00f5ik teie v\u00e4ljad on t\u00fc\u00fcpi string. See on vale. Nii ei tohi teha. <\/p>\n<p><\/p>\n<p>Laske meil arutada, kuidas \u00f5igesti k\u00e4ituda olukordades, kus soovite \u00f6elda, et m\u00f5ni v\u00e4li on meil string ja laske ClickHouse'il ise aru saada, kuigi samas tasuks siiski mingit pingutust teha. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a0fdcf6423933293318411242fe2ede7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4iteks meil on IP-aadress. \u00dches olukorras salvestasime selle stringina. N\u00e4iteks 192.168.1.1. Teises olukorras on see arv t\u00fc\u00fcbiga UInt32*. 32 bitti on piisav IPv4 aadresside jaoks.<\/p>\n<p><\/p>\n<p>Esiteks, kummalisel kombel kokkusurutud andmed on enam-v\u00e4hem sama ulatusega. Seal on loomulikult erinevusi, kuid need ei ole nii suured. Seega ei ole diskiv\u00f5imaluste osas erilisi probleeme. <\/p>\n<p><\/p>\n<p>Kuid on t\u00f5sine erinevus protsessori aja ja p\u00e4ringu t\u00e4itmise aja osas. <\/p>\n<p><\/p>\n<p>Lugemisel unikaalsete IP-aadresside arvu, kui need on salvestatud numbritena. Tulemus on 137 miljonit rida sekundis. Kui sama toimub stringide kujul, siis 37 miljonit rida sekundis. Ma ei tea, miks selline kokkulangevus tekkis. Mina ise sooritasin neid p\u00e4ringuid. Kuid siiski on aeg umbes 4 korda aeglasem. <\/p>\n<p><\/p>\n<p>Ja kui arvutada vahe ketta ruumi osas, siis erinevus on samuti olemas. Ja see erinevus on umbes neljandik, sest unikaalseid IP-aadresse on piisavalt palju. Kui siin oleksid stringid v\u00e4ikese erinevate v\u00e4\u00e4rtuste hulgaga, siis need oleksid rahulikult s\u00f5nastiku j\u00e4rgi peaaegu sama suurusega kokku surutud. <\/p>\n<p><\/p>\n<p>Ja nelja korda erinev aeg teel ei ole t\u00fchjaks j\u00e4\u00e4nud. V\u00f5ib-olla teid see ei h\u00e4iri, kuid kui n\u00e4en selliseid erinevusi, tunnen end kurvana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f74dbfdab5a9e26fa044a5870a8cc00d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vaadakem erinevaid juhtumeid. <\/p>\n<p><\/p>\n<p>1. \u00dcks juhtum, kui teil on erinevaid unikaalseid v\u00e4\u00e4rtusi veidi. Sellisel juhul kasutame lihtsat praktikat, mida te ilmselt tunnete ja saate kasutada mis tahes andmebaasides. See on m\u00f5istlik mitte ainult ClickHouse'i jaoks. Lihtsalt salvestage andmebaasi numbrilised id-d. Ja konverteerida stringideks ja tagasi saab juba teie rakenduse poolel. <\/p>\n<p><\/p>\n<p>N\u00e4iteks, teil on regiooni andmed. Ja te \u00fcritate seda hoida stringina. Ja seal on n\u00e4iteks: Moskva ja MO. Ja kui ma n\u00e4en, et seal on kirjutatud \"Moskva\", siis see on veel okei, aga kui ka MO, siis muutub see kuidagi ikka kurvaks. See on ju palju baite. <\/p>\n<p><\/p>\n<p>Selle asemel salvestame lihtsalt numbri Ulnt32 ja 250. Meil on Yandexis 250, aga teil v\u00f5ib see olla teisiti. Igaks juhuks \u00fctlen, et ClickHouse'il on sisseehitatud v\u00f5imalus geobaasiga t\u00f6\u00f6tamiseks. Te salvestate lihtsalt regioonide katalooge, sealhulgas hierarhilise, st seal on nii Moskva kui mee, ning k\u00f5ik, mis teile vajalik. Ja saate konverteerida p\u00e4ringu tasemel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/cc6e871136dab8f8a35246a5af512cda.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teine variant on enam-v\u00e4hem sama, kuid juba ClickHouse'i sees toe abil. See on Enum andmet\u00fc\u00fcp. Te lihtsalt m\u00e4\u00e4rate Enum'i sees k\u00f5ik vajalikud v\u00e4\u00e4rtused. N\u00e4iteks seadme t\u00fc\u00fcp ja seal kirjutate: desktop, mobiilne, tahvelarvuti, televiisor. Kokku 4 varianti. <\/p>\n<p><\/p>\n<p>Puuduseks on see, et peate perioodiliselt muutma. Lisame vaid \u00fche variandi. Teeme alter table. Tegelikult on alter table ClickHouse'is tasuta. Eriti on see tasuta Enum'i osas, kuna andmed kettal ei muutu. Kuid sellegipoolest haarab alter tabelist lukku ja peab ootama, kuni k\u00f5ik select'id l\u00f5pule viiakse. Ja alles p\u00e4rast seda viidatakse alter'ile, st mugavus on siiski kohal.<\/p>\n<p><\/p>\n<p>* Uutes ClickHouse'i versioonides on ALTER t\u00e4ielikult blokeerimata.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7284fa5be583ab063bb6de0b60f54d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel \u00fcks variant, mis on ClickHouse'ile piisavalt ainulaadne, on v\u00e4liste s\u00f5nastike \u00fchendamine. Te saate kirjutada ClickHouse'isse numbreid ja hoida oma katalooge mis tahes mugavas s\u00fcsteemis. N\u00e4iteks v\u00f5ib kasutada: MySQL, Mongo, Postgres. V\u00f5ite isegi oma mikroteenuse luua, mis edastab neid andmeid http kaudu. Ja ClickHouse'i tasemel kirjutate funktsiooni, mis muudab need andmed numbritest stringideks. <\/p>\n<p><\/p>\n<p>See on spetsialiseeritud, kuid v\u00e4ga t\u00f5hus viis v\u00e4lise tabeli \u00fchendamiseks. Ja olemas on kaks varianti. \u00dches variandis on need andmed t\u00e4ielikult vahem\u00e4llu salvestatud, t\u00e4ielikult olemas m\u00e4lus ja neid uuendatakse teatud ajavahemike j\u00e4rel. Teises variandis, kui andmed ei mahu m\u00e4lusse, saab neid osaliselt vahem\u00e4llu salvestada. <\/p>\n<p><\/p>\n<p>Siin on n\u00e4ide. On Yandex.Direct. Seal on reklaamikampaania ja b\u00e4nnerid. Reklaamikampaaniaid on ilmselt umbes k\u00fcmme miljonit. Ja need mahutavad enamasti m\u00e4lu. Ja b\u00e4nnerid \u2013 miljardeid, need ei mahu m\u00e4lusse. Ja me kasutame MySQL-i vahem\u00e4llu salvestatud s\u00f5nastikku.<\/p>\n<p><\/p>\n<p>Ainus probleem on see, et vahem\u00e4llu salvestatud s\u00f5nastik t\u00f6\u00f6tab normaalselt, kui hit rate on l\u00e4hedal 100%-le. Kui see on madalam, siis tuleb andmete t\u00f6\u00f6tlemisel iga andmepaki jaoks hankida puuduolevad v\u00f5tmed ja t\u00f5mmata andmed MySQL-ist. ClickHouse'i osas v\u00f5in veel kindel olla, et see ei aeglustu, teiste s\u00fcsteemide puhul ei hakka ma r\u00e4\u00e4kima.<\/p>\n<p><\/p>\n<p>Ja bonusena on see, et s\u00f5nastikud on v\u00e4ga lihtne viis andmete uuendamiseks ClickHouse'is tagantj\u00e4rele. T. e. kui teil oli reklaamikampaaniate aruanne ja kasutaja lihtsalt muudab reklaamikampaaniat, siis k\u00f5ikides vanades andmetes ja k\u00f5igis aruannetes muudetakse need andmed samuti. Kui kirjutada read otse tabelisse, siis nende uuendamine ei oleks v\u00f5imalik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a5a2919d6be7d00c0ad5875b9a8f0f31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel \u00fcks viis, kui te ei tea, kust oma ridade identifikaatoreid v\u00f5tta. V\u00f5ite lihtsalt need h\u00e4kkida. Ja k\u00f5ige lihtsam variant on v\u00f5tta 64-bitine h\u00e4kk. <\/p>\n<p><\/p>\n<p>Ainus probleem on see, et kui h\u00e4kk on 64-bitine, siis on teil peaaegu kindlalt kollisioonid. Sest kui seal on miljard rida, siis t\u00f5en\u00e4osus hakkab t\u00f5eliselt tuntav olema. <\/p>\n<p><\/p>\n<p>Ja ei oleks v\u00e4ga hea h\u00e4mada reklaamikampaaniate nimesid. Kui erinevate ettev\u00f5tete reklaamikampaaniad segamini l\u00e4hevad, siis tekib midagi arusaamatut. <\/p>\n<p><\/p>\n<p>Ja on lihtne trikk. T\u00f5si, t\u00f5siste andmete jaoks see eriti ei sobi, aga kui miski pole eriti t\u00f5sine, siis lisage lihtsalt s\u00f5nastiku v\u00f5tmesse ka kliendi identifikaator. Ja siis tekivad kolliisiid, kuid ainult \u00fche kliendi piires. Sellist meetodit kasutame me Yandex.Metrikas lingikaardi jaoks. Meil on seal url'e, me salvestame hash'e. Ja me teame, et kolliisiid on olemas. Kuid kui leht kuvatakse, siis on t\u00f5en\u00e4osus, et \u00fchel lehel \u00fchel kasutajal on mingid url'id kokku jooksnud ja et seda m\u00e4rgatakse, h\u00e4sti v\u00e4ike, sellega v\u00f5ib \u00fcle vaadata. <\/p>\n<p><\/p>\n<p>Boonusena \u2013 paljude toimingute jaoks piisab vaid hash'idest ja stringe ei pea kusagil salvestama. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/abbb73aaba29d10e3b7e7650bf68e6a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teine n\u00e4ide, kui stringid on l\u00fchikesed, n\u00e4iteks veebisaitide domeenid. Neid saab salvestada sellisena. V\u00f5i n\u00e4iteks brauseri keel ru \u2013 2 baiti. Mulle muidugi v\u00e4ga kahju nendest baitidest, aga \u00e4rge muretsege, 2 bitti pole kahju. Palun salvestage niisama, \u00e4rge muretsege. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/901eaed0029da6ea59630b57ccf80c25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teine juhtum on see, kui stringe on vastupidiselt v\u00e4ga palju ja need on v\u00e4ga unikaalsed, lisaks on potentsiaalne arv piiramatu. T\u00fc\u00fcpiline n\u00e4ide \u2013 see on otsingufraasid v\u00f5i url'id. Otsingufraasid, sealhulgas tr\u00fckivigade t\u00f5ttu. Vaadake, kui palju unikaalseid otsingufraase \u00f6\u00f6p\u00e4evas. Ilmneb, et need moodustavad peaaegu poole k\u00f5igist s\u00fcndmustest. Ja sel juhul v\u00f5iksite m\u00f5elda, et peaksite andmeid normaliseerima, identifikaatoreid arvestama, eraldi tabelisse koguma. Kuid nii teha ei ole vaja. Lihtsalt salvestage need stringid sellisena. <\/p>\n<p><\/p>\n<p>Parem on mitte midagi v\u00e4lja m\u00f5elda, sest kui salvestada eraldi, siis tuleb teha \u00fchendus. Ja see \u00fchendus \u2013 on parimal juhul juhuslik juurdep\u00e4\u00e4s m\u00e4lule, kui see maht mahub veel m\u00e4llu. Kui ei mahutu, siis on probleemid. <\/p>\n<p><\/p>\n<p>Ja kui andmed on salvestatud in place, siis loetakse need lihtsalt vajalikus j\u00e4rjekorras failis\u00fcsteemist v\u00e4lja ja k\u00f5ik on normaalselt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15f1d632083def16ccbc939579c1cf6b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui teil on url'e v\u00f5i m\u00f5ni muu keeruline pikk string, siis tasub m\u00f5elda, et v\u00f5iks arvutada mingisuguse kokkuv\u00f5tte ette ja salvestada eraldi veergu. <\/p>\n<p><\/p>\n<p>Url'ide puhul n\u00e4iteks v\u00f5ite salvestada domeeni eraldi. Ja kui teil on t\u00f5eliselt vaja domeeni, siis kasutage lihtsalt seda veergu, samas kui url'id j\u00e4\u00e4vad puutumatuks ja te ei puutu nendega isegi kokku. <\/p>\n<p><\/p>\n<p>Vaadake, milline on erinevus. ClickHouse'is on spetsialiseeritud funktsioon, mis arvutab domeeni. See on v\u00e4ga kiire, me oleme seda optimeerinud. Ja ausalt \u00f6eldes, see ei vasta isegi RFC-le, kuid vaatamata sellele loendab see k\u00f5ike, mis meile vajalik on. <\/p>\n<p><\/p>\n<p>Ja \u00fches olukorras saame lihtsalt URL-id v\u00e4lja v\u00f5tta ja domeeni arvutada. Tulemuseks on 166 millisekundit. Kui aga v\u00f5tta valmislahendatud domeen, siis on tulemuseks vaid 67 millisekundit, st peaaegu kolm korda kiiremini. Kiirus ei tulene sellest, et peame tegema mingeid arvutusi, vaid sellest, et loeme v\u00e4hem andmeid. <\/p>\n<p><\/p>\n<p>Miks m\u00f5ne p\u00e4ringu kiirus, mis on aeglasem, on suurem gigabaitide sekundis. Sest see loeb rohkem gigabaiti. Need on t\u00e4iesti tarbetud andmed. P\u00e4ring t\u00f6\u00f6tab nagu oleks kiire, kuid tegelikult kestab see kauem.<\/p>\n<p><\/p>\n<p>Kui vaadata andmemahtu kettal, siis selgub, et URL on 126 megabaiti, samas kui domeen on vaid 5 megabaiti. See on 25 korda v\u00e4hem. Sellegipoolest kestab p\u00e4ringu t\u00e4itmine vaid 4 korda kiiremini. Kuid see on tingitud kuumadest andmetest. Kui andmed oleks k\u00fclmad, siis oleks see t\u00f5en\u00e4oliselt 25 korda kiirem ketta sisendi-v\u00e4ljundi t\u00f5ttu. <\/p>\n<p><\/p>\n<p>Muide, kui hinnata, kui palju domeen on v\u00e4iksem kui URL, siis tuleb arvestada, et see on kuskil 4 korda. Kuid kummalisel kombel v\u00f5tavad andmed kettal 25 korda v\u00e4hem ruumi. Miks? See on tingitud survest. N nii URL kui ka domeen pressitakse kokku. Kuid tihti sisaldab URL hulgaliselt pr\u00fcgi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/c93d2128a41561ed7abb25d77414bc2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja muidugi on oluline kasutada \u00f5igeid andmet\u00fc\u00fcpe, mis on spetsiaalselt m\u00f5eldud vajalike v\u00e4\u00e4rtuste jaoks v\u00f5i mis sobivad. Kui te kasutate IPv4, siis hoidke UInt32*. Kui IPv6, siis FixedString(16), sest IPv6 aadress on 128 bitti, st hoidke seda otse binaarformaadis. <\/p>\n<p><\/p>\n<p>Kuidas aga k\u00e4ituda, kui teil on m\u00f5nikord IPv4 aadresse ja m\u00f5nikord IPv6? Jah, m\u00f5lemat saab hoida. \u00dcks veerg IPv4 jaoks, teine IPv6 jaoks. Muidugi on v\u00f5imalus IPv4 kuvada IPv6-s. See t\u00f6\u00f6taks ka, kuid kui teil on p\u00e4ringutes sageli vaja just IPv4 aadressi, siis oleks m\u00f5istlik see eraldi veergu panna. <\/p>\n<p><\/p>\n<p>* n\u00fc\u00fcd on ClickHouse'is eraldi andmet\u00fc\u00fcbid IPv4, IPv6, mis talletavad andmeid sama efektiivselt nagu numbrid, kuid esitavad neid sama mugavalt nagu stringid.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7d6342ebd6b8b4f3526b3cd8a06cf26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oluline on m\u00e4rkida, et andmed tuleks eelnevalt ette valmistada. N\u00e4iteks, kui teil on m\u00f5ned toorlogid. Ja v\u00f5ib-olla ei tasu neid kohe ClickHouse'i sisestada, kuigi on v\u00e4ga ahvatlev mitte midagi teha ja k\u00f5ik toimib. Kuid tasub siiski teha k\u00f5ik v\u00f5imalikud arvutused.<\/p>\n<p><\/p>\n<p>N\u00e4iteks brauserid. \u00dches teises osakonnas, kuhu ma ei taha n\u00e4puga n\u00e4idata, hoitakse brauseri versiooni niimoodi, s.t. stringina: 12.3. Ja siis, et aruannet teha, v\u00f5tavad nad selle stringi, jagavad selle massiiviga ja seej\u00e4rel massiivi esimese elemendiga. Loomulikult k\u00f5ik aeglustub. K\u00fcsisin, miks nad nii teevad. Nad vastasid, et ei armasta enneaegset optimeerimist. Mina aga ei armasta enneaegset pessimistlikkust.<\/p>\n<p><\/p>\n<p>Seega oleks sel juhul \u00f5igustatud jagada need 4 veergu. Siin \u00e4rge kartke, sest see on ClickHouse. ClickHouse on veergude andmebaas. Ja mida rohkem on hoolikalt valmistatud v\u00e4ikseid veerge, seda paremad. Kui teil on 5 BrowserVersioni, tehke 5 veergu. See on normaalne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f9a67221bf8508933d7bd336b16f9e04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd vaatame, mida teha, kui teil on palju v\u00e4ga pikki stringe, v\u00e4ga pikki massiive. Neid ei pea ClickHouse'is \u00fcldse hoidma. Selle asemel saate ClickHouse'is salvestada ainult mingi identifikaatori. Ja need pikad stringid pange m\u00f5nda teise s\u00fcsteemi. <\/p>\n<p><\/p>\n<p>N\u00e4iteks on \u00fches meie anal\u00fc\u00fcsiteenustes m\u00f5ned s\u00fcndmuste parameetrid. Ja kui s\u00fcndmustele tuleb palju parameetreid, salvestame lihtsalt esimesed 512. Sest 512 \u2013 pole kahju. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/755271e8788ba4bd638f493bf320c820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja kui te ei saa kindlaks teha oma andmet\u00fc\u00fcpide, siis saate ka andmed ClickHouse'i salvestada, kuid ajutisse tabelisse, mis on spetsialiseerunud ajutistele andmetele. P\u00e4rast seda saate anal\u00fc\u00fcsida, milline on teil seal v\u00e4\u00e4rtuste jaotus, mis seal \u00fcldse on ja koostada \u00f5iged t\u00fc\u00fcbid.<\/p>\n<p><\/p>\n<p>* praegu on ClickHouse'is andmet\u00fc\u00fcp, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/data-types\/lowcardinality\/\">LowCardinality<\/a><\/noindex> , mis v\u00f5imaldab t\u00f5husalt hoida stringe v\u00e4iksemate t\u00f6\u00f6mahtude t\u00f5ttu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7e9e53d86a4189783c28ce56a669198c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd vaatame veel \u00fcht huvitavat juhtumit. M\u00f5nikord t\u00f6\u00f6tab inimestel k\u00f5ik kuidagi imelikult. Ma sisenen ja n\u00e4en sellist pilti. Ja kohe tundub, et seda on teinud m\u00f5ni v\u00e4ga kogenud, nutikas admin, kellel on suur kogemus MySQL versiooni 3.23 seadistamisel. <\/p>\n<p><\/p>\n<p>Siin n\u00e4eme tuhandet tabelit, milles igas on salvestatud j\u00e4\u00e4nus mingist imelikust jagamisest tuhande peale. <\/p>\n<p><\/p>\n<p>P\u00f5him\u00f5tteliselt austan teiste kogemusi ja m\u00f5istan, milliste kannatustega see kogemus on saadud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3a5e21ef2076966fcc627670485c5b3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja p\u00f5hjused on enam-v\u00e4hem arusaadavad. Need on vanad stereot\u00fc\u00fcbid, mis on v\u00f5inud tekkida teiste s\u00fcsteemidega t\u00f6\u00f6tades. N\u00e4iteks MyISAM tabelites ei ole klasterdatud esmaseid v\u00f5tmeid. Ja selline andmete jagamise viis v\u00f5ib olla meeleheitlik katse saada sama funktsionaalsust. <\/p>\n<p><\/p>\n<p>Teine p\u00f5hjus on see, et igasuguseid operatsioone nagu alter on suurte tabelite puhul raske teha. K\u00f5ik saab blokeeritud. Kuigi kaasaegsetes MySQL versioonides ei ole see probleem enam nii t\u00f5sine. <\/p>\n<p><\/p>\n<p>V\u00f5i n\u00e4iteks mikro\u0161ardimise kohta, kuid sellest r\u00e4\u00e4gime veidi hiljem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/321b1d9caa8db7aca5b96e08c61d05b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse'is ei ole seda vaja teha, kuna esmase v\u00f5ti on klasterdatud ja andmed on esmase v\u00f5tme j\u00e4rgi j\u00e4rjestatud. <\/p>\n<p><\/p>\n<p>Ja m\u00f5nikord k\u00fcsitakse minult: \"Kuidas muutub ClickHouse-i vahemiku p\u00e4ringute j\u00f5udlus tabeli suuruse kasvades?\". Ma \u00fctlen, et see ei muutu \u00fcldse. N\u00e4iteks, kui teil on miljard rida tabelis ning loete vahemikku \u00fcks miljon rida. K\u00f5ik on korras. Kui tabelis on triljon rida ja te loete \u00fche million rida, siis on tulemused peaaegu samad. <\/p>\n<p><\/p>\n<p>Ja teiseks, sellised asjad nagu k\u00e4sitsi partitsioonid ei ole vajalikud. Kui te vaatate, mis on failis\u00fcsteemis, n\u00e4ete, et tabel on t\u00f5sine asi. Seal sees on midagi nagu partitsioonid. See t\u00e4hendab, et ClickHouse teeb k\u00f5ik ise teie eest ja te ei pea muretsema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/652f3742ad3a44f172d0d7302abd09f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alter ClickHouse'is on tasuta, kui tegemist on alter add\/drop column. <\/p>\n<p><\/p>\n<p>Ja v\u00e4ikeste tabelite tegemine ei ole vajalik, kuna kui teil on 10 rida v\u00f5i 10 000 rida tabelis, ei ole sellel suurt t\u00e4htsust. ClickHouse on s\u00fcsteem, mis optimeerib l\u00e4bilaskev\u00f5imet, mitte latentsust, seega ei ole m\u00f5tet t\u00f6\u00f6delda 10 rida. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/144144b4740e9c5daec80c8dadc445f9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00f5eliselt \u00f5ige on kasutada \u00fchte suurt tabelit. Vabanege vanadest stereot\u00fc\u00fcpidest, k\u00f5ik l\u00e4heb h\u00e4sti. <\/p>\n<p><\/p>\n<p>Ja boonusena on meie viimases versioonis lisandunud v\u00f5imalus teha suvaline partitsioneerimise v\u00f5ti, et teostada erinevaid hooldusoperatsioone eraldi partitsioonide \u00fcle. <\/p>\n<p><\/p>\n<p>N\u00e4iteks, kui teil on vaja palju v\u00e4ikeseid tabelite, n\u00e4iteks kui peate t\u00f6\u00f6tlema vaheandmeid, siis teil tulevad chunk'id ja peate nende kallal t\u00f5lked tegema enne nende kirjutamist l\u00f5plikku tabelisse. Selle juhtumi jaoks on suurep\u00e4rane tabelimootor \u2013 StripeLog. See on midagi sarnast TinyLogiga, aga parem. <\/p>\n<p><\/p>\n<p>* n\u00fc\u00fcd on ClickHouse'is veelgi <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/table-functions\/input\/\">tabelifunktsioon input<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d62f0b3d29876c29c6c0ba236b200186.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel \u00fcks antipattern on mikros\u00fclemine. N\u00e4iteks, kui peate andmeid s\u00fclema ja teil on 5 serverit, aga homme tuleb 6serverit. Ja te m\u00f5tlete, kuidas neid andmeid \u00fcmber jagada. Ja selle asemel, et jagada 5 partii, teete 1 000 partiid. Ja edasi jagate iga\u00fche nende mikros\u00fclemite sarnaselt eraldi serveritele. Ja teil v\u00f5ib olla n\u00e4iteks \u00fches serveris 200 ClickHouse'i instance, n\u00e4iteks. Eraldi instance'id erinevatel portidel v\u00f5i eraldi andmebaasid. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3e550ef7e338b84e4394eb9fa4538769.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aga ClickHouse'is pole see v\u00e4ga hea. Sest isegi \u00fcks ClickHouse instance p\u00fc\u00fcab kasutada k\u00f5ik saadaval olevad serveri ressursid \u00fche p\u00e4ringu t\u00f6\u00f6tlemiseks. St. teil on mingi server ja seal on n\u00e4iteks 56 protsessorituuma. Teete p\u00e4ringu, mis kestab \u00fche sekundi ja see kasutab 56 tuuma. Ja kui te olete sinna paigutanud 200 ClickHouse'i \u00fchte serverisse, siis t\u00e4hendab, et k\u00e4ivitub 10 000 l\u00f5ime. \u00dches\u00f5naga, k\u00f5ik l\u00e4heb v\u00e4ga halvasti.<\/p>\n<p><\/p>\n<p>Teine p\u00f5hjus on see, et t\u00f6\u00f6 jaotus nende instance'ide vahel on eba\u00fchtlane. M\u00f5ni l\u00f5petab varem, m\u00f5ni hiljem. Kui see k\u00f5ik toimuks \u00fches instance'is, siis ClickHouse saaks ise aru, kuidas andmeid \u00f5igele l\u00f5ime jaotada. <\/p>\n<p><\/p>\n<p>Ja veel \u00fcks p\u00f5hjus on see, et teil on protsessoritevaheline suhtlemine TCP kaudu. Andmeid tuleb serialiseerida, deserialiseerida ja see on tohutu hulk mikros\u00fclemeid. Lihtsalt ei ole efektiivne t\u00f6\u00f6.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/18cacc17d22ae1cb2977c6be74769896.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel \u00fcks antipattern, kuigi seda on raske antipatterniks nimetada. See on suur hulk eelagreed.<\/p>\n<p><\/p>\n<p>\u00dcldiselt on eelagregeerimine hea. Teil oli miljard rida, te aggregeerisite selle ja see muutus 1 000 reaks, ja n\u00fc\u00fcd k\u00e4ib p\u00e4ring hetkega. K\u00f5ik on suurep\u00e4rane. Nii v\u00f5ib teha. Ja selle jaoks on isegi ClickHouse'is spetsiaalne tabelit\u00fc\u00fcp AggregatingMergeTree, mis teeb inkrementaalse aggregeerimise andmete sisestamise k\u00e4igus. <\/p>\n<p><\/p>\n<p>Aga on olukordi, kus te arvate, et me kogume andmeid selliselt ja veel ka niimoodi. Ja mingis naaberosakonnas, millest ma ei taha r\u00e4\u00e4kida, kasutatakse SummingMergeTree tabeleid summade kogumiseks p\u00f5hiv\u00f5tme j\u00e4rgi, ning p\u00f5hiv\u00f5tmena kasutatakse 20 erinevat veergu. Ma muutsin m\u00f5ned veergude nimetused varjamiseks, kuid umbes nii see ongi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/54e3a02ab4bbce7c63ded595780ae1f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja tekivad sellised probleemid. Esiteks, teie andmete maht ei v\u00e4hene kuigi palju. N\u00e4iteks v\u00e4heneb see kolm korda. Kolm korda \u2013 see oleks hea hind, et lubada endale piiramatud anal\u00fc\u00fcsi v\u00f5imalused, mis tekivad, kui andmed ei ole koondatud. Kui andmed on koondatud, siis saate anal\u00fc\u00fcsi asemel vaid kehva statistika. <\/p>\n<p><\/p>\n<p>Ja mis eriti h\u00e4irib? Et need inimesed naaberosakonnast tulevad ja k\u00fcsivad m\u00f5nikord, et lisage veel \u00fcks veerg p\u00f5hiv\u00f5tmesse. T. e. me oleme koondanud andmeid, aga n\u00fc\u00fcd tahame midagi rohkemat. Kuid ClickHouse'is ei ole v\u00f5imalik p\u00f5hiv\u00f5tit muuta. Seega peame kirjutama mingeid skripte C++. Ja ma ei armasta skripte, isegi kui need on C++.<\/p>\n<p><\/p>\n<p>Ja kui vaadata, milleks ClickHouse loodi, siis mitteagreggeeritud andmed on just see stsenaarium, mille jaoks see on loodud. Kui kasutate ClickHouse't mitteagreggeeritud andmete jaoks, siis teete k\u00f5ik \u00f5igesti. Kui te aga koondate, siis m\u00f5nikord on see m\u00f6\u00f6dap\u00e4\u00e4smatu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/09fafd4c8a3ea8c22e586cb7a5cf6564.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel \u00fcks huvitav juhtum \u2013 see on l\u00f5pmatus ts\u00fcklis toimuvad p\u00e4ringud. Ma m\u00f5nikord sisenen m\u00f5nele tootmisserverile ja vaatan seal show processlist. Ja iga kord avastan, et toimub midagi kohutavat. <\/p>\n<p><\/p>\n<p>N\u00e4iteks midagi sellist. Siit on kohe selge, et k\u00f5ik oleks saanud teostada \u00fches p\u00e4ringus. Lihtsalt kirjutage url in ja nimekiri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae03b659f178962f50e0640614517296.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Miks on palju selliseid p\u00e4ringuid l\u00f5pmatus ts\u00fcklis halb? Kui indeksi ei kasutata, siis teil on palju l\u00e4bimineid samade andmete kohta. Kuid kui indeks on kasutusel, n\u00e4iteks kui teil on p\u00f5hiv\u00f5ti ru ja kirjutate url = millegi kohta. Ja te arvate, et loetakse tabelist \u00fche url'i, siis k\u00f5ik on korras. Kuid tegelikult ei ole. Sest ClickHouse teeb k\u00f5ik pakettide kaupa. <\/p>\n<p><\/p>\n<p>Kui tal on vaja lugeda andmete vahemikku, loeb ta veidi rohkem, kuna ClickHouse'i indeks on haruldane. See indeks ei v\u00f5imalda tabelist leida \u00fchte konkreetset rida, vaid ainult mingit vahemikku. Andmed tihendatakse plokkide kaupa. \u00dche rea lugemiseks tuleb v\u00f5tta kogu plokk ja see avada. Ja kui teete hulga p\u00e4ringuid, siis teil on palju kattuvusi ja palju t\u00f6\u00f6d, mida tehakse j\u00e4lle ja j\u00e4lle.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/95eef43c5b869f8b145c61ce3c616cfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja boonusena v\u00f5ib m\u00e4rkida, et ClickHouse'is ei pea kartma edastada isegi megabaite ja isegi sadu megabaite IN-sektsiooni. M\u00e4letan meie praktikast, et kui MySQL-is edastame palju v\u00e4\u00e4rtusi IN-sektsiooni, n\u00e4iteks edastame 100 megabaidi numbreid, siis MySQL s\u00f6\u00f6b 10 gigabaiti m\u00e4lu ja sellega enam midagi ei juhtu, k\u00f5ik t\u00f6\u00f6tab halvasti. <\/p>\n<p><\/p>\n<p>Ja teiseks \u2013 ClickHouse'is, kui teie p\u00e4ringud kasutavad indeksit, siis see ei ole kunagi aeglasem kui t\u00e4iskann, st kui lugeda tuleb peaaegu kogu tabelit, siis see toimub j\u00e4rjestikku ja loeb kogu tabeli. \u00dcldiselt m\u00f5istab see ise, millega on tegu.<\/p>\n<p><\/p>\n<p>Kuid sellel on siiski teatud keerukused. N\u00e4iteks see, et IN koos alamp\u00e4ringuga ei kasuta indeksit. Kuid see on meie probleem ja peame selle parandama. Siin pole midagi fundamentaalset. Parandame selle. <\/p>\n<p><\/p>\n<p>Ja veel \u00fcks huvitav asi \u2013 kui teil on v\u00e4ga pikk p\u00e4ring ja jaotatud p\u00e4ringute t\u00f6\u00f6tlemine k\u00e4ib, siis see v\u00e4ga pikk p\u00e4ring saadetakse igale serverile ilma tihendamiseta. N\u00e4iteks 100 megabaidi ja 500 serveriga. Seega edastatakse teie v\u00f5rgus 50 gigabaiti. See edastatakse ja seej\u00e4rel t\u00e4idetakse k\u00f5ik edukalt.<\/p>\n<p><\/p>\n<p>* juba kasutab; k\u00f5ik on parandatud, nagu lubatud.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/5fcde9bf04fff0645be2530daa12743f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja \u00fcsna sagedane juhtum on see, kui p\u00e4ringud tulevad API-st. N\u00e4iteks olete loonud oma teenuse. Ja kui teie teenus on kellelegi vajalik, siis olete avanud API ja juba kaks p\u00e4eva hiljem n\u00e4ete, et toimub midagi arusaamatut. K\u00f5ik on \u00fcle koormatud ja paar kohutavat p\u00e4ringut tuleb, mida kunagi ei oleks pidanud olema. <\/p>\n<p><\/p>\n<p>Ja siin on lahendus \u00fcks. Kui olete avanud API, peate selle k\u00e4rpima. N\u00e4iteks tuleks kehtestada mingid kvoodid. Teisi normaalseid v\u00f5imalusi pole. Vastasel juhul kirjutatakse kohe skript ja tekivad probleemid. <\/p>\n<p><\/p>\n<p>Ja ClickHouse'is on spetsiaalne v\u00f5imalus \u2013 kvota arvestamine. Lisaks on v\u00f5imalik edastada oma kvota v\u00f5ti. See v\u00f5ib olla n\u00e4iteks kasutaja sisemine identifikaator. Ja kvotad arvestatakse iga\u00fche jaoks eraldi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/532438d0f116919e62f04e32ebbd3c45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd veel \u00fcks huvitav asi. See on k\u00e4sitsi juhitav replikeerimine. <\/p>\n<p><\/p>\n<p>Ma tean palju juhtumeid, kus, hoolimata ClickHouse'is olevast sisseehitatud replikeerimise toest, replikeerivad inimesed ClickHouse'i k\u00e4sitsi.<\/p>\n<p><\/p>\n<p>Millisest printsiibist on jutt? Teil on andmete t\u00f6\u00f6tlemise pipeline. Ja see toimib iseseisvalt, n\u00e4iteks erinevates andmekeskustes. Te kirjutate sama teavet ClickHouse'i samamoodi. T\u00f5si, praktika n\u00e4itab, et andmed l\u00e4hevad ikkagi erinevaks, s\u00f5ltuvalt teie koodis esinevatest erip\u00e4rastest. Loodetavasti mitte teie omades. <\/p>\n<p><\/p>\n<p>Ja aeg-ajalt peate ikkagi k\u00e4sitsi s\u00fcnkroonima. N\u00e4iteks kord kuus teevad administraatorid rsync'i.<\/p>\n<p><\/p>\n<p>Tegelikult on palju lihtsam kasutada ClickHouse'i sisseehitatud replikeerimist. Kuid siin v\u00f5ivad olla teatud vastun\u00e4idustused, sest selleks peate kasutama ZooKeeperit. Ma ei \u00fctle midagi halba ZooKeeperi kohta, p\u00f5him\u00f5tteliselt on s\u00fcsteem t\u00f6\u00f6v\u00f5imel, kuid m\u00f5nikord ei kasuta inimesed seda java-fobi t\u00f5ttu, sest ClickHouse on nii hea s\u00fcsteem, mis on kirjutatud C++-s, mida saab kasutada ja k\u00f5ik t\u00f6\u00f6tab h\u00e4sti. Aga ZooKeeper on java peal. Ja kuidagi ei tahaks isegi vaadata, kuid siis v\u00f5ite kasutada k\u00e4sitsi juhitavat replikeerimist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3b5b68996daef6b8920f067b189f25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse on praktiline s\u00fcsteem. See arvestab teie vajadustega. Kui teil on k\u00e4sitsi juhitav replikeerimine, siis saate luua Jaotatud tabeli, mis vaatab teie k\u00e4sitsireplikaid ja teeb nende vahel automaatse failover'i. Ja on isegi spetsiaalne valik, mis v\u00f5imaldab v\u00e4ltida flappe, isegi kui teie replikad erinevad s\u00fcsteemselt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/70f6630f8b14756163923a7db8dd7391.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Edasi v\u00f5ivad tekkida probleemid, kui kasutate primitiivseid tabelimootoreid. ClickHouse on nagu ehituskonstruktor, kus on palju erinevaid tabelimootoreid. K\u00f5igi t\u00f5siste juhtumite jaoks, nagu on dokumentatsioonis kirjutatud, kasutage MergeTree perekonna tabeleid. K\u00f5ik teised on pigem erijuhtumiteks v\u00f5i testimiseks.<\/p>\n<p><\/p>\n<p>MergeTree tabelis ei pea teil olema mingit kuup\u00e4eva ja aega. Saate ikkagi kasutada. Kui kuup\u00e4eva ja aega ei ole, kirjutage default \u2013 2000. aasta. See t\u00f6\u00f6tab ja ei n\u00f5ua ressursse. <\/p>\n<p><\/p>\n<p>Ja uues serveri versioonis on isegi v\u00f5imalik m\u00e4\u00e4rata, et teil oleks kohandatud jagamine ilma partitsiooni v\u00f5tmeta. See on sama. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6d4046d11afdd1e5962d49a1612b666a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teiselt poolt v\u00f5ib kasutada primitiivseid tabelimootoreid. N\u00e4iteks laadige andmed \u00fcks kord sisse ja vaadake, m\u00e4ngige nendega ja kustutage. V\u00f5ite kasutada Logi.<\/p>\n<p><\/p>\n<p>V\u00f5i salvestada v\u00e4ikseid mahtusid vahepealseks t\u00f6\u00f6tlemiseks \u2013 see on StripeLog v\u00f5i TinyLog.<\/p>\n<p><\/p>\n<p>M\u00e4lu saab kasutada, kui andmete maht on v\u00e4ike ja lihtsalt m\u00e4ngitakse midagi m\u00e4llu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8a3d4e0e3a8c26dd3a2b2f64123e2bf9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse ei armasta \u00fclem\u00e4\u00e4raselt normaliseeritud andmeid. <\/p>\n<p><\/p>\n<p>Siin on t\u00fc\u00fcpiline n\u00e4ide. See on tohutu hulk URL-e. Te panite need naabertabelisse. Siis otsustasite neid JOINida, aga see ei toimi, kuna ClickHouse toetab ainult Hash JOINi. Kui m\u00e4lust ei piisa andmete koguni, millega tuleb liita, siis JOIN ei \u00f5nnestu.* <\/p>\n<p><\/p>\n<p>Kui andmed on suure kardinaalsusega, siis \u00e4rge muretsege, hoidke neid denormaliseeritud kujul, URL-id otse p\u00f5hitaotluses. <\/p>\n<p><\/p>\n<p>* kuid n\u00fc\u00fcd on ClickHouse'il ka merge join ja see t\u00f6\u00f6tab, kui vaheandmed ei mahu m\u00e4llu. Kuid see ei ole efektiivne ja soovitus kehtib endiselt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/e8160a8db17c18d48f810092c55b094c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veel paar n\u00e4idet, kuid ma juba kahtlen, kas need on t\u00f5eliselt antipaaterid v\u00f5i mitte. <\/p>\n<p><\/p>\n<p>ClickHouse'il on \u00fcks tuntud puudus. Ta ei oska uuendusi teha*. Teatud m\u00f5ttes on see isegi hea. Kui teil on olulisi andmeid, n\u00e4iteks raamatupidamine, siis keegi ei suuda neid saata, sest uuendusi pole.<\/p>\n<p><\/p>\n<p>* juba ammu on lisatud toetus uuendamiseks ja kustutamiseks partii re\u017eiimis.<\/p>\n<p><\/p>\n<p>Kuid on m\u00f5ned erilised viisid, mis v\u00f5imaldavad uuendusi nagu taustal. N\u00e4iteks ReplaceMergeTree t\u00fc\u00fcpi tabelid. Need teevad uuendusi taustal toimuvate \u00fchinemiste ajal. Saate seda sundida optimize table abil. Kuid \u00e4rge tehke seda liiga tihti, sest see t\u00e4hendab partitsiooni t\u00e4ielikku kirjutamist. <\/p>\n<p><\/p>\n<p>Jaotatud JOIN'id ClickHouse'is \u2013 see on samuti halvasti planeerimisre\u017eiimiga t\u00f6\u00f6deldud. <\/p>\n<p><\/p>\n<p>Halb, kuid m\u00f5nikord on see korras.<\/p>\n<p><\/p>\n<p>ClickHouse'i kasutamine ainult selleks, et lugeda andmeid tagasi select* abil.<\/p>\n<p><\/p>\n<p>Ma ei soovitaks ClickHouse'i kasutada mahukate arvutuste jaoks. Kuid asi ei ole t\u00e4iesti nii, kuna me oleme juba sellest soovitusest k\u00f5rvale kaldumas. Ja meil on hiljuti lisandunud v\u00f5imalus rakendada masin\u00f5ppemudeleid ClickHouse'is \u2013 Catboost. See teeb mind murelikuks, sest ma m\u00f5tlen: \"Kohutav. Kui palju siis takte byte kohta tuleb!\". Mul on t\u00f5eliselt kahju, et takte byte'ide peale kulutada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse&#039;i efektiivne kasutamine. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f686d5d352ccb444cd06e2ae68897137.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aga \u00e4rge muretsege, installige ClickHouse ja k\u00f5ik l\u00e4heb h\u00e4sti. Kui midagi juhtub, on meil kogukond. Muide, kogukond olete teie. Ja kui teil on mingeid probleeme, saate v\u00e4hemalt meie chati astuda ja loodan, et teid aidatakse. <\/p>\n<p><\/p>\n<p>K\u00fcsimused<\/p>\n<p><\/p>\n<p><em>Ait\u00e4h ettekande eest! Kuhu kaevata ClickHouse'i kokkuvarisemise \u00fcle?<\/em><\/p>\n<p><\/p>\n<p>V\u00f5ite kaevata otse minu juurde praegu. <\/p>\n<p><\/p>\n<p><em>Ma hakkasin hiljuti ClickHouse'i kasutama. Koheselt kukutasin cli liidese.<\/em><\/p>\n<p><\/p>\n<p>Teid on \u00f5nnistatud. <\/p>\n<p><\/p>\n<p><em>Veidi hiljem kukutasin v\u00e4ikese select'iga serveri.<\/em><\/p>\n<p><\/p>\n<p>Teil on anne. <\/p>\n<p><\/p>\n<p><em>Avasin GitHubis vea, kuid seda ignoreeriti.<\/em> <\/p>\n<p><\/p>\n<p>Vaadake. <\/p>\n<p><\/p>\n<p><em>Aleksei t\u00f5i mind ettekandesse vale p\u00e4rast, lubades r\u00e4\u00e4kida, kuidas te andmeid pressite.<\/em><\/p>\n<p><\/p>\n<p>V\u00e4ga lihtne. <\/p>\n<p><\/p>\n<p><em>Seda ma arvasin juba eile. Rohkem konkreetikast.<\/em> <\/p>\n<p><\/p>\n<p>Seal pole mingeid kohutavaid trikke. Seal on lihtsalt blokkide kaupa tihendamine. Vaikimisi kasutatakse LZ4, ZSTD* saab sisse l\u00fclitada. Blokid on vahemikus 64 kilobaiti kuni 1 megabaidini.<\/p>\n<p><\/p>\n<p>* Samuti on olemas spetsialiseeritud tihenduskoodikate tugi, mida saab kasutada muude algoritmidega ahelas.<\/p>\n<p><\/p>\n<p><em>Kas blokid sisaldavad lihtsalt tooreid andmeid?<\/em><\/p>\n<p><\/p>\n<p>Ei ole t\u00e4iesti toored. Seal on massiivid. Kui teil on numbriline veerg, siis numbrid on j\u00e4rjestikku massiivis. <\/p>\n<p><\/p>\n<p><em>Selge.<\/em> <\/p>\n<p><\/p>\n<p><em>Aleksei, n\u00e4ide, mis oli uniqExact'iga ip aadresside puhul, st see, et uniqExact arvutamine ridade peal kestab kauem kui numbrite jaoks jne. Aga kui me rakendame trikki ja castime kokku lugemise ajal? St te, n\u00e4iliselt \u00fctlesite, et kettal ei erine see oluliselt. Kui me loeme ketas ridu, castime, kas siis on meil aggregaadid kiiremad v\u00f5i ei? V\u00f5i me siiski ei saa siin m\u00e4rgatavat kasu? Mul on tunne, et te testisite seda, kuid mingil p\u00f5hjusel ei maininud te seda benchmark'is.<\/em> <\/p>\n<p><\/p>\n<p>Ma arvan, et see on aeglasem kui ilma kastita. Sel juhul tuleb IP-aadressi stringist eraldada. Meil on ClickHouse'is ka IP-aadresside eraldamine optimeeritud. Me oleme selle nimel k\u00f5vasti vaeva n\u00e4inud, aga seal on numbrid kirja pandud k\u00fcmnendvormis. V\u00e4ga ebamugav. Teisest k\u00fcljest t\u00f6\u00f6tab uniqExact funktsioon stringide puhul aeglasemalt mitte ainult sellep\u00e4rast, et need on stringid, vaid ka seet\u00f5ttu, et valitakse teine algoritmi spetsialiseerumine. Stringe t\u00f6\u00f6deldakse lihtsalt teistmoodi.<\/p>\n<p><\/p>\n<p><em>Aga kui v\u00f5tta lihtsam andmet\u00fc\u00fcp? N\u00e4iteks, kui me paneme kirja user id, mis meil on in, kirjutame selle stringina ja siis kastime, kas siis on l\u00f5busam v\u00f5i mitte?<\/em><\/p>\n<p><\/p>\n<p>Ma kahtlen. Arvan, et see on isegi kurvem, sest numbrite eraldamine on t\u00f5eliselt t\u00f5sine probleem. Ma arvan, et sellel kollegil oli isegi esitluses teema, kuidas numbrite eraldamine k\u00fcmnendvormis on keeruline, v\u00f5i v\u00f5ib-olla mitte. <\/p>\n<p><\/p>\n<p><em>Aleksei, suur ait\u00e4h esitluse eest! Ja suur ait\u00e4h ClickHouse'i eest! Mul on k\u00fcsimus plaanide kohta. Kas on plaanis funktsioon, et s\u00f5naraamatute osalist uuendamist?<\/em><\/p>\n<p><\/p>\n<p>T. e. osaline taask\u00e4ivitamine?<\/p>\n<p><\/p>\n<p><em>Jah-jah. Nagu v\u00f5imalus m\u00e4\u00e4rata seal MySQL v\u00e4li, t. e. uuendada after, et laadida ainult need andmed, kui s\u00f5naraamat on v\u00e4ga suur.<\/em><\/p>\n<p><\/p>\n<p>V\u00e4ga huvitav funktsioon. Ja mulle tundub, et keegi inimene pakkus seda meie vestluses. V\u00f5ib-olla olite see isegi teie. <\/p>\n<p><\/p>\n<p><em>Ma ei arva, et see olin mina.<\/em><\/p>\n<p><\/p>\n<p>Suurep\u00e4rane, n\u00fc\u00fcd on siis kaks p\u00e4ringut. Ja v\u00f5ib rahulikult alustada tegemist. Aga tahan kohe teid hoiatada, et see funktsioon on \u00fcsna lihtne ellu viia. T. e. p\u00f5him\u00f5tteliselt tuleb lihtsalt tabelisse kirjutada versiooni number ja seej\u00e4rel kirjutada: versioon on v\u00e4iksem kui see ja see. Ja see t\u00e4hendab, et me t\u00f5en\u00e4oliselt pakume selle tegemiseks entusiastidele. Kas te olete entusiast? <\/p>\n<p><\/p>\n<p><em>Jah, aga kahjuks mitte C++-s.<\/em><\/p>\n<p><\/p>\n<p>Kas teie kolleegid oskavad C++-s kirjutada? <\/p>\n<p><\/p>\n<p><em>Ma leian kellegi.<\/em><\/p>\n<p><\/p>\n<p>Suurep\u00e4rane*.<\/p>\n<p><\/p>\n<p>* funktsioon lisati kaks kuud p\u00e4rast esitluse tegemist \u2013 selle t\u00f6\u00f6tas v\u00e4lja k\u00fcsimuse autor ja saatis oma <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/pull\/1771\">pull request<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>Ait\u00e4h!<\/em><\/p>\n<p><\/p>\n<p><em>Tere! Ait\u00e4h ettekande eest! Mainisite, et ClickHouse kasutab v\u00e4ga h\u00e4sti \u00e4ra k\u00f5ik selle jaoks saadaval olevad ressursid. Ja naaberettekande tegija Luxsoftist r\u00e4\u00e4kis oma lahendusest Venemaa Posti jaoks. Ta \u00fctles, et ClickHouse meeldis neile v\u00e4ga, kuid nad ei kasutanud seda oma peamise konkurendi asemel just sellep\u00e4rast, et see kasutas \u00e4ra kogu protsessori. Ja nad ei suutnud seda integreerida oma arhitektuuri, oma ZooKeeperi ja konteineritega. Kas on v\u00f5imalus kuidagi piirata ClickHouse'i, et see ei kasutaks k\u00f5ike, mis talle k\u00e4tte satub?<\/em><\/p>\n<p><\/p>\n<p>Jah, see on v\u00f5imalik ja v\u00e4ga lihtne. Kui soovite, et see kasutaks v\u00e4hem tuumasid, kirjutage lihtsalt <code>set max_threads = 1<\/code>. Ja k\u00f5ik, see t\u00e4idab p\u00e4ringu \u00fches tuumas. Samuti saavad erinevad kasutajad kasutada erinevaid seadeid. Seega ei ole probleeme. Ja edastage oma kolleegidele Luxsoftist, et ei ole hea, et nad ei leidnud seda seadet dokumentatsioonist. <\/p>\n<p><\/p>\n<p><em>Tere, Aleksei! Sooviksin k\u00fcsida sellise k\u00fcsimuse. Juba mitte esimest korda kuulen, et paljud hakkavad kasutama ClickHouse'i logide hoidmiseks. Ettekandes \u00fctlesite, et seda ei tohi teha, st ei ole vaja hoida pikki ridu. Kuidas Te sellele suhtute?<\/em><\/p>\n<p><\/p>\n<p>Esiteks, logid on reeglina mitte pikad read. Muidugi, erandeid v\u00f5ib olla. N\u00e4iteks, kui mingi teenus, mis on kirjutatud java's, viskab exception'i ja see logitakse. Ja nii l\u00f5pmatus ts\u00fcklis, ja l\u00f5puks l\u00f5peb koht k\u00f5vakettal. Lahendus on v\u00e4ga lihtne. Kui read on liiga pikad, siis l\u00f5igake need. Ja mis t\u00e4hendab pikad? K\u00fcmned kilobaitid \u2013 see on halb*.<\/p>\n<p><\/p>\n<p>* uutes versioonides ClickHouse on sisse l\u00fclitatud &quot;kohandatav graanulite indeks&quot;, mis lahendab peamiselt probleemid pikkade stringide salvestamisega.<\/p>\n<p><\/p>\n<p><em>Aga kilobait \u2013 see on normaalne?<\/em><\/p>\n<p><\/p>\n<p>Normaalne. <\/p>\n<p><\/p>\n<p><em>Tere! Ait\u00e4h ettekande eest! Olen juba sellest vestluses k\u00fcsinud, aga ei m\u00e4leta, kas sain vastuse. Kas plaanitakse laiendada ANDMESEKTSIOONI nagu CTE?<\/em><\/p>\n<p><\/p>\n<p>Praegu ei. Meie ANDMESEKTSIOON on natuke ebasiiras. See on meil nagu v\u00e4ike funktsioon.<\/p>\n<p><\/p>\n<p><em>Sain aru. Ait\u00e4h!<\/em><\/p>\n<p><\/p>\n<p><em>Ait\u00e4h ettekande eest! V\u00e4ga huvitav! \u00dcks globaalne k\u00fcsimus. Kas on plaanis ehk teha m\u00f5ningaid silte andmete kustutamise modifikatsiooniks?<\/em><\/p>\n<p><\/p>\n<p>Kohustuslikult. See on meie esmane \u00fclesanne meie j\u00e4rjekorras. Praegu oleme aktiivselt v\u00e4lja m\u00f5tlemas, kuidas k\u00f5ike \u00f5igesti teha. Ja n\u00fc\u00fcd on aeg hakata klaviatuurile vajutama*.<\/p>\n<p><\/p>\n<p>* vajutades klahve klaviatuuril, tegime k\u00f5ik \u00e4ra.<\/p>\n<p><\/p>\n<p><em>Kas see m\u00f5jutab kuidagi s\u00fcsteemi j\u00f5udlust v\u00f5i mitte? Kas sisestamine on sama kiire, kui see on praegu?<\/em><\/p>\n<p><\/p>\n<p>V\u00f5ib-olla ise deletes, ise updates on v\u00e4ga rasked, kuid see ei m\u00f5juta selects ja inserts j\u00f5udlust.<\/p>\n<p><\/p>\n<p><em>Ja veel \u00fcks v\u00e4ike k\u00fcsimus. Esitluses r\u00e4\u00e4kisite peamise v\u00f5tme kohta. Seega, meil on partitsioneerimine, mis on vaikimisi kuup\u00f5hine, eks? Ja kui me m\u00e4\u00e4rame kuup\u00e4evade vahemiku, mis mahub kuusse, siis loetakse ainult seda partitsiooni, eks?<\/em><\/p>\n<p><\/p>\n<p>Jah.<\/p>\n<p><\/p>\n<p><em>Selline k\u00fcsimus. Kui me ei saa m\u00e4\u00e4rata mingit peamist v\u00f5tit, kas on \u00f5ige teha see v\u00e4ljale \"Kuup\u00e4ev\" selleks, et taustal oleks v\u00e4hem andmete \u00fcmberkorraldamist ning need oleksid korrastatumalt paigutatud? Kui teil ei ole vahemiku p\u00e4ringuid ja te isegi ei saa valida mingit peamist v\u00f5tit, kas on siis m\u00f5tet kuup\u00e4eva peamisse v\u00f5tmesse panna?<\/em><\/p>\n<p><\/p>\n<p>Jah.<\/p>\n<p><\/p>\n<p>V\u00f5ib-olla on m\u00f5istlik panna peamisse v\u00f5tmesse selline v\u00e4li, mille j\u00e4rgi andmeid oleks lihtsam kompressida, kui need on selle v\u00e4li j\u00e4rgi sorteeritud. N\u00e4iteks, kasutaja identifikaator. Kasutaja, n\u00e4iteks, k\u00fclastab sama veebisaiti. Sellisel juhul panege kasutaja id ja aeg. Siis on teie andmed paremini kompressitud. Seoses kuup\u00e4evaga, kui teil t\u00f5epoolest ei ole ja ei ole kunagi vahemiku p\u00e4ringuid kuup\u00e4evade j\u00e4rgi, siis ei ole m\u00f5tet kuup\u00e4eva peamisse v\u00f5tmesse panna. <\/p>\n<p><\/p>\n<p><em>Hea, ait\u00e4h palju!<\/em><\/p>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47T\u00f5hus ClickHouse kasutamine. Aleksei Milovidov (Yandex) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/91438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=91438"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/91438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/91439"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=91438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=91438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=91438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}