ClickHouse'i kolimine: 3 aastat hiljem

Kolm aastat tagasi laval Viktor Tarnavsky ja Aleksei Milovidov Yandexist HighLoad ++ rääkinud, milline ClickHouse on hea ja kuidas see ei aeglusta. Ja järgmisel etapil oli Aleksander Zaicev с aruanne kolimise kohta Klõpsake nuppu Maja teisest analüütilisest DBMS-ist ja järeldusega, et Klõpsake nuppu Maja, muidugi hea, aga mitte eriti mugav. Kui ettevõte 2016. a LifeStreet, kus Aleksander siis töötas, tõlkis mitme petabaidi analüütilise süsteemi keelde Klõpsake nuppu Maja, see oli põnev "kollaste tellistest tee", täis tundmatuid ohte - Klõpsake nuppu Maja siis nägi see välja nagu miiniväli.

Kolm aastat hiljem Klõpsake nuppu Maja muutus palju paremaks - selle aja jooksul asutas Aleksander ettevõtte Altinity, mis mitte ainult ei aita kuhu kolida Klõpsake nuppu Maja kümneid projekte, vaid täiustab ka toodet ennast koos kolleegidega Yandexist. Nüüd Klõpsake nuppu Maja ikka mitte muretu jalutuskäik, aga mitte enam miiniväli.

Alexander on tegelenud hajutatud süsteemidega alates 2003. aastast, arendades edasi suuri projekte MySQL, Oracle и Vertica. Viimasel ajal HighLoad ++ 2019 Aleksander, üks kasutamise pioneere Klõpsake nuppu Maja, rääkis, mis see DBMS nüüd on. Õpime tundma põhifunktsioone Klõpsake nuppu Maja: kuidas see erineb teistest süsteemidest ja millistel juhtudel on seda efektiivsem kasutada. Vaatleme näidete abil värskeid ja projektiga tõestatud praktikaid hoonesüsteemide ehitamiseks, mis põhinevad Klõpsake nuppu Maja.


Tagasivaade: mis juhtus 3 aastat tagasi

Kolm aastat tagasi andsime ettevõtte üle LifeStreet edasi Klõpsake nuppu Maja teisest analüüsiandmebaasist ja reklaamivõrgustiku analüütika migratsioon nägi välja selline:

  • juuni 2016. Aastal Avatud lähtekoodiga ilmus Klõpsake nuppu Maja ja alustasime meie projektiga;
  • August. Kontseptsiooni tõestus: suur reklaamivõrk, infrastruktuur ja 200-300 terabaiti andmemahtu;
  • oktoober. Esimesed tootmisandmed;
  • detsembril. Toote täiskoormus – 10-50 miljardit sündmust päevas.
  • juuni 2017. Kasutajate edukas üleminek Klõpsake nuppu Maja, 2,5 petabaiti andmeid 60 serverist koosnevas klastris.

Rändeprotsessi käigus hakati sellest üha enam aru saama Klõpsake nuppu Maja on hea süsteem, millega on meeldiv töötada, kuid see on Yandexi siseprojekt. Seetõttu on nüansse: Yandex hakkab esmalt tegelema oma siseklientide ja alles seejärel kogukonna ja väliskasutajate vajadustega, samas kui ClickHouse ei jõudnud siis paljudes funktsionaalsetes valdkondades ettevõtte tasemele. Nii asutasime 2017. aasta märtsis ettevõtte Altinity to make Klõpsake nuppu Maja veelgi kiirem ja mugavam mitte ainult Yandexi, vaid ka teiste kasutajate jaoks. Ja nüüd meie:

  • Koolitame ja aitame selle põhjal lahendusi luua Klõpsake nuppu Maja et kliendid ei täidaks konarusi ja et lahendus lõpuks toimiks;
  • Pakume 24/7 tuge Klõpsake nuppu Maja- paigaldised;
  • Arendame välja oma ökosüsteemiprojekte;
  • Pühendun endale aktiivselt Klõpsake nuppu Maja, vastates kasutajate päringutele, kes soovivad näha teatud funktsioone.

Ja loomulikult aitame kaasa kolimisel Klõpsake nuppu Maja с MySQL, Vertica, Oraakel, Roheline ploom, Redshift ja muud süsteemid. Oleme olnud seotud väga erinevate kolimistega ja need kõik on olnud edukad.

ClickHouse'i kolimine: 3 aastat hiljem

Miks üldse kolida Klõpsake nuppu Maja

Ei aeglusta! See on peamine põhjus. Klõpsake nuppu Maja - väga kiire andmebaas erinevate stsenaariumide jaoks:

ClickHouse'i kolimine: 3 aastat hiljem

Juhuslikud tsitaadid inimestelt, kes koos töötavad Klõpsake nuppu Maja.

Skaalautuvus. Mõnes teises andmebaasis saate saavutada ühe riistvara hea jõudluse, kuid Klõpsake nuppu Maja Saate skaleerida mitte ainult vertikaalselt, vaid ka horisontaalselt, lisades lihtsalt serverid. Kõik ei tööta nii libedalt, kui me tahaksime, kuid see toimib. Saate süsteemi laiendada, kui teie ettevõte kasvab. Oluline on, et meid ei piiraks praegune otsus ja arengupotentsiaal on alati olemas.

teisaldatavus. Ühe asjaga pole mingit kiindumust. Näiteks koos Amazoni punane nihe raske kuhugi liikuda. A Klõpsake nuppu Maja saate selle oma sülearvutisse, serverisse panna, pilve juurutada, minna aadressile Kubernetes - infrastruktuuri toimimisel puuduvad piirangud. See on mugav kõigile ja see on suur eelis, millega paljud teised sarnased andmebaasid kiidelda ei saa.

Paindlikkus. Klõpsake nuppu Maja ei piirdu ühe asjaga, näiteks Yandex.Metrica, vaid seda arendatakse ja kasutatakse üha erinevates projektides ja tööstusharudes. Seda saab laiendada, lisades uusi funktsioone uute probleemide lahendamiseks. Näiteks arvatakse, et logide andmebaasi salvestamine on halb komme, nii et nad mõtlesid selle välja Elasticsearch. Aga tänu paindlikkusele Klõpsake nuppu Maja, saab sinna ka palke hoiustada ja sageli on see isegi parem kui sees Elasticsearch - sisse Klõpsake nuppu Maja see nõuab 10 korda vähem rauda.

Tasuta Open Source. Te ei pea millegi eest maksma. Süsteemi sülearvutisse või serverisse paigaldamiseks pole vaja läbirääkimisi pidada. Varjatud tasusid pole. Samal ajal ei suuda ükski teine ​​avatud lähtekoodiga andmebaasitehnoloogia kiirusega võistelda Klõpsake nuppu Maja. MySQL, MariaDB, Greenplum - nad kõik on palju aeglasemad.

Kogukond, sõita ja lõbu. Sisse Klõpsake nuppu Maja suurepärane kogukond: kohtumised, vestlused ja Aleksei Milovidov, kes laeb meid kõiki oma energia ja optimismiga.

Kolimine ClickHouse'i

Et lülituda Klõpsake nuppu Maja millegipärast vajate ainult kolme asja:

  • Mõista piiranguid Klõpsake nuppu Maja ja milleks see ei sobi.
  • Kasutage eeliseid tehnoloogia ja selle suurimad tugevused.
  • Katse. Isegi teades, kuidas see töötab Klõpsake nuppu Maja, ei ole alati võimalik ennustada, millal see on kiirem, millal aeglasem, millal parem ja millal halvem. Nii et proovige.

Liikumise probleem

On ainult üks "aga": kui kolid Klõpsake nuppu Maja millestki muust, siis tavaliselt läheb midagi viltu. Oleme harjunud mõningate tavade ja asjadega, mis meie lemmikandmebaasis töötavad. Näiteks igaüks, kes töötab SQL-andmebaasid, peab järgmisi funktsioone kohustuslikuks:

  • tehingud;
  • piirangud;
  • järjepidevus;
  • indeksid;
  • VÄRSKENDA/KUSTUTA;
  • NULL-id;
  • millisekundid;
  • automaatsed tüübikonversioonid;
  • mitu liitumist;
  • suvalised vaheseinad;
  • klastri haldamise tööriistad.

Värbamine on kohustuslik, kuid kolm aastat tagasi sisse Klõpsake nuppu Maja polnud ühtegi neist funktsioonidest! Nüüd on realiseerimata jäänud vähem kui pool: tehingud, piirangud, järjepidevus, millisekundid ja tüübi valamine.

Ja peamine on see, et sisse Klõpsake nuppu Maja mõned standardtavad ja lähenemisviisid ei tööta või ei tööta nii, nagu oleme harjunud. Kõik, mis sisse ilmub Klõpsake nuppu Maja, vastab "kliki maja viis”, st. funktsioonid erinevad teistest DB-dest. Näiteks:

  • Indekseid ei valita, vaid jäetakse vahele.
  • VÄRSKENDA/KUSTUTA mitte sünkroonne, vaid asünkroonne.
  • Liitumisi on mitu, kuid päringuplaneerijat pole. Kuidas neid seejärel täidetakse, pole andmebaasimaailma inimestele üldiselt väga selge.

ClickHouse skriptid

1960. aastal ungari päritolu Ameerika matemaatik WignerEP kirjutas artikliMatemaatika ebamõistlik efektiivsus loodusteadustes”(“Matemaatika arusaamatu efektiivsus loodusteadustes”), et meid ümbritsev maailm on millegipärast matemaatiliste seadustega hästi kirjeldatud. Matemaatika on abstraktne teadus ja matemaatilises vormis väljendatud füüsikaseadused ei ole triviaalsed ja WignerEP rõhutas, et see on väga kummaline.

Minu vaatenurgast, Klõpsake nuppu Maja - sama kummalisus. Wignerit ümbersõnastades võib öelda nii: hoomamatu efektiivsus on hämmastav Klõpsake nuppu Maja mitmesugustes analüütilistes rakendustes!

ClickHouse'i kolimine: 3 aastat hiljem

Näiteks võtame Reaalajas andmeladu, kuhu andmeid laetakse peaaegu pidevalt. Soovime temalt päringud saada teise viivitusega. Palun kasutage Klõpsake nuppu Majasest see oli selle stsenaariumi jaoks loodud. Klõpsake nuppu Maja nii kasutatakse seda mitte ainult veebis, vaid ka turunduses ja finantsanalüütikas, AdTech, samuti sisse Pettuse tuvastaminen. IN Reaalajas andmeladu kasutatakse keerulist struktureeritud skeemi, nagu "täht" või "lumehelves", paljudes tabelites LIITU (mõnikord mitu) ning tavaliselt salvestatakse ja muudetakse andmeid mõnes süsteemis.

Võtame teise stsenaariumi - Ajaseeria: jälgimisseadmed, võrgud, kasutusstatistika, asjade internet. Siin kohtame üsna lihtsaid õigel ajal tellitud üritusi. Klõpsake nuppu Maja ei olnud algselt selle jaoks välja töötatud, kuid on end hästi näidanud, nii et suured ettevõtted kasutavad Klõpsake nuppu Maja seireteabe hoidlana. Et näha, kas sobib Klõpsake nuppu Maja aegridade jaoks koostasime lähenemisviisi ja tulemuste põhjal võrdlusaluse InfluxDB и AjakavaDB - spetsialiseerunud aegrida andmebaasid. SelgusEt Klõpsake nuppu Maja, isegi ilma selliste ülesannete jaoks optimeerimiseta võidab ka võõral väljal:

ClickHouse'i kolimine: 3 aastat hiljem

В aegrida tavaliselt kasutatakse kitsast tabelit - mitu väikest veergu. Paljud andmed võivad pärineda monitooringust – miljoneid kirjeid sekundis – ja need tulevad tavaliselt väikeste vahetükkidena (reaalajas voogesitus). Seetõttu vajame teistsugust sisestusskripti ja päringuid endid – oma spetsiifikaga.

Logi juhtimine. Logide kogumine andmebaasi on tavaliselt halb, kuid sees Klõpsake nuppu Maja seda saab teha mõne kommentaariga, nagu eespool kirjeldatud. Paljud ettevõtted kasutavad Klõpsake nuppu Maja just selle pärast. Sel juhul kasutatakse tasast laia lauda, ​​kus hoiustame kogu palke (näiteks vormis JSON) või tükkideks lõigatud. Andmed laaditakse tavaliselt suurte partiidena (failidena) ja me otsime mõnda välja.

Kõigi nende funktsioonide jaoks kasutatakse tavaliselt spetsiaalseid andmebaase. Klõpsake nuppu Maja saab seda kõike teha ja nii hästi, et see ületab neid jõudluses. Vaatame nüüd lähemalt aegrida stsenaarium ja kuidas süüa teha Klõpsake nuppu Maja selle stsenaariumi alusel.

Aegrida

See on praegu peamine stsenaarium, mille puhul Klõpsake nuppu Maja peetakse standardlahenduseks. Aegrida on ajaliselt järjestatud sündmuste kogum, mis tähistab aja jooksul toimunud muutusi mingis protsessis. Näiteks võib see olla südame löögisagedus päevas või protsesside arv süsteemis. Kõik, mis aega annab, mingite mõõtmetega tiksub, on aegrida:

ClickHouse'i kolimine: 3 aastat hiljem

Enamik neist sündmustest on pärit monitooringust. See võib olla mitte ainult veebi jälgimine, vaid ka reaalsed seadmed: autod, tööstussüsteemid, IoT, tööstused või mehitamata taksod, mille pagasiruumi Yandex juba paneb Klõpsake nuppu Maja-server.

Näiteks on ettevõtteid, kes koguvad andmeid laevadelt. Iga paari sekundi tagant saadavad konteinerlaeva andurid sadu erinevaid mõõtmisi. Insenerid uurivad neid, ehitavad mudeleid ja püüavad aru saada, kui tõhusalt alust kasutatakse, sest konteinerlaev ei tohiks sekunditki jõude seista. Igasugune seisakuaeg on raha raiskamine, seega on oluline marsruut ette näha nii, et parkimine oleks minimaalne.

Nüüd on suurenenud spetsiaalsete andmebaaside arv, mis mõõdavad aegrida. Internetis DB-mootorid millegipärast järjestatakse erinevad andmebaasid ja neid saab vaadata tüübi järgi:

ClickHouse'i kolimine: 3 aastat hiljem

Kõige kiiremini kasvav tüüp aegridas. Kasvavad ka graafikuandmebaasid, kuid aegridas on viimastel aastatel kiiremini kasvanud. Selle andmebaaside perekonna tüüpilised esindajad on InfluxDB, Prometheus, KDB, AjakavaDB (ehitatud PostgreSQL), lahendusi alates Amazon. Klõpsake nuppu Maja ka siin saab kasutada ja seda kasutatakse. Lubage mul tuua teile mõned avalikud näited.

Üks teerajajaid on ettevõte CloudFlare (CDNpakkuja). Nad jälgivad oma CDN läbi Klõpsake nuppu Maja (DNS- taotlused, HTTP-päringud) tohutu koormusega - 6 miljonit sündmust sekundis. Kõik läheb läbi Kafka, läheb Klõpsake nuppu Maja, mis annab võimaluse näha süsteemi sündmuste reaalajas armatuurlaudu.

Comcast - üks telekommunikatsiooni liidreid Ameerika Ühendriikides: Internet, digitaaltelevisioon, telefon. Nad lõid sarnase juhtimissüsteemi CDN raamistikus Open Source projekti Apache liikluskontroll nende tohutute andmetega töötada. Klõpsake nuppu Maja kasutatakse analüütika taustaprogrammina.

percona sisse ehitatud Klõpsake nuppu Maja sinu sees PMMet jälgida erinevat MySQL.

Erinõuded

Aegridade andmebaasidel on oma spetsiifilised nõuded.

  • Kiire sisestamine paljudelt agentidelt. Peame väga kiiresti sisestama andmed paljudest voogudest. Klõpsake nuppu Maja teeb seda hästi, sest sellel on kõik mitteblokeeruvad lisad. Ükskõik milline sisestada on uus fail kettal ja väikseid lisasid saab ühel või teisel viisil puhverdada. IN Klõpsake nuppu Maja parem on sisestada andmed suurte partiidena, mitte ühe rea kaupa.
  • Paindlik vooluring. Sisse aegrida me tavaliselt ei tea täielikult andmete struktuuri. Konkreetse rakenduse jaoks on võimalik ehitada seiresüsteem, kuid siis on seda raske kasutada mõne muu rakenduse jaoks. See nõuab paindlikumat skeemi. Klõpsake nuppu Maja, võimaldab seda teha, kuigi tegemist on tugevasti trükitud alusega.
  • Tõhus salvestus ja andmete "unustamine".. Tavaliselt sisse aegrida tohutul hulgal andmeid, mistõttu tuleb neid võimalikult tõhusalt salvestada. Näiteks kl InfluxDB hea tihendus on selle peamine omadus. Kuid lisaks salvestamisele peate suutma ka vanu andmeid "unustada" ja midagi ette võtta alamvalim — agregaatide automaatne loendamine.
  • Kiired päringud koondatud andmete kohta. Mõnikord on huvitav vaadata viimast 5 minutit millisekundi täpsusega, kuid igakuiste andmete puhul ei pruugi minuti või sekundi täpsust vaja minna – piisab üldisest statistikast. Selline toetus on vajalik, vastasel juhul võtab 3 kuu taotluse täitmine isegi sisse väga kaua aega Klõpsake nuppu Maja.
  • Taotlused nagu "viimane punkt, seisuga». Need on tüüpilised aegrida päringud: vaadake süsteemi viimast mõõtmist või olekut ajahetkel t. Andmebaasi jaoks pole need eriti meeldivad päringud, kuid neid peab ka saama täita.
  • "liimimine" aegrida. Aegrida on aegrida. Kui on kaks aegrida, tuleb need sageli ühendada ja korreleerida. Seda pole mugav teha kõigis andmebaasides, eriti joondamata aegridade puhul: siin on mõned ajamärgid, on teised. Keskmist võib arvestada, aga järsku jääb ikka auk sisse, nii et pole selge.

Vaatame, kuidas need nõuded on täidetud Klõpsake nuppu Maja.

Kava

В Klõpsake nuppu Maja skeem jaoks aegrida saab teha erineval viisil, olenevalt andmete korrektsuse astmest. Tavaandmetele on võimalik süsteemi ehitada, kui teame kõiki mõõdikuid ette. Näiteks tegi CloudFlare koos jälgimisega CDN on hästi optimeeritud süsteem. Saab ehitada üldisema süsteemi, mis jälgib kogu infrastruktuuri, erinevaid teenuseid. Ebaregulaarsete andmete puhul ei tea me ette, mida jälgime – ja see on ilmselt kõige levinum juhtum.

regulaarsed andmed. Veerud. Skeem on lihtne - vajalike tüüpidega veerud:

CREATE 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 on tavaline tabel, mis jälgib teatud tüüpi süsteemi algkäivitustegevust (kasutaja, süsteem, tühikäigul, kena). Lihtne ja mugav, kuid mitte paindlik. Kui tahame paindlikumat skeemi, siis saame kasutada massiive.

Ebaregulaarsed andmed. Massiivid:

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

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

Struktuur Pesastatud on kaks massiivi: meetrika.nimi и mõõdikud.väärtus. Siin saate salvestada sellised suvalised seireandmed iga sündmuse nimede massiivina ja mõõtmiste massiivina. Edasiseks optimeerimiseks võite ühe sellise struktuuri asemel teha mitu. Näiteks üks jaoks ujuk-väärtus, teine ​​- eest int-tähendab, sest int Ma tahan salvestada tõhusamalt.

Kuid sellisele struktuurile on raskem juurde pääseda. Esmalt indeksi ja seejärel massiivi väärtuste väljatõmbamiseks peate kasutama spetsiaalset konstruktsiooni, kasutades erifunktsioone:

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

Kuid see töötab ikkagi piisavalt kiiresti. Teine võimalus ebaregulaarsete andmete salvestamiseks on ridade kaupa.

Ebaregulaarsed andmed. Stringid. Sel traditsioonilisel viisil, ilma massiivideta, salvestatakse nimed ja väärtused korraga. Kui ühest seadmest tuleb korraga 5 mõõtmist, genereeritakse andmebaasi 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', ...)

Klõpsake nuppu Maja saab sellega hakkama - sellel on spetsiaalsed laiendused Klõpsake nuppu Maja SQL. Näiteks maxIf - spetsiaalne funktsioon, mis mõne tingimuse täitmisel arvutab maksimumi mõõdiku järgi. Ühes päringus saate kirjutada mitu sellist avaldist ja arvutada kohe mitme mõõdiku väärtuse.

Võrdleme kolme lähenemisviisi:

ClickHouse'i kolimine: 3 aastat hiljem

Detailid

Siin olen lisanud mõne testandmestiku jaoks "Andmete suurus kettal". Veergude puhul on meil väikseim andmemaht: maksimaalne tihendus, maksimaalne päringu kiirus, kuid maksame sellega, et peame kõik korraga parandama.

Massiivide puhul on asi veidi hullem. Andmed tihenevad endiselt hästi ja on võimalik salvestada ebakorrapärane muster. Aga Klõpsake nuppu Maja - veergude andmebaas ja kui hakkame kõike massiivi salvestama, muutub see stringiks ja paindlikkuse eest maksame efektiivsusega. Iga toimingu jaoks peate kogu massiivi mällu lugema, seejärel leidma sellest soovitud elemendi - ja kui massiiv kasvab, siis kiirus väheneb.

Ühes seda lähenemist kasutavas ettevõttes (näiteks Uber), lõigatakse massiivid 128 elemendist koosnevateks tükkideks. Mitme tuhande mõõdiku andmeid mahuga 200 TB andmeid päevas ei salvestata mitte ühes massiivis, vaid 10 või 30 spetsiaalse salvestusloogikaga massiivina.

Lihtsaim lähenemine on stringidega. Kuid andmed on halvasti tihendatud, tabeli suurus on suur ja isegi kui päringud põhinevad mitmel mõõdikul, ei tööta ClickHouse optimaalselt.

hübriidskeem

Oletame, et oleme valinud massiivi skeemi. Kui aga teame, et enamik meie armatuurlaudu näitab ainult kasutaja- ja süsteemimõõdikuid, saame need mõõdikud lisaks tabeli tasemel massiivi veergudeks realiseerida järgmisel viisil:

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 Klõpsake nuppu Maja loendab need automaatselt. Nii saate ühendada äri naudinguga: skeem on paindlik ja üldine, kuid me tõmbasime välja kõige sagedamini kasutatavad veerud. Pange tähele, et see ei nõudnud vahetüki vahetamist ja ETL, mis jätkab massiivide lisamist tabelisse. Me just tegime ALTER TABLE, lisas paar kõlarit ja sai hübriidse ja kiirema skeemi, mida saad kohe kasutama hakata.

Kodekid ja tihendamine

eest aegrida Tähtis on see, kui hästi te andmeid pakendate, sest teabe hulk võib olla väga suur. IN Klõpsake nuppu Maja kompressiooni mõju saavutamiseks 1:10, 1:20 ja mõnikord rohkem on olemas tööriistade komplekt. See tähendab, et 1 TB tihendamata andmeid kettal võtab enda alla 50-100 GB. Väiksem suurus on hea, andmeid saab kiiremini lugeda ja töödelda.

Kõrge tihendustaseme saavutamiseks Klõpsake nuppu Maja toetab järgmisi koodekeid:

ClickHouse'i kolimine: 3 aastat hiljem

Tabeli näide:

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 ühel juhul, teisel Gorillaja lisage kindlasti rohkem LZ4 kokkusurumine. Selle tulemusena väheneb kõvasti kettal olevate andmete maht:

ClickHouse'i kolimine: 3 aastat hiljem

See näitab, kui palju ruumi võtavad samad andmed, kuid kasutades erinevaid koodekeid ja tihendusi:

  • kettal GZIP-failis;
  • ClickHouse'is ilma koodekiteta, kuid ZSTD tihendamisega;
  • ClickHouse'is koos LZ4 ja ZSTD koodekite ja tihendamisega.

On näha, et koodekitega tabelid võtavad palju vähem ruumi.

Suurus on oluline

Mitte vähem oluline выбрать õige andmetüüp:

ClickHouse'i kolimine: 3 aastat hiljem

Kõikides ülaltoodud näidetes olen kasutanud Ujuk64. Aga kui me valime Ujuk32siis oleks veel parem. Seda näitasid hästi Perkona poisid ülaltoodud lingil olevas artiklis. Oluline on kasutada kõige kompaktsemat tüüpi, mis sobib ülesandega: isegi vähem ketta suuruse kui päringu kiiruse jaoks. Klõpsake nuppu Maja selle suhtes väga tundlik.

Kui saate kasutada intxnumx asemel intxnumx, siis oodata jõudluse peaaegu kahekordset kasvu. Andmed võtavad vähem mälu ja kogu "aritmeetika" töötab palju kiiremini. Klõpsake nuppu Maja selle sees on väga rangelt tipitud süsteem, see kasutab kõiki võimalusi, mida kaasaegsed süsteemid pakuvad.

Liitmine ja Realiseeritud vaated

Koond- ja materialiseeritud vaated võimaldavad teil koostada agregaate erinevatel juhtudel.

ClickHouse'i kolimine: 3 aastat hiljem

Näiteks võivad teil olla koondamata lähteandmed ja saate neile riputada erinevaid materialiseeritud vaateid automaatse summeerimisega spetsiaalse mootori kaudu. SummingMergeTree (SMT). SMT on spetsiaalne koondav andmestruktuur, mis loendab koondandmeid automaatselt. Toorandmed sisestatakse andmebaasi, need koondatakse automaatselt ja armatuurlaudu saab kohe kasutada.

TTL - "unusta" vanad andmed

Kuidas "unustada" andmeid, mida enam ei vajata? Klõpsake nuppu Maja teab, kuidas seda teha. Tabelite loomisel saate täpsustada TTL väljendid: näiteks salvestame minutiandmeid ühe päeva kohta, päevaandmeid 30 päeva kohta ega puuduta kunagi nädala- või kuuandmeid:

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 */

mitmetasandiline - andmete jagamine ketaste vahel

Seda ideed arendades saab andmeid salvestada Klõpsake nuppu Maja erinevates kohtades. Oletame, et tahame salvestada viimase nädala kuumaid andmeid väga kiirele kohalikule SSDja lisame teise kohta rohkem ajaloolisi andmeid. IN Klõpsake nuppu Maja nüüd on see võimalik:

ClickHouse'i kolimine: 3 aastat hiljem

Saate konfigureerida säilitamispoliitikat (ladustamispoliitika) Niisiis Klõpsake nuppu Maja edastab andmed automaatselt teise salvestusruumi, kui teatud tingimused on täidetud.

Kuid see pole veel kõik. Konkreetse tabeli tasemel saate määratleda reeglid selle kohta, millal täpselt andmed külmhoonesse edastatakse. Näiteks 7 päeva andmeid lebavad väga kiirel kettal ja kõik, mis on vanem, kantakse üle aeglasele. See on hea, sest võimaldab süsteemil säilitada maksimaalse jõudluse, kontrollides samal ajal kulusid ja mitte kulutades raha külmadele andmetele:

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

Ainulaadsed omadused Klõpsake nuppu Maja

Peaaegu kõik sees Klõpsake nuppu Maja selliseid "highlights" on olemas, aga neid tasastab eksklusiivne – mida teistes andmebaasides pole. Näiteks siin on mõned ainulaadsed funktsioonid Klõpsake nuppu Maja:

  • Massiivid. Sisse Klõpsake nuppu Maja väga hea tugi massiivide jaoks, samuti võimalus teha nendega keerulisi arvutusi.
  • Andmestruktuuride koondamine. See on üks "tapja funktsioone" Klõpsake nuppu Maja. Hoolimata asjaolust, et Yandexi poisid ütlevad, et me ei taha andmeid koondada, on kõik koondatud Klõpsake nuppu Majasest see on kiire ja mugav.
  • Realiseeritud vaated. Koos koondavate andmestruktuuridega võimaldavad materialiseeritud vaated teha mugava reaalajas liitmine.
  • ClickHouse SQL. See on keelelaiend SQL mõnede lisa- ja eksklusiivsete funktsioonidega, mis on saadaval ainult riigis Klõpsake nuppu Maja. Varem oli see ühest küljest nagu laienemine, teisest küljest miinus. Nüüd peaaegu kõik puudused võrreldes SQL 92 eemaldasime selle, nüüd on see lihtsalt laiendus.
  • Lambda-väljendid. Kas need on veel mingis andmebaasis?
  • ML-toetus. See on erinevates andmebaasides, mõned on paremad, mõned halvemad.
  • avatud lähtekoodiga. Saame laieneda Klõpsake nuppu Maja koos. Nüüd sisse Klõpsake nuppu Maja umbes 500 kaastöölist ja see arv kasvab pidevalt.

Keerulised päringud

В Klõpsake nuppu Maja sama asja tegemiseks on palju erinevaid viise. Näiteks tabelist viimase väärtuse tagastamiseks on kolm erinevat viisi Protsessor (on ka neljas, aga see on veelgi eksootilisem).

Esimene näitab, kui mugav on seda sisse teha Klõpsake nuppu Maja küsib, kui soovite seda kontrollida kahekordne sisalduvad alampäringus. See on midagi, millest mul isiklikult teistes andmebaasides puudus. Kui ma tahan midagi võrrelda alampäringuga, siis teistes andmebaasides saab sellega võrrelda ainult skalaari ja mitme veeru jaoks tuleb kirjutada LIITU. Sisse Klõpsake nuppu Maja võid kasutada korteeži:

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

Teine viis teeb sama, kuid kasutab koondfunktsiooni argMax:

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

В Klõpsake nuppu Maja koondfunktsioone on mitukümmend ja kui kasutada kombinaatoreid, siis kombinatoorika seaduste järgi saab neid umbes tuhat. ArgMax - üks funktsioonidest, mis loeb maksimaalse väärtuse: päring tagastab väärtuse usage_user, mille juures saavutatakse maksimaalne väärtus loodud_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 LIITUMINE - erinevate aegadega ridade "liimimine". See on andmebaaside ainulaadne funktsioon ja see on saadaval ainult riigis kdb+. Kui on kaks erineva ajaga aegrida, ASOF LIITUMINE võimaldab neid ühe taotlusega nihutada ja liimida. Ühe aegrea iga väärtuse jaoks leitakse lähim väärtus teises ja need tagastatakse samal real:

ClickHouse'i kolimine: 3 aastat hiljem

Analüütilised funktsioonid

Standardis SQL-2003 võid 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;

В Klõpsake nuppu Maja see pole võimalik – see ei toeta standardit SQL-2003 ja ilmselt ei tee seda kunagi. Selle asemel sisse Klõpsake nuppu Maja on kombeks kirjutada nii:

ClickHouse'i kolimine: 3 aastat hiljem

Lubasin lambdasid – siin nad on!

See on standardis oleva analüütilise päringu analoog SQL-2003: see loeb kahe vahe ajatempel, kestus, järguline – kõik, mida me tavaliselt analüütilisteks funktsioonideks peame. IN Klõpsake nuppu Maja loendame need massiivide kaudu: kõigepealt ahendame andmed massiiviks, pärast seda teeme massiiviga, mida tahame, ja seejärel laiendame seda tagasi. See pole eriti mugav, see nõuab vähemalt armastust funktsionaalse programmeerimise vastu, kuid see on väga paindlik.

Eriomadused

Pealegi sisse Klõpsake nuppu Maja palju erifunktsioone. Näiteks kuidas teha kindlaks, mitu seanssi samal ajal töötab? Tüüpiline seireülesanne on maksimaalse koormuse määramine ühe taotlusega. IN Klõpsake nuppu Maja selleks on spetsiaalne funktsioon:

ClickHouse'i kolimine: 3 aastat hiljem

Üldiselt on ClickHouse'il erifunktsioonid mitmel otstarbel:

  • jooksmineErinevus, jooksmine Accumulate, naaber;
  • sumMap(võti, väärtus);
  • timeSeriesGroupSum(uid, ajatempel, väärtus);
  • timeSeriesGroupRateSum(uid, ajatempel, väärtus);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • TÄIDISEGA / SIDEGA;
  • simpleLinearRegression, stochasticLinearRegression.

See ei ole täielik funktsioonide loetelu, neid on ainult 500–600. Vihje: kõik funktsioonid on sees Klõpsake nuppu Maja on süsteemitabelis (kõik pole dokumenteeritud, kuid kõik on huvitavad):

select * from system.functions order by name

Klõpsake nuppu Maja see salvestab enda kohta palju teavet, sealhulgas palgilauad, query_log, jälgimislogi, andmeplokkidega toimingute logi (osa_logi), mõõdikute logi ja süsteemilogi, mille see tavaliselt kettale kirjutab. Mõõdikute logi on aegrida в Klõpsake nuppu Maja tegelikult Klõpsake nuppu Maja: andmebaas ise võib mängida rolli aegrida andmebaase, "õgides" seega ennast.

ClickHouse'i kolimine: 3 aastat hiljem

See on ka ainulaadne asi – kuna teeme head tööd aegridamiks me ei suuda kõike vajalikku endasse salvestada? Meil pole vaja Prometheus, hoiame kõike endas. Ühendatud grafana ja jälgime ennast. Kui aga Klõpsake nuppu Maja kukub, me ei näe – miks – sellepärast nad seda tavaliselt ei tee.

Suur kobar või palju väikseid Klõpsake nuppu Maja

Mis on parem - üks suur klaster või mitu väikest ClickHouse'i? Traditsiooniline lähenemine DWH on suur klaster, kus iga rakenduse jaoks eraldatakse skeemid. Tulime andmebaasi administraatori juurde - andke meile skeem ja meile anti see:

ClickHouse'i kolimine: 3 aastat hiljem

В Klõpsake nuppu Maja saate seda teha teisiti. Kas iga rakendus saab teha oma Klõpsake nuppu Maja:

ClickHouse'i kolimine: 3 aastat hiljem

Meil pole enam suurt koletist vaja DWH ja koostöövõimetud administraatorid. Saame anda igale rakendusele oma Klõpsake nuppu Maja, ja arendaja saab seda ise teha, kuna Klõpsake nuppu Maja väga lihtne paigaldada ja ei nõua keerulist haldust:

ClickHouse'i kolimine: 3 aastat hiljem

Aga kui meil on palju Klõpsake nuppu Maja, ja peate seda sageli määrama, siis soovite selle protsessi automatiseerida. Selleks saame näiteks kasutada Kubernetes и clickhouse- operaator. IN Kubernetes ClickHouse võite panna "on click": võin klõpsata nuppu, käivitada manifest ja andmebaas on valmis. Saate kohe luua skeemi, alustada seal mõõdikute laadimist ja 5 minuti pärast on mul armatuurlaud valmis grafana. See on nii lihtne!

Ja tulemus?

Niisiis, Klõpsake nuppu Maja - see:

  • Kiire. Kõik teavad seda.
  • Lihtsalt. Natuke vaieldav, aga ma arvan, et seda on raske õppida, kerge võidelda. Kui saate aru, kuidas Klõpsake nuppu Maja töötab, kõik on väga lihtne.
  • Universaalselt. See sobib erinevate stsenaariumide jaoks: DWH, aegrida, logisalvestus. Aga ei ole OLTP andmebaasi, nii et ärge proovige seal lühikesi sisestusi ja lugemisi teha.
  • Huvitavalt. Tõenäoliselt see, kes töötab Klõpsake nuppu Maja, kogeti palju huvitavaid minuteid heas ja halvas mõttes. Näiteks tuli välja uus väljalase, kõik lakkas töötamast. Või kui nägite kaks päeva ülesandega vaeva, kuid pärast Telegrami vestluses esitatud küsimust lahendati ülesanne kahe minutiga. Või nagu konverentsil Lesha Milovidovi ettekandel, ekraanipilt Klõpsake nuppu Maja katkestas saate HighLoad ++. Sellised asjad juhtuvad kogu aeg ja muudavad meie elu sellega Klõpsake nuppu Maja särav ja huvitav!

Esitlust saab vaadata siin.

ClickHouse'i kolimine: 3 aastat hiljem

Kauaoodatud suure koormusega süsteemide arendajate kohtumine kl HighLoad ++ toimub 9. ja 10. novembril Skolkovos. Lõpuks on see võrguühenduseta konverents (ehkki kõigi ettevaatusabinõudega), kuna HighLoad++ energiat ei saa võrgus pakkida.

Konverentsi jaoks leiame ja näitame teile juhtumeid tehnoloogia maksimaalsete võimaluste kohta: HighLoad ++ oli, on ja jääb ainsaks kohaks, kus saate kahe päeva jooksul õppida, kuidas Facebook, Yandex, VKontakte, Google ja Amazon töötavad.

Olles pidanud oma koosolekuid katkematult alates 2007. aastast, kohtume sel aastal juba 14. korda. Selle ajaga on konverents kasvanud 10 korda, eelmisel aastal kogus valdkonna võtmesündmus 3339 osalejat, 165 ettekannete ja kohtumiste esinejat ning samal ajal mängis 16 lugu.
Eelmisel aastal oli teie jaoks 20 bussi, 5280 liitrit teed ja kohvi, 1650 liitrit puuviljajooke ja 10200 pudelit vett. Ja veel 2640 kilogrammi toitu, 16 000 taldrikut ja 25 000 tassi. Muide, taaskasutatud paberist kogutud raha eest istutasime 100 tamme istikut 🙂

Pileteid saab osta siin, saada uudiseid konverentsi kohta — siinja rääkige kõigis sotsiaalvõrgustikes: Telegramm, Facebook, Vkontakte и puperdama.

Allikas: www.habr.com

Lisa kommentaar