
Kuna ClickHouse on spetsiifiline sĂŒsteem, tuleb selle kasutamisel arvesse vĂ”tta selle arhitektuuri eripĂ€ra. Selles ettekandes rÀÀgib Aleksei nĂ€idetest tĂŒĂŒpilistest vigadest ClickHouse'i kasutamisel, mis vĂ”ivad viia ebaefektiivse tööni. Praktikast tulevad nĂ€ited nĂ€itavad, kuidas andmete töötlemise skeemi valik vĂ”ib oluliselt muuta jĂ”udlust.
Tere kÔigile! Minu nimi on Aleksei, ma teen ClickHouse'i.

Esiteks, kiirustan teid rÔÔmustama, et ma ei hakka tĂ€na rÀÀkima, mis on ClickHouse. Ausalt öeldes, mulle on see juba tĂŒĂŒtav. Iga kord rÀÀgin sellest. Ja tĂ”enĂ€oliselt teavad kĂ”ik juba.

Selle asemel rÀÀgin ma vĂ”imalikest komistuskividest, st kuidas ClickHouse'i vale kasutamine vĂ”ib juhtuda. Tegelikult ei ole pĂ”hjust muretseda, sest me arendame ClickHouse'i sĂŒsteemina, mis on lihtne, mugav ja töötab otse karbist. Paigaldad ja kĂ”ik, mingeid probleeme pole.
Siiski tuleb arvestada, et see sĂŒsteem on spetsialiseeritud ning vĂ”ib kergesti sattuda ebatavalisse kasutusstsenaariumi, mis viib selle mugavustsoonist vĂ€lja.
Nii et millised on nÀhtavad probleemid? Peamiselt rÀÀgin ilmselgetest asjadest. KÔik saavad aru, kÔik mÔistavad ja vÔivad rÔÔmustada, et nad on nii targad, ning need, kes ei saa aru, saavad midagi uut teada.

Esimene ja kÔige lihtsam nÀide, millega kahjuks sageli kokku puututakse, on suur hulk sisendeid, mis on vÀikesed partiid, st suur hulk vÀikeseid sisendeid.
Kui vaadata, kuidas ClickHouse sisendeid sooritab, siis vĂ”ite ĂŒhe pĂ€ringuga saata isegi terabaidi andmevoo. See ei ole probleem.
Vaatame nĂŒĂŒd, milline on tĂŒĂŒpiline tulemuslikkus. NĂ€iteks meil on tabel Yandex.Metrika andmetega. Hitid. 105 erinevat veergu. 700 baiti tihendamata kujul. Ja alustame sisestamist korralike partiidena, kus on miljon rida.
Sisestades MergeTree tabelisse, saame umbes pool miljonit rida sekundis. SuurepÀrane! Replitseeritud tabelis on see veidi vÀhem, umbes 400 000 rida sekundis.
Ja kui aktiveerida kvora sisestamine, siis saadakse pisut vÀhem, kuid ikkagi korralik jÔudlus, 250 000 rida sekundis. Kvora sisestamine on dokumenteerimata vÔimalus ClickHouse'is*.
* seisuga 2020. aasta. .

Mida teha, kui asjad lĂ€hevad halvasti? Sisestame ĂŒhe rea korraga MergeTree tabelisse ja saame 59 rida sekundis. See on 10 000 korda aeglasem. ReplicatedMergeTree puhul on see 6 rida sekundis. Ja kui kvora veel sisse lĂŒlitada, siis on see 2 rida sekundis. Minu arvates on see tĂ€ielik fiasco. Kuidas saab nii aeglane olla? Mul on isegi T-sĂ€rgis kirjas, et ClickHouse ei tohi aeglane olla. Kuid siiski juhtub seda mĂ”nikord.

Tegelikult on see meie viga. Me oleks saand teha nii, et kÔik töötaks normaalselt, aga me ei teinud. Ja me ei teinud sellepÀrast, et meie stsenaariumis ei olnud see vajalik. Meil olid juba partiid. Lihtsalt meie jaoks tulid partiid sisse ja polnud mingeid probleeme. Paneme andmed sisse ja kÔik töötab normaalselt. Aga muidugi vÔivad esineda igasuguseid stsenaariume. NÀiteks, kui teil on hulk servereid, kus andmeid genereeritakse. Ja nad sisestavad andmeid mitte nii sageli, kuid siiski tulevad sagedased sisestused. Ja sellega tuleb kuidagi toime tulla.
Tehnilisest kĂŒljest on asi selles, et kui teete ClickHouse'is sisestuse, ei satu andmed ĂŒhtegi memtable'i. Meil pole isegi reaalset log structure MergeTree't, vaid lihtsalt MergeTree, kuna log'i ega memTable'i pole. Me kirjutame andmed otse failisĂŒsteemi, juba veergude kaupa jaotatuna. Ja kui teil on 100 veergu, tuleb kirjutada ĂŒle 200 faili eraldi kausta. See kĂ”ik on ĂŒsna mahukas.

Ja tekib kĂŒsimus: "Kuidas Ă”igesti teha?", kui selline olukord, et tuleb siiski kuidagi andmeid ClickHouse'i salvestada.
Meetod 1. See on kÔige lihtsam meetod. Kasutage mÔnda hajutatud jÀrjekorda, nÀiteks Kafka. Lihtsalt tÔstate andmeid Kafka'st, batƥit iga sekundi jÀrel. Ja kÔik on korras, salvestate ja kÔik töötab normaalselt.
Puuduseks on see, et Kafka on veel ĂŒks kohmakas hajutatud sĂŒsteem. Ma saan aru, kui teil on ettevĂ”ttes juba Kafka. See on hea, see on mugav. Kuid kui seda ei ole, siis tasub enne veel ĂŒhe hajutatud sĂŒsteemi projekti toomist kolm korda mĂ”elda. SeepĂ€rast tasub kaaluda alternatiive.

Meetod 2. Selline vanakooli alternatiiv, mis on samas vĂ€ga lihtne. Teil on server, mis genereerib teie logisid. Ja see salvestab teie logid failina. Ja nĂ€iteks korra sekundis nimetame selle faili ĂŒmber ja avame uue. Eraldi skript, kas croni vĂ”i mĂ”ne daemoni kaudu, vĂ”tab kĂ”ige vanema faili ja salvestab selle ClickHouse'i. Kui logisid salvestada korra sekundis, siis on kĂ”ik suurepĂ€rane.
Kuid selle meetodi puudus on see, et kui teie server, kus logid genereeritakse, kuhugi kaob, kaovad ka andmed.

Meetod 3. On veel ĂŒks huvitav viis, mis ei kasuta ajutisi faile. NĂ€iteks vĂ”ib teil olla mĂ”ni reklaamipööre vĂ”i muu huvitav daemon, mis genereerib andmeid. Saate andmepaketi koguda otse mĂ€lus, puhvrisse. Ja kui aega on möödunud piisavalt, asetate selle puhvri kĂ”rvale, loote uue ning eraldi tahkudes sisestate juba kogunenud andmed ClickHouse'i.
Teisest kĂŒljest kaovad andmed kill -9 korral. Kui teie server crashes, kaotate need andmed. Ja veel on probleemiks see, et kui te ei saanud andmeid andmebaasi salvestada, hakkavad need andmed kuhjuma mĂ€llu. Kasmalt kaotate mĂ€lu vĂ”i kaotate lihtsalt andmed.

Meetod 4. Veel ĂŒks huvitav viis. Kui teil on mĂ”ni serveriprotsess. Ja ta vĂ”ib andmeid saata ClickHouse'i kohe, aga seda ĂŒhes ĂŒhenduses. NĂ€iteks, saadetakse http-pĂ€ring koos transfer-encoding: chunked ja insertâiga. Ja genereeritakse tĂŒkkide kaupa mitte liiga harva, vĂ”ib igat rida saata, kuigi andmete framing'i tĂ”ttu tekib ĂŒlekandekiirus.
Kuid sel juhul saadetakse andmed siiski kohe ClickHouse'i. Ja ClickHouse bufrib neid ise.
Aga tekkivad probleemid. NĂŒĂŒd kaotate andmed, sealhulgas siis, kui teie protsess katkestatakse ja kui ClickHouse'i protsess katkestatakse, kuna see jÀÀb lĂ”petamata insert'i taha. ClickHouse'i insert'id on aatomilised teatud ridade piiri ulatuses. Ăldiselt on see huvitav meetod. Seda vĂ”ib kasutada ka.

Meetod 5. Siin on veel ĂŒks huvitav meetod. See on mingisugune kogukonna vĂ€lja töötatud server andmete grupiseerimiseks. Ma ei ole seda ise vaatamas kĂ€inud, seega ei saa ma midagi garanteerida. Siiski ei anta ka ClickHouse'i enda puhul mingeid garantiisid. See on samuti avatud lĂ€htekoodiga, kuid teisest kĂŒljest vĂ”ite olla harjunud teatud kvaliteedistandardiga, mida me pĂŒĂŒame tagada. Ent selle asja kohta â ma ei tea, minge GitHub'i, vaadake koodi. VĂ”ib-olla on seal midagi normaalset kirjutatud.
* seisuga 2020. aasta, tuleks lisada ka kaalu alla .

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.
Kuid puuduseks on see, et probleem ei lahene tĂ€ielikult. Kui MergeTree tĂŒĂŒpi lisamiste korral peate andmeid grupeerima ĂŒhe partii kaupa sekundis, siis Buffer tabelisse lisamisel peate grupeerima vĂ€hemalt mitu tuhat sekundis. Kui neid on rohkem kui 10 000 sekundis, on see ikka halb. Ja kui te lisate partiidena, siis nĂ€gite, et seal vĂ”ib olla sadu tuhandeid ridu sekundis. Ja see on juba ĂŒsna raskete andmete puhul.
Samuti ei oma buffer tabelid logi. Ja kui teie serveriga on midagi valesti, siis andmed kaovad.

Boonusena on ClickHouse'il hiljuti vĂ”imalus andmeid Kafka'st kinni pĂŒĂŒda. On olemas tabeli mootori nimi - Kafka. Loote selle lihtsalt. Ja sellele saab kinnitada materialiseeritud vaateid. Sel juhul toob see automaatselt andmed Kafka'st ja lisab need soovitud tabelitesse.
Ja see, mis selle vĂ”imaluse juures eriti rÔÔmustab, on see, et seda ei teinud meie. See on kogukonna funktsioon. Ja kui ma rÀÀgin 'kogukonna funktsioonist', siis ei rÀÀgi ma seda mingisuguse pĂ”lgusega. Me lugesime koodi, tegime ĂŒlevaate, see peaks normaalselt töötama.
* seisuga 2020. aasta, on saadaval sarnane tugi .

Mis veel vĂ”ib olla ebamugav vĂ”i ootamatu andmete sisestamisel? Kui teete sisestamise pĂ€ringu ja values'is kirjutate mingi arvutuslikke vĂ€ljendeid. NĂ€iteks, now() â see on samuti arvutuslik vĂ€ljend. Sel juhul peab ClickHouse iga rea jaoks kĂ€ivitama nende vĂ€ljendite tĂ”lgendaja, ja jĂ”udlus langeb oluliselt. Paremini on seda vĂ€ltida.
* hetkel on probleem tÀielikult lahendatud, jÔudluselangust vÀljendite kasutamisel VALUES'is enam ei esine.
Teine olukord, kus vĂ”ivad tekkida probleemid, on see, kui teil on ĂŒhes partiiandmestikus palju partiisid. ClickHouse'is on partiiandmestik vaikimisi kuude kaupa. Ja kui sisestate partii miljonist reast, kus andmed on mitme aasta kohta, on teil seal mitu kĂŒmmet partiid. See on ekvivalentne sellega, et partii on mitu korda vĂ€iksem, sest need jagunevad alati kĂ”igepealt partiiandmestike kaupa.
* Hiljuti on ClickHouse'is katsereĆŸiimis lisatud toetus kompaktsel formaadil osadele ja osadele mĂ€lus koos write-ahead log'iga, mis peaaegu tĂ€ielikult lahendab probleemi.

NĂŒĂŒd vaatame teist tĂŒĂŒpi probleemi â andmete tĂŒĂŒpimist.
Andmete tĂŒĂŒpimine vĂ”ib olla range vĂ”i stringiline. Stringiline on siis, kui olete lihtsalt öelnud, et kĂ”ik teie vĂ€ljad on tĂŒĂŒpi string. See on halb. Nii ei tohiks teha.
Vaatame, kuidas Ôigesti teha olukordades, kus soovite öelda, et mÔni vÀli on meil string ja las ClickHouse ise sellega tegeleb, aga siiski on mÔistlik katta mÔned vaeva.

NĂ€iteks meil on IP-aadress. Ăhes nĂ€ites oleme selle salvestanud stringina. NĂ€iteks 192.168.1.1. Teises nĂ€ites on see number tĂŒĂŒpi UInt32*. 32 bitti on piisavalt IPv4 aadressi jaoks.
Esiteks, kuigi see vĂ”ib tunduda kummaline, surutakse andmed kokku ligikaudu ĂŒhtemoodi. Seal on vahe, muidugi, aga mitte nii suur. Nii et ketta sisendi- ja vĂ€ljundi osas erilisi probleeme pole.
Aga on mÀrkimisvÀÀrne vahe protsessori ajal ja pÀringu tÀitmise ajas.
Arvutame ainulaadsete IP-aadresside arvu, kui need on salvestatud numbritena. Tulemuseks on 137 miljonit rida sekundis. Kui sama stringide kujul, siis 37 miljonit rida sekundis. Ma ei tea, miks selline kokkusattumine juhtus. Mina ise tegin need pÀringud. Kuid siiski on see umbes 4 korda aeglasem.
Ja kui arvestada vahet diskil, siis vahe on ka olemas. Ja vahe on umbes veerandi ulatuses, sest ainulaadseid IP-aadresse on piisavalt palju. Kui siin oleks read vĂ€ikese arvu erinevate vÀÀrtustega, siis need suruksid ennast sĂ”nastiku jĂ€rgi tĂ”enĂ€oliselt umbes ĂŒhesugusesse mahtu.
Ja neljakordne ajavahe teel ei ole mitte midagi. VÔib-olla sind ei huvita, aga kui ma nÀen sellist vahet, tunnen ma end kurvalt.

Vaatame erinevaid juhtumeid.
1. Ăks juhtum, kui sul on erinevaid unikaalseid vÀÀrtusi vĂ€he. Sel juhul kasutame lihtsat praktikat, mida sa tĂ”enĂ€oliselt tead ja saad kasutada mis tahes andmebaaside haldussĂŒsteemide puhul. See kehtib mitte ainult ClickHouse'i jaoks. Salvestage lihtsalt numbrilisi identifikaatoreid. Ja teisendada stringideks ja tagasi saab juba oma rakenduse poolel.
NĂ€iteks, kui sul on piirkond. Ja sa pĂŒĂŒad seda salvestada stringina. Seal kirjutatakse: Moskva ja MO. Kui ma nĂ€en, et seal on kirjas 'Moskva', siis pole hullu, kuid kui lisada ka MO, lĂ€heb kĂ”ik veel nukramaks. Kui palju see on baite.
Kuna me salvestame lihtsalt arvu Ulnt32 ja 250. Meil on 250 Yandexis, aga sul vĂ”ib olla teisiti. Igaks juhuks ĂŒtlen, et ClickHouse'il on sisseehitatud funktsioon geobaasiga töötamiseks. Sa lihtsalt salvestad piirkondade loendi, sealhulgas ka hierarhilise, st seal on nii Moskva kui MO, ja kĂ”ik, mis sul vaja on. Ja seda saab teisendada pĂ€ringu tasemel.

Teine variant on umbes sama, kuid toega ClickHouse'is. See on Enum andmetĂŒĂŒp. Sa lihtsalt mÀÀratled Enum'is kĂ”ik vajalikud vÀÀrtused. NĂ€iteks seadme tĂŒĂŒp, kuhu kirjutad: lauaarvuti, nutitelefon, tahvelarvuti, televiisor. Kokku 4 varianti.
Puuduseks on see, et tuleb perioodiliselt teha muutmine. Lisati vaid ĂŒks variant. Teeme alter table. Tegelikult on alter table ClickHouse'is tasuta. Eriti tasuta Enum'i puhul, sest andmed kettal ei muutu. Siiski, alter vĂ”tab tabeli peale lukustuse* ja peab ootama, kuni kĂ”ik select'id on lĂ”pule viidud. Ja alles siis tĂ€idetakse alter, s.t. siiski on mĂ”ned ebamugavused.
* Uuemates ClickHouse'i versioonides on ALTER tehtud tÀiesti mitteblokkeerivaks.

Veel ĂŒks variant, mis on ClickHouse'i jaoks piisavalt ainulaadne, on vĂ€liste sĂ”nastike ĂŒhendamine. Sa vĂ”id kirjutada ClickHouse'i numbreid ja hoida oma sĂ”nastikke igas mugavas sĂŒsteemis. NĂ€iteks vĂ”ib kasutada: MySQL, Mongo, Postgres. VĂ”id isegi luua oma mikroteenuse, mis edastab neid andmeid http kaudu. Ja ClickHouse'i tasemel kirjutad funktsiooni, mis muudab need andmed numbreid ridadeks.
See on spetsialiseeritud, kuid vĂ€ga tĂ”hus viis liita andmeid vĂ€lise tabeliga. On kaks varianti. Ăhes variandis on need andmed tĂ€ielikult vahemĂ€lustatud, tĂ€iesti olemas mĂ€lus ja uuendatakse teatud perioodilisusega. Teises variandis, kui andmed ei mahu mĂ€llu, saab neid osaliselt vahemĂ€lustada.
Siin on nĂ€ide. On Yandex.Direct. Seal on reklaamikampaania ja bĂ€nnerid. Reklaamikampaaniaid on tĂ”enĂ€oliselt kĂŒmneid miljoneid. Need mahuvad enamasti mĂ€llu. Aga bĂ€nnerid â miljardeid, need ei mahu. Ja me kasutame vahemĂ€lustatavat sĂ”nastikku MySQL-st.
Ainus probleem on see, et vahemĂ€lustatav sĂ”nastik töötab korralikult ainult siis, kui hit rate on lĂ€hedane 100%-le. Kui see on madalam, siis iga andmepaki töötlemisel tuleb tegelikult vĂ”tta puuduvaid vĂ”tmeid ja minna andmeid MySQL-st hankima. ClickHouse'i kohta vĂ”in veel kinnitada, et â jah, see ei pidurda, teiste sĂŒsteemide kohta ei hakka ma rÀÀkima.
Ja boonusena on see, et sÔnastikud on vÀga lihtne viis andmete ajakohastamiseks ClickHouse'is tagantjÀrele. See tÀhendab, et kui teil oli reklaamikampaania aruanne, vahetab kasutaja lihtsalt reklaamikampaaniat ja kÔikides vanades andmetes, kÔigis aruannetes muutuvad need andmed samuti. Kui kirjutada read otse tabelisse, siis nende uuendamine ei ole vÔimalik.

Teine vÔimalus, kui te ei tea, kust leida oma ridade identifikaatoreid, on lihtsalt need hashida. Ja kÔige lihtsam variant on vÔtta 64-bitine hash.
Ainus probleem on see, et kui hash on 64-bitine, siis kollisiidid on praktiliselt garanteeritud. Sest kui seal on miljard rida, siis tÔenÀosus muutub juba oluliseks.
Ja ei oleks vÀga hea hashida reklaamikampaaniate nimesid nii. Kui reklaamikampaaniad erinevate ettevÔtete vahel segamini lÀhevad, siis tekib mingi arusaamatus.
Ja on ĂŒks lihtne nipp. TĂ”si, see ei sobi tĂ”siste andmete jaoks, kuid kui tegemist ei ole millegi tĂ”sisega, siis lisage lihtsalt sĂ”nastiku vĂ”tmesse veel kliendi identifikaator. Siis esinevad konfliktid, kuid ainult ĂŒhe kliendi piires. Sellist meetodit kasutame me Yandex.Metrica lingikaardi puhul. Meil on seal URL-id, salvestame hash'e. Ja me teame, et konfliktid esinevad, kuid kui lehekĂŒlg kuvatakse, siis on tĂ”enĂ€osus, et just ĂŒhel lehekĂŒljel on ĂŒhel kasutajal mingid URL-id kokku jÀÀnud ja seda mĂ€rgatakse, nii et seda vĂ”ib ignoreerida.
Boonusena â paljude operatsioonide jaoks piisab ainult hash'idest, ja ise stringe ei pea kuskil hoidma.

Teine nĂ€ide, kui stringid on lĂŒhikesed, nĂ€iteks domeenid. Need vĂ”ib salvestada sellisena, nagu need on. VĂ”i nĂ€iteks brauseri keel ru â 2 baiti. Muidugi on mul kahju pisikestest baitidest, aga Ă€rge muretsege, 2 baiti ei ole kahju. Palun salvestage, nagu on, Ă€rge muretsege.

Teine olukord on see, kui ridasid on palju ja need on ĂŒhtlasi vĂ€ga unikaalsed ning palju potentsiaalselt piiramatuid. TĂŒĂŒpiline nĂ€ide on otsingufraasid vĂ”i URL-id. Otsingufraasid, sealhulgas tippimisvead. Vaatame, kui palju unikaalseid otsingufraase pĂ€evas. Ja selgub, et need moodustavad peaaegu poole kĂ”igist sĂŒndmustest. Sel juhul vĂ”ite mĂ”elda, et andmeid tuleb normaliseerida, tuvastada identifikaatorid ja koguda eraldi tabelisse. Aga nii teha ei tohiks. Lihtsalt hoidke neid ridu sellisena, nagu nad on.
Parem on mitte midagi vĂ€lja mĂ”elda, sest kui hoida eraldi, tuleb teha join. Ja see join on parimal juhul juhuslik juurdepÀÀs mĂ€lule, kui see veel mĂ€llu mahtuda suudab. Kui ei mahu, siis tekivad ĂŒldse probleemid.
Aga kui andmed on in place, lugetakse need lihtsalt Ă”igesse jĂ€rjekorda failisĂŒsteemist ja kĂ”ik on korras.

Kui teil on URL-id vÔi mingi muu keeruline pikk rida, siis tasub mÔelda, et vÔiks mingisuguse kokkuvÔtte eelnevalt arvutada ja salvestada eraldi veergu.
NÀiteks URL-de puhul saab eraldi hoida domeeni. Ja kui teil on tegelikult domeen vajalik, siis kasutage lihtsalt seda veergu, ja URL-id lÀhevad olema, ning te ei pea neile isegi puudutama.
Vaatame, milline on erinevus. ClickHouse'is on spetsialiseeritud funktsioon, mis arvutab domeeni. See on vÀga kiire; me optimeerisime selle. Ja ausalt öeldes ei vasta see isegi RFC-le, aga see arvestab ikkagi kÔike, mis meil vajalik on.
Ăhes juhul saame me lihtsalt URL-e vĂ€lja tĂ”mmata ja domeeni arvutada. See vĂ”tab 166 millisekundit. Kui vĂ”tta aga valmis domeen, siis kulub vaid 67 millisekundit, see tĂ€hendab peaaegu kolm korda kiiremini. Kiirus ei tulene mitte vajadusest teha mingeid arvutusi, vaid sellest, et me loeme vĂ€hem andmeid.
Kuid mingil pĂ”hjusel on ĂŒhel pĂ€ringul, mis on aeglasem, suurem gigabaitide kiirus. Sest see loeb rohkem gigabaite. Need on tĂ€iesti ĂŒleliigsed andmed. PĂ€ring töötab nagu kiiremini, kuid tĂ€idab ĂŒlesannet kauem.
Ja kui vaadata andmete mahtu kettal, siis selgub, et URL on 126 megabaiti, aga domeen vaid 5 megabaiti. See on 25 korda vĂ€hem. Siiski toimub pĂ€ringu tĂ€itmine vaid 4 korda kiiremini. See on sellepĂ€rast, et andmed on kuumad. Kui aga need oleks kĂŒlmad, oleks kahtlemata kiirus 25 korda suurem diskikande tĂ”ttu.
Tegelikult, kui hinnata, kui palju domeen on vĂ€iksem kui URL, siis see on umbes 4 korda. Kuid kummalisel kombel vĂ”tab andmete maht kettal 25 korda vĂ€hem. Miks? Selle pĂ”hjuseks on tihendamine. Nii URL kui domeen tihendatakse. Kuid sageli sisaldab URL palju prĂŒgi.

Ja muidugi, tuleks kasutada Ă”igeid andmetĂŒĂŒpe, mis on spetsiaalselt mĂ”eldud vajalike vÀÀrtuste jaoks vĂ”i mis sobivad. Kui olete IPv4, hoidke UInt32*. Kui IPv6, siis FixedString(16), sest IPv6 aadress on 128 bit, st hoidke see otse binaarformaadis.
Ent mida teha, kui teil on vahel IPv4 aadresse ja vahel IPv6? Jah, saate hoida mĂ”lemat. Ăks veerg IPv4 jaoks, teine IPv6 jaoks. Loomulikult on vĂ”imalus kuvada IPv4 IPv6-s. See töötab ka, kuid kui teil on pĂ€ringutes sageli vajalik just IPv4 aadress, siis oleks parem see panna eraldi veergu.
* nĂŒĂŒd on ClickHouse'is eraldi andmetĂŒĂŒbid IPv4 ja IPv6, mis salvestavad andmeid sama tĂ”husalt nagu numbrid, kuid esitavad neid sama mugavalt nagu stringid.

Samuti on oluline mÀrkida, et andmed tuleks eelnevalt töödelda. NÀiteks kui teile saabuvad mÔned toored logid. Ja vÔib-olla ei tasu neid kohe ClickHouse'i toppida, kuigi on vÀga ahvatlev mitte midagi teha ja kÔik töötab. Kuid siiski tasub teha need arvutused, mis on vÔimalik.
NĂ€iteks brauseri versioon. Ăhes naaberosakonnas, kuhu ma ei taha nĂ€puga nĂ€idata, hoitakse brauseri versiooni nii, st stringina: 12.3. Ja siis, et aruannet teha, vĂ”tavad nad selle stringi ja jagavad selle massiiviga, ja siis esimese elemendiga massiivist. Loomulikult, kĂ”ik hakkab aeglaselt liikuma. KĂŒsisin, miks nad nii teevad. Nad vastasid, et ei armasta enneaegset optimeerimist. Aga mina ei armasta enneaegset pessimistlikku lĂ€henemist.
Nii et sel juhul oleks Ôigem jagada 4 veerguks. Siin Àrge kartke, sest see on ClickHouse. ClickHouse on veergude andmebaas. Ja mida rohkem korralikke vÀikeseid veerge, seda parem. Kui on 5 BrowserVersion'i, tehke 5 veergu. See on normaalne.

NĂŒĂŒd vaatame, mida teha, kui teil on palju vĂ€ga pikki ridu vĂ”i vĂ€ga pikki massiive. Neid ei pea ClickHouse'is ĂŒldse hoidma. Selle asemel saate ClickHouse'i salvestada ainult mingi identifikaatori. Need pikad read tasub panna mĂ”nesse teise sĂŒsteemi.
NĂ€iteks ĂŒhes meie analĂŒĂŒtikateenustes on mĂ”ned sĂŒndmuste parameetrid. Ja kui sĂŒndmustele tuleb palju parameetreid, salvestame lihtsalt esimesed 512. Sest 512 ei ole kahju.

Ja kui te ei suuda oma andmetĂŒĂŒpe mÀÀrata, saate ka andmed ClickHouse'i kirjutada, kuid ajutisse Log-tĂŒĂŒpi tabelisse, mis on spetsiaalne ajutiste andmete jaoks. PĂ€rast seda saate analĂŒĂŒsida, milline on teie vÀÀrtuste jaotus, mis seal ĂŒldse olemas on, ja koostada Ă”iged tĂŒĂŒbid.
* praegu on ClickHouse'is andmetĂŒĂŒp mis vĂ”imaldab efektiivselt salvestada ridu vĂ€iksema töömahu jaotusega.

NĂŒĂŒd vaatame veel ĂŒhte huvitavat juhtumit. MĂ”nikord töötab inimestel kĂ”ik kuidagi veidralt. Sisenen ja nĂ€en sellist. Ja kohe on selge, et seda on teinud mingi vĂ€ga kogenud, nutikas administraator, kellel on suur kogemus MySQL versiooni 3.23 seadistamisel.
Siin nÀeme tuhandet tabelit, milles igas on kirjas jÀÀk, mis tuleneb arusaamatust jagamisest tuhandega.
ĂhesĂ”naga, ma austan teiste kogemusi, sealhulgas mĂ”istan, kui suure vaevaga see kogemus on saadud.

Ja pĂ”hjused on enam-vĂ€hem arusaadavad. Need on vanad stereotĂŒĂŒbid, mis on vĂ”inud tekkida töötades teiste sĂŒsteemidega. NĂ€iteks MyISAM tabelites ei ole klasterpĂ€randvĂ”tit. Ja selline andmete jagamise viis vĂ”ib olla meeleheitlik katse saavutada sama funktsionaalsus.
Teine pÔhjus on see, et erinevad operatsioonid, nagu alter, suurte tabelite puhul on keerulised. KÔik jÀÀb lukku. Kuigi tÀnapÀevaste MySQL versioonide puhul ei ole see probleem enam nii tÔsine.
VÔi nÀiteks mikroshardimine, aga sellest rÀÀgime natuke hiljem.

ClickHouse'i puhul ei ole seda vaja teha, kuna esiteks on klasterpÀrandvÔti, andmed on jÀrjestatud klasterpÀrandvÔtme jÀrgi.
Ja mĂ”nikord kĂŒsitakse minult: âKuidas muutub ClickHouse'i jĂ€lgimispĂ€ringute jĂ”udlus tabeli suurusest?â. Ma ĂŒtlen, et see ei muutu kuidagi. NĂ€iteks, kui teil on tabel, kus on miljard rida, ja loete satuvust miljon rida. KĂ”ik on korras. Kui tabelis on triljon rida ja loete miljon rida, siis on see peaaegu sama.
Ja teiseks, igasuguseid asju nagu kĂ€sitsi partitsioonide seadmine ei ole vajalik. Kui te lĂ€hete ja vaatate, mis seal failisĂŒsteemis on, nĂ€ete, et tabel on pĂ€ris tĂ”sine asi. Seal sees on midagi nagu partitsioonid. Ehk siis ClickHouse teeb kĂ”ik teie eest Ă€ra ja te ei pea muretsema.

Alter ClickHouse'is on tasuta, kui lisate/eemaldate veeru.
Ja vĂ€ikeste tabelite loomine ei ole mĂ”ttekas, sest kui teie tabelis on 10 rida vĂ”i 10 000 rida, ei oma see mingit tĂ€htsust. ClickHouse on sĂŒsteem, mis optimeerib lĂ€bilaskevĂ”imet, mitte latentsust, nii et 10 rida töötlemine ei ole mĂ”istlik.

Ăige on kasutada ĂŒhte suurt tabelit. Vabanege vanadest stereotĂŒĂŒpidest, kĂ”ik lĂ€heb hĂ€sti.
Ja boonuseks on meie uusimas versioonis vĂ”imalus luua arbitraarseid partitsioneerimise vĂ”tmeid, et teostada erinevaid hooldusoperatsioone ĂŒksikute partitsioonide ĂŒle.
NĂ€iteks, kui teil on palju vĂ€ikseid tabeleid, nĂ€iteks kui on vaja töödelda vaheandmeid, kus te saate kokkusurutud andmestikke ja peate enne nende salvestamist lĂ”pptabelisse teostama teisendusi. Selle jaoks on olemas suurepĂ€rane tabelimootor â StripeLog. See on umbes nagu TinyLog, aga parem.
* nĂŒĂŒd on ClickHouse'is olemas veel ka .

Veel ĂŒks antipattern on mikrotĂŒkeldamine. NĂ€iteks, kui peate oma andmed jagama ja teil on 5 serverit, kuid homme tuleb 6 serverit. Ja te mĂ”tlete, kuidas neid andmeid ĂŒmber jagada. Selle asemel, et jagada 5 shards'i peale, jagate te need 1 000 shards'i peale. Ja siis suunate igaĂŒhe neist mikrotĂŒkeldustest eraldi serverisse. NĂ€iteks vĂ”ib ĂŒhes serveris olla 200 ClickHouse'i. Erinevad instantsid erinevatel portidel vĂ”i eraldi andmebaasid.

Kuid ClickHouse'is ei ole see eriti hea. Sest isegi ĂŒks ClickHouse'i instants pĂŒĂŒab kasutada kĂ”iki serveri ressursse ĂŒhe pĂ€ringu töötlemiseks. St, kui teil on nĂ€iteks server, kus on 56 protsessorituuma. Teete pĂ€ringu, mis kestab ĂŒhe sekundi, ja see kasutab 56 tuuma. Ja kui olete sinna paigutanud 200 ClickHouse'i ĂŒhte serverisse, siis kĂ€ivitatakse kokku 10 000 lĂ”ime. ĂhesĂ”naga, kĂ”ik lĂ€heb tĂ”eliselt halvasti.
Teine pĂ”hjus on see, et tööjaotamine nende instantside vahel ei ole ĂŒhtlane. MĂ”ni lĂ”petab varem, mĂ”ni hiljem. Kui kogu see asi toimuks ĂŒhe instantsi sees, siis ClickHouse oskaks ise andmed Ă”igesti lĂ”imede vahel jaotada.
Ja veel ĂŒks pĂ”hjus on see, et teil on protsessoritevaheline suhtlus TCP kaudu. Andmed tuleb serialiseerida, deserialiseerida ja see on tohutu hulk mikro-sharde. See ei tööta lihtsalt tĂ”husalt.

Veel ĂŒks antimÀÀratlemine, kuigi seda on raske antimÀÀratlemiseks pidada. See on suur hulk eelaggregatsiooni.
Ăldiselt on eelagregatsioon hea. Kui teil oli miljard rida ja te agreegasite selle ning nĂŒĂŒd on 1 000 rida, siis pĂ€ring toimub kohe. KĂ”ik on suurepĂ€rane. Nii saab teha. Selle jaoks on ClickHouse'is isegi spetsiaalne tabelitĂŒĂŒp AggregatingMergeTree, mis teeb inkrementaalset aggregeerimist, kui andmeid sisestatakse.
Aga on juhtumeid, kui arvate, et me peaksime andmeid selliselt kokku koondama ja veel teistmoodi kokku koondama. Ja mingis naaberosakonnas, millest ma ei soovi rÀÀkida, kasutatakse SummingMergeTree tabeleid summamiseks pÔhivÔtme jÀrgi, ja pÔhivÔtmena kasutatakse umbes 20 erinevat veergu. Muutsin mÔningaid veergude nimesid konspiratsiooni huvides, aga umbes nii need asjad on.

Ja tekivad sellised probleemid. Esiteks, andmete maht ei vĂ€hene piisavalt. NĂ€iteks vĂ€heneb see kolm korda. Kolm korda oleks hea hind, et lubada endale piiramatu analĂŒĂŒsi vĂ”imalusi, mis tekivad, kui andmed ei ole agreggeeritud. Kui andmed on agreggeeritud, siis saate analĂŒĂŒsi asemel vaid halva statistika.
Ja ja, mis seal eriti hĂ€irib? See, et need inimesed naaberosakonnast kĂ€ivad ja paluvad aeg-ajalt lisada veel ĂŒks veerg algusvĂ”tmesse. See tĂ€hendab, et oleme andmeid selliselt kokku kogunud, aga nĂŒĂŒd tahame natuke rohkem. Kuid ClickHouse'is ei saa algusvĂ”tit muuta. SeetĂ”ttu peab kirjutama mingisuguseid skripte C++-s. Ja mulle ei meeldi skriptid, isegi kui need on C++-s.
Ja kui vaadata, milleks ClickHouse loodi, siis mitteaggregeeritud andmed on just see stsenaarium, mille jaoks see on sĂŒndinud. Kui kasutate ClickHouse'i mitteaggregeeritud andmete jaoks, siis teete kĂ”ik Ă”igesti. Kui aggregeerite, siis see on mĂ”nikord andestatav.

Veel ĂŒks huvitav juhtum on pĂ€ringud lĂ”putus tsĂŒklis. Ma vahel lĂ€hen mĂ”nele tootmisserverile ja vaatan seal show processlist. Ja iga kord avastan, et toimub midagi kohutavat.
NĂ€iteks selline. Siit on kohe selge, et kĂ”ik oleks saanud teha ĂŒhe pĂ€ringuga. Lihtsalt kirjutage sinna url in ja nimekiri.

Miks on nii palju selliseid pĂ€ringute lĂ”pmatuid tsĂŒkleid â see on halb? Kui indeksit ei kasutata, siis toimub sul palju lĂ€bikĂ€ike samade andmete kaudu. Kuid kui indeksit kasutatakse, nĂ€iteks kui sul on pĂ”hivĂ”ti ru ja sa kirjutad url = millelegi. Sa arvad, et loetakse tabelist ĂŒht kindlat URL-i, siis kĂ”ik on korras. Aga tegelikult ei ole. Sest ClickHouse teeb kĂ”ike pakendatult.
Kui tal on vaja lugeda mingit andmevahemikku, loeb ta natuke rohkem, kuna clickHouseâi indeks on harv. See indeks ei luba leida tabelist ĂŒhte individuaalset rida, vaid ainult mingit vahemikku. Ja andmed tihendatakse plokkidena. Ăhe rea lugemiseks tuleb vĂ”tta terve plokk ja see lahti suruda. Ja kui sa teed kuhjaga pĂ€ringuid, siis sul on palju kattuvusi ja palju tööd tuleb sul ikka ja jĂ€lle teha.

Ja boonuseks vÔib öelda, et ClickHouse'is ei ole vaja karta isegi megabaidide ja isegi sadade megabaidide edastamist IN-sektsiooni. MÀletan meie praktikast, et kui MySQL-is edastame hulga vÀÀrtusi IN-sektsiooni, nÀiteks edastame 100 megabaiti mingisuguseid numbreid, siis MySQL tarbib 10 gigabaiti mÀlust ja rohkem ei juhtu midagi, kÔik töötab halvasti.
Ja teine asi on see, et ClickHouse'is, kui teie pĂ€ringud kasutavad indeksit, siis see ei ole kunagi aeglasem kui full scan, st kui tuleb lugeda peaaegu kogu tabelit, siis ta lĂ€heb jĂ€rjestikku ja loeb kogu tabelit. ĂhesĂ”naga, ta saadab end ise asja korda.
Kuid siiski on mÔned keerukused. NÀiteks see, et IN koos alam pÀringuga ei kasuta indeksit. Kuid see on meie probleem ja me peame seda parandama. Siin ei ole midagi fundamentaalset. Parandame seda.
Ja veel ĂŒks huvitav asi on see, et kui teil on vĂ€ga pikk pĂ€ring ja pĂ€ringute jaotatud töötlemine kĂ€ib, siis see vĂ€ga pikk pĂ€ring saadetakse igale serverile ilma kokkusurumiseta. NĂ€iteks 100 megabaiti ja 500 serverit. Seega edastatakse teie vĂ”rgus 50 gigabaiti. See saadetakse ja siis kĂ”ik lĂ”petatakse edukalt.
* juba kasutab; kÔik on korras, nagu lubatud.

Ja ĂŒsna sage juhtum, kui pĂ€ringud tulevad API-st. NĂ€iteks, kui olete loonud oma teenuse. Ja kui teie teenust keegi vajab, siis avate API ja juba kahe pĂ€eva pĂ€rast nĂ€ete, et toimub midagi ebaselget. KĂ”ik on ĂŒle koormatud ja tulevad mingid kohutavad pĂ€ringud, mida ei oleks kunagi pidanud olema.
Ja siin on lahendus. Kui olete API avanud, peate seda kÀrpima. NÀiteks, kehtestama mingid piirangud. Teisi normaalseid variante ei ole. Vastasel juhul kirjutatakse kohe skript ja tekivad probleemid.
Ja ClickHouse'is on spetsiaalne funktsioon â kvootide arvestus. Samuti saate edastada oma kvoodi vĂ”tme. See on nĂ€iteks kasutaja sisemine identifikaator. Ja kvoote arvestatakse sĂ”ltumatult igaĂŒhe jaoks.

NĂŒĂŒd veel ĂŒks huvitav asi. See on replikatsioon kĂ€sitsi juhtimisega.
Ma tean palju juhtumeid, kus, hoolimata sellest, et ClickHouse'il on sisseehitatud replikatsiooni tugi, replitseerivad inimesed ClickHouse'i kÀsitsi.
Milline on pÔhimÔte? Teil on andmetöötluse pipeline, mis töötab iseseisvalt, nÀiteks erinevates andmekeskustes. Te kirjutate andmed ClickHouse'i samal viisil. TÔsi, praktika nÀitab, et andmed lÀhevad siiski lahku, kuna teie koodis on mÔningaid eripÀrasid. Loodan, et see ei kehti teie kohta.
Ja perioodiliselt peate ikkagi kĂ€sitsi sĂŒnkroonima. NĂ€iteks kord kuus teevad adminnid rsync'i.
TĂ”epoolest, ClickHouse'is on palju lihtsam kasutada sisseehitatud replikatsiooni. Kuid siin vĂ”ivad olla teatud vastunĂ€idustused, kuna selleks tuleb kasutada ZooKeeper'i. Ma ei ĂŒtle ZooKeeper'i kohta halba, sisuliselt on sĂŒsteem töökindel, kuid mĂ”nikord ei kasuta inimesed seda java-fobia tĂ”ttu, kuna ClickHouse on nii suurepĂ€rane sĂŒsteem, mis on kirjutatud C++-s ja millega saab ikka ideaalselt töötada. Aga ZooKeeper on java peal. Ja seda ei tahaks isegi vaadata, kuid juhul kui, siis vĂ”ite kasutada manuaalisel pĂ”hinevat replikatsiooni.

ClickHouse on praktiline sĂŒsteem. See arvestab teie vajadusi. Kui teil on replikatsioon kĂ€sitsi kĂ€ivitatud, saate luua jaotatud tabeli, mis vaatab teie kĂ€sitsi replikate poole ja teostab nende vahel automaatse ĂŒlemineku. On isegi eriline valik, mis aitab vĂ€ltida tĂ”rkeid, isegi kui teie replikad pidevalt eralduvad.

Edasi vÔivad tekkida probleemid, kui kasutate primitiivseid tabelimootoreid. ClickHouse on selline ehitaja, kus on palju erinevaid tabelimootoreid. KÔigi tÔsiste juhtumite jaoks, nagu dokumentatsioonis on kirjutatud, kasutage MergeTree perekonna tabeleid. KÔik teised on lihtsalt erijuhtudeks vÔi testimiseks.
MergeTree tabelis ei ole tingimata vajalik, et teil oleks mingi kuupÀev ja kellaaeg. VÔite ikkagi kasutada. Kui kuupÀeva ja kellaaega pole, kirjutage, et vaikevÀÀrtus on 2000. aasta. See töötab ja ei nÔua ressursse.
Ja uues serveriversioonis on isegi vÔimalik nÀidata, et teil on kohandatud partitseerimine ilma partitsiooni vÔtmeta. See on sama asi.

Teisest kĂŒljest on vĂ”imalik kasutada primitiivseid tabelimootoreid. NĂ€iteks laadige andmed ĂŒks kord, vaadake neid, keerake ringi ja eemaldage. Saate kasutada Log.
VĂ”i vĂ€ikeste mahtude salvestamine vahepealseks töötlemiseks â see on StripeLog vĂ”i TinyLog.
Memory vÔib kasutada, kui andmemahu on vÀike ja lihtsalt keerata midagi mÀletsejas.

ClickHouse ei armasta vĂ€ga ĂŒleliigselt normaliseeritud andmeid.
Siin on tĂŒĂŒpiline nĂ€ide. See on tohutu hulk URL-e. Te panite need naabertabelisse. Ja siis otsustasite nendega JOIN teha, kuid see ei tööta tavaliselt, kuna ClickHouse toetab ainult Hash JOIN-i. Kui mĂ€lu ei piisa paljude andmete jaoks, millega tuleb ĂŒhendada, ei saa JOIN-i teostada*.
Kui andmed on suure kardinaalsusega, siis Àrge muretsege, hoidke neid denormeeritud kujul, URL-id otse pÔhitahel.
* kuid nĂŒĂŒd on ClickHouse'il ka merge join ja see töötab tingimustes, kus vaheandmed ei mahuta mĂ€llu. Kuid see ei ole efektiivne ja soovitus jÀÀb kehtima.

Veel paar nĂ€idet, kuid nĂŒĂŒd kahtlen, kas need on antipatternid vĂ”i mitte.
ClickHouse'il on ĂŒks tuntud puudus. See ei toeta uuendusi*. MĂ”nes mĂ”ttes on see isegi hea. Kui teil on olulised andmed, nĂ€iteks raamatupidamine, siis ei saa keegi neid saata, kuna uuendusi ei ole.
* uuenduse ja kustutamise tugi on juba ammu lisatud batch-reĆŸiimis.
Kuid on mĂ”ned erilised viisid, mis vĂ”imaldavad uuendusi peaaegu 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 viib kogu partitsiooni ĂŒmberkirjutamiseni.
Jaotatud JOIN'id ClickHouse'is â need on samuti halva pĂ€ringuplaanijaga.
Halb, aga mÔnikord okei.
ClickHouse'i kasutamine ainult selleks, et andmeid tagasi lugeda select* abil.
Ma ei soovitaks ClickHouse'i kasutada mahukate arvutuste jaoks. Kuid see pole pĂ€ris nii, kuna me juba eemaldume sellest soovitusest. Ja meil on hiljuti lisandunud vĂ”imalus rakendada masinĂ”ppemudeleid ClickHouse's â Catboost. Ja see teeb mind murelikuks, sest ma mĂ”tlen: âKui hirmus. Kui palju takte ĂŒhe byte'i kohta tuleb!â. Mul on vĂ€ga kahju, kui takte byte'ide peale kulutada.

Aga Ă€rge kartke, installige ClickHouse, kĂ”ik lĂ€heb hĂ€sti. Kui midagi juhtub, on meil kogukond. Ătleme nii, et see olete teie. Ja kui teil on mingeid probleeme, saate vĂ€hemalt meie vestlusesse astuda ja loodetavasti saavad nad teid aidata.
KĂŒsimused
AitĂ€h ettekande eest! Kuhu saab ClickHouse'i tĂ”rgete ĂŒle kaevata?
VÔite pöörduda minu poole isiklikult juba praegu.
Ma hakkasin hiljuti ClickHouse'i kasutama. TÔmbasin kohe cli liidese alla.
Teil on vedanud.
Hiljem tÔmbasin serveri alla vÀikese selectiga.
Teie talent on silmapaistev.
Avasin GitHubis vea, kuid see jÀeti tÀhelepanuta.
Vaatan, mis juhtub.
Aleksandr tÔmbas mind ettekandele, lubades rÀÀkida, kuidas te andmeid pressite.
See on vÀga lihtne.
Selle sain eile aru. Rohkem konkreetsust.
Seal pole mingeid hirmsaid nippe. Seal on lihtsalt plokkide pÔhine kompressioon. Vaikimisi kasutatakse LZ4, kuid saate lubada ZSTD*. Plokid on suurusega 64 kilobaiti kuni 1 megabait.
* on saadaval ka spetsialiseeritud kompressioonikoodikud, mida saab kasutada koos teiste algoritmidega.
Kas plokkides on lihtsalt toored andmed?
Ei ole pÀris toored. Seal on massiivid. Kui teil on numbriline veerg, siis on seal numbrid jÀrjestikku massiivis paigutatud.
Selge.
Aleksandr, nĂ€ide, mis oli uniqExact'i puhul IP-aadressidega, st see, et uniqExact'i arvutamine stringide pealt vĂ”tab kauem aega kui numbrite pealt ja nii edasi. Aga kui me kasutame nippe ja teisendame lugemise ajal? St te ĂŒtlesite, et ketas ei erine meil palju. Kui me loeme kettalt stringe ja teisendame need, kas meie aggregeerimine siis kiireneb vĂ”i mitte? VĂ”i saame me ikkagi siin vaid vĂ€he parema tulemuse? Mul on tunne, et te olete seda testinud, kuid mingil pĂ”hjusel ei nĂ€idanud seda tulemuste vĂ”rdluses.
Ma arvan, et see on aeglasem kui ilma teisendamiseta. Sel juhul tuleb IP-aadress stringist vĂ€lja lugeda. Meil on ClickHouse's IP-aadresside parsimine samuti optimeeritud. Me oleme selle nimel tĂ”esti vaeva nĂ€inud, kuid seal on ju numbrid salvestatud kĂŒmnendikku vormi. See on tĂ”eliselt ebamugav. Teisest kĂŒljest töötab uniqExact stringide pealt aeglasemalt mitte ainult seetĂ”ttu, et need on stringid, vaid ka seetĂ”ttu, et valitakse teine algoritmi spetsialiseerumine. Stringe töödeldakse lihtsalt teisiti.
Aga kui vĂ”tta mĂ”ni primitiivsem andmetĂŒĂŒp? NĂ€iteks oleme salvestanud kasutaja ID, mis meil on sisse, salvestanud selle stringina ja siis teisendame, kas oleks toredam vĂ”i mitte?
Ma kahtlen. Arvan, et see on isegi kurvem, sest numbrite parsimine on tĂ”sine probleem. Tundub, et sellel kolleegil oli isegi ettekande teema, kuidas on keeruline numbreid kĂŒmne tuhandes vormis parsida, vĂ”i vĂ”ib-olla ei olnud?
Aleksei, suur aitĂ€h ettekande eest! Ja samuti suur aitĂ€h ClickHouse'i eest! Mul on kĂŒsimus plaanide kohta. Kas plaanis on funktsiooni, mis vĂ”imaldab sĂ”nastike osalisi uuendusi?
Ehk osaline taaskÀivitamine?
Jah-jah. TÔenÀoliselt vÔimalus mÀÀrata seal MySQL vÀli, st uuendada 'after', et laadida ainult need andmed, kui sÔnastik on vÀga suur.
VÀga huvitav funktsioon. Ja mulle tundub, et keegi inimene oli seda meie vestluses soovitanud. VÔib-olla olite see isegi teie.
Ei arva, et mina.
SuurepĂ€rane, nĂŒĂŒd on kaks pĂ€ringut. Ja nĂŒĂŒd saab rahulikult alustada. Kuid tahan teid kohe hoiatada, et see funktsioon on piisavalt lihtne rakendada. St idee on kirjutada lihtsalt tabelisse versiooninumber ja edasi kirjutada: versioon on vĂ€iksem kui see ja see. Ja see tĂ€hendab, et tĂ”enĂ€oliselt pakume seda huvilistele. Kas olete huviline?
Jah, kuid kahjuks mitte C++-s.
Kas teie kolleegid oskavad C++-s kirjutada?
Leian kedagi.
SuurepÀrane.
* vĂ”imalus lisati kaks kuud pĂ€rast ettekannet â selle arendas vĂ€lja kĂŒsimuse autor ja saatis selle edasi .
AitÀh!
Tere! AitĂ€h ettekande eest! Te mainisite, et ClickHouse tarbib kĂ”iki talle saadaval olevaid ressursse vĂ€ga hĂ€sti. Ja ettekandja, kes oli Glassifti kĂ”rval, rÀÀkis oma lahendusest Post Vene tagasi. Ta ĂŒtles, et neile meeldis ClickHouse vĂ€ga, kuid nad ei kasutanud seda oma peamise konkurendi asemel, just sellepĂ€rast, et see vĂ”ttis kĂ”ik protsessori jĂ”u. Ja nad ei suutnud seda oma arhitektuuri, oma ZooKeeperi ja konteineritega integreerida. Kas on vĂ”imalik mingil moel piirata ClickHouse'i, et see ei tarbiks kĂ”ike, mis talle kĂ€tte saadav on?
Jah, on vĂ”imalik ja vĂ€ga lihtne. Kui soovite, et vĂ€hem tuumasid tarbitakse, kirjutage lihtsalt set max_threads = 1. Ja kĂ”ik, see tĂ€idab pĂ€ringu ĂŒhe tuumaga. TĂ”si, erinevatele kasutajatele saab mÀÀrata erinevaid seadeid. Nii et probleeme pole. Ja edastage oma kolleegidele Glassiftis, et nad ei leidnud seda seadet dokumentatsioonist, see pole hea.
Tere, Aleksei! Soovin kĂŒsida sellist kĂŒsimust. See ei ole esimene kord, kui kuulen, et paljud hakkavad kasutama ClickHouse'i logide salvestamiseks. Esitluses rÀÀkisite, et seda ei peaks tegema, ehk siis pikki ridu ei tohiks salvestada. Kuidas te sellele suhtute?
Esiteks, logid ei ole reeglina pikad read. Loomulikult on erandeid. NĂ€iteks, kui mĂ”ni teenus, mis on kirjutatud Java's, viskab exception'i, siis see logitakse. Ja nii lĂ”putus tsĂŒklis, kuni kĂ”vakettal ei jĂ€tku ruumi. Lahendus on vĂ€ga lihtne. Kui read on liiga pikad, siis kĂ€rpige neid. Mis tĂ€hendab liiga pikka? KĂŒmneid kilobaiti â see on halb.
* Uutes ClickHouse'i versioonides on sisse lĂŒlitatud "kohandatav granulaarsus indekseerimisel", mis enamikus ulatuses eemaldab pika rida hoidmise probleemi.
Aga kilobait â see on normaalne?
Normaalne.
Tere! AitĂ€h ettekande eest! Ma juba kĂŒsisin sellest vestluses, aga ei mĂ€leta, kas sain vastuse. Kas plaanitakse laiendada WITH jaotist nagu CTE?
Praegu ei. Meie WITH jaotis on pigem tÔsiseltvÔetmatu. See on meil nagu vÀike funktsioon.
MÔistan. AitÀh!
AitĂ€h ettekande eest! VĂ€ga huvitav! Ăks globaalne kĂŒsimus. Kas plaanitakse luua, vĂ”ib-olla, mingite suunavate lahenduste kaudu andmete kustutamise muudatusetappi?
Kindlasti. See on meie prioriteetide nimekirjas esimene ĂŒlesanne. Me oleme aktiivselt vĂ€lja mĂ”elnud, kuidas kĂ”ike Ă”igesti teha. Ja on aeg hakata klaviatuurile vajutama*.
* vajutasime klahve klaviatuuril ja tegime kÔik korda.
Kas see mĂ”jutab kuidagi sĂŒsteemi jĂ”udlust vĂ”i mitte? Kas sisestamine jÀÀb sama kiireks kui praegu?
VÔib-olla on kustutamised ja uuendused vÀga keerulised, kuid see ei mÔjuta valikute ja sisestuste jÔudlust.
Ja veel ĂŒks vĂ€ike kĂŒsimus. Esitluses rÀÀkisite primaarvĂ”tmega. Seega on meil partitsioneerimine, mis on vaikimisi kuupĂ”hine, eks? Ja kui mÀÀrame kuupĂ€evade vahemiku, mis mahub kuusse, loetakse ainult see partitsioon, eks?
Jah.
Tavaliselt tekib kĂŒsimus: kui me ei suuda mÀÀrata mingit primaarset vĂ”tit, kas on Ă”ige teha seda âKuupĂ€evaâ vĂ€lja alusel, et vĂ€hendada taustal nende andmete ĂŒmberstruktureerimist ja muuta need paremini organiseerituks? Kui teil ei ole vahemikupĂ€ringuid ja te ei suuda valida ĂŒhtegi primaarset vĂ”tit, siis kas on mĂ”tet kuupĂ€eva primaarseks vĂ”tme panna?
Jah.
VĂ”ib-olla on mĂ”istlik lisada primaarsetesse vĂ”tmetesse vĂ€li, mille alusel andmed lĂ€bivad paremini tihendamist, kui need on selle vĂ€lja jĂ€rgi jĂ€rjestatud. NĂ€iteks kasutaja identifikaator. Kasutaja kĂŒlastab sama saiti. Sellisel juhul lisage kasutaja ID ja aeg. Siis tihendatakse teie andmed paremini. KuupĂ€eva osas, kui teil tĂ”eliselt ei ole ja ei ole kunagi vahemikupĂ€ringuid kuupĂ€evade jĂ€rgi, siis ei pea kuupĂ€eva primaarsetesse vĂ”tmetesse lisama.
AitÀh, suur aitÀh!
Allikas: habr.com
