ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Kuna ClickHouse on spetsialiseeritud sĂŒsteem, on selle kasutamisel oluline arvesse vĂ”tta selle arhitektuuri omadusi. Selles ettekandes rÀÀgib Aleksei nĂ€idetest tĂŒĂŒpilistest vigadest ClickHouse'i kasutamisel, mis vĂ”ivad viia ebaefektiivse tööni. Praktikast toome nĂ€iteid, kuidas andmete töötlemise erineva skeemi valik vĂ”ib tootlikkust dramaatiliselt muuta.

Tere kÔigile! Minu nimi on Aleksei, ma teen ClickHouse'i.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Esiteks, kiirustan teid rÔÔmustama, et ma ei hakka tĂ€na rÀÀkima, mis on ClickHouse. Ausalt öeldes on see mul juba tĂŒĂŒtuks muutunud. Ma rÀÀgin sellega iga kord. Ja ilmselt teavad kĂ”ik juba.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Kohapeal rÀÀgin hoopis sellest, millised on vĂ”imalikud takistused, st kuidas ClickHouse'i valesti kasutada. Tegelikult ei ole mĂ”tet karta, kuna me arendame ClickHouse'i sĂŒsteemina, mis on lihtne, mugav ja töötab kohe. Paigaldad ja kĂ”ik, mingeid probleeme ei ole.

Kuid siiski tuleb arvestada, et see sĂŒsteem on spetsialiseeritud ja vĂ”ib kerge vaevaga sattuda ebatavalisse kasutusskeemi, mis viib selle sĂŒsteemi mugavustsoonist vĂ€lja.

Nii et, millised on takistused? Peamiselt rÀÀgin ma ilmselgetest asjadest. KÔigile on kÔik ilmselge, kÔik mÔistavad ja saavad rÔÔmustada, et nad on nii targad, ja kes ei mÔista, need saavad midagi uut teada.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Esimene, kÔige lihtsam nÀide, mida kahjuks sageli kohtab, on suur arv sisendeid vÀikeste partiitide kaupa, st suur arv vÀikseid sisendeid.

Kui vaadata, kuidas ClickHouse sisestusi tĂ€idab, saate ĂŒhe pĂ€ringu kaudu saata kas vĂ”i terabaidi andmevoo. See ei ole probleem.

Vaadakem, milline oleks tĂŒĂŒpiline tootlikkus. NĂ€iteks on meil tabel Yandex.Metrikast. KĂŒllused. 105 mingisugust veergu. 700 baiti uncompressed. Ja sisestame Ă”igesti partiitide kaupa miljon rida.

Sisestame tabelisse MergeTree, tulemuseks on 500 000 rida sekundis. SuurepĂ€rane. Replitseeritud tabelisse – veidi vĂ€hem, umbes 400 000 rida sekundis.

Ja kui sisse lĂŒlitada hÀÀltega sisestamine, siis on tulemuseks veidi vĂ€hem, kuid siiski korralik tootlikkus, 250 000 rida sekundis. HÀÀltega sisestamine on ClickHouse's dokumenteerimata funktsionaalsus.

* 2020. aasta seisuga, on juba dokumenteeritud.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

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ĂŒlitada, siis saame 2 rida sekundis. Minu arust on see tĂ€ielik jama. Kuidas saab nii aeglaselt töötada? Mul on isegi T-sĂ€rgil kirjutatud, et ClickHouse ei tohiks aeglustada. Kuid vahel juhtub ikkagi.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Tegelikult on see meie puudus. Me oleksime tÀiesti vÔinud teha nii, et kÔik 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Ôik töötab normaalselt. Kuid muidugi on vÔimalikud erinevad stsenaariumid. NÀiteks, 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Àltida.

Tehnilisest vaatepunktist on asi selles, et kui teete ClickHouse’is sisestamise, siis andmed ei satu ĂŒhtegi memtable’i. Meil ei ole isegi tĂ”elist log structure MergeTree’d, vaid lihtsalt MergeTree, kuna puudub nii log kui memTable. Me lihtsalt salvestame andmed otse failisĂŒsteemi, juba veergude kaupa jaotatuna. Ja kui teil on 100 veergu, siis tuleb salvestada rohkem kui 200 faili eraldi kausta. KĂ”ik see on ĂŒsna mahukas.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja tekib kĂŒsimus: „Kuidas teha Ă”igesti?“, kui on selline olukord, kus on ikkagi vaja kuidagi andmeid ClickHouse’i salvestada.

Meetod 1. See on kÔige lihtsam meetod. Kasutage mÔnda hajutatud jÀrjekorda. NÀiteks, Kafka. Lihtsalt vÔtate andmed Kafkast vÀlja, batƥite kord sekundis. Ja kÔik lÀheb normaalselt, te salvestate, kÔik töötab hÀsti.

Puuduseks on see, et Kafka on veel ĂŒks mahukas hajutatud sĂŒsteem. Ma saan aru, kui teie ettevĂ”ttes juba on Kafka. See on hea, see on mugav. Kuid kui seda ei ole, siis mĂ”elge kolm korda, enne kui tĂ”mbate endale projekti veel ĂŒhe hajutatud sĂŒsteemi. Seega tasub kaaluda alternatiive.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Meetod 2. Siin on selline vanakooli alternatiiv, mis on samas vĂ€ga lihtne. Teil on server, mis genereerib teie logid. See lihtsalt salvestab teie logid faili. Ja iga sekundi jĂ€rel, nĂ€iteks, nimetame selle faili ĂŒmber, loome uue. Ja eraldi skript, kas cronilt vĂ”i mĂ”ni demon, vĂ”tab kĂ”ige vanema faili ja salvestab selle ClickHouse'i. Kui logid salvestada iga sekundi tagant, siis kĂ”ik töötab suurepĂ€raselt.

Aga selle meetodi puudus on see, et kui teie server, kus logid genereeritakse, mingil pÔhjusel kaob, kaovad ka andmed.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Meetod 3. On veel ĂŒks huvitav meetod, mis ei vaja ĂŒldse ajutisi faile. NĂ€iteks, teil vĂ”ib olla mingi reklaamikĂ€ivitaja vĂ”i mĂ”ni muu huvitav demon, mis genereerib andmeid. Ja te saate koguda hunniku andmeid otse mĂ€llu, puhvri sisse. Ja kui mÔÔdukas aeg on möödunud, eraldate selle puhvri, loote uue ja eraldi lĂ”imes sisestate ClickHouse'i juba kogunenud andmed.

Teiselt poolt kaovad andmed samuti kill -9 korral. Kui teie server kukub, kaotate need andmed. Ja veel ĂŒheks probleemiks on see, et kui te ei saa andmeid andmebaasi salvestada, hakkavad need andmed kogunema mĂ€llu. Ja kas mĂ€lu saab otsa vĂ”i kaotate lihtsalt andmed.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Meetod 4. Veel ĂŒks huvitav meetod. Teil on mingisugune serveriprotsess. Ja see vĂ”ib saata andmeid ClickHouse'i kohe, kuid teha seda ĂŒhes ĂŒhenduses. NĂ€iteks saata HTTP-pĂ€ring transfer-encoding: chunked koos insert’iga. Ja genereerida chunk'e mitte liiga harva, saab saata iga rida, kuigi see lisab ĂŒlekoormust nende andmete raamistamisele.

Aga ikkagi, sellisel juhul saadetakse andmed ClickHouse'i kohe. Ja ClickHouse ise hakkab neid puhvritama.

Aga probleemid ilmnevad ka. NĂŒĂŒd kaotate andmed, sealhulgas siis, kui teie protsess tapetakse ja kui ClickHouse'i protsess tapetakse, kuna see on lĂ”petamata insert. Ja ClickHouse'is on insertid aatomilised kuni teatud mÀÀratud ridade arvuni. Üldiselt on see huvitav meetod. Seda saab samuti kasutada.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Meetod 5. Siin on veel ĂŒks huvitav meetod. See on mingi community arendatud server, mis on mĂ”eldud andmete töötlemiseks. Ma pole seda ise vaadanud, seega ei saa ma midagi garantii alla vĂ”tta. Siiski, isegi ClickHouse ei paku mingeid tagatisi. See on samuti avatud lĂ€htekoodiga, kuid teisest kĂŒljest olete vĂ”ib-olla harjunud teatud kvaliteedistandardiga, mida me pĂŒĂŒame tagada. Selle tööriista osas - ma ei tea, minge GitHubi, vaadake koodi. VĂ”ib-olla on seal midagi normaalset kirjutatud.

* seisuga 2020. aasta, tuleks ka kaaluda KittenHouse.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Meetod 6. Veel ĂŒks meetod on Buffer tabelite kasutamine. Selle meetodi eeliseks on see, et selle kasutamine on vĂ€ga lihtne. Loote Buffer tabeli ja lisate sinna andmed.

Aga puuduseks on see, et probleem ei lahene tĂ€ielikult. Kui MergeTree tĂŒĂŒpi sisestamisel peate andmeid rĂŒhmitama ĂŒhe partii kohta sekundis, siis Buffer tabelisse sisestamisel peate rĂŒhmitama vĂ€hemalt paar tuhat sekundis. Kui on rohkem kui 10 000 sekundis, siis lĂ€heb ikkagi halvasti. Ja kui sisestada partii kaupa, siis nĂ€gite, et vĂ”ib saada sadu tuhandeid ridu sekundis. Ja see juba raskete andmete puhul.

Ja ka Buffer tabelitel ei ole logi. Kui teie serveriga juhtub midagi, siis andmed kaotatakse.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja boonuseks, hiljuti ilmus ClickHouse'is vÔimalus 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.

Ja eriti rÔÔmustav on selles vĂ”imaluses see, et seda ei teinud meie. See on community funktsioon. Ja kui ma rÀÀgin 'community funktsioonist', siis ma ei rÀÀgi mingisuguse ĂŒleolekuga. Koodi oleme lugenud, ĂŒlevaate teinud, peaks tööle hakkama.

* seisuga 2020. aasta, ilmus sarnane tugi RabbitMQ.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Mis veel vĂ”ib olla ebamugav vĂ”i ĂŒllatav andmete sisestamisel? Kui teete insert values pĂ€ringu ja values'is kirjutate mĂ”ningaid arvutuse vĂ€ljendeid. NĂ€iteks now() - see on samuti arvutuse vĂ€ljend. Ja sel juhul peab ClickHouse igal real kĂ€ivitama nende vĂ€ljendite tĂ”lgendi, ja jĂ”udlus langeb jĂ€rsult. Parem seda vĂ€ltida.

* hetkel on probleem tÀielikult lahendatud, vÀÀrtuste mÔistuslike vÀljendite kasutamisel ei ole enam jÔudlusprobleeme.

Teine nĂ€ide, kui vĂ”ivad esineda mĂ”ned probleemid, kui ĂŒhes 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ĂŒmnendat partitsiooni. Ja see on ekvivalentne sellega, et partiid on mitmekĂŒmne vĂ”rra vĂ€iksemad, kuna need jagunevad kĂ”igepealt partitsioonide kaupa.

* hiljuti lisati ClickHouse'is eksperimentaalses reĆŸiimis toimetamise toetuseks kompaktne formaadi tĂŒkid ja tĂŒkid mĂ€lus koos eelneva logimisfailiga, mis lahendab probleemi peaaegu tĂ€ielikult.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

NĂŒĂŒd vaatame teist tĂŒĂŒpi probleemi – andmete tĂŒpiseerimine.

Andmete tĂŒpiseerimine vĂ”ib olla range vĂ”i struktuurne. Struktuurne on see, kui te lihtsalt vĂ”tate ja kuulutate, et kĂ”ik teie vĂ€ljad on tĂŒĂŒpi string. See on vale. Nii ei tohi teha.

Laske meil arutada, kuidas Ôigesti kÀituda olukordades, kus soovite öelda, et mÔni vÀli on meil string ja laske ClickHouse'il ise aru saada, kuigi samas tasuks siiski mingit pingutust teha.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

NĂ€iteks meil on IP-aadress. Ühes olukorras salvestasime selle stringina. NĂ€iteks 192.168.1.1. Teises olukorras on see arv tĂŒĂŒbiga UInt32*. 32 bitti on piisav IPv4 aadresside jaoks.

Esiteks, kummalisel kombel kokkusurutud andmed on enam-vÀhem sama ulatusega. Seal on loomulikult erinevusi, kuid need ei ole nii suured. Seega ei ole diskivÔimaluste osas erilisi probleeme.

Kuid on tÔsine erinevus protsessori aja ja pÀringu tÀitmise aja osas.

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Àringuid. Kuid siiski on aeg umbes 4 korda aeglasem.

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Àikese erinevate vÀÀrtuste hulgaga, siis need oleksid rahulikult sÔnastiku jÀrgi peaaegu sama suurusega kokku surutud.

Ja nelja korda erinev aeg teel ei ole tĂŒhjaks jÀÀnud. VĂ”ib-olla teid see ei hĂ€iri, kuid kui nĂ€en selliseid erinevusi, tunnen end kurvana.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Vaadakem erinevaid juhtumeid.

1. Üks juhtum, kui teil on erinevaid unikaalseid vÀÀrtusi veidi. Sellisel juhul kasutame lihtsat praktikat, mida te ilmselt tunnete ja saate kasutada mis tahes andmebaasides. See on mĂ”istlik mitte ainult ClickHouse'i jaoks. Lihtsalt salvestage andmebaasi numbrilised id-d. Ja konverteerida stringideks ja tagasi saab juba teie rakenduse poolel.

NĂ€iteks, teil on regiooni andmed. Ja te ĂŒritate seda hoida stringina. Ja seal on nĂ€iteks: Moskva ja MO. Ja kui ma nĂ€en, 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.

Selle asemel salvestame lihtsalt numbri Ulnt32 ja 250. Meil on Yandexis 250, aga teil vĂ”ib see olla teisiti. Igaks juhuks ĂŒtlen, et ClickHouse'il on sisseehitatud vĂ”imalus geobaasiga töötamiseks. Te salvestate lihtsalt regioonide katalooge, sealhulgas hierarhilise, st seal on nii Moskva kui mee, ning kĂ”ik, mis teile vajalik. Ja saate konverteerida pĂ€ringu tasemel.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Teine variant on enam-vĂ€hem sama, kuid juba ClickHouse'i sees toe abil. See on Enum andmetĂŒĂŒp. Te lihtsalt mÀÀrate Enum'i sees kĂ”ik vajalikud vÀÀrtused. NĂ€iteks seadme tĂŒĂŒp ja seal kirjutate: desktop, mobiilne, tahvelarvuti, televiisor. Kokku 4 varianti.

Puuduseks on see, et peate perioodiliselt muutma. Lisame vaid ĂŒhe 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Ă”ik select'id lĂ”pule viiakse. Ja alles pĂ€rast seda viidatakse alter'ile, st mugavus on siiski kohal.

* Uutes ClickHouse'i versioonides on ALTER tÀielikult blokeerimata.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel ĂŒks variant, mis on ClickHouse'ile piisavalt ainulaadne, on vĂ€liste sĂ”nastike ĂŒhendamine. Te saate kirjutada ClickHouse'isse numbreid ja hoida oma katalooge mis tahes mugavas sĂŒsteemis. NĂ€iteks vĂ”ib kasutada: MySQL, Mongo, Postgres. VĂ”ite isegi oma mikroteenuse luua, mis edastab neid andmeid http kaudu. Ja ClickHouse'i tasemel kirjutate funktsiooni, mis muudab need andmed numbritest stringideks.

See on spetsialiseeritud, kuid vĂ€ga tĂ”hus viis vĂ€lise tabeli ĂŒhendamiseks. Ja olemas on kaks varianti. Ühes variandis on need andmed tĂ€ielikult vahemĂ€llu salvestatud, tĂ€ielikult olemas mĂ€lus ja neid uuendatakse teatud ajavahemike jĂ€rel. Teises variandis, kui andmed ei mahu mĂ€lusse, saab neid osaliselt vahemĂ€llu salvestada.

Siin on nĂ€ide. On Yandex.Direct. Seal on reklaamikampaania ja bĂ€nnerid. Reklaamikampaaniaid on ilmselt umbes kĂŒmme miljonit. Ja need mahutavad enamasti mĂ€lu. Ja bĂ€nnerid – miljardeid, need ei mahu mĂ€lusse. Ja me kasutame MySQL-i vahemĂ€llu salvestatud sĂ”nastikku.

Ainus probleem on see, et vahemĂ€llu salvestatud sĂ”nastik töötab normaalselt, kui hit rate on lĂ€hedal 100%-le. Kui see on madalam, siis tuleb andmete töötlemisel iga andmepaki jaoks hankida puuduolevad vĂ”tmed ja tĂ”mmata andmed MySQL-ist. ClickHouse'i osas vĂ”in veel kindel olla, et see ei aeglustu, teiste sĂŒsteemide puhul ei hakka ma rÀÀkima.

Ja bonusena on see, et sÔnastikud on vÀga lihtne viis andmete uuendamiseks ClickHouse'is tagantjÀrele. T. e. kui teil oli reklaamikampaaniate aruanne ja kasutaja lihtsalt muudab reklaamikampaaniat, siis kÔikides vanades andmetes ja kÔigis aruannetes muudetakse need andmed samuti. Kui kirjutada read otse tabelisse, siis nende uuendamine ei oleks vÔimalik.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel ĂŒks viis, kui te ei tea, kust oma ridade identifikaatoreid vĂ”tta. VĂ”ite lihtsalt need hĂ€kkida. Ja kĂ”ige lihtsam variant on vĂ”tta 64-bitine hĂ€kk.

Ainus probleem on see, et kui hÀkk on 64-bitine, siis on teil peaaegu kindlalt kollisioonid. Sest kui seal on miljard rida, siis tÔenÀosus hakkab tÔeliselt tuntav olema.

Ja ei oleks vÀga hea hÀmada reklaamikampaaniate nimesid. Kui erinevate ettevÔtete reklaamikampaaniad segamini lÀhevad, siis tekib midagi arusaamatut.

Ja on lihtne trikk. TĂ”si, tĂ”siste andmete jaoks see eriti ei sobi, aga kui miski pole eriti tĂ”sine, siis lisage lihtsalt sĂ”nastiku vĂ”tmesse ka kliendi identifikaator. Ja siis tekivad kolliisiid, kuid ainult ĂŒhe 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Ă”enĂ€osus, et ĂŒhel lehel ĂŒhel kasutajal on mingid url'id kokku jooksnud ja et seda mĂ€rgatakse, hĂ€sti vĂ€ike, sellega vĂ”ib ĂŒle vaadata.

Boonusena – paljude toimingute jaoks piisab vaid hash'idest ja stringe ei pea kusagil salvestama.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Teine nĂ€ide, kui stringid on lĂŒhikesed, nĂ€iteks veebisaitide domeenid. Neid saab salvestada sellisena. VĂ”i nĂ€iteks brauseri keel ru – 2 baiti. Mulle muidugi vĂ€ga kahju nendest baitidest, aga Ă€rge muretsege, 2 bitti pole kahju. Palun salvestage niisama, Ă€rge muretsege.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Teine juhtum on see, kui stringe on vastupidiselt vĂ€ga palju ja need on vĂ€ga unikaalsed, lisaks on potentsiaalne arv piiramatu. TĂŒĂŒpiline nĂ€ide – see on otsingufraasid vĂ”i url'id. Otsingufraasid, sealhulgas trĂŒkivigade tĂ”ttu. Vaadake, kui palju unikaalseid otsingufraase ööpĂ€evas. Ilmneb, et need moodustavad peaaegu poole kĂ”igist sĂŒndmustest. Ja sel juhul vĂ”iksite mĂ”elda, et peaksite andmeid normaliseerima, identifikaatoreid arvestama, eraldi tabelisse koguma. Kuid nii teha ei ole vaja. Lihtsalt salvestage need stringid sellisena.

Parem on mitte midagi vĂ€lja mĂ”elda, sest kui salvestada eraldi, siis tuleb teha ĂŒhendus. Ja see ĂŒhendus – on parimal juhul juhuslik juurdepÀÀs mĂ€lule, kui see maht mahub veel mĂ€llu. Kui ei mahutu, siis on probleemid.

Ja kui andmed on salvestatud in place, siis loetakse need lihtsalt vajalikus jĂ€rjekorras failisĂŒsteemist vĂ€lja ja kĂ”ik on normaalselt.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Kui teil on url'e vÔi mÔni muu keeruline pikk string, siis tasub mÔelda, et vÔiks arvutada mingisuguse kokkuvÔtte ette ja salvestada eraldi veergu.

Url'ide puhul nÀiteks vÔite salvestada domeeni eraldi. Ja kui teil on tÔeliselt vaja domeeni, siis kasutage lihtsalt seda veergu, samas kui url'id jÀÀvad puutumatuks ja te ei puutu nendega isegi kokku.

Vaadake, milline on erinevus. ClickHouse'is on spetsialiseeritud funktsioon, mis arvutab domeeni. See on vÀga kiire, me oleme seda optimeerinud. Ja ausalt öeldes, see ei vasta isegi RFC-le, kuid vaatamata sellele loendab see kÔike, mis meile vajalik on.

Ja ĂŒhes olukorras saame lihtsalt URL-id vĂ€lja vĂ”tta ja domeeni arvutada. Tulemuseks on 166 millisekundit. Kui aga vĂ”tta 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Ă€hem andmeid.

Miks mÔne pÀringu kiirus, mis on aeglasem, on suurem gigabaitide sekundis. Sest see loeb rohkem gigabaiti. Need on tÀiesti tarbetud andmed. PÀring töötab nagu oleks kiire, kuid tegelikult kestab see kauem.

Kui vaadata andmemahtu kettal, siis selgub, et URL on 126 megabaiti, samas kui domeen on vaid 5 megabaiti. See on 25 korda vĂ€hem. Sellegipoolest kestab pĂ€ringu tĂ€itmine vaid 4 korda kiiremini. Kuid see on tingitud kuumadest andmetest. Kui andmed oleks kĂŒlmad, siis oleks see tĂ”enĂ€oliselt 25 korda kiirem ketta sisendi-vĂ€ljundi tĂ”ttu.

Muide, kui hinnata, kui palju domeen on vĂ€iksem kui URL, siis tuleb arvestada, et see on kuskil 4 korda. Kuid kummalisel kombel vĂ”tavad andmed kettal 25 korda vĂ€hem ruumi. Miks? See on tingitud survest. N nii URL kui ka domeen pressitakse kokku. Kuid tihti sisaldab URL hulgaliselt prĂŒgi.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja muidugi on oluline kasutada Ă”igeid andmetĂŒĂŒpe, mis on spetsiaalselt mĂ”eldud vajalike vÀÀrtuste jaoks vĂ”i 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.

Kuidas aga kĂ€ituda, kui teil on mĂ”nikord IPv4 aadresse ja mĂ”nikord IPv6? Jah, mĂ”lemat saab hoida. Üks veerg IPv4 jaoks, teine IPv6 jaoks. Muidugi on vĂ”imalus IPv4 kuvada IPv6-s. See töötaks ka, kuid kui teil on pĂ€ringutes sageli vaja just IPv4 aadressi, siis oleks mĂ”istlik see eraldi veergu panna.

* nĂŒĂŒd on ClickHouse'is eraldi andmetĂŒĂŒbid IPv4, IPv6, mis talletavad andmeid sama efektiivselt nagu numbrid, kuid esitavad neid sama mugavalt nagu stringid.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Oluline on mÀrkida, et andmed tuleks eelnevalt ette valmistada. NÀiteks, kui teil on mÔned toorlogid. Ja vÔib-olla ei tasu neid kohe ClickHouse'i sisestada, kuigi on vÀga ahvatlev mitte midagi teha ja kÔik toimib. Kuid tasub siiski teha kÔik vÔimalikud arvutused.

NĂ€iteks brauserid. Ühes teises osakonnas, kuhu ma ei taha nĂ€puga nĂ€idata, hoitakse brauseri versiooni niimoodi, s.t. stringina: 12.3. Ja siis, et aruannet teha, vĂ”tavad nad selle stringi, jagavad selle massiiviga ja seejĂ€rel massiivi esimese elemendiga. Loomulikult kĂ”ik aeglustub. KĂŒsisin, miks nad nii teevad. Nad vastasid, et ei armasta enneaegset optimeerimist. Mina aga ei armasta enneaegset pessimistlikkust.

Seega oleks sel juhul Ôigustatud jagada need 4 veergu. Siin Àrge kartke, sest see on ClickHouse. ClickHouse on veergude andmebaas. Ja mida rohkem on hoolikalt valmistatud vÀikseid veerge, seda paremad. Kui teil on 5 BrowserVersioni, tehke 5 veergu. See on normaalne.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

NĂŒĂŒd vaatame, mida teha, kui teil on palju vĂ€ga pikki stringe, vĂ€ga pikki massiive. Neid ei pea ClickHouse'is ĂŒldse hoidma. Selle asemel saate ClickHouse'is salvestada ainult mingi identifikaatori. Ja need pikad stringid pange mĂ”nda teise sĂŒsteemi.

NĂ€iteks on ĂŒhes meie analĂŒĂŒsiteenustes mĂ”ned sĂŒndmuste parameetrid. Ja kui sĂŒndmustele tuleb palju parameetreid, salvestame lihtsalt esimesed 512. Sest 512 – pole kahju.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja kui te ei saa kindlaks teha oma andmetĂŒĂŒpide, siis saate ka andmed ClickHouse'i salvestada, kuid ajutisse tabelisse, mis on spetsialiseerunud ajutistele andmetele. PĂ€rast seda saate analĂŒĂŒsida, milline on teil seal vÀÀrtuste jaotus, mis seal ĂŒldse on ja koostada Ă”iged tĂŒĂŒbid.

* praegu on ClickHouse'is andmetĂŒĂŒp, LowCardinality , mis vĂ”imaldab tĂ”husalt hoida stringe vĂ€iksemate töömahtude tĂ”ttu.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

NĂŒĂŒd vaatame veel ĂŒht huvitavat juhtumit. MĂ”nikord töötab inimestel kĂ”ik kuidagi imelikult. Ma sisenen ja nĂ€en sellist pilti. Ja kohe tundub, et seda on teinud mĂ”ni vĂ€ga kogenud, nutikas admin, kellel on suur kogemus MySQL versiooni 3.23 seadistamisel.

Siin nÀeme tuhandet tabelit, milles igas on salvestatud jÀÀnus mingist imelikust jagamisest tuhande peale.

PÔhimÔtteliselt austan teiste kogemusi ja mÔistan, milliste kannatustega see kogemus on saadud.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja pĂ”hjused on enam-vĂ€hem arusaadavad. Need on vanad stereotĂŒĂŒbid, mis on vĂ”inud tekkida teiste sĂŒsteemidega töötades. NĂ€iteks MyISAM tabelites ei ole klasterdatud esmaseid vĂ”tmeid. Ja selline andmete jagamise viis vĂ”ib olla meeleheitlik katse saada sama funktsionaalsust.

Teine pÔhjus on see, et igasuguseid operatsioone nagu alter on suurte tabelite puhul raske teha. KÔik saab blokeeritud. Kuigi kaasaegsetes MySQL versioonides ei ole see probleem enam nii tÔsine.

VÔi nÀiteks mikroƥardimise kohta, kuid sellest rÀÀgime veidi hiljem.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

ClickHouse'is ei ole seda vaja teha, kuna esmase vÔti on klasterdatud ja andmed on esmase vÔtme jÀrgi jÀrjestatud.

Ja mĂ”nikord kĂŒsitakse minult: "Kuidas muutub ClickHouse-i vahemiku pĂ€ringute jĂ”udlus tabeli suuruse kasvades?". Ma ĂŒtlen, et see ei muutu ĂŒldse. NĂ€iteks, kui teil on miljard rida tabelis ning loete vahemikku ĂŒks miljon rida. KĂ”ik on korras. Kui tabelis on triljon rida ja te loete ĂŒhe million rida, siis on tulemused peaaegu samad.

Ja teiseks, sellised asjad nagu kĂ€sitsi partitsioonid ei ole vajalikud. Kui te vaatate, mis on failisĂŒsteemis, nĂ€ete, et tabel on tĂ”sine asi. Seal sees on midagi nagu partitsioonid. See tĂ€hendab, et ClickHouse teeb kĂ”ik ise teie eest ja te ei pea muretsema.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Alter ClickHouse'is on tasuta, kui tegemist on alter add/drop column.

Ja vĂ€ikeste tabelite tegemine ei ole vajalik, kuna kui teil on 10 rida vĂ”i 10 000 rida tabelis, ei ole sellel suurt tĂ€htsust. ClickHouse on sĂŒsteem, mis optimeerib lĂ€bilaskevĂ”imet, mitte latentsust, seega ei ole mĂ”tet töödelda 10 rida.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

TĂ”eliselt Ă”ige on kasutada ĂŒhte suurt tabelit. Vabanege vanadest stereotĂŒĂŒpidest, kĂ”ik lĂ€heb hĂ€sti.

Ja boonusena on meie viimases versioonis lisandunud vĂ”imalus teha suvaline partitsioneerimise vĂ”ti, et teostada erinevaid hooldusoperatsioone eraldi partitsioonide ĂŒle.

NĂ€iteks, kui teil on vaja palju vĂ€ikeseid tabelite, nĂ€iteks kui peate töötlema vaheandmeid, siis teil tulevad chunk'id ja peate nende kallal tĂ”lked tegema enne nende kirjutamist lĂ”plikku tabelisse. Selle juhtumi jaoks on suurepĂ€rane tabelimootor – StripeLog. See on midagi sarnast TinyLogiga, aga parem.

* nĂŒĂŒd on ClickHouse'is veelgi tabelifunktsioon input.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel ĂŒks antipattern on mikrosĂŒlemine. NĂ€iteks, kui peate andmeid sĂŒlema ja teil on 5 serverit, aga homme tuleb 6serverit. Ja te mĂ”tlete, kuidas neid andmeid ĂŒmber jagada. Ja selle asemel, et jagada 5 partii, teete 1 000 partiid. Ja edasi jagate igaĂŒhe nende mikrosĂŒlemite sarnaselt eraldi serveritele. Ja teil vĂ”ib olla nĂ€iteks ĂŒhes serveris 200 ClickHouse'i instance, nĂ€iteks. Eraldi instance'id erinevatel portidel vĂ”i eraldi andmebaasid.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Aga ClickHouse'is pole see vĂ€ga hea. Sest isegi ĂŒks ClickHouse instance pĂŒĂŒab kasutada kĂ”ik saadaval olevad serveri ressursid ĂŒhe pĂ€ringu töötlemiseks. St. teil on mingi server ja seal on nĂ€iteks 56 protsessorituuma. Teete pĂ€ringu, mis kestab ĂŒhe sekundi ja see kasutab 56 tuuma. Ja kui te olete sinna paigutanud 200 ClickHouse'i ĂŒhte serverisse, siis tĂ€hendab, et kĂ€ivitub 10 000 lĂ”ime. ÜhesĂ”naga, kĂ”ik lĂ€heb vĂ€ga halvasti.

Teine pĂ”hjus on see, et töö jaotus nende instance'ide vahel on ebaĂŒhtlane. MĂ”ni lĂ”petab varem, mĂ”ni hiljem. Kui see kĂ”ik toimuks ĂŒhes instance'is, siis ClickHouse saaks ise aru, kuidas andmeid Ă”igele lĂ”ime jaotada.

Ja veel ĂŒks pĂ”hjus on see, et teil on protsessoritevaheline suhtlemine TCP kaudu. Andmeid tuleb serialiseerida, deserialiseerida ja see on tohutu hulk mikrosĂŒlemeid. Lihtsalt ei ole efektiivne töö.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel ĂŒks antipattern, kuigi seda on raske antipatterniks nimetada. See on suur hulk eelagreed.

Üldiselt on eelagregeerimine hea. Teil oli miljard rida, te aggregeerisite selle ja see muutus 1 000 reaks, ja nĂŒĂŒd kĂ€ib pĂ€ring hetkega. KĂ”ik on suurepĂ€rane. Nii vĂ”ib teha. Ja selle jaoks on isegi ClickHouse'is spetsiaalne tabelitĂŒĂŒp AggregatingMergeTree, mis teeb inkrementaalse aggregeerimise andmete sisestamise kĂ€igus.

Aga on olukordi, kus te arvate, et me kogume andmeid selliselt ja veel ka niimoodi. Ja mingis naaberosakonnas, millest ma ei taha rÀÀkida, kasutatakse SummingMergeTree tabeleid summade kogumiseks pÔhivÔtme jÀrgi, ning pÔhivÔtmena kasutatakse 20 erinevat veergu. Ma muutsin mÔned veergude nimetused varjamiseks, kuid umbes nii see ongi.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja tekivad sellised probleemid. Esiteks, teie andmete maht ei vĂ€hene kuigi palju. NĂ€iteks vĂ€heneb see kolm korda. Kolm korda – see oleks hea hind, et lubada endale piiramatud analĂŒĂŒsi vĂ”imalused, mis tekivad, kui andmed ei ole koondatud. Kui andmed on koondatud, siis saate analĂŒĂŒsi asemel vaid kehva statistika.

Ja mis eriti hĂ€irib? Et need inimesed naaberosakonnast tulevad ja kĂŒsivad mĂ”nikord, et lisage veel ĂŒks veerg pĂ”hivĂ”tmesse. T. e. me oleme koondanud andmeid, aga nĂŒĂŒd tahame midagi rohkemat. Kuid ClickHouse'is ei ole vĂ”imalik pĂ”hivĂ”tit muuta. Seega peame kirjutama mingeid skripte C++. Ja ma ei armasta skripte, isegi kui need on C++.

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Ôik Ôigesti. Kui te aga koondate, siis mÔnikord on see möödapÀÀsmatu.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel ĂŒks huvitav juhtum – see on lĂ”pmatus tsĂŒklis toimuvad pĂ€ringud. Ma mĂ”nikord sisenen mĂ”nele tootmisserverile ja vaatan seal show processlist. Ja iga kord avastan, et toimub midagi kohutavat.

NĂ€iteks midagi sellist. Siit on kohe selge, et kĂ”ik oleks saanud teostada ĂŒhes pĂ€ringus. Lihtsalt kirjutage url in ja nimekiri.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Miks on palju selliseid pĂ€ringuid lĂ”pmatus tsĂŒklis halb? Kui indeksi ei kasutata, siis teil on palju lĂ€bimineid samade andmete kohta. Kuid kui indeks on kasutusel, nĂ€iteks kui teil on pĂ”hivĂ”ti ru ja kirjutate url = millegi kohta. Ja te arvate, et loetakse tabelist ĂŒhe url'i, siis kĂ”ik on korras. Kuid tegelikult ei ole. Sest ClickHouse teeb kĂ”ik pakettide kaupa.

Kui tal on vaja lugeda andmete vahemikku, loeb ta veidi rohkem, kuna ClickHouse'i indeks on haruldane. See indeks ei vĂ”imalda tabelist leida ĂŒhte konkreetset rida, vaid ainult mingit vahemikku. Andmed tihendatakse plokkide kaupa. Ühe rea lugemiseks tuleb vĂ”tta kogu plokk ja see avada. Ja kui teete hulga pĂ€ringuid, siis teil on palju kattuvusi ja palju tööd, mida tehakse jĂ€lle ja jĂ€lle.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja boonusena vÔib mÀrkida, et ClickHouse'is ei pea kartma edastada isegi megabaite ja isegi sadu megabaite IN-sektsiooni. MÀletan meie praktikast, et kui MySQL-is edastame palju vÀÀrtusi IN-sektsiooni, nÀiteks edastame 100 megabaidi numbreid, siis MySQL sööb 10 gigabaiti mÀlu ja sellega enam midagi ei juhtu, kÔik töötab halvasti.

Ja teiseks – ClickHouse'is, kui teie pĂ€ringud kasutavad indeksit, siis see ei ole kunagi aeglasem kui tĂ€iskann, st kui lugeda tuleb peaaegu kogu tabelit, siis see toimub jĂ€rjestikku ja loeb kogu tabeli. Üldiselt mĂ”istab see ise, millega on tegu.

Kuid sellel on siiski teatud keerukused. NÀiteks see, et IN koos alampÀringuga ei kasuta indeksit. Kuid see on meie probleem ja peame selle parandama. Siin pole midagi fundamentaalset. Parandame selle.

Ja veel ĂŒks huvitav asi – kui teil on vĂ€ga pikk pĂ€ring ja jaotatud pĂ€ringute töötlemine kĂ€ib, siis see vĂ€ga pikk pĂ€ring saadetakse igale serverile ilma tihendamiseta. NĂ€iteks 100 megabaidi ja 500 serveriga. Seega edastatakse teie vĂ”rgus 50 gigabaiti. See edastatakse ja seejĂ€rel tĂ€idetakse kĂ”ik edukalt.

* juba kasutab; kÔik on parandatud, nagu lubatud.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Ja ĂŒsna sagedane juhtum on see, kui pĂ€ringud tulevad API-st. NĂ€iteks olete loonud oma teenuse. Ja kui teie teenus on kellelegi vajalik, siis olete avanud API ja juba kaks pĂ€eva hiljem nĂ€ete, et toimub midagi arusaamatut. KĂ”ik on ĂŒle koormatud ja paar kohutavat pĂ€ringut tuleb, mida kunagi ei oleks pidanud olema.

Ja siin on lahendus ĂŒks. Kui olete avanud API, peate selle kĂ€rpima. NĂ€iteks tuleks kehtestada mingid kvoodid. Teisi normaalseid vĂ”imalusi pole. Vastasel juhul kirjutatakse kohe skript ja tekivad probleemid.

Ja ClickHouse'is on spetsiaalne vĂ”imalus – kvota arvestamine. Lisaks on vĂ”imalik edastada oma kvota vĂ”ti. See vĂ”ib olla nĂ€iteks kasutaja sisemine identifikaator. Ja kvotad arvestatakse igaĂŒhe jaoks eraldi.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

NĂŒĂŒd veel ĂŒks huvitav asi. See on kĂ€sitsi juhitav replikeerimine.

Ma tean palju juhtumeid, kus, hoolimata ClickHouse'is olevast sisseehitatud replikeerimise toest, replikeerivad inimesed ClickHouse'i kÀsitsi.

Millisest printsiibist on jutt? Teil on andmete töötlemise pipeline. Ja see toimib iseseisvalt, nÀiteks erinevates andmekeskustes. Te kirjutate sama teavet ClickHouse'i samamoodi. TÔsi, praktika nÀitab, et andmed lÀhevad ikkagi erinevaks, sÔltuvalt teie koodis esinevatest eripÀrastest. Loodetavasti mitte teie omades.

Ja aeg-ajalt peate ikkagi kĂ€sitsi sĂŒnkroonima. NĂ€iteks kord kuus teevad administraatorid rsync'i.

Tegelikult on palju lihtsam kasutada ClickHouse'i sisseehitatud replikeerimist. Kuid siin vĂ”ivad olla teatud vastunĂ€idustused, sest selleks peate kasutama ZooKeeperit. Ma ei ĂŒtle midagi halba ZooKeeperi kohta, pĂ”himĂ”tteliselt on sĂŒsteem töövĂ”imel, kuid mĂ”nikord ei kasuta inimesed seda java-fobi tĂ”ttu, sest ClickHouse on nii hea sĂŒsteem, mis on kirjutatud C++-s, mida saab kasutada ja kĂ”ik töötab hĂ€sti. Aga ZooKeeper on java peal. Ja kuidagi ei tahaks isegi vaadata, kuid siis vĂ”ite kasutada kĂ€sitsi juhitavat replikeerimist.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

ClickHouse on praktiline sĂŒsteem. See arvestab teie vajadustega. Kui teil on kĂ€sitsi juhitav replikeerimine, siis saate luua Jaotatud tabeli, mis vaatab teie kĂ€sitsireplikaid ja teeb nende vahel automaatse failover'i. Ja on isegi spetsiaalne valik, mis vĂ”imaldab vĂ€ltida flappe, isegi kui teie replikad erinevad sĂŒsteemselt.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Edasi vÔivad tekkida probleemid, kui kasutate primitiivseid tabelimootoreid. ClickHouse on nagu ehituskonstruktor, kus on palju erinevaid tabelimootoreid. KÔigi tÔsiste juhtumite jaoks, nagu on dokumentatsioonis kirjutatud, kasutage MergeTree perekonna tabeleid. KÔik teised on pigem erijuhtumiteks vÔi testimiseks.

MergeTree tabelis ei pea teil olema mingit kuupĂ€eva ja aega. Saate ikkagi kasutada. Kui kuupĂ€eva ja aega ei ole, kirjutage default – 2000. aasta. See töötab ja ei nĂ”ua ressursse.

Ja uues serveri versioonis on isegi vÔimalik mÀÀrata, et teil oleks kohandatud jagamine ilma partitsiooni vÔtmeta. See on sama.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Teiselt poolt vĂ”ib kasutada primitiivseid tabelimootoreid. NĂ€iteks laadige andmed ĂŒks kord sisse ja vaadake, mĂ€ngige nendega ja kustutage. VĂ”ite kasutada Logi.

VĂ”i salvestada vĂ€ikseid mahtusid vahepealseks töötlemiseks – see on StripeLog vĂ”i TinyLog.

MÀlu saab kasutada, kui andmete maht on vÀike ja lihtsalt mÀngitakse midagi mÀllu.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

ClickHouse ei armasta ĂŒlemÀÀraselt normaliseeritud andmeid.

Siin on tĂŒĂŒpiline nĂ€ide. 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Ă€lust ei piisa andmete koguni, millega tuleb liita, siis JOIN ei Ă”nnestu.*

Kui andmed on suure kardinaalsusega, siis Àrge muretsege, hoidke neid denormaliseeritud kujul, URL-id otse pÔhitaotluses.

* kuid nĂŒĂŒd on ClickHouse'il ka merge join ja see töötab, kui vaheandmed ei mahu mĂ€llu. Kuid see ei ole efektiivne ja soovitus kehtib endiselt.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Veel paar nÀidet, kuid ma juba kahtlen, kas need on tÔeliselt antipaaterid vÔi mitte.

ClickHouse'il on ĂŒks tuntud puudus. Ta ei oska uuendusi teha*. Teatud mĂ”ttes on see isegi hea. Kui teil on olulisi andmeid, nĂ€iteks raamatupidamine, siis keegi ei suuda neid saata, sest uuendusi pole.

* juba ammu on lisatud toetus uuendamiseks ja kustutamiseks partii reĆŸiimis.

Kuid on mĂ”ned erilised viisid, mis vĂ”imaldavad uuendusi nagu taustal. NĂ€iteks ReplaceMergeTree tĂŒĂŒpi tabelid. Need teevad uuendusi taustal toimuvate ĂŒhinemiste ajal. Saate seda sundida optimize table abil. Kuid Ă€rge tehke seda liiga tihti, sest see tĂ€hendab partitsiooni tĂ€ielikku kirjutamist.

Jaotatud JOIN'id ClickHouse'is – see on samuti halvasti planeerimisreĆŸiimiga töödeldud.

Halb, kuid mÔnikord on see korras.

ClickHouse'i kasutamine ainult selleks, et lugeda andmeid tagasi select* abil.

Ma ei soovitaks ClickHouse'i kasutada mahukate arvutuste jaoks. Kuid asi ei ole tĂ€iesti nii, kuna me oleme juba sellest soovitusest kĂ”rvale kaldumas. Ja meil on hiljuti lisandunud vĂ”imalus rakendada masinĂ”ppemudeleid ClickHouse'is – Catboost. See teeb mind murelikuks, sest ma mĂ”tlen: "Kohutav. Kui palju siis takte byte kohta tuleb!". Mul on tĂ”eliselt kahju, et takte byte'ide peale kulutada.

ClickHouse'i efektiivne kasutamine. Alexey Milovidov (Yandex)

Aga Àrge muretsege, installige ClickHouse ja kÔik lÀheb hÀsti. Kui midagi juhtub, on meil kogukond. Muide, kogukond olete teie. Ja kui teil on mingeid probleeme, saate vÀhemalt meie chati astuda ja loodan, et teid aidatakse.

KĂŒsimused

AitĂ€h ettekande eest! Kuhu kaevata ClickHouse'i kokkuvarisemise ĂŒle?

VÔite kaevata otse minu juurde praegu.

Ma hakkasin hiljuti ClickHouse'i kasutama. Koheselt kukutasin cli liidese.

Teid on Ônnistatud.

Veidi hiljem kukutasin vÀikese select'iga serveri.

Teil on anne.

Avasin GitHubis vea, kuid seda ignoreeriti.

Vaadake.

Aleksei tÔi mind ettekandesse vale pÀrast, lubades rÀÀkida, kuidas te andmeid pressite.

VĂ€ga lihtne.

Seda ma arvasin juba eile. Rohkem konkreetikast.

Seal pole mingeid kohutavaid trikke. Seal on lihtsalt blokkide kaupa tihendamine. Vaikimisi kasutatakse LZ4, ZSTD* saab sisse lĂŒlitada. Blokid on vahemikus 64 kilobaiti kuni 1 megabaidini.

* Samuti on olemas spetsialiseeritud tihenduskoodikate tugi, mida saab kasutada muude algoritmidega ahelas.

Kas blokid sisaldavad lihtsalt tooreid andmeid?

Ei ole tÀiesti toored. Seal on massiivid. Kui teil on numbriline veerg, siis numbrid on jÀrjestikku massiivis.

Selge.

Aleksei, nĂ€ide, 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Ă€iliselt ĂŒtlesite, et kettal ei erine see oluliselt. Kui me loeme ketas ridu, castime, kas siis on meil aggregaadid kiiremad vĂ”i ei? VĂ”i me siiski ei saa siin mĂ€rgatavat kasu? Mul on tunne, et te testisite seda, kuid mingil pĂ”hjusel ei maininud te seda benchmark'is.

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Ă”vasti vaeva nĂ€inud, aga seal on numbrid kirja pandud kĂŒmnendvormis. VĂ€ga ebamugav. Teisest kĂŒljest töötab uniqExact funktsioon stringide puhul aeglasemalt mitte ainult sellepĂ€rast, et need on stringid, vaid ka seetĂ”ttu, et valitakse teine algoritmi spetsialiseerumine. Stringe töödeldakse lihtsalt teistmoodi.

Aga kui vĂ”tta lihtsam andmetĂŒĂŒp? NĂ€iteks, kui me paneme kirja user id, mis meil on in, kirjutame selle stringina ja siis kastime, kas siis on lĂ”busam vĂ”i mitte?

Ma kahtlen. Arvan, et see on isegi kurvem, sest numbrite eraldamine on tĂ”eliselt tĂ”sine probleem. Ma arvan, et sellel kollegil oli isegi esitluses teema, kuidas numbrite eraldamine kĂŒmnendvormis on keeruline, vĂ”i vĂ”ib-olla mitte.

Aleksei, suur aitĂ€h esitluse eest! Ja suur aitĂ€h ClickHouse'i eest! Mul on kĂŒsimus plaanide kohta. Kas on plaanis funktsioon, et sĂ”naraamatute osalist uuendamist?

T. e. osaline taaskÀivitamine?

Jah-jah. Nagu vÔimalus mÀÀrata seal MySQL vÀli, t. e. uuendada after, et laadida ainult need andmed, kui sÔnaraamat on vÀga suur.

VÀga huvitav funktsioon. Ja mulle tundub, et keegi inimene pakkus seda meie vestluses. VÔib-olla olite see isegi teie.

Ma ei arva, et see olin mina.

SuurepĂ€rane, nĂŒĂŒd on siis kaks pĂ€ringut. Ja vĂ”ib rahulikult alustada tegemist. Aga tahan kohe teid hoiatada, et see funktsioon on ĂŒsna lihtne ellu viia. T. e. pĂ”himĂ”tteliselt tuleb lihtsalt tabelisse kirjutada versiooni number ja seejĂ€rel kirjutada: versioon on vĂ€iksem kui see ja see. Ja see tĂ€hendab, et me tĂ”enĂ€oliselt pakume selle tegemiseks entusiastidele. Kas te olete entusiast?

Jah, aga kahjuks mitte C++-s.

Kas teie kolleegid oskavad C++-s kirjutada?

Ma leian kellegi.

SuurepÀrane*.

* funktsioon lisati kaks kuud pĂ€rast esitluse tegemist – selle töötas vĂ€lja kĂŒsimuse autor ja saatis oma pull request.

AitÀh!

Tere! AitĂ€h ettekande eest! Mainisite, et ClickHouse kasutab vĂ€ga hĂ€sti Ă€ra kĂ”ik selle jaoks saadaval olevad ressursid. Ja naaberettekande tegija Luxsoftist rÀÀkis oma lahendusest Venemaa Posti jaoks. Ta ĂŒtles, et ClickHouse meeldis neile vĂ€ga, kuid nad ei kasutanud seda oma peamise konkurendi asemel just sellepĂ€rast, et see kasutas Ă€ra kogu protsessori. Ja nad ei suutnud seda integreerida oma arhitektuuri, oma ZooKeeperi ja konteineritega. Kas on vĂ”imalus kuidagi piirata ClickHouse'i, et see ei kasutaks kĂ”ike, mis talle kĂ€tte satub?

Jah, see on vĂ”imalik ja vĂ€ga lihtne. Kui soovite, et see kasutaks vĂ€hem tuumasid, kirjutage lihtsalt set max_threads = 1. Ja kĂ”ik, see tĂ€idab pĂ€ringu ĂŒhes 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.

Tere, Aleksei! Sooviksin kĂŒsida sellise kĂŒsimuse. Juba mitte esimest korda kuulen, et paljud hakkavad kasutama ClickHouse'i logide hoidmiseks. Ettekandes ĂŒtlesite, et seda ei tohi teha, st ei ole vaja hoida pikki ridu. Kuidas Te sellele suhtute?

Esiteks, logid on reeglina mitte pikad read. Muidugi, erandeid vĂ”ib olla. NĂ€iteks, kui mingi teenus, mis on kirjutatud java's, viskab exception'i ja see logitakse. Ja nii lĂ”pmatus tsĂŒklis, ja lĂ”puks lĂ”peb koht kĂ”vakettal. Lahendus on vĂ€ga lihtne. Kui read on liiga pikad, siis lĂ”igake need. Ja mis tĂ€hendab pikad? KĂŒmned kilobaitid – see on halb*.

* Uuemates ClickHouse'i versioonides on sisse lĂŒlitatud "kohandatud granulaarsuse indeks", mis lahendab pika ridade hoidmise probleemi peaaegu tĂ€ielikult.

Aga kilobait – see on normaalne?

Normaalne.

Tere! AitĂ€h ettekande eest! Olen juba sellest vestluses kĂŒsinud, aga ei mĂ€leta, kas sain vastuse. Kas plaanitakse laiendada ANDMESEKTSIOONI nagu CTE?

Praegu ei. Meie ANDMESEKTSIOON on natuke ebasiiras. See on meil nagu vÀike funktsioon.

Sain aru. AitÀh!

AitĂ€h ettekande eest! VĂ€ga huvitav! Üks globaalne kĂŒsimus. Kas on plaanis ehk teha mĂ”ningaid silte andmete kustutamise modifikatsiooniks?

Kohustuslikult. See on meie esmane ĂŒlesanne meie jĂ€rjekorras. Praegu oleme aktiivselt vĂ€lja mĂ”tlemas, kuidas kĂ”ike Ă”igesti teha. Ja nĂŒĂŒd on aeg hakata klaviatuurile vajutama*.

* vajutades klahve klaviatuuril, tegime kÔik Àra.

Kas see mĂ”jutab kuidagi sĂŒsteemi jĂ”udlust vĂ”i mitte? Kas sisestamine on sama kiire, kui see on praegu?

VÔib-olla ise deletes, ise updates on vÀga rasked, kuid see ei mÔjuta selects ja inserts jÔudlust.

Ja veel ĂŒks vĂ€ike kĂŒsimus. Esitluses rÀÀkisite peamise vĂ”tme kohta. Seega, meil on partitsioneerimine, mis on vaikimisi kuupĂ”hine, eks? Ja kui me mÀÀrame kuupĂ€evade vahemiku, mis mahub kuusse, siis loetakse ainult seda partitsiooni, eks?

Jah.

Selline kĂŒsimus. Kui me ei saa mÀÀrata mingit peamist vĂ”tit, kas on Ă”ige teha see vĂ€ljale "KuupĂ€ev" selleks, et taustal oleks vĂ€hem andmete ĂŒmberkorraldamist ning need oleksid korrastatumalt paigutatud? Kui teil ei ole vahemiku pĂ€ringuid ja te isegi ei saa valida mingit peamist vĂ”tit, kas on siis mĂ”tet kuupĂ€eva peamisse vĂ”tmesse panna?

Jah.

VĂ”ib-olla on mĂ”istlik panna peamisse vĂ”tmesse selline vĂ€li, mille jĂ€rgi andmeid oleks lihtsam kompressida, kui need on selle vĂ€li jĂ€rgi sorteeritud. NĂ€iteks, kasutaja identifikaator. Kasutaja, nĂ€iteks, kĂŒlastab sama veebisaiti. Sellisel juhul panege kasutaja id ja aeg. Siis on teie andmed paremini kompressitud. Seoses kuupĂ€evaga, kui teil tĂ”epoolest ei ole ja ei ole kunagi vahemiku pĂ€ringuid kuupĂ€evade jĂ€rgi, siis ei ole mĂ”tet kuupĂ€eva peamisse vĂ”tmesse panna.

Hea, aitÀh palju!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster