Liigume ClickHouse'i: 3 aastat hiljem

Kolm aastat tagasi rÀÀkisid Viktor Tarnavski ja Aleksei Milovidov Yandexist laval HighLoad++ rÀÀkinud, kui hea ClickHouse on ja kui sujuvalt see töötab. Samal ajal oli kĂ”rvalsel laval Aleksandr Zaitsev jot ettekanne ĂŒleminekust ClickHouse teisele analĂŒĂŒsisĂŒsteemile ja tulemuseks oli see, et ClickHouse, muidugi, see on hea, kuid mitte kĂ”ige mugavam. Kui 2016. aastal ettevĂ”te LifeStreet, kus Aleksandr tol ajal töötas, tĂ”lkis mitme petabaiti analĂŒĂŒsisĂŒsteemi ClickHouse, oli see pĂ”nev "kollase tellise tee", tĂ€is tundmatuid ohte — ClickHouse tollal nĂ€gi see vĂ€lja nagu miinivĂ€li.

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

Aleksandr on tegelenud jagatud sĂŒsteemidega 2003. aastast, töötanud suurtes projektides MySQL, Oracle ja Vertica. Möödunud HighLoad++ 2019 Aleksandr, ĂŒks pioneeridest, kes kasutas ClickHouse, rÀÀkis, milline see andmebaas praegu on. Uurime selle peamisi omadusi ClickHouse: millega see erineb teistest sĂŒsteemidest ja millistes olukordades on seda efektiivsem kasutada. Vaatame nĂ€iteid vĂ€rskete ja katsetatud praktikate kohta sĂŒsteemide loomisel ClickHouse.

MĂ€ngi videot

Tagasivaade: mis toimus 3 aastat tagasi

Kolm aastat tagasi tegime ĂŒlemineku ettevĂ”ttelt LifeStreet . Tundub, et ClickHouse teisele analĂŒĂŒsibaasile ja reklaamivĂ”rgu analĂŒĂŒsi migratsioon nĂ€gi vĂ€lja jĂ€rgmiselt:

  • Juuni 2016. Avati OpenSource ja kĂ€ivitasime oma projekti; ClickHouse August.
  • Proof Of Concept : suur reklaamivĂ”rk, infrastruktuur ja 200-300 terabaidi andmeid;Oktoober. Esimesed tootmised andmed;
  • Detsember. TĂ€ielik koormus — 10-50 miljardit sĂŒndmust pĂ€evas.
  • Juuni 2017. Kasutajate edukas ĂŒleviimine
  • , 2,5 petabaiti andmeid 60 serverist koosnevas klastris. ClickHouseMigratsiooni kĂ€igus kasvas teadlikkus, et

see on hea sĂŒsteem, millega on meeldiv töötada, kuid see on Yandexi sisemine projekt. Seega on teatud nĂŒansid: Yandex tegeleb esmalt oma sisemiste tellijatega, ja alles seejĂ€rel kogukonna ja vĂ€listarbijate vajadustega, ning ClickHouse ei vastanud siis paljudes funktsionaalsetes valdkondades ettevĂ”tte tasemele. SeetĂ”ttu asutasime 2017. aasta mĂ€rtsis ettevĂ”tte Altinity, et teha ClickHouse — see on tore sĂŒsteem, millega on meeldiv töötada, kuid see on Yandexi sisemine projekt. SeetĂ”ttu on teatud nĂŒansid: Yandex tegeleb esmalt oma sisemiste klientidega ja alles seejĂ€rel vĂ€liskogukonna ja vĂ€liste kasutajate vajadustega, ning ClickHouse ei ulatunud toona paljude funktsionaalsete valdkondade osas ettevĂ”tte tasemeni. SeetĂ”ttu asutasime 2017. aasta mĂ€rtsis ettevĂ”tte Altinity, et luua ClickHouse veel kiirem ja mugavam mitte ainult Yandexile, vaid ka teistele kasutajatele. Ja nĂŒĂŒd me:

  • Koolitame ja aitame lahendusi luua ClickHouse nii, et tellijad ei saaks peksa ja lahendus toimiks lĂ”puks;
  • Pakume 24/7 tuge ClickHouse-paigaldustele;
  • Arendame oma ökosĂŒsteemi projekte;
  • Aktiivselt panustame sellesse ClickHouse, vastates kasutajate soovidele, kes tahavad nĂ€ha teatud funktsioone.

Ja muidugi, me aitame ĂŒleminekul ClickHouse jot MySQL, Vertica, Oracle, Greenplum, Redshift ja teistesse sĂŒsteemidesse. Oleme osalenud vĂ€ga erinevates ĂŒleminekutes ja kĂ”ik need on olnud edukad.

Liigume ClickHouse'i: 3 aastat hiljem

Miks ĂŒldse ĂŒleminek teha ClickHouse

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

Liigume ClickHouse'i: 3 aastat hiljem

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

Skaleeritavus. Teises andmebaasis vĂ”ib saavutada korralikku jĂ”udlust ĂŒhel raual, kuid ClickHouse saab skaleerida mitte ainult vertikaalselt, vaid ka horisontaalselt, lihtsalt lisades servereid. KĂ”ik ei toimi nii sujuvalt, kui sooviks, aga töötab. SĂŒsteemi saab kasvatada koos Ă€ri kasvuga. On oluline, et me ei ole praeguses lahenduses piiratud ja potentsiaal arenguks on alati olemas.

Kandmiseks. Ei ole sidet millegi kindlega. NĂ€iteks, kui Amazon Redshift on raske kuhugi ĂŒleminek teha. Aga ClickHouse vĂ”ib paigaldada oma sĂŒlearvutile, serverisse, rakendada pilve, liikuda Kubernetes — ei ole piiranguid infrastruktuuri kasutamiseks. See on mugav kĂ”igile ning see on suur eelis, millega ei saa kiidelda paljud teised sarnased andmebaasid.

Paindlikkus. ClickHouse ei seisa millegi ĂŒhes asjas, nĂ€iteks Yandex.Metrikas, vaid areneb ja kasutatakse ĂŒha rohkemates erinevates projektides ja valdkondades. Seda saab laiendada, lisades uusi vĂ”imalusi uute ĂŒlesannete lahendamiseks. NĂ€iteks, arvatakse, et logide hoidmine andmebaasis on halb tava, seega selleks on vĂ€lja mĂ”eldud Elasticsearch. Kuid tĂ€nu paindlikkusele ClickHouse, on seal ka vĂ”imalik logisid hoida ja sageli on see isegi parem kui Elasticsearch — ClickHouse selleks on vaja 10 korda vĂ€hem riistvara.

Tasuta Open Source. Ei ole vaja millegi eest maksta. Ei ole vaja kokku leppida, et paigaldada sĂŒsteem oma sĂŒlearvutisse vĂ”i serverisse. Ei ole varjatud makseid. Selle juures ei saa ĂŒkski teine avatud koodiga andmebaasitehnoloogia kiiruselt konkurentsi pakkuda ClickHouse. MySQL, MariaDB, Greenplum — kĂ”ik need on palju aeglasemad.

Kogukond, ajend ja lÔbu. Meie ClickHouse suurepÀrane kogukond: kohtumised, vestlused ja Aleksei Milovidov, kes laadib meid kÔiki oma energia ja optimismiga.

RĂ€nne ClickHouse'ile

Et minna ĂŒle ClickHouse millegilt, on vaja vaid kolme asja:

  • MĂ”ista piiranguid ClickHouse ja mille jaoks 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.

RĂ€nde probleem

On ainult ĂŒks "aga": kui lĂ€hete ĂŒle ClickHouse millegi teisest, siis tavaliselt lĂ€heb midagi valesti. Oleme harjunud teatud praktikate ja asjadega, mis töötavad meie lemmikandmebaasis. NĂ€iteks arvab iga inimene, kes töötab SQL-andmebaasidega, et selline funktsioonide hulk on kohustuslik:

  • tehingud;
  • piirangud;
  • jĂ€rjepidevus;
  • indeksid;
  • UPDATE/DELETE;
  • NULLid;
  • millisekundid;
  • automaatne tĂŒĂŒpide muundamine;
  • mitmekordsed liitmine;
  • juhuslikud partitsioonid;
  • klastrihaldusvahendid.

Nii et komplekt on kohustuslik, kuid kolm aastat tagasi ei olnud ClickHouse ĂŒhtki neist funktsioonidest! Praegu on realiseerimata jÀÀnud vĂ€hem kui pool: tehingud, piirangud, jĂ€rjepidevus, millisekundid ja tĂŒĂŒpide muundamine.

Ja kĂ”ige tĂ€htsam — et mĂ”ned standardpraktikad ja lĂ€henemised ei tööta vĂ”i ei tööta nii, nagu me harjunud oleme. KĂ”ik, mis ilmub ClickHouse , vastab " ClickHouseClickHouse'i viis", st funktsioonid erinevad teistest andmebaasidest. NĂ€iteks:Indeksid ei vali, vaid jĂ€tavad vahele.

  • Ei ole sĂŒnkroneid, vaid asĂŒnkroneid.
  • UPDATE/DELETE Mitmekordsed liitmine on olemas, kuid pĂ€ringute planeerija puudub. Kuidas need siis tĂ€idetakse, ei ole andmebaasi maailmast inimestele ĂŒldse selge.
  • ClickHouse'i stsenaariumid

1960. aastal kirjutas Ameerika matemaatik Ungari pÀritolu

Wigner E. P. artikli " Matemaatika ebaaus tĂ”husus loodusvaldkondades" ("Matemaatika ebaaus tĂ”husus loodusvaldkondades") selle kohta, et ĂŒmbritsev maailm on imelikul kombel hĂ€sti kirjeldatav matemaatiliste seadustega. Matemaatika on abstraktne teadus, ja fĂŒĂŒsikalised seadused, mis on vĂ€ljendatud matemaatilises vormis, ei ole triviaalne, ningtoonitas, et see on vĂ€ga kummaline. artikli " Minu arvates on

— sama kummalisus. Wignerit parafraseerides vĂ”ib öelda nii: ĂŒllatavalt ebaaus tĂ”husus ClickHouse erinevates analĂŒĂŒtilistes rakendustes! ClickHouse NĂ€iteks vĂ”tame

Liigume ClickHouse'i: 3 aastat hiljem

Reaalajas andmete laod Reaalajas Andmehoidla, mille andmed laaditakse praktiliselt katkematult. Soovime saada sellelt pĂ€ringuid ĂŒhe sekundi viivitusega. Palun — kasutame ClickHouse, sest selle stsenaariumi jaoks on ta vĂ€lja töötatud. ClickHouse just nii kasutatakse seda mitte ainult veebis, vaid ka turunduse ja finantsanalĂŒĂŒsis, AdTech, samuti Fraud detection. Siin Reaalajas andmehoidla kasutab keerukat struktureeritud skeemi, mis on kas «tĂ€ht» vĂ”i «lumehelves», palju tabeleid JOIN (mĂ”nikord ka mitme jĂ€rjestusega), ja andmed tavaliselt hoitakse ja muudetakse mingites sĂŒsteemides.

VĂ”tame teise stsenaariumi — Aja seeria: seadmete, vĂ”rkude, kasutusstatistika jĂ€lgimine, asjade internet. Siin kohtame ajaliselt jĂ€rjestatud suhteliselt lihtsaid sĂŒndmusi. ClickHouse selleks ei olnud algselt vĂ€lja töötatud, kuid on nĂ€idanud head tulemust, seega kasutavad suured ettevĂ”tted ClickHouse seda jĂ€lgimisinfohoidla jaoks. Et uurida, kas ClickHouse sobib aja seeriaks, tegime testimise pĂ”hjal lĂ€henemist ja tulemusi InfluxDB ja TimescaleDB — spetsialiseeritud aja seeria andmebaasid. Selgus, et ClickHouse, et isegi ilma selliste ĂŒlesannete optimeerimiseta, saavutab ta edumaa ka teistel maadel:

Liigume ClickHouse'i: 3 aastat hiljem

Uues aja seeria tavaliselt kasutatakse kitsast tabelit — paar vĂ€ikest veergu. JĂ€lgimisest vĂ”ib tulla vĂ€ga palju andmeid — miljoneid kirjeid sekundis — ja neid tavaliselt saadetakse vĂ€ikeste sisestuste kaupa (reaalajas voogedastusega). SeetĂ”ttu on vajalik teine sisestusstsenaarium, ja iseĂ€rasused on ka pĂ€ringutel.

Logihaldus. Logide kogumine andmebaasi — see on tavaliselt halb, kuid ClickHouse seda saab teha mĂ”ningate mĂ€rkustega, nagu eespool kirjeldatud. Paljud ettevĂ”tted kasutavad ClickHouse just selleks. Sellisel juhul kasutatakse tasapinnalist laia tabelit, kus hoiame logisid tervikuna (nĂ€iteks JSON), vĂ”i jagame need osadeks. Andmed laaditakse tavaliselt suurte partiitide (failide) kaupa ja otsitakse mĂ”ne vĂ€lja jĂ€rgi.

Iga nende funktsioonide jaoks kasutatakse tavaliselt spetsialiseeritud andmebaase. ClickHouse kuid ĂŒks vĂ”ib kĂ”ike seda teha nii hĂ€sti, et ĂŒletab neid tulemuslikkuses. Vaatame nĂŒĂŒd lĂ€hemalt aja seeria stsenaariumit ja kuidas Ă”igesti «ette valmistada» ClickHouse seda stsenaariumi.

Aja seeria

Praegu on see peamine stsenaarium, mille jaoks ClickHouse peetakse standardlahenduseks. Aja seeria on ajakohaste sĂŒndmuste kogum, mis kujutab mingisuguse protsessi muutusi ajas. NĂ€iteks vĂ”ib see olla sĂŒdametegevuse sagedus pĂ€eva jooksul vĂ”i protsesside arv sĂŒsteemis. KĂ”ik, mis annab ajatilkude mÔÔtmisi, on aja seeria:

Liigume ClickHouse'i: 3 aastat hiljem

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

NÀiteks on olemas ettevÔtteid, mis koguvad andmeid laevadelt. Iga paari sekundi jÀrel saadavad konteinerlaeva sensorid sadu erinevaid mÔÔtmisi. Insenerid uurivad neid, loovad mudeleid ja proovivad mÔista, kui tÔhusalt kasutatakse laeva, kuna konteinerlaev ei tohiks jÀÀda seisma sekundi kaupa. Iga seismine tÀhendab rahakaotust, seetÔttu on oluline prognoosida marsruuti nii, et peatused oleksid minimaalsed.

Praegu on nÀha spetsialiseeritud andmebaaside kasvu, mis mÔÔdavad aja seeria. Veebisaidil DB-Engines jÀrgmisel viisil jÀrjestatakse erinevaid andmebaase, millest neid saab vaadata liikide jÀrgi:

Liigume ClickHouse'i: 3 aastat hiljem

Kiireim kasvav liik on aeg-seeriad. Samuti kasvavad graafikud andmebaasid, kuid aeg-seeriad on viimase paari aasta jooksul kasvanud kiiremini. Selle pereliikme tĂŒĂŒpilised esindajad on InfluxDB, Prometheus, KDB, TimescaleDB (ehitatud PostgreSQL), lahendused firmalt Amazon. ClickHouse on siin samuti kasutusel ja seda kasutatakse. Too mĂ”ned avalikud nĂ€ited.

Üks pioneeridest on ettevĂ”te CloudFlare (CDN-teenuse pakkuja). Nad jĂ€lgivad oma CDN lĂ€bi ClickHouse (DNS-kĂŒsimusi, HTTP-taotlusi) tohutu koormusega - 6 miljonit sĂŒndmust sekundis. KĂ”ik lĂ€heb lĂ€bi Kafka, saadetakse ClickHouse, mis pakub reaalajas vĂ”imalust nĂ€ha sĂŒsteemi sĂŒndmuste juhtpaneele.

Comcast on ĂŒks USA juhtivaid telekommunikatsiooniettevĂ”tteid: Internet, digitaaltelevisioon, telefoniteenus. Nad lĂ”id sarnase juhtimisse sĂŒsteemi CDN Apache Traffic Control Open Source projekti oma tohutute andmete haldamiseks. kasutatakse analĂŒĂŒtika taustsĂŒsteemina. ClickHouse Percona

integreeris oma ClickHouse PMM , et salvestada erinevatespetsiifilisi nÔudeid. Aeg-seeria andmebaasidel on omad spetsiifilised nÔuded. MySQL.

Kiire andmete sisestamine paljusid agentaid. Me peame vÀga kiiresti sisestama andmeid paljusid vooge.

teeb seda hĂ€sti, kuna sellel on kĂ”ik sisestamised, mis ei blokeeri. IgaĂŒks

  • Kiire sisestamine paljusid agendeid pidi. Me peame vĂ€ga kiiresti andmeid paljusidest voogudest sisestama. ClickHouse teeb seda hĂ€sti, kuna kĂ”ik sisestamised ei blokeeri midagi. IgaĂŒks sisestage — see on uus fail kettal ja vĂ€iksele sisestusele saab kasutada vahemĂ€lu erinevatel viisidel. ClickHouse Andmeid on parem sisestada suurte pakkidena, mitte ĂŒhe reana.
  • Paindlik skeem. Failis aja seeria me ei tea tavaliselt andmete struktuuri lĂ”puni. Saame luua jĂ€lgimissĂŒsteemi konkreetse rakenduse jaoks, kuid siis on seda raske kasutada teise rakenduse jaoks. Selleks on vaja paindlikumat skeemi. ClickHouse, see vĂ”imaldab seda teha, isegi kui tegemist on rangelt tĂŒĂŒbistatud andmebaasiga.
  • TĂ”hus andmete salvestamine ja „unustamine”. Tavaliselt on aja seeria hiiglaslik andmemaht, seega tuleb neid salvestada maksimaalse efektiivsusega. NĂ€iteks, InfluxDB hea tihendus on selle pĂ”hifunktsioon. Kuid lisaks salvestamisele tuleb ka vanu andmeid „unustada” ja teha mingit allapoole nĂ€itamine — automaatne arvutamine kogumite jaoks.
  • Kiired pĂ€ringud kogutud andmetele. Va sometimes tahaksime vaadata viimase 5 minuti jooksul, tĂ€psusega millisekundilise, kuid kuupĂ”histe andmete puhul vĂ”ib minuti vĂ”i sekundi granulaarsus olema ebavajalik — piisab ĂŒldstatistikast. Sellise toetuse olemasolu on vajalik, vastasel juhul kestab 3 kuu pĂ€ring vĂ€ga kaua, isegi ClickHouse.
  • PĂ€ringud nagu “viimane punkt, kuupĂ€ev». Need on tĂŒĂŒpilised aja seeria pĂ€ringud: vaatame viimast mÔÔtmist vĂ”i sĂŒsteemi seisundit antud ajahetkel t. Andmebaaside jaoks ei ole need pĂ€ringud eriti meeldivad, kuid neid tuleb ka osata teha.
  • Aja ridade „liimimine”. Aja seeria — see on ajaline rida. Kui on olemas kaks ajalist rida, tuleb need sageli ĂŒhendada ja korreleerida. KĂ”ikide andmebaaside puhul ei ole see mugav, eriti mitteĂŒhtlaste ajaliste ridade korral: siin — on ĂŒhed ajamĂ€rgid, seal — teised. VĂ”ib arvutada keskmisi, kuid Ă€kki seal on ikkagi auk, seega pole selge.

Vaadakem, kuidas need nÔuded on tÀidetud ClickHouse.

Schema

Uues ClickHouse skeemi jaoks aja seeria saab teha erinevate viiside kaudu, sĂ”ltuvalt andmete regulaarsete olemuse astmest. VĂ”ime luua sĂŒsteemi regulaarsete andmete jaoks, kui me teame kĂ”iki mÔÔtmeid ette. NĂ€iteks on nii teinud CloudFlare jĂ€lgimisega CDN — see on hĂ€sti optimeeritud sĂŒsteem. Saame luua ĂŒldisema sĂŒsteemi, mis jĂ€lgib kogu infrastruktuuri, erinevaid teenuseid. Ebaregulaarsete andmete puhul ei tea me ette, mida jĂ€lgime — ja tĂ”enĂ€oliselt on see kĂ”ige ĂŒldisem juhtum.

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

LOOD TABLE cpu (
  created_date Date DEFAULT today(),  
  created_at DateTime DEFAULT now(),  
  time String,  
  tags_id UInt32,  
  /* join to dim_tag */
  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
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

See tavaliselt tabel, mis jĂ€lgib mingit sĂŒsteemi koormuse aktiivsust (kasutaja, system, ĂŒksik, nice). Lihtne ja mugav, kuid mitte paindlik. Kui soovime paindlikumat skeemi, saame kasutada massiive.

Ebaregulaarne teave. Massiivid:

LOOD TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  )
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

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

Struktuur Nested — need on kaks massiivi: metrics.name ja metrics.value. Siin saab hoida selliseid vĂ€ljakutsuvaid monitooringuandmeid nagu nimede massiiv ja mÔÔtmiste massiiv iga sĂŒndmuse puhul. Edasiseks optimeerimiseks vĂ”ib selle struktuuri asemel teha mitu. NĂ€iteks ĂŒks — tekst-vÀÀrtus, teine — int-vÀÀrtus, sest int tahaks efektiivsemalt hoida.

Kuid sellise struktuuriga on keerulisem tegutseda. Tuleb kasutada erilist konstruktsiooni, et spetsiaalsete funktsioonidega vÀlja tuua vÀÀrtusi esmalt indeksi, seejÀrel massiivi kaudu:

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

Kuid see töötab ikkagi piisavalt kiiresti. Teine viis ebaregulaarses andmete hoidmiseks on ridade kaupa.

Ebaregulaarne teave. Rida. Selle traditsioonilise meetodi puhul hoitakse koheselt pealkirju ja vÀÀrtusi ilma massiivideta. Kui ĂŒhest seadmest tuleb korraga 5 000 mÔÔtmist — genereeritakse andmebaasis 5 000 rida:

LOOD 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);


VALI 
    maxIf(metric_value, metric_name = 'usage_user'),
    ... 
FROM cpu_r
KUS metric_name IN ('usage_user', ...)

ClickHouse sellega tĂ”hus - tal on erilised laiendused ClickHouse SQL. NĂ€iteks, maxIf — erifunktsioon, mis arvutab maksimumit mÔÔte korral, kui mingid tingimused on tĂ€idetud. Ühes pĂ€ringus saab kirjutada mitu sellist vĂ€ljendit ja koheselt korraga arvutada mitme mÔÔtme vÀÀrtuse.

VÔrdleme kolme lÀhenemist:

Liigume ClickHouse'i: 3 aastat hiljem

Detailid

Siin lisasin "Andmete maht kettal" mÔne testandmestiku jaoks. Veergude puhul on meil kÔige vÀiksem andmehulga suurus: maksimaalne tihendamine, maksimaalne pÀringute kiirus, kuid maksame selle eest sellega, et peame kÔik korraga fikseerima.

Massiivide puhul on kĂ”ik pisut halvem. Andmed tihenduvad siiski hĂ€sti ja vĂ”ib hoida ebaĂŒhtlast skeemi. Kuid ClickHouse — veergude andmebaas, ja kui hakkame kĂ”ike massiivi salvestama, muutub see stringiks ning maksame paindlikkuse eest efektiivsusega. Igaks toiminguks tuleb lugeda kogu massiiv mĂ€lu, pĂ€rast seda leida sealt sobiv element — ja kui massiiv kasvab, siis kiirus halveneb.

Ühes ettevĂ”ttes, kes kasutab sellist lĂ€henemist (nĂ€iteks Uber), jagatakse massiivid 128 elemendi tĂŒkkideks. Tuhandeid mÔÔtmeid mahus 200 TB andmeid/pĂ€evas ei hoita ĂŒhes massiivis, vaid 10 vĂ”i 30 massiivis koos spetsiaalse loogikaga sĂ€ilitamiseks.

VĂ€hemalt lihtne lĂ€henemine — stringidega. Kuid andmed tihenduvad halvasti, tabeli suurus on suur, ja kui pĂ€ringud lĂ€hevad lĂ€bi mitmete mÔÔtmete, siis ClickHouse töötab mitteoptimaalselt.

HĂŒbriidskeem

Oletame, et valisime massiivide skeemi. Kuid kui me teame, et enamik meie armatuurlaudu nÀitavad ainult user ja system mÔÔtmeid, saame tÀiendavalt massiivist tabeli tasandil need mÔÔtmed veergudeks 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 arvutab need automaatselt. Nii on vĂ”imalik ĂŒhendata meeldiv kasuliku: skeem on paindlik ja ĂŒldine, kuid kĂ”ige sagedamini kasutatavad veerud oleme vĂ€lja toonud. TĂ”in vĂ€lja, et see ei nĂ”udnud sisestamise muutmist ja ETL, mis jĂ€tkab massiivide sisestamist tabelisse. Me lihtsalt tegime ALTER TABLE, lisasime paar veergu ja saime hĂŒbriidse ja kiirema skeemi, millega saab kohe alustada kasutamist.

Koodekid ja tihendamine

Tooge aja seeria on oluline, kui hÀsti te andmeid pakendate, sest info massiiv vÔib olla vÀga suur. V ClickHouse on saadaval vahendid kompressiooniefekti saavutamiseks suhe 1:10, 1:20 ja mÔnikord isegi rohkem. See tÀhendab, et pakendamata 1 TB andmed kettal vÔtavad 50-100 GB. VÀiksem maht on hea, andmeid saab kiiremini lugeda ja töödelda.

KÔrge kompressioonitaseme saavutamiseks, ClickHouse toetab jÀrgmisi koodekeid:

Liigume ClickHouse'i: 3 aastat hiljem

NĂ€ide tabelist:

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 olukorras, teises — Gorilla, ja me peame kindlasti lisama veel LZ4 kompressiooni. Selle tulemusena andmete maht kettal vĂ€heneb oluliselt:

Liigume ClickHouse'i: 3 aastat hiljem

Siin on nÀidatud, kui palju ruumi vÔtab sama andmete kogus, kuid erinevate koodekite ja kompressioonidega:

  • GZIPitud fail kettal;
  • ClickHouse'is ilma koodekideta, kuid ZSTD-kompressiooniga;
  • ClickHouse'is koos koodekite ja LZ4 ning ZSTD kompressiooniga.

On nÀha, et koodekitega tabelid vÔtavad palju vÀhem ruumi.

Suurus on oluline

VĂ€hemalt sama oluline valida Ă”ige andmetĂŒĂŒp:

Liigume ClickHouse'i: 3 aastat hiljem

KĂ”ikides ĂŒlaltoodud nĂ€idetes olen kasutanud Float64. Kuid kui oleksime valinud Float32, siis oleks see olnud isegi parem. Seda on hĂ€sti demonstreerinud inimesed Perkonast artiklis, mis on ĂŒleval linkides. Oluline on kasutada vĂ”imalikult kompaktset tĂŒĂŒpi, mis sobib ĂŒlesande jaoks: isegi vĂ€hem kettaruumi kui pĂ€ringute kiirus. ClickHouse on sellele vĂ€ga tundlik.

Kui saate kasutada int32 asemel int64, siis oodake peaaegu kahekordset jĂ”udluse suurenemist. Andmed vĂ”tavad vĂ€hem mĂ€lu ja kogu "aritmeetika" töötab palju kiiremini. ClickHouse iseenesest — vĂ€ga rangelt tĂŒĂŒbistatud sĂŒsteem, mis kasutab maksimaalselt Ă€ra kĂ”iki kaasaegsete sĂŒsteemide vĂ”imalusi.

Agregeerimine ja Materialiseeritud vaated

Agregeerimine ja materialiseeritud vaated vÔimaldavad luua agregaatide variatsioone erinevate elusituatsioonide jaoks:

Liigume ClickHouse'i: 3 aastat hiljem

NÀiteks vÔivad teil olla mitteaggregeeritud algandmed, millele saab siduda erinevaid materialiseeritud vaateid automaatse summeerimisega spetsiaalse mootoriga SummingMergeTree (SMT). SMT on spetsiaalne aggregeeriv andmestruktuur, mis arvutab aggregeeritud andmed automaatselt. Andmebaasi sisestatakse toorandmed, need aggregeeritakse automaatselt ja nende pÔhjal saab kohe kasutada juhtpaneele.

TTL unustame vanad andmed

Kuidas unustada andmeid, mida enam ei vajata? ClickHouse oskab seda. Tabelite loomisel saab mÀÀrata TTL avaldised: nĂ€iteks salvestame minutilised andmed ĂŒheks pĂ€evaks, pĂ€evased — 30 pĂ€evaks, kuid nĂ€dalased vĂ”i kuised ei puutu 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 */

Mitme tasandi jagame andmeid ketaste vahel

Seda ideed arendades saab andmeid hoida ClickHouse erinevates kohtades. Oletame, et tahame viimase nÀdala kuumi andmeid hoida vÀga kiirel kohalikul SSD, samas kui vanemad ajaloolised andmed paigutatakse mujale. See on ClickHouse praegu vÔimalik:

Liigume ClickHouse'i: 3 aastat hiljem

Saame konfigureerida ladustamispoliitika (storage policy) nii, et ClickHouse ĂŒlekandab andmed automaatselt mĂ”nede tingimuste tĂ€itmisel teise salvestusse.

Kuid see ei ole veel kĂ”ik. Konkreetse tabeli tasandil saab mÀÀratleda reeglid, millal andmed ajaliselt kĂŒlmasse ladustamisse liiguvad. NĂ€iteks, 7 pĂ€eva andmed asuvad vĂ€ga kiirel kettal, ja kĂ”ik, mis on vanem, kantakse aeglasele. See on hea, kuna see vĂ”imaldab sĂŒsteemi hoida maksimaalses jĂ”udluses, samal ajal kulusid kontrollides ja mitte raisates raha 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Ă”ikides ClickHouse on sellised "erilised omadused", kuid need tasakaalustatakse eksklusiivsusega — millegi olemasoluga, mida teistes andmebaasides ei ole. NĂ€iteks siin on mĂ”ned ainulaadsed funktsioonid ClickHouse:

  • Massiivid. Failis ClickHouse vĂ€ga hea toetus massiividele ning ka vĂ”imalus teha nende peal keerulisi arvutusi.
  • Aggregeerivad andmestruktuurid. See on ĂŒks "mĂŒĂŒgipunkte" ClickHouse. Kuigi Yandexi tĂŒĂŒbid ĂŒtlevad, et me ei soovi andmeid aggregeerida, aggregeerib kĂ”ik ClickHouse, kuna see on kiire ja mugav.
  • Materialiseeritud vaated. Koos koos aggregatiivsete andmestruktuuridega vĂ”imaldavad materialiseeritud vaated mugavalt reaalajas aggregatsiooni.
  • ClickHouse SQL. See on keele laiendus SQL mĂ”nedelt lisafunktsioonidelt, mis on saadaval ainult ClickHouse. Varem oli see teatud mĂ”ttes nii laiendus kui ka puudus. NĂŒĂŒd oleme peaaegu kĂ”ik puudused vĂ”rreldes SQL 92 Ă€ra kĂ”rvaldanud, nĂŒĂŒd on see ainult laiendus.
  • Lambda-vĂ€ljendid. Kas need on veel mingis andmebaasis?
  • ML-toetuse. Seda leidub erinevates andmebaasides, mĂ”nedes paremini, mĂ”nes halvasti.
  • Avaalne kood. Me saame laiendada ClickHouse koos. Praegu on ClickHouse umbes 500 ĂŒhendajat ja see arv kasvab pidevalt.

Kavalad pÀringud

Uues ClickHouse on palju erinevaid viise sama asja tegemiseks. NÀiteks saab viimast vÀÀrtust tabelist tuua kolme erineva meetodi abil CPU (on veel neljas, kuid see on veel eksootilisem).

Esimene nÀitab, kui mugav on seda teha ClickHouse pÀringutes, kui soovite kontrollida, et tulp on alampÀringus. Seda oli isiklikult teistes andmebaasides vÀga puudu. Kui soovin midagi alampÀringuga vÔrrelda, siis teistes andmebaasides saab selle vÔrrelda ainult skalaariga, kuid mitme veeru jaoks tuleb kirjutada JOIN. Failis ClickHouse saab kasutada tulpa:

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 asja, kuid kasutab agregaatfunktsiooni argMax:

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

Uues ClickHouse olemas mitu tosinat agregaatfunktsiooni, ja kui kasutada kombinatoore, siis nende seaduste kohaselt on neid umbes tuhat. ArgMax on ĂŒks funktsioonidest, mis arvutab maksimaalse vÀÀrtuse: pĂ€ring tagastab vÀÀrtuse usage_user, mille korral 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 on erineva ajaga ridade "liitmine". See on ainulaadne funktsioon andmebaaside jaoks, mida leidub ainult kdb+. Kui on kaks ajajoonte rida erineva ajaga, ASOF JOIN vĂ”imaldab neid nihutada ja ĂŒhes pĂ€ringus liita. Iga vÀÀrtuse puhul ĂŒhel ajajoonte reas leitakse lĂ€him vÀÀrtus teises ja need tagastatakse ĂŒhel real:

Liigume ClickHouse'i: 3 aastat hiljem

AnalĂŒĂŒtilised funktsioonid

Standardis SQL-2003 saab kirjutada nii:

VALI origin,
       timestamp,
       timestamp -LAG(timestamp, 1) OVER (PARTITION BY origin ORDER BY timestamp) KUI duration,
       timestamp -MIN(timestamp) OVER (PARTITION BY origin ORDER BY timestamp) KUI startseq_duration,
       RIDA_NUMBER() OVER (PARTITION BY origin ORDER BY timestamp) KUI sequence,
       COUNT() OVER (PARTITION BY origin ORDER BY timestamp) KUI nb
  FROM mytable
ORDER BY origin, timestamp;

Uues ClickHouse nii ei saa - see ei toeta standardit SQL-2003 ja tÔenÀoliselt ei hakka kunagi seda tegema. Selle asemel on ClickHouse tavaks kirjutada nii:

Liigume ClickHouse'i: 3 aastat hiljem

Ma lubasin lambdasid – siin need on!

See on analoog analĂŒĂŒtilisest pĂ€ringust standardis SQL-2003: see arvutab vahe kahe timestamp, duration, jĂ€rjestusnumber - kĂ”ik, mida me tavaliselt analĂŒĂŒtiliste funktsioonide puhul arvestame. Me ClickHouse loeme neid massiivide kaudu: esmalt koondame andmed massiivi, seejĂ€rel teeme massiiviga kĂ”ike, mida soovime, ja lĂ”puks avame tagasi. See ei ole vĂ€ga mugav, nĂ”uab armastust funktsionaalse programmeerimise vastu, vĂ€hemalt, kuid see on vĂ€ga paindlik.

Spetsiaalsed funktsioonid

Lisaks on ClickHouse palju spetsialiseeritud funktsioone. NĂ€iteks kuidas mÀÀrata, kui palju seansse kulgeb samaaegselt? TĂŒĂŒpiline jĂ€relevalveĂŒlesanne – mÀÀrata maksimaalne koormus ĂŒhe pĂ€ringuga. Siin on ClickHouse eriline funktsioon selle eesmĂ€rgi saavutamiseks:

Liigume ClickHouse'i: 3 aastat hiljem

Üldiselt on ClickHouse’is paljusid spetsiaalseid funktsioone:

  • 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 ametlik funktsioonide nimekiri, neid on kokku 500-600. NĂ€punĂ€ide: kĂ”ik funktsioonid ClickHouse on sĂŒsteemitabelis (kĂ”iki ei ole dokumenteeritud, kuid kĂ”ik on huvitavad):

select * from system.functions order by name

ClickHouse iseendaga salvestab palju teavet enda kohta, sealhulgas log tabelid, query_log, jĂ€lgimistabel, andmepakkide operatsioonide logi (part_log), mÔÔdiku logi ja sĂŒsteemne logi, mida ta tavaliselt kirjutab kettale. MÔÔdiku logi – see on aja seeria ja ClickHouse ĂŒldiselt: ClickHouseAndmebaas ise vĂ”ib enda jaoks mĂ€ngida rolli aja seeria andmebaas, seelĂ€bi "neelates" ennast ise.

Liigume ClickHouse'i: 3 aastat hiljem

See on ka ainulaadne asi - kuna teeme meie jaoks head tööd aja seeria, miks ei saa me alles hoida kĂ”ike, mis on vajalik? Me ei vaja Prometheus, me hoiame kĂ”ike enda sees. Ühendasime Grafana ja jĂ€lgime iseennast. Kuid kui ClickHouse kukub, siis me ei nĂ€e, - miks, - seetĂ”ttu ei tehta seda tavaliselt.

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 on eraldatud skeemid. Me pöördusime andmebaasi administraatori poole — andke meile skeem ja me saime selle:

Liigume ClickHouse'i: 3 aastat hiljem

Uues ClickHouse seda on vÔimalik teha ka teistmoodi. Iga rakenduse jaoks saab luua omaette ClickHouse:

Liigume ClickHouse'i: 3 aastat hiljem

Me ei vaja enam suurt, tohutut DWH ja koostöövalimat administraatorit. Me saame iga rakenduse jaoks anda omaette ClickHouse, ja arendaja saab selle ise teha, kuna ClickHouse see on vÀga lihtne paigaldada ja ei vaja keerulist haldust:

Liigume ClickHouse'i: 3 aastat hiljem

Kuid kui meil on palju ClickHouse, ja me peame seda sageli paigaldama, siis sooviksime selle protsessi automatiseerida. Sel juhul saame kasutada nĂ€iteks Kubernetes ja clickhouse-operaatorit. K ubernetes ClickHouse saab paigaldada „nupu klĂ”psuga”: ma saan vajutada nuppu, kĂ€ivitada manifesti ja andmebaas on valmis. Saame kohe luua skeemi, alustada mÔÔdikute laadimist ja viie minutiga on mul juba valmis juhtpaneel. Grafana. KĂ”ik on nii lihtne!

KokkuvÔttes?

Nii, ClickHouse — see on:

  • Kiire. See on kĂ”igile teada.
  • Lihtne. Veidi vaieldav, aga ma arvan, et raske Ă”ppimisel, kerge lahingus. Kui mĂ”ista, kuidas ClickHouse see töötab, siis edasi on kĂ”ik vĂ€ga lihtne.
  • Universaalne. See sobib erinevate stsenaariumite jaoks: DWH, Aegrea, Logi Salvestamine. Kuid see ei ole OLTP andmebaas, seega Ă€rge pĂŒĂŒdke seal teha lĂŒhikesi sisendeid ja lugemisi.
  • Huvitav. Ilmselt on see, kes töötas ClickHouse, kogenud palju huvitavaid hetki nii heas kui halvas mĂ”ttes. NĂ€iteks uus versioon vĂ€lja, kĂ”ik lakkas töötamast. VĂ”i kui sa vaevasid ĂŒlesande kallal kaks pĂ€eva, kuid pĂ€rast kĂŒsimust Telegrami vestluses lahendati see kahe minutiga. VĂ”i kuidas konverentsil Aleksei Milovidovi ettekandes purunes ekraan ClickHouse . Sellised asjad juhtuvad pidevalt ja muudavad meie elu HighLoad++vĂ€rvikaks ja huvitavaks! ClickHouse Esitluse saab vaadata

Oodatud kohtumine kĂ”rgkoormuslike sĂŒsteemide arendajatega siin.

Liigume ClickHouse'i: 3 aastat hiljem

toimub 9. ja 10. novembril Skolkovo. L lĂ”puks toimub see fĂŒĂŒsilisel konverentsil (kuigi kĂ”iki ettevaatusabinĂ”usid jĂ€rgides), kuna HighLoad++ energiat ei saa internetis pakendada. HighLoad++ Konverentsil leiame ja nĂ€itame teile juhtumeid tehnoloogiate maksimaalsetest vĂ”imalustest: HighLoad++ oli, on ja jÀÀb ainukeseks kohaks, kus kahe pĂ€eva jooksul saab teada, kuidas on korraldatud Facebook, Yandex, VKontakte, Google ja Amazon.

Konverentsil toome teieni tehnoloogiate maksimaalsed vĂ”imalused ja juhtumianalĂŒĂŒsid: HighLoad++ oli, on ja jÀÀb ainukeseks kohaks, kus kahe pĂ€eva jooksul tutvuda, kuidas Facebook, Yandex, VKontakte, Google ja Amazon toimivad.

Alates meie kohtumistest 2007. aastast oleme sel aastal koos 14. korda. Selle aja jooksul on konverents kasvanud kĂŒmme korda, eelmisel aastal jĂ”udis tööstuse peamine ĂŒritus kokku 3339 osalejat, 165 esinejat ettekannete ja koosolekute jaoks, ning toimusid samaaegselt 16 rada.
Eelmisel aastal oli teie jaoks 20 bussi, 5280 liitrit teed ja kohvi, 1650 liitrit mahlajooke ja 10200 pudelit vett. Lisaks oli 2640 kilogrammi toitu, 16000 taldrikut ja 25000 klaasikest. Muide, taaskasutatud paberi mĂŒĂŒgist saadud raha eest istutasime 100 tammesimooni 🙂

Piletid on saadaval siin, et saada konverentsi uudiseid — siin, ja vestlemiseks — kĂ”igis sotsiaalmeedia kanalites: Telegram, Facebook, Vkontakte ja Twitteris.

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