Kolime ClickHouse'ile: kolm aastat hiljem

Kolm aastat tagasi rÀÀkis Viktor Tarnavski ja Aleksei Milovidov Yandexist laval HighLoad++ olen rÀÀkinud, kui hea ClickHouse on ja kuidas see ei aeglusta. Samuti oli naaber laval Aleksandr Zaitsev koos ettekanne rÀÀkimas ĂŒleminekust ClickHouse teise analĂŒĂŒtilise DBMS-i ja jĂ€reldusega, et ClickHouse, muidugi, hea, kuid mitte vĂ€ga mugav. Kui 2016. aastal ettevĂ”te LifeStreet, kus Aleksandr toona töötas, tĂ”i mitme petabaiti analĂŒĂŒtilise sĂŒsteemi ĂŒle ClickHouse, oli see pĂ”nev "kollaste telliste teed" tĂ€is tundmatuid ohtusid — ClickHouse toona meenutas miinivĂ€lja.

Kolm aastat hiljem ClickHouse on palju parem — selle aja jooksul asutas Aleksandr ettevĂ”tte Altinity, mis mitte ainult ei aita ĂŒleminekuid ClickHouse kĂŒmnetele projektidele, vaid tĂ€iustavad ka toodet koos Yandexi kolleegidega. Praegu ClickHouse ei ole see enam muretu jalutuskĂ€ik, kuid see pole ka enam miinivĂ€li.

Aleksandr tegeleb jaotatud sĂŒsteemidega alates 2003. aastast, on arendanud suuri projekte MySQL, Oracle ja Vertica. TĆĄihtud HighLoad++ 2019 rÀÀkis Aleksandr, ĂŒks pioneeridest, kes kasutas ClickHouse, milline on nĂŒĂŒd see DBMS. Saame teada peamistest omadustest ClickHouse: milline ta sĂŒsteemidest erineb ja millistel juhtudel on selle kasutamine tĂ”husam. Vaadates nĂ€iteid, kĂ€sitleme vĂ€rskeid ja katsetatud praktikaid sĂŒsteemide loomisel ClickHouse.

Vaata videot

Tagasivaade: mis toimus 3 aastat tagasi

Kolm aastat tagasi tĂ”lkisime ettevĂ”tte LifeStreet jĂ€rgnevaga ClickHouse teise analĂŒĂŒsibaasi, ja reklaamivĂ”rgu analĂŒĂŒsi migratsioon nĂ€gi vĂ€lja jĂ€rgmiselt:

  • Juuni 2016. Aastal OpenSource ilmus ClickHouse ja meie projekt kĂ€ivitati;
  • August. Proof Of Concept: suur reklaamivĂ”rk, infrastruktuur ja 200–300 terabaiti andmeid;
  • Oktoober. Esimesed tootmisandmed;
  • Detsember. TĂ€ielik tootekoormus — 10–50 miljardit sĂŒndmust pĂ€evas.
  • Juuni 2017. Edukas kasutajate ĂŒleviimine ClickHouse, 2,5 petabaiti andmeid 60 serverist koosnevas klastris.

Migratsiooni kĂ€igus kasvas arusaamine, et ClickHouse — see on hea sĂŒsteem, millega on mugav töötada, kuid see on Yandexi sisemine projekt. SeetĂ”ttu on teatud nĂŒansid: Yandex hakkab esmalt tegelema oma siseste tellijatega ja alles hiljem — kogukonna ja vĂ€liste kasutajate vajadustega, ning tol ajal ei olnud ClickHouse paljuski ettevĂ”tte tasemel. SeetĂ”ttu asutasime mĂ€rtsis 2017 Altinity ettevĂ”tte, et teha ClickHouse veel kiiremini ja mugavamalt mitte ainult Yandexile, vaid ka teistele kasutajatele. Ja nĂŒĂŒd me:

  • Koolitame ja aitame lahendusi ĂŒles ehitada ClickHouse nii, et kliendid ei teeks vigu ja et lahendus töötab lĂ”puks hĂ€sti;
  • Tagame 24/7 toe ClickHouse-paigaldustele;
  • Arendame oma ökosĂŒsteemi projekte;
  • Aktiivselt panustame ise ClickHouse, vastates kasutajate soovidele, kes tahavad nĂ€ha teatud funktsioone.

Ja muidugi aitame ĂŒleminekuga ClickHouse koos MySQL, Vertica, Oracle, Greenplum, Redshift ja teistesse sĂŒsteemidesse. Oleme osalenud erinevates ĂŒleminekutes, ja need on kĂ”ik olnud edukaid.

Kolime ClickHouse'ile: kolm aastat hiljem

Miks ĂŒldse ĂŒleminekut teha ClickHouse

Ei seisak! See on peamine pĂ”hjus. ClickHouse — vĂ€ga kiire andmebaas erinevate stsenaariumide jaoks:

Kolime ClickHouse'ile: kolm aastat hiljem

Juhuslikud tsitaadid inimestelt, kes on pikka aega töötanud ClickHouse.

Skaalautuvus. MĂ”nes teises andmebaasis vĂ”ib ĂŒhel masinal saavutada korralikku sooritust, kuid ClickHouse saa skaleerida mitte ainult vertikaalselt, vaid ka horisontaalselt, lihtsalt lisades servereid. KĂ”ik ei tööta nii sujuvalt, kui sooviks, kuid toimib siiski. SĂŒsteemi saab kasvatada koos Ă€ri kasvuga. Oluline on see, et me ei ole piiratud praeguse lahendusega ja arengu potentsiaal on alati olemas.

Portatiivsus. Pole ĂŒksnes millelegi kinni seotud. NĂ€iteks, koos Amazon Redshift on raske kuhugi ĂŒle minna. Aga ClickHouse saab selle paigaldada oma sĂŒlearvutisse, serverisse, juurutada pilve, minna Kubernetes — infrastruktuuri kasutamise osas pole piiranguid. See on mugav kĂ”igile ja on suur eelis, mis ei ole paljudel teistel sarnastel andmebaasidel.

Paindlikkus. ClickHouse ei piira end ĂŒhe asjaga, nĂ€iteks Yandex.Metrica, vaid areneb ja seda kasutatakse ĂŒha suuremas ja suuremas arvus erinevates projektides ja valdkondades. Seda saab laiendada, lisades uusi funktsioone uute probleemide lahendamiseks. NĂ€iteks peetakse logide hoidmist andmebaasis arusaamatuks, seetĂ”ttu mĂ”eldi vĂ€lja Elasticsearch. Aga tĂ€nu paindlikkusele ClickHouse, selles saate samuti logisid hoida, tihti isegi paremini kui Elasticsearch — in ClickHouse see nĂ”uab 10 korda vĂ€hem riistvara.

Tasuta Avatud lĂ€htekood. Selle eest ei pea midagi maksma. Ei pea kĂŒsima luba, et installida sĂŒsteemi enda sĂŒlearvutisse vĂ”i serverisse. Peidetud tasusid ei ole. Samuti ei saa ĂŒkski teine avatud lĂ€htekoodiga andmebaasitehnoloogia kiiruselt konkureerida ClickHouse. MySQL, MariaDB, Greenplum — kĂ”ik nad on palju aeglasemad.

Kogukond, vaim ja lÔbu.Siin on ClickHouse suurepÀrane kogukond: kohtumised, vestlusgrupid ja Aleksei Milovidov, kes laadib meid kÔik oma energiaga ja optimistikusega.

Üleminek ClickHouse'ile

Üleminekuks ClickHouse millestki, on vaja vaid kolme asja:

  • MĂ”ista piiranguid ClickHouse ja milleks see ei sobi.
  • Kasutada tehnoloogia eeliseid ja selle kĂ”ige tugevamaid kĂŒlgi.
  • Katsetada.Isegi mĂ”istes, kuidas see töötab ClickHouse, ei ole alati vĂ”imalik ennustada, millal see on kiirem, millal aeglasem, millal parem ja millal halvem. SeetĂ”ttu proovige.

Ülemineku probleem

On ainult ĂŒks „aga”: kui ĂŒleminek toimub ClickHouse millegilt mujalt, siis tavaliselt lĂ€heb midagi valesti. Oleme harjunud teatud praktikate ja asjadega, mis toimivad meie lemmikandmebaasis. NĂ€iteks iga inimene, kes on töötanud SQAndmebaaside puhul peetakse vajalikuks sellist funktsioonide kogumit:

  • tehingud;
  • piirangud;
  • kooskĂ”la;
  • indeksid;
  • UPDATE/DELETE;
  • NULLid;
  • millisekundid;
  • automaatsete tĂŒĂŒpide konverteerimised;
  • mitmikliitumised;
  • meelevaldsed partitsioonid;
  • klastrihalduse tööriistad.

Kogum on vajalik, aga kolm aastat tagasi ei olnud ĂŒhtegi neist funktsioonidest! ClickHouse Praegu on teostamata jÀÀnud vĂ€hem kui pool: tehingud, piirangud, kooskĂ”la, millisekundid ja tĂŒĂŒpide konverteerimised.

Ja mis kĂ”ige tĂ€htsam — see, et ClickHouse mĂ”ned standardpraktikad ja lĂ€henemisviisid ei tööta vĂ”i ei toimi nii, nagu me harjunud oleme. KĂ”ik, mis ilmub ClickHouse, vastab "ClickHouse'i viisile", st funktsioonid erinevad teistest andmebaasidest. NĂ€iteks:

  • Indekseid ei valita, vaid neid vahele jĂ€etakse.
  • UPDATE/DELETE need ei ole sĂŒnkroonsed, vaid asĂŒnkroonsed.
  • Mitmikliitumised on olemas, kuid pĂ€ringute planeerijat ei ole. Kuidas nad siis tĂ€idetakse, pole andmebaasi maailmast tulijatele ĂŒldse arusaadav.

ClickHouse'i stsenaariumid

1960. aastal kirjutas Ameerika matemaatik Ungari pĂ€ritoluga Wigner E. P. artikli "Matemaatika ebaĂ”iglane efektiivsus looduslikes teadustes» («Matemaatika hĂ€mmastav efektiivsus looduslikes teadustes») rÀÀgib sellest, et ĂŒmbritsev maailm kirjeldab kuidagi hĂ€sti matemaatilisi seadusi. Matemaatika on abstraktne teadus, kuid fĂŒĂŒsikaseadused, mis on vĂ€ljendatud matemaatilises vormis, ei ole triviaalset laadi, ja Wigner E. P. rĂ”hutas, et see on vĂ€ga kummaline.

Minu arvates, ClickHouse on see sama kummalisus. Ümber sĂ”nastades Wignerit, vĂ”ib öelda: hĂ€mmastav on matemaatika hĂ€mmastav efektiivsus ClickHouse nii erinevates analĂŒĂŒtilistes rakendustes!

Kolime ClickHouse'ile: kolm aastat hiljem

NĂ€iteks, vĂ”tame Reaalajas Andmehoidla, kuhu andmeid laaditakse praktiliselt pidevalt. Soovime saada sellelt pĂ€ringuid sekundilise viivitusega. Palun — kasutame ClickHouse, sest see ongi selle stsenaariumi jaoks vĂ€lja töötatud. ClickHouse Nii kasutatakse seda mitte ainult veebis, vaid ka turunduse ja finantsanalĂŒĂŒsis, AdTech, samuti petuvastasestuge. Reaalajas Andmehoidlas kasutatakse keerulist struktureeritud skeemi tĂŒĂŒpi 'tĂ€ht' vĂ”i 'lumesahk', palju tabeleid ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ŃĐ»ĐŸĐ¶ĐœĐ°Ń струĐșŃ‚ŃƒŃ€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐ°Ń ŃŃ…Đ”ĐŒĐ° топа «зĐČДзЎа» ОлО Â«ŃĐœĐ”Đ¶ĐžĐœĐșа», ĐŒĐœĐŸĐłĐŸ таблОц с JOIN (mĂ”nikord mitu), ja andmed on tavaliselt salvestatud ja muudetud mingites sĂŒsteemides.

VĂ”tame teise stsenaariumi — Aja seeria: seadmete, vĂ”rkude jĂ€lgimine, kasutusstatistika, asjade internet. Siin kohtame ajaliselt jĂ€rjestatud ĂŒsna lihtsaid sĂŒndmusi. ClickHouse selleks ei olnud algselt vĂ€lja töötatud, kuid on end hĂ€sti tĂ”estanud, seetĂ”ttu kasutavad suured ettevĂ”tted ClickHouse monitooringu teabe ladustamiseks. Et uurida, kas see sobib ClickHouse ajaseeria jaoks, tegime meie lĂ€henemise ja tulemuste pĂ”hjal benchmĂ€rgi InfluxDB ja TimescaleDB — spetsialiseeritud ajaseeria andmebaasid. Selgub, et ClickHouse, isegi ilma selliste ĂŒlesannete optimeerimiseta, vĂ”idab ja teistel vĂ€ljakutel:

Kolime ClickHouse'ile: kolm aastat hiljem

V ajaseeria kasutatakse tavaliselt kitsast tabelit — mitu vĂ€ikest veergu. Monitooringu kaudu vĂ”ib tulla vĂ€ga palju andmeid — miljoneid kirjeid sekundis — ja tavaliselt saabuvad need vĂ€ikeste lisandustega (reaalajas voogedastusega). SeetĂ”ttu on vajalik teine sisestusskenaar, samal ajal kui pĂ€ringud on oma teatud spetsiifikaga.

Logihaldus. Logide kogumine andmebaasi — see on tavaliselt halb, kuid ClickHouse seda on vĂ”imalik teha teatud kommentaaridega, nagu eespool kirjeldatud. Paljud ettevĂ”tted kasutavad ClickHouse tĂ€pselt selleks. Sellisel juhul kasutatakse tasast laia tabelit, kus hoiame logisid tervikuna (nĂ€iteks kujul JSON), vĂ”i lĂ”igatakse tĂŒkkideks. Andmed laaditakse tavaliselt suurte partiidena (failidena) ja otsitakse mingi vĂ€lja jĂ€rgi.

Iga nende funktsioonide jaoks kasutatakse tavaliselt spetsialiseeritud andmebaase. ClickHouse ĂŒks vĂ”ib seda kĂ”ike teha nii hĂ€sti, et ĂŒletab neid vĂ”imekuses. Vaatame nĂŒĂŒd lĂ€hemalt ajaseeria stsenaariumi ja seda, kuidas Ă”igesti "valmistada" ClickHouse seda stsenaariumi.

Aja-jÀrgne

Praegu on see peamine stsenaarium, mille jaoks ClickHouse peetakse standardlahenduseks. Aja-jĂ€rgne on ajas jĂ€rjestatud sĂŒndmuste kogum, mis esindab mingi protsessi muutusi ajas. NĂ€iteks see vĂ”ib olla sĂŒdame löögisagedus pĂ€eva jooksul vĂ”i sĂŒsteemis toimuvate protsesside arv. KĂ”ik, mis annab ajateike koos mÔÔtmistega – see on ajaseeria:

Kolime ClickHouse'ile: kolm aastat hiljem

Seda tĂŒĂŒpi sĂŒndmusi tuleb kĂ”ige rohkem jĂ€lgimisest. See vĂ”ib olla mitte ainult veebijĂ€lgimine, vaid ka reaalsete seadmete jĂ€lgimine: autod, tööstussĂŒsteemid, IoT, tootmine vĂ”i isesĂ”itvad taksod, mille pagasiruumi Yandex juba praegu paneb ClickHouse-server.

NĂ€iteks on ettevĂ”tteid, mis koguvad andmeid laevadelt. Iga paari sekundi tagant saadavad konteineritelt sensorid sadu erinevaid mÔÔtmisi. Ingeniirid analĂŒĂŒsivad neid, loovad mudeleid ja pĂŒĂŒavad mĂ”ista, kui efektiivselt laeva kasutatakse, kuna konteinerilaev ei tohi seista hetkekski. Iga seismine tĂ€hendab rahakaotust, seega on oluline prognoosida marsruuti nii, et peatused oleksid minimaalsed.

Praegu on tĂ”usuteel spetsialiseeritud andmebaasid, mis mÔÔdavad ajaseeria. Veebisaidil DB-Engines kuidas erinevad andmebaasid kuidagi jĂ€rjestatakse ning neid saab vaadata tĂŒĂŒpide jĂ€rgi:

Kolime ClickHouse'ile: kolm aastat hiljem

Kiireimalt kasvav tĂŒĂŒp on aja-seeriad. Samuti kasvavad graafiku andmebaasid, kuid aja-seeriad kasvavad kiiremini viimasel paaril aastal. TĂŒĂŒpilised selle perekonna andmebaasid on InfluxDB, Prometheus, KDB, TimescaleDB (valmistatud PostgreSQL), lahendused Amazonilt. ClickHouse vĂ”ib siin samuti olla kasutusel, ja see on kasutusel. Toon mĂ”ned avalikud nĂ€ited.

Üks pioneere on ettevĂ”te CloudFlare (CDN-teenusepakkuja). Nad jĂ€lgivad oma CDN kaudu ClickHouse (DNS-pĂ€ringute, HTTP-pĂ€ringud) tohutu koormusega — 6 miljonit sĂŒndmust sekundis. KĂ”ik lĂ€heb lĂ€bi Kafka, saadetakse ClickHouse, mis vĂ”imaldab reaalajas jĂ€lgida sĂŒsteemi sĂŒndmuste armatuurlauas.

Comcast — ĂŒks juhtivaid telekommunikatsiooni ettevĂ”tteid USA-s: internet, digitaaltelevisioon, telefoniteenus. Nad on loonud sarnase juhtimissĂŒsteemi CDN raames Avatud lĂ€htekood projekt Apache Traffic Control oma tohutute andmete haldamiseks. ClickHouse kasutatakse analĂŒĂŒtika tagakĂŒljena.

Percona sisemiselt integreeritud ClickHouse oma PMM, et hoida silm peal erinevatel MySQL.

Spetsiifilised nÔuded

Aja-seeria andmebaasidel on omad spetsiifilised nÔuded.

  • Kiire sisestamine paljusid agente. Me peame vĂ€ga kiiresti andmeid paljust voogudest sisestama. ClickHouse teeb seda hĂ€sti, kuna kĂ”ik sisestamised pole blokeerivad. Iga insert on uus fail kettal, ning vĂ€ikseid sisestusi saab vahemĂ€llu salvestada erinevatel viisidel. ClickHouse On parem sisestada andmeid suurtes partiiades, mitte ĂŒhe rea haaval.
  • Paindlik skeem. Dokumendihalduses ajaseeria me ei tea tavaliselt andmete struktuuri tĂ€ielikult. Saame luua jĂ€lgimissĂŒsteemi konkreetse rakenduse jaoks, kuid siis on seda teise rakenduse jaoks keeruline kasutada. Selleks on vajalik paindlikum skeem. ClickHouse, vĂ”imaldab seda teha, isegi kui tegemist on rangelt tĂŒĂŒbitud andmebaasiga.
  • TĂ”hus andmete sĂ€ilitamine ja unustamine. Tavaliselt on tegemist ajaseeria hiiglaslike andmemĂ€gede, seetĂ”ttu tuleks need hoida vĂ”imalikult efektiivselt. NĂ€iteks, InfluxDB hea kompressioon — see on selle peamine omadus. Kuid peale salvestamise tuleb osata ka vanu andmeid "unustada" ja teha mingit downsampling — automaatne kogumite arvutamine.
  • Kiired taotlused kogutud andmetele. MĂ”nikord on huvitav vaadata viimaseid 5 minutit tĂ€psusega millisekundite kaupa, kuid kuumÔÔdud andmete puhul ei pruugi minutine vĂ”i sekundiline granulaarsus olla vajalik — piisab ĂŒldstatistikast. Taolise toe puudumine on vajalik, vastasel juhul vĂ”tab 3 kuu andmete pĂ€ring aega liiga kaua, isegi ClickHouse.
  • PĂ€ringud tĂŒĂŒpi "viimane punkt, seisuga». Need on tĂŒĂŒpilised ajaseeria pĂ€ringud: vaatame viimast mÔÔtmist vĂ”i sĂŒsteemi olekut antud ajahetkel t. Andmebaasides ei ole need pĂ€ringud kuigi meeldivad, kuid ka neid tuleb osata teostada.
  • "Aja jĂ€rjendite" kokkuvĂ”tmine. Aja-jĂ€rgne — see on ajaseeria. Kui on kaks ajaseeriat, tuleb neid tihti ĂŒhendada ja korreleerida. KĂ”ik andmebaasid ei vĂ”imalda seda mugavalt teha, eriti kui ajaseeriad ei ole ĂŒhtlustatud: siin on ĂŒhed ajakohased ja seal teised. Keskmised vÀÀrtused on vĂ”imalikud, kuid Ă€kki jÀÀb ikkagi auk, mistĂ”ttu jÀÀb segaseks.

Vaatame, kuidas neid nÔudeid tÀidetakse ClickHouse.

Skeem

V ClickHouse skeem ajaseeria vĂ”ib teha mitmeti, sĂ”ltuvalt andmete regulaarsetest omadustest. NĂ€iteks vĂ”ib koostada sĂŒsteemi regulaarsete andmete pĂ”hjal, kui me teame kĂ”iki metrikate eelnevalt. Nii on teinud CloudFlare monitooringuga CDN — see on hĂ€sti optimiseeritud sĂŒsteem. VĂ”ib luua ĂŒldisema sĂŒsteemi, mis jĂ€lgib kogu infrastruktuuri ja erinevaid teenuseid. EbaĂŒhtlaste andmete korral ei tea me, mida jĂ€lgime — see on tĂ”enĂ€oliselt kĂ”ige ĂŒldisem juhtum.

Regulaarsed andmed. Veerud. Skeem on lihtne – veerud vajalike tĂŒĂŒpidega:

LOODA TABEL cpu (
  created_date KuupÀev KOHUSTUSLIK tÀnasest,  
  created_at KuupĂ€evaAeg KOHUSTUSLIK nĂŒĂŒd,  
  time String,  
  tags_id UInt32,  /* liitmine dim_tagiga */
  usage_user Float64,  
  usage_system Float64,  
  usage_idle Float64,  
  usage_nice Float64,  
  usage_iowait Float64,  
  usage_irq Float64,  
  usage_softirq Float64,  
  usage_steal Float64,  
  usage_guest Float64,  
  usage_guest_nice Float64
) MOOTOR = MergeTree(created_date, (tags_id, created_at), 8192);

See on tavaline tabel, mis jĂ€lgib mingit sĂŒsteemi koormuse tegevust (kasutaja, sĂŒsteem, idle, nice). Lihtne ja mugav, kuid mitte paindlik. Kui soovime paindlikumat skeemi, vĂ”ime kasutada massiive.

EbaĂŒhtlased andmed. Massiivid:

LOODA TABEL cpu_alc (
  created_date KuupÀev,  
  created_at KuupÀevaAeg,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  )
) MOOTOR = MergeTree(created_date, (tags_id, created_at), 8192);

VALI max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

Struktuur Sissetoomine — need on kaks massiivi: metrics.name ja metrics.value. Siin saab salvestada selliseid juhuslikke jĂ€lgimisandmeid nagu nimede massiiv ja mÔÔtmete massiiv iga sĂŒndmuse juures. Edasiarendamiseks, efektiivsuse hoidmiseks, vĂ”ib selle struktuuri asemel luua mitu. NĂ€iteks ĂŒhe — float-vÀÀrtuse, teise — int-vÀÀrtuse, sest int soovime sĂ€ilitada tĂ”husamalt.

Aga sellise struktuuri kasutamine on keerulisem. Peate kasutama spetsiaalset konstruktsiooni, et esmalt indeksi vÀÀrtused ja seejÀrel massiivi vÀÀrtused vÀlja tuua:

SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

Kuid see töötab siiski piisavalt kiiresti. Teine viis ebaĂŒhtlaste andmete hoidmiseks on ridades.

EbaĂŒhtlased andmed. Read. Selles traditsioonilises meetodis hoitakse kohe nii nimesid kui ka vÀÀrtusi ilma massiivideta. Kui ĂŒhest seadmest tuleb korraga 5 000 mÔÔtmist — genereeritakse andmebaasis 5 000 rida:

CREATE TABLE cpu_rlc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metric_name LowCardinality(String),  
  metric_value Float64
) ENGINE = MergeTree(created_date, (metric_name, tags_id, created_at), 8192);


SELECT 
    maxIf(metric_value, metric_name = 'usage_user'),
    ... 
FROM cpu_r
WHERE metric_name IN ('usage_user', ...)

ClickHouse sellega toimib — sellel on erilised laiendid ClickHouse SQL. NĂ€iteks, maxIf — spetsiaalne funktsioon, mis arvutab maksimumi metrika pĂ”hjal teatud tingimuste tĂ€itmisel. Ühes pĂ€ringus saab kirjutada mitu sellist vĂ€ljendit ja kohe arvutada vÀÀrtuse mitme metrika jaoks.

VÔtame kolm lÀhenemist:

Kolime ClickHouse'ile: kolm aastat hiljem

Detailid

Siin olen lisanud „Andmete suurus kettal“ mĂ”ne testandmekogumi jaoks. Veergude puhul on meil kĂ”ige vĂ€iksem andmete suurus: maksimaalne tihendamine, maksimaalne pĂ€ringute kiirus, kuid me maksame selle eest, et peame kĂ”ik koheselt fikseerima.

Massiivide puhul on kĂ”ik veidi halvem. Andmed siiski tihenduvad hĂ€sti ja ebaĂŒhtlast skeemi on vĂ”imalik hoida. Aga ClickHouse — veergude andmebaas, ja kui hakkame kĂ”ike massiivis hoidma, siis see muutub reavahetuseks ning me maksame paindlikkuse eest tĂ”hususe arvelt. Iga operatsiooni jaoks tuleb kogu massiiv mĂ€llu lugeda, seejĂ€rel leida seest vajalik element — ja kui massiiv suureneb, siis kiirus halveneb.

Ühes ettevĂ”ttes, mis kasutab sellist lĂ€henemist (nĂ€iteks, Ubermassive kas vĂ”i 128 elemendist. Mitme tuhande mÔÔtme andmed koguses 200 TB andmeid/pĂ€evas ei hoita mitte ĂŒhes massiivis, vaid 10 vĂ”i 30 massiivis koos spetsiaalse loogikaga salvestamiseks.

Maksimaalselt lihtne lĂ€henemine — stringidega. Kuid andmed tihenduvad halvasti, tabeli suurus on suur, ja kui pĂ€ringud kĂ€ivad lĂ€bi mitme mÔÔtme, siis ClickHouse ei tööta optimaalselt.

HĂŒbriidskeem

Oletame, et oleme valinud skeemi massiiviga. Kui meil on teadlikkus, et enamus meie juhtpaneelidest nÀitab ainult user ja system mÔÔdikuid, saame tÀiendavalt massiivist tabeli tasandil need mÔÔdikud veergudesse materialiseerida jÀrgmiselt:

CREATE TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  ),
  usage_user Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_user')],
  usage_system Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_system')]
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

Sisestamisel ClickHouse loendab need automaatselt. Nii saab meeldivad ja kasulikud ĂŒhendatud: skeem on paindlik ja ĂŒldine, kuid kĂ”ige sagedamini kasutatavad veerud on Ă€ra tĂ”stetud. TĂ”den, et see ei nĂ”udnud muudatusi sisestamisel ja ETL, mis jĂ€tkab massiivide sisestamist tabelisse. Me lihtsalt tegime ALTER TABLE, lisasime mĂ”ned veerud ja saime hĂŒbriidse ning kiiremast skeemi, millega saab kohe alustada.

Koodekid ja kokkusurumine

Kuna ajaseeria on oluline, kui hÀsti te andmeid pakite, sest teave vÔib olla vÀga suur. ClickHouse on kompressioonivahendeid, mis saavutavad efekti 1:10, 1:20 ja mÔnikord isegi rohkem. See tÀhendab, et 1 TB kompressimata andmed kettal vÔtavad 50-100 GB. VÀiksem suurus on hea, andmete lugemine ja töötlemine on kiirem.

Korke kompressioonitaseme saavutamiseks, ClickHouse tugi jÀrgmisi koodekeid:

Kolime ClickHouse'ile: kolm aastat hiljem

NĂ€idis tabel:

CREATE TABLE benchmark.cpu_codecs_lz4 (
    created_date Date DEFAULT today(), 
    created_at DateTime DEFAULT now() Codec(DoubleDelta, LZ4), 
    tags_id UInt32, 
    usage_user Float64 Codec(Gorilla, LZ4), 
    usage_system Float64 Codec(Gorilla, LZ4), 
    usage_idle Float64 Codec(Gorilla, LZ4), 
    usage_nice Float64 Codec(Gorilla, LZ4), 
    usage_iowait Float64 Codec(Gorilla, LZ4), 
    usage_irq Float64 Codec(Gorilla, LZ4), 
    usage_softirq Float64 Codec(Gorilla, LZ4), 
    usage_steal Float64 Codec(Gorilla, LZ4), 
    usage_guest Float64 Codec(Gorilla, LZ4), 
    usage_guest_nice Float64 Codec(Gorilla, LZ4), 
    additional_tags String DEFAULT ''
)
ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

Siin mÀÀratleme koodeki DoubleDelta ĂŒhes juhus, teises — Gorilla, ja kindlasti lisame veel LZ4 kompressiooni. Tulemuseks on andmete suuruse mĂ€rkimisvÀÀrne vĂ€henemine kettal:

Kolime ClickHouse'ile: kolm aastat hiljem

Siin on nÀidatud, kui palju ruumi vÔtavad samad andmed, kuid erinevate koodekite ja kompressioonide kasutamisel:

  • GZIP-itud fail kettal;
  • ClickHouse'is ilma koodekideta, aga ZSTD-kompressiooniga;
  • ClickHouse'is koode ja LZ4 ning ZSTD kokkusurutud.

On selge, et koode sisaldavad tabelid vÔtavad palju vÀhem ruumi.

Suurus on oluline

Samuti on oluline valida Ă”ige andmetĂŒĂŒp:

Kolime ClickHouse'ile: kolm aastat hiljem

KĂ€itusin kĂ”igis ĂŒlaltoodud nĂ€idetes Float64. Aga kui me oleksime valinud Float32, siis oleks see isegi parem olnud. Seda on hĂ€sti demonstreeritud Percona meeskonna poolt ĂŒlaltoodud lingil. Oluline on kasutada vĂ”imalikult kompaktselt sobivat tĂŒĂŒpi: isegi vĂ€hem olulisel mÀÀral kettaruumi jaoks kui pĂ€ringute kiirus. ClickHouse on sellele vĂ€ga tundlik.

Kui saate kasutada int32 asetatakse int64, oodake peaaegu kahekordset jĂ”udluse suurenemist. Andmed vĂ”tavad vĂ€hem mĂ€lu ja kogu "aritmeetika" töötab palju kiiremini. ClickHouse ise — vĂ€ga rangelt tĂŒĂŒbitud sĂŒsteem, mis kasutab maksimaalselt Ă€ra kĂ”iki vĂ”imalusi, mida pakuvad kaasaegsed sĂŒsteemid.

Agregatsioon ja Materialized Views

Agregatsioon ja materialiseeritud vaated vÔimaldavad luua agregaatide erinevate olukordade jaoks:

Kolime ClickHouse'ile: kolm aastat hiljem

NÀiteks vÔivad teil olla mitteaggregeeritud allikandmed, millele saab rakendada erinevaid materialiseeritud vaateid automaatse kogumisega spetsiaalse mootori kaudu. SummingMergeTree (SMT). SMT on spetsiaalne aggregeeriv andmestruktuur, mis arvutab automaatset kogumist. Andmebaasi sisestatakse toored andmed, need aggregeeritakse automaatselt ja neid saab kohe kasutada juhtpaneelidel.

TTL unustame vanad andmed

Kuidas unustada andmeid, mis enam ei ole vajalikud? ClickHouse seda oskab teha. Tabeleid luues saab mÀÀrata TTL avaldisi: nĂ€iteks, et minutilised andmed hoiame ĂŒhe pĂ€eva, pĂ€evased — 30 pĂ€eva ja nĂ€dalased vĂ”i kuu andmeid ei puuduta kunagi:

CREATE TABLE aggr_by_minute


TTL time + interval 1 day

CREATE TABLE aggr_by_day


TTL time + interval 30 day

CREATE TABLE aggr_by_week


/* no TTL */

Multi-tier jagame andmed kettale

Arendades edasi seda ideed, saab andmeid hoida ClickHouse erinevates kohtades. Oletame, et tahame hoida kuumaid andmeid viimase nÀdala kohta vÀga kiirel kohalikke SSD, samas kui ajaloolised andmed paigutame mujale. TÀna on see vÔimalik: ClickHouse Saame konfigureerida sÀilitamise poliitikat (

Kolime ClickHouse'ile: kolm aastat hiljem

storage policy) nii, et) таĐș, Ń‡Ń‚ĐŸ ClickHouse andmed suunatakse automaatselt teise salvestusse pĂ€rast teatud tingimuste tĂ€itmist.

Kuid see ei ole veel kĂ”ik. Konkreetses tabelis saab mÀÀrata reeglid, millal andmed aja jooksul kĂŒlmale salvestusele ĂŒlevi kasutatakse. NĂ€iteks 7 pĂ€eva jooksul on andmed vĂ€ga kiirel kettal, ja kĂ”ik ĂŒle selle perioodi kantakse aeglasele kettale. See on hea, kuna see vĂ”imaldab sĂŒsteemil hoida maksimaalset jĂ”udlust, samal ajal jĂ€lgides kulutusi ja mitte raisates vahendeid kĂŒlmadele andmetele:

CREATE TABLE 
... 
TTL date + INTERVAL 7 DAY TO VOLUME 'cold_volume', 
    date + INTERVAL 180 DAY DELETE

Ainulaadsed vÔimalused ClickHouse

Peaaegu kĂ”iges on ClickHouse need 'ĆĄedörid', kuid need kaovad eksklusiivsuse tĂ”ttu — asjad, mida teistes andmebaasides ei ole. NĂ€iteks mĂ”ned ainulaadsed funktsioonid ClickHouse:

  • Massiivid. Dokumendihalduses ClickHouse vĂ€ga hea tugi massiividele, samuti vĂ”imalus neil keerulisi arvutusi teostada.
  • Agrrgateeritud andmestruktuurid. See on ĂŒks 'tapja omadustest' ClickHouse. Kuigi Yandexi mehed vĂ€idavad, et me ei soovi andmeid agregreerida, teeb seda kĂ”ik ClickHouse, sest see on kiire ja mugav.
  • Materjaliseeritud vaated. Koos koos andmete kogumise struktuuridega vĂ”imaldavad materialiseeritud vaated mugavat reaalajas kogumist.
  • ClickHouse SQL. See on keele laiendus SQL mĂ”ningate lisafunktsioonidega, mis on saadaval ainult ClickHouse. Varem oli see ĂŒhtpidi laiendus ja teistpidi puudus. NĂŒĂŒd oleme peaaegu kĂ”ik puudused vĂ”rreldes SQL 92 Ă€ra kaotanud, nĂŒĂŒd on see vaid laiendus.
  • Lambdaavaldised. Kas need on olemas ka teistes andmebaasides?
  • ML-tugi. See on erinevates andmebaasides, mĂ”nes paremini, mĂ”nes halvemini.
  • Avaallikakood. Me vĂ”ime koos laiendada ClickHouse praegu on ClickHouse umbes 500 kaastöötajat ja see arv kasvab pidevalt.

Ning kĂŒsimustes

V ClickHouse on palju erinevaid viise sama asja tegemiseks. NÀiteks saab viimast vÀÀrtust tabelist kolme erineva meetodiga tagastada CPU (on olemas ka neljas, kuid see on veel eksootilisem).

Esimene nÀitab, kui mugav on teha ClickHouse pÀringud, kui soovite kontrollida, et tuple on alampÀringis. Just seda ma isiklikult teistes andmebaasides vÀga tundsin. Kui ma tahan midagi alampÀringuga vÔrrelda, siis teistes andmebaasides saab seda vÔrrelda ainult skalaari, ja mitme veeru jaoks peab kirjutama JOIN. Dokumendihalduses ClickHouse saab kasutada tupleid:

SELECT *
  FROM cpu 
 WHERE (tags_id, created_at) IN 
    (SELECT tags_id, max(created_at)
        FROM cpu 
        GROUP BY tags_id)

Teine meetod teeb sama, kuid kasutab agregaatfunktsiooni argMax:

SELECT 
    argMax(usage_user, created_at),
    argMax(usage_system, created_at),
...
 FROM cpu 

V ClickHouse on mitukĂŒmmend agregaatfunktsiooni, ja kui kasutada kombinatoore, siis kommutatsiooni seaduste jĂ€rgi tuleb neid umbes tuhat. ArgMax — ĂŒks funktsioone, mis arvutab maksimaalse vÀÀrtuse: pĂ€ring tagastab vÀÀrtuse usage_user, millel saavutatakse maksimaalne vÀÀrtus created_at:

SELECT now() as created_at,
       cpu.*
  FROM (SELECT DISTINCT tags_id from cpu) base 
  ASOF LEFT JOIN cpu USING (tags_id, created_at)

ASOF JOIN — „ridade” „liimimine” erineva ajaga. See on ainulaadne funktsioon andmebaasides, mis on ainult kdb+. Kui on kaks ajasarja erineva ajaga, ASOF JOIN vĂ”imaldab neid ĂŒhe pĂ€ringuga nihutada ja kokku liita. Iga vÀÀrtuse jaoks ĂŒhes ajareas on lĂ€him vÀÀrtus teises, ja need tagastatakse ĂŒhel real:

Kolime ClickHouse'ile: kolm aastat hiljem

AnalĂŒĂŒtilised funktsioonid

Standardi jÀrgi SQL-2003 vÔib kirjutada nii:

SELECT origin,
       timestamp,
       timestamp -LAG(timestamp, 1) OVER (PARTITION BY origin ORDER BY timestamp) AS duration,
       timestamp -MIN(timestamp) OVER (PARTITION BY origin ORDER BY timestamp) AS startseq_duration,
       ROW_NUMBER() OVER (PARTITION BY origin ORDER BY timestamp) AS sequence,
       COUNT() OVER (PARTITION BY origin ORDER BY timestamp) AS nb
  FROM mytable
ORDER BY origin, timestamp;

V ClickHouse niimoodi ei saa — see ei toeta standardit SQL-2003 ja tĂ”enĂ€oliselt ei hakka kunagi seda tegema. Selle asemel on ClickHouse tavaline kirjutada nii:

Kolime ClickHouse'ile: kolm aastat hiljem

Lubasin lambdasid – siin nad on!

See on analoog analĂŒĂŒtilisest pĂ€ringust, mis on standardis SQL-2003: see arvutab kahe vahelise erinevuse timestamp, duration, jĂ€rjestusnumber — kĂ”ik, mida me tavaliselt loeme analĂŒĂŒtilisteks funktsioonideks. Me ClickHouse loeme neid massiivide kaudu: esmalt kokku surume andmed massiiviks, seejĂ€rel teeme massiivil kĂ”ik, mida soovime, ja seejĂ€rel avame tagasi. See ei ole vĂ€ga mugav, nĂ”uab armastust funktsionaalse programmeerimise vastu, vĂ€hemalt, kuid see on vĂ€ga paindlik.

Eri funktsioonid

Lisaks sellele on ClickHouse palju spetsialiseeritud funktsioone. NĂ€iteks, kuidas mÀÀrata, kui palju sessioone toimub korraga? TĂŒĂŒpiline jĂ€lgimise ĂŒlesanne on mÀÀrata maksimaalne koormus ĂŒhe pĂ€ringu kaudu. Selleks ClickHouse on spetsiaalne funktsioon:

Kolime ClickHouse'ile: kolm aastat hiljem

Üldiselt on ClickHouse'is palju spetsiaalseid funktsioone erinevate eesmĂ€rkide jaoks:

  • runningDifference, runningAccumulate, neighbor;
  • sumMap(key, value);
  • timeSeriesGroupSum(uid, timestamp, value);
  • timeSeriesGroupRateSum(uid, timestamp, value);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • WITH FILL / WITH TIES;
  • simpleLinearRegression, stochasticLinearRegression.

See ei ole tĂ€ielik funktsioonide nimekiri, neid on kokku umbes 500-600. NĂ€punĂ€ide: kĂ”ik funktsioonid ClickHouse leidub sĂŒsteemitabelis (kĂ”iki funktsioone ei ole dokumenteeritud, kuid kĂ”ik on huvitavad):

select * from system.functions order by name

ClickHouse hoiab endas palju teavet enda kohta, sealhulgas log tabelid, query_log, jĂ€lgimislogi, blokkmooduli operatsioonide logi (part_log), mÔÔdikute logi ja sĂŒsteemilog, mida ta tavaliselt kirjutab kettale. MÔÔdikute logi on ajaseeria ĂŒhes ClickHouse ĂŒldiselt ClickHouse: andmebaas ise vĂ”ib mĂ€ngida ajaseeria andmebaase, „imedes“ seega iseennast.

Kolime ClickHouse'ile: kolm aastat hiljem

See on samuti ainulaadne asi – kuna me teeme head tööd ajaseeria, miks mitte hoida endas kĂ”ike, mida vajame? Me ei vaja Prometheus, me hoiame kogu oma teabe endas. Me oleme ĂŒhendatud Grafana ja jĂ€lgime iseennast. Siiski, kui ClickHouse kui see kukub, siis me ei nĂ€e, — miks, — seega tavaliselt nii ei tehta.

Suur klaster vÔi palju vÀikeseid ClickHouse

Mis on parem — ĂŒks suur klaster vĂ”i palju vĂ€ikeseid ClickHouse? Traditsiooniline lĂ€henemine DWH — see on suur klaster, kus iga rakenduse jaoks mÀÀratakse skeem. Me lĂ€ksime andmebaasi administraatori juurde — andke meile skeem, ja me saime selle:

Kolime ClickHouse'ile: kolm aastat hiljem

V ClickHouse seda saab teha teisiti. Igal rakendusel vÔib olla oma ClickHouse:

Kolime ClickHouse'ile: kolm aastat hiljem

Me ei vaja enam suurt monstrosust DWH ja kangekaelseid administraatoreid. Igal rakendusel vÔib olla oma ClickHouse, ja arendaja vÔib seda ise teha, kuna ClickHouse see paigaldub vÀga lihtsalt ja ei nÔua keerulist haldamist:

Kolime ClickHouse'ile: kolm aastat hiljem

Aga kui meil on palju ClickHouse, ja seda tuleb tihti paigaldada, siis tahaks selle protsessi automatiseerida. Selleks saab nĂ€iteks kasutada Kubernetes ja clickhouse-operaatorit. Kuberneteses ClickHouse saab paigaldada Â«ĂŒhe klikiga»: ma vĂ”in vajutada nuppu, kĂ€ivitada manifeste ja baasi ongi valmis. Saame kohe luua skeemi, alustada seal andmete laadimist, ja viie minutiga on mul juba valmid dashboard . Nii lihtne see on! Grafana. ĐĐ°ŃŃ‚ĐŸĐ»ŃŒĐșĐŸ ĐČсД ĐżŃ€ĐŸŃŃ‚ĐŸ!

Mis on lÔpptulemus?

Nii et, ClickHouse — see on:

  • Kiire. See on kĂ”igile teada.
  • Lihtne. Veidi vaieldav, aga ma arvan, et rasked Ă”pingud toovad kerguse lahingus. Kui saada aru, kuidas ClickHouse see töötab, siis edasi on kĂ”ik vĂ€ga lihtne.
  • Universaalne. See sobib erinevate stsenaariumite jaoks: DWH, Aja seeria, Logi salvestus. Kuid see ei ole OLTP andmebaas, seega Ă€rge proovige seal lĂŒhikesi sisendeid ja lugemisi teha.
  • Huvitav. Ilmselt on see, kes töötab ClickHouse, veetnud palju huvitavaid hetki nii heas kui halvas mĂ”ttes. NĂ€iteks, kui ilmus uus versioon, kĂ”ik lakkas töötamast. VĂ”i kui te töötasite ĂŒlesande kallal kaks pĂ€eva, kuid pĂ€rast kĂŒsimust Telegrami grupis lahendati see kahe minutiga. VĂ”i kuidas konverentsil Aleksei Milovidovi ettekandes purunes ClickHouse ĂŒlekanne HighLoad++. Taolised asjad juhtuvad pidevalt ning muudavad meie elu ClickHouse vĂ€rvikaks ja huvitavaks!

Esitluse saab vaadata siit.

Kolime ClickHouse'ile: kolm aastat hiljem

Oodatud kohtumine kĂ”rge koormusega sĂŒsteemide arendajatega HighLoad++ toimub 9. ja 10. novembril Skolkovo's. LĂ”finally toimub see offline-konverents (kuigi kĂ”ik ettevaatusabinĂ”ud on olemas), kuna HighLoad++ energiat ei saa veebis pakendada.

Konverentsil leiame ja nÀitame teile juhtumeid tehnoloogiate maksimaalsetest vÔimalustest: HighLoad++ on olnud, on ja jÀÀb ainukeseks kohaks, kus kahe pÀeva jooksul teada saada, kuidas toimivad Facebook, Yandex, VKontakte, Google ja Amazon.

Pidades meie kohtumisi katkematult alates 2007. aastast, kohtume sel aastal 14. korda. Selle aja jooksul on konverents kasvanud 10 korda, eelmisel aastal tĂ”i valdkonna oluline sĂŒndmus kokku 3339 osalejat, 165 esinejat ettekannete ja kohtumiste jaoks ning samal ajal toimus 16 rada.
Eelmisel aastal oli teie jaoks 20 bussi, 5280 liitrit teed ja kohvi, 1650 liitrit mahla ning 10200 pudelit vett. Samuti 2640 kilogrammi toitu, 16000 taldrikut ja 25000 klaasi. Muuseas, mĂŒĂŒdud ĂŒmbertöödeldud paberi raha eest istutasime 100 tamme seemikut 🙂

Piletid on ostmiseks saadaval siit, et saada uudiseid konverentsi kohta — siit, ja vestelda — kĂ”igis sotsiaalmeedias: Telegram, Facebook, Vkontakte ja Twitter.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster