Verhuis na ClickHouse: 3 jaar later

Drie jaar gelede Viktor Tarnavsky en Alexey Milovidov van Yandex op die verhoog Hoëlaai++ vertel, hoe goed ClickHouse is, en hoe dit nie vertraag nie. En op die volgende stadium was daar Alexander Zaitsev с rapporteer oor verhuising na klikhuis van 'n ander analitiese DBBS en met die gevolgtrekking dat klikhuis, natuurlik, goed, maar nie baie gerieflik. Wanneer in 2016 die maatskappy LifeStreet, waar Alexander toe gewerk het, was besig om 'n multi-petagrepe analitiese stelsel om te skakel na klikhuis, dit was 'n fassinerende "geel baksteenpad" vol onbekende gevare - klikhuis destyds het dit soos 'n mynveld gelyk.

Drie jaar later klikhuis het baie beter geword - in hierdie tyd het Alexander die maatskappy Altinity gestig, wat nie net mense help om na te trek nie klikhuis dosyne projekte, maar verbeter ook die produk self saam met kollegas van Yandex. Nou klikhuis steeds nie 'n sorgvrye kuier nie, maar nie meer 'n mynveld nie.

Alexander werk sedert 2003 met verspreide stelsels en ontwikkel groot projekte op MySQL, Oracle и Vertikale. Op die laaste HighLoad++ 2019 Alexander, een van die pioniers van die gebruik klikhuis, vertel wat hierdie DBBS nou is. Ons sal leer oor die hoofkenmerke klikhuis: hoe dit van ander stelsels verskil en in watter gevalle dit meer effektief is om dit te gebruik. Deur voorbeelde te gebruik, sal ons kyk na onlangse en projek-getoetste praktyke vir die bou van stelsels gebaseer op klikhuis.


Terugskouend: wat 3 jaar gelede gebeur het

Drie jaar gelede het ons die maatskappy oorgedra LifeStreet op klikhuis vanaf 'n ander analitiese databasis, en die advertensienetwerk-analise-migrasie het soos volg gelyk:

  • Junie 2016. In Oop bron verskyn klikhuis en ons projek het begin;
  • Augustus. Bewys van die konsep: groot advertensienetwerk, infrastruktuur en 200-300 teragrepe data;
  • Oktober. Eerste produksiedata;
  • Desember. Die volle produklading is 10-50 miljard gebeurtenisse per dag.
  • Junie 2017. Suksesvolle migrasie van gebruikers na klikhuis, 2,5 petagrepe data op 'n groep van 60 bedieners.

Tydens die migrasieproses was daar 'n groeiende begrip dat klikhuis is 'n goeie stelsel wat aangenaam is om mee te werk, maar dit is 'n interne projek van Yandex. Daarom is daar nuanses: Yandex sal eers met sy eie interne kliënte handel en eers dan met die gemeenskap en die behoeftes van eksterne gebruikers, en ClickHouse het toe nie die ondernemingsvlak in baie funksionele gebiede bereik nie. Daarom het ons Altinity in Maart 2017 gestig om te maak klikhuis selfs vinniger en geriefliker, nie net vir Yandex nie, maar ook vir ander gebruikers. En nou ons:

  • Ons lei en help bou oplossings gebaseer op klikhuis sodat kliënte nie in die moeilikheid beland nie, en sodat die oplossing uiteindelik werk;
  • Ons bied 24/7 ondersteuning klikhuis- installasies;
  • Ons ontwikkel ons eie ekosisteemprojekte;
  • Ons verbind ons aktief tot onsself klikhuis, reageer op versoeke van gebruikers wat sekere kenmerke wil sien.

En natuurlik help ons met verhuising na klikhuis с MySQL, Vertikale, Oracle, Groenpruim, rooi verschuiving en ander stelsels. Ons was betrokke by 'n verskeidenheid skuiwe, en hulle was almal suksesvol.

Verhuis na ClickHouse: 3 jaar later

Hoekom skuif na klikhuis

Vertraag nie! Dit is die hoofrede. klikhuis - baie vinnige databasis vir verskillende scenario's:

Verhuis na ClickHouse: 3 jaar later

Ewekansige aanhalings van mense wat al lank met mense werk klikhuis.

Skaalbaarheid. Op 'n ander databasis kan jy goeie werkverrigting op een stuk hardeware behaal, maar klikhuis jy kan nie net vertikaal skaal nie, maar ook horisontaal, bloot deur bedieners by te voeg. Alles werk nie so glad soos ons wil nie, maar dit werk. Jy kan die stelsel uitbrei soos jou besigheid groei. Dit is belangrik dat ons nie nou deur die oplossing beperk word nie en daar is altyd potensiaal vir ontwikkeling.

Draagbaarheid. Daar is geen gehegtheid aan een ding nie. Byvoorbeeld, met Amazon rooiverskuiwing Dit is moeilik om iewers heen te beweeg. A klikhuis jy kan dit op jou skootrekenaar, bediener installeer, dit na die wolk ontplooi, gaan na Kubernetes — daar is geen beperkings op die werking van die infrastruktuur nie. Dit is gerieflik vir almal, en dit is 'n groot voordeel waarmee baie ander soortgelyke databasisse nie kan spog nie.

Buigsaamheid. klikhuis stop nie by een ding nie, byvoorbeeld Yandex.Metrica, maar ontwikkel en word in meer en meer verskillende projekte en nywerhede gebruik. Dit kan uitgebrei word deur nuwe vermoëns by te voeg om nuwe probleme op te los. Byvoorbeeld, daar word geglo dat die stoor van logs in 'n databasis slegte maniere is, so hulle het vorendag gekom Elasticsearch. Maar te danke aan buigsaamheid klikhuis, jy kan ook logs daarin stoor, en dikwels is dit selfs beter as in Elasticsearch - in klikhuis dit verg 10 keer minder yster.

Vry Open Source. Jy hoef vir niks te betaal nie. Dit is nie nodig om toestemming te onderhandel om die stelsel op jou skootrekenaar of bediener te installeer nie. Geen verborge fooie nie. Terselfdertyd kan geen ander oopbron-databasistegnologie in spoed meeding nie klikhuis. MySQL, MariaDB, Greenplum - hulle is almal baie stadiger.

Gemeenskap, ry en pret. in klikhuis uitstekende gemeenskap: ontmoetings, geselsies en Alexey Milovidov, wat ons almal met sy energie en optimisme laai.

Verhuis na ClickHouse

Om na te gaan klikhuis vir een of ander rede het jy net drie dinge nodig:

  • Verstaan ​​die beperkings klikhuis en waarvoor dit nie geskik is nie.
  • Neem voordeel tegnologie en sy grootste sterk punte.
  • Eksperimenteer. Selfs om te verstaan ​​hoe dit werk klikhuis, dit is nie altyd moontlik om te voorspel wanneer dit vinniger sal wees, wanneer dit stadiger sal wees, wanneer dit beter sal wees en wanneer dit erger sal wees nie. So probeer dit.

Beweeg probleem

Daar is net een "maar": as jy skuif na klikhuis van iets anders, dan loop gewoonlik iets verkeerd. Ons is gewoond aan sommige praktyke en dinge wat in ons gunsteling databasis werk. Byvoorbeeld, enigiemand wat saam met SQL-databasisse beskou die volgende stel funksies as verpligtend:

  • transaksies;
  • beperkings;
  • konsekwentheid;
  • indekse;
  • UPDATEER/VEE;
  • NULLs;
  • millisekondes;
  • outomatiese tipe gietwerk;
  • veelvuldige verbindings;
  • arbitrêre partisies;
  • klusterbestuurnutsmiddels.

Werwing is verpligtend, maar drie jaar gelede in klikhuis Nie een van hierdie funksies was beskikbaar nie! Nou bly minder as die helfte oor van wat nie geïmplementeer is nie: transaksies, beperkings, Konsekwentheid, millisekondes en tipe casting.

En die belangrikste ding is dat in klikhuis sommige standaardpraktyke en -benaderings werk of werk nie anders as waaraan ons gewoond is nie. Alles wat in verskyn klikhuis, stem ooreen met "ClickHouse manier", d.w.s. funksies verskil van ander databasisse. Byvoorbeeld:

  • Indekse word nie gekies nie, maar oorgeslaan.
  • UPDATEER/VEE nie sinchronies nie, maar asinchronies.
  • Daar is veelvuldige aansluitings, maar daar is geen navraagbeplanner nie. Hoe dit dan uitgevoer word, is oor die algemeen nie baie duidelik vir mense uit die databasiswêreld nie.

ClickHouse Scripts

In 1960, 'n Amerikaanse wiskundige van Hongaarse oorsprong Wigner EP het 'n artikel geskryf "Die onredelike effektiwiteit van wiskunde in die natuurwetenskappe” (“The Incomprehensible Effectiveness of Mathematics in the Natural Sciences”) dat die wêreld om ons om een ​​of ander rede goed beskryf word deur wiskundige wette. Wiskunde is 'n abstrakte wetenskap, en fisiese wette wat in wiskundige vorm uitgedruk word, is nie triviaal nie, en Wigner EP beklemtoon dat dit baie vreemd is.

Uit my oogpunt, klikhuis - dieselfde vreemdheid. Om Wigner te herformuleer, kan ons dit sê: die ondenkbare doeltreffendheid is verstommend klikhuis in 'n wye verskeidenheid analitiese toepassings!

Verhuis na ClickHouse: 3 jaar later

Byvoorbeeld, kom ons neem Intydse datapakhuis, waarin data feitlik deurlopend gelaai word. Ons wil met 'n tweede vertraging versoeke daarvan ontvang. Asseblief - gebruik dit klikhuis, want dit is die scenario waarvoor dit ontwerp is. klikhuis dit is presies hoe dit nie net op die web gebruik word nie, maar ook in bemarking en finansiële analise, AdTech, sowel as in Bedrog opsporingn. IN Intydse datapakhuis 'n komplekse gestruktureerde skema soos "ster" of "sneeuvlok" word gebruik, baie tabelle met SLUIT (soms veelvuldig), en die data word gewoonlik in sommige stelsels gestoor en verander.

Kom ons neem 'n ander scenario - Tyd reeks: monitering van toestelle, netwerke, gebruikstatistieke, Internet van dinge. Hier kom ons redelik eenvoudige gebeure teë wat betyds georden is. klikhuis is nie oorspronklik hiervoor ontwikkel nie, maar het bewys dat dit goed werk, en daarom gebruik groot maatskappye klikhuis as 'n bewaarplek vir die monitering van inligting. Om te ondersoek of dit geskik is klikhuis vir tydreekse het ons 'n maatstaf gemaak op grond van die benadering en resultate InstromingDB и TydskaalDB - gespesialiseerde tyd reeks databasisse. Dit het uitgedraaiWat klikhuis, selfs sonder optimalisering vir sulke take, wen op 'n vreemde veld:

Verhuis na ClickHouse: 3 jaar later

В tyd reeks Gewoonlik word 'n smal tabel gebruik - verskeie klein kolomme. Baie data kan afkomstig wees van monitering—miljoene rekords per sekonde—en hulle kom gewoonlik in klein sarsies (real-time stroom). Daarom is 'n ander invoegskrif nodig, en die navrae self het hul eie besonderhede.

Logbestuur. Om logs in 'n databasis te versamel is gewoonlik sleg, maar klikhuis dit kan gedoen word met 'n paar opmerkings soos hierbo beskryf. Baie maatskappye gebruik klikhuis presies vir hierdie doel. In hierdie geval gebruik ons ​​'n plat wye tafel waar ons die hele stompe stoor (byvoorbeeld in die vorm Into), of in stukke gesny. Data word gewoonlik in groot bondels (lêers) gelaai, en ons soek volgens een of ander veld.

Vir elk van hierdie funksies word gewoonlik gespesialiseerde databasisse gebruik. klikhuis mens kan dit alles doen en so goed dat dit beter as hulle presteer. Kom ons kyk nou van nader tyd reeks scenario, en hoe om korrek te "kook". klikhuis vir hierdie scenario.

Tyd reeks

Tans is dit die belangrikste scenario waarvoor klikhuis as die standaardoplossing beskou. Tyd reeks is 'n stel gebeurtenisse wat in tyd georden is, wat veranderinge in een of ander proses met verloop van tyd verteenwoordig. Dit kan byvoorbeeld die hartklop per dag of die aantal prosesse in die stelsel wees. Alles wat tyd gee met sekere afmetings is tyd reeks:

Verhuis na ClickHouse: 3 jaar later

Die meeste van hierdie tipe gebeurtenisse kom van monitering. Dit kan nie net die monitering van die web wees nie, maar ook werklike toestelle: motors, industriële stelsels, IOT, fabrieke of onbemande taxi's, in die kattebak waarvan Yandex reeds sit klikhuis-bediener.

Daar is byvoorbeeld maatskappye wat data van skepe insamel. Elke paar sekondes stuur sensors op die houerskip honderde verskillende metings. Ingenieurs bestudeer dit, bou modelle en probeer verstaan ​​hoe doeltreffend die vaartuig gebruik word, want 'n houerskip behoort nie eers 'n sekonde ledig te wees nie. Enige stilstand is 'n verlies aan geld, daarom is dit belangrik om die roete te voorspel sodat onderbrekings minimaal is.

Deesdae is daar 'n groei van gespesialiseerde databasisse wat meet tyd reeks. Op die webwerf DB-enjins Die verskillende databasisse word op een of ander manier gerangskik, en jy kan hulle volgens tipe bekyk:

Verhuis na ClickHouse: 3 jaar later

Die vinnigste groeiende tipe is tyd reekss. Grafiekdatabasisse groei ook, maar tyd reekss het die afgelope paar jaar vinniger gegroei. Tipiese verteenwoordigers van hierdie familie van databasisse is InstromingDB, Prometheus, KDB, TydskaalDB (opgebou PostgreSQL), oplossings uit Amazon. klikhuis kan ook hier gebruik word, en word gebruik. Kom ek gee jou 'n paar openbare voorbeelde.

Een van die baanbrekers is die maatskappy CloudFlare (CDN-verskaffer). Hulle monitor hul CDN deur klikhuis (DNS-versoeke, HTTP-navrae) met 'n groot vrag - 6 miljoen gebeurtenisse per sekonde. Alles gaan deur Kafka, gaan klikhuis, wat die geleentheid bied om dashboards van gebeure in die stelsel intyds te sien.

Comcast - een van die leiers in telekommunikasie in die VSA: Internet, digitale televisie, telefonie. Hulle het 'n soortgelyke beheerstelsel geskep CDN binne die raamwerk Open Source die projek Apache Verkeersbeheer om met jou groot data te werk. klikhuis gebruik as 'n backend vir analise.

percona ingebou klikhuis binne jou PMMmonitering van verskeie te stoor MySQL.

Spesifieke vereistes

Tydreeksdatabasisse het hul eie spesifieke vereistes.

  • Vinnige invoeging van baie agente. Ons moet baie vinnig data van baie strome invoeg. klikhuis Dit doen dit goed omdat al sy insetsels nie blokkeer nie. Enige voeg is 'n nuwe lêer op skyf, en klein insetsels kan op een of ander manier gebuffer word. IN klikhuis Dit is beter om data in groot bondels in te voeg eerder as een reël op 'n slag.
  • Buigsame skema. In tyd reeks ons ken gewoonlik nie die datastruktuur heeltemal nie. Dit is moontlik om 'n moniteringstelsel vir 'n spesifieke toepassing te bou, maar dan is dit moeilik om dit vir 'n ander toepassing te gebruik. Dit vereis 'n meer buigsame skema. klikhuis, laat jou toe om dit te doen, al is dit 'n sterk getikte basis.
  • Doeltreffende berging en vergeet van data. Gewoonlik in tyd reeks 'n groot hoeveelheid data, dus moet dit so doeltreffend moontlik gestoor word. Byvoorbeeld, by InstromingDB goeie kompressie is die belangrikste kenmerk daarvan. Maar behalwe om te stoor, moet jy ook ou data kan "vergeet" en 'n soort van doen afsteekproefneming - outomatiese telling van aggregate.
  • Vinnige navrae oor saamgestelde data. Soms is dit interessant om na die laaste 5 minute te kyk met 'n akkuraatheid van millisekondes, maar op maandelikse data is minuut of tweede korreligheid dalk nie nodig nie - algemene statistieke is genoeg. Ondersteuning van hierdie soort is nodig, anders sal 'n versoek vir 3 maande baie lank neem om selfs in te voltooi klikhuis.
  • Versoeke soos "laaste punt, soos van». Hierdie is tipies vir tyd reeks navrae: kyk na die laaste meting of toestand van die stelsel op 'n oomblik in tyd t. Dit is nie baie aangename navrae vir 'n databasis nie, maar jy moet dit ook kan uitvoer.
  • "Gluing" tydreekse. Tyd reeks is 'n tydreeks. As daar twee tydreekse is, moet hulle dikwels verbind en gekorreleer word. Dit is nie gerieflik om dit op alle databasisse te doen nie, veral met onbelynde tydreekse: hier is 'n paar tydpunte, daar is ander. Jy kan gemiddeld oorweeg, maar skielik sal daar nog 'n gat daar wees, so dit is nie duidelik nie.

Kom ons kyk hoe daar aan hierdie vereistes voldoen word klikhuis.

Die skema

В klikhuis skema vir tyd reeks kan op verskillende maniere gedoen word, afhangende van die mate van reëlmaat van die data. Dit is moontlik om 'n stelsel op gereelde data te bou wanneer ons al die maatstawwe vooraf ken. Ek het dit byvoorbeeld gedoen CloudFlare met monitering CDN is 'n goed geoptimaliseerde stelsel. Jy kan 'n meer algemene stelsel bou wat die hele infrastruktuur en verskeie dienste monitor. In die geval van onreëlmatige data weet ons nie vooraf wat ons monitor nie – en dit is waarskynlik die algemeenste geval.

Gereelde data. Kolomme. Die skema is eenvoudig - kolomme met die vereiste tipes:

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

Dit is 'n gereelde tabel wat 'n soort stelsellaaiaktiwiteit monitor (gebruiker, stelsel, idle, lekker). Eenvoudig en gerieflik, maar nie buigsaam nie. As ons 'n meer buigsame skema wil hê, kan ons skikkings gebruik.

Onreëlmatige data. Skikkings:

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 geneste is twee skikkings: metrieke.naam и metrieke.waarde. Hier kan jy sulke arbitrêre moniteringsdata stoor as 'n verskeidenheid name en 'n verskeidenheid metings vir elke gebeurtenis. Vir verdere optimalisering, in plaas van een so 'n struktuur, kan jy verskeie maak. Byvoorbeeld, een vir dryf-waarde, 'n ander - vir int- wat beteken omdat int Ek wil meer doeltreffend stoor.

Maar so 'n struktuur is moeiliker om toegang te verkry. Jy sal 'n spesiale konstruksie moet gebruik, met spesiale funksies om die waardes van eers die indeks en dan die skikking uit te trek:

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

Maar dit werk steeds redelik vinnig. Nog 'n manier om onreëlmatige data te stoor, is per ry.

Onreëlmatige data. Snare. In hierdie tradisionele metode, sonder skikkings, word name en waardes gelyktydig gestoor. As 5 000 metings op een slag van een toestel af kom, word 5 000 rye in die databasis gegenereer:

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', ...)

klikhuis hanteer dit - dit het spesiale uitbreidings klikhuis SQL. Byvoorbeeld, maksimum As — 'n spesiale funksie wat die maksimum deur 'n metriek bereken wanneer aan een of ander voorwaarde voldoen word. Jy kan verskeie sulke uitdrukkings in een versoek skryf en onmiddellik die waarde vir verskeie metrieke bereken.

Kom ons vergelyk drie benaderings:

Verhuis na ClickHouse: 3 jaar later

Besonderhede

Hier het ek "Disk Data Size" bygevoeg vir 'n paar toetsdatastel. In die geval van kolomme het ons die kleinste datagrootte: maksimum kompressie, maksimum navraagspoed, maar ons betaal deur alles gelyktydig op te teken.

In die geval van skikkings is alles 'n bietjie erger. Die data is steeds goed saamgepers en 'n onreëlmatige patroon kan gestoor word. Maar klikhuis - 'n kolomdatabasis, en wanneer ons alles in 'n skikking begin stoor, verander dit in 'n ry een, en ons betaal vir buigsaamheid met doeltreffendheid. Vir enige operasie sal jy die hele skikking in die geheue moet lees, dan die gewenste element daarin moet vind - en as die skikking groei, dan verminder die spoed.

In een van die maatskappye wat hierdie benadering gebruik (bv. Uber), word skikkings in stukke van 128 elemente gesny. Data van etlike duisende metrieke met 'n volume van 200 TB data/dag word nie in een skikking gestoor nie, maar in 10 of 30 skikkings met spesiale stoorlogika.

Die eenvoudigste benadering is met snare. Maar die data is swak saamgepers, die tabelgrootte is groot, en selfs wanneer navrae op verskeie maatstawwe gebaseer is, werk ClickHouse nie optimaal nie.

Hibriede skema

Kom ons neem aan dat ons 'n skikkingkring gekies het. Maar as ons weet dat die meeste van ons kontroleskerms slegs gebruikers- en stelselstatistieke wys, kan ons hierdie statistieke ook in kolomme vanaf 'n skikking op tabelvlak op hierdie manier materialiseer:

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

By invoeging klikhuis sal hulle outomaties tel. Op hierdie manier kan jy besigheid met plesier kombineer: die skema is buigsaam en algemeen, maar ons het die kolomme wat die meeste gebruik word, uitgetrek. Let daarop dat dit nie nodig was om die insetsel en te verander nie ETLwat voortgaan om skikkings in die tabel in te voeg. Ons het net gedoen ALTER TAFEL, het 'n paar luidsprekers bygevoeg en ons het 'n hibriede en vinniger skema gekry wat jy dadelik kan begin gebruik.

Kodeks en kompressie

Vir tyd reeks Dit maak saak hoe goed jy die data verpak, want die hoeveelheid inligting kan baie groot wees. IN klikhuis Daar is 'n stel gereedskap om 'n kompressie-effek van 1:10, 1:20 en soms meer te bereik. Dit beteken dat 1 TB se uitgepakte data op die skyf 50-100 GB opneem. Kleiner grootte is goed, data kan vinniger gelees en verwerk word.

Om 'n hoë vlak van kompressie te bereik, klikhuis ondersteun die volgende codecs:

Verhuis na ClickHouse: 3 jaar later

Tabel voorbeeld:

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

Hier definieer ons die kodek DubbelDelta in een geval, in die tweede - Gorilla, en ons sal beslis meer byvoeg LZ4 kompressie. As gevolg hiervan word die grootte van die data op skyf aansienlik verminder:

Verhuis na ClickHouse: 3 jaar later

Dit wys hoeveel spasie dieselfde data opneem, maar met behulp van verskillende kodeks en kompressies:

  • in 'n GZIP-lêer op skyf;
  • in ClickHouse sonder codecs, maar met ZSTD-kompressie;
  • in ClickHouse met codecs en kompressie LZ4 en ZSTD.

Dit kan gesien word dat tabelle met codecs baie minder spasie opneem.

Grootte saak

Nie minder belangrik nie kies korrekte data tipe:

Verhuis na ClickHouse: 3 jaar later

In al die voorbeelde hierbo het ek gebruik Vlot 64. Maar as ons kies Vlot 32, dan sal dit nog beter wees. Dit is goed gedemonstreer deur die ouens van Perkona in die artikel wat hierbo geskakel is. Dit is belangrik om die mees kompakte tipe te gebruik wat geskik is vir die taak: selfs minder vir skyfgrootte as vir navraagspoed. klikhuis baie sensitief hiervoor.

As jy kan gebruik int32 in plaas van int64, verwag dan 'n byna tweevoudige toename in prestasie. Die data neem minder geheue op, en al die "rekenkunde" werk baie vinniger. klikhuis intern is dit 'n baie streng getikte stelsel; dit maak maksimum gebruik van al die moontlikhede wat moderne stelsels bied.

Aggregasie en Gematerialiseerde sienings

Aggregasie en gematerialiseerde aansigte laat jou toe om aggregate vir verskillende geleenthede te skep:

Verhuis na ClickHouse: 3 jaar later

Byvoorbeeld, jy kan nie-geaggregeerde brondata hê, en jy kan verskeie gematerialiseerde aansigte daaraan heg met outomatiese opsomming deur 'n spesiale enjin SummingMergeTree (SBS). SBS is 'n spesiale samevoegende datastruktuur wat aggregate outomaties bereken. Rou data word in die databasis ingevoeg, dit word outomaties saamgevoeg, en dashboards kan dadelik daarop gebruik word.

TTL - "vergeet" ou data

Hoe om data te "vergeet" wat nie meer nodig is nie? klikhuis weet hoe om dit te doen. Wanneer u tabelle skep, kan u spesifiseer TTL uitdrukkings: byvoorbeeld dat ons minuutdata vir een dag stoor, daaglikse data vir 30 dae, en nooit weeklikse of maandelikse data raak nie:

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

Veelvlakkige - verdeel data oor skywe

Deur hierdie idee verder te neem, kan data in gestoor word klikhuis op verskillende plekke. Gestel ons wil warm data vir die afgelope week op 'n baie vinnige plaaslike stoor SSD, en ons plaas meer historiese data op 'n ander plek. IN klikhuis dit is nou moontlik:

Verhuis na ClickHouse: 3 jaar later

Jy kan 'n bergingsbeleid opstel (bergingsbeleid) Dus klikhuis sal outomaties data oordra wanneer sekere voorwaardes na 'n ander berging bereik word.

Maar dit is nie al nie. Op die vlak van 'n spesifieke tabel kan jy reëls definieer vir presies wanneer die data in koelberging gaan. Data word byvoorbeeld vir 7 dae op 'n baie vinnige skyf gestoor, en alles wat ouer is word na 'n stadige een oorgedra. Dit is goed omdat dit jou toelaat om die stelsel op maksimum werkverrigting te hou, terwyl jy koste beheer en nie geld mors op koue data nie:

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

Unieke kenmerke klikhuis

In byna alles klikhuis Daar is sulke “hoogtepunte”, maar dit word geneutraliseer deur eksklusiwiteit – iets wat nie in ander databasisse is nie. Hier is byvoorbeeld 'n paar van die unieke kenmerke klikhuis:

  • skikkings. In klikhuis baie goeie ondersteuning vir skikkings, sowel as die vermoë om komplekse berekeninge daarop uit te voer.
  • Aggregerende datastrukture. Dit is een van die "moordenaarkenmerke" klikhuis. Ten spyte van die feit dat die ouens van Yandex sê dat ons nie data wil versamel nie, word alles saamgevoeg in klikhuis, want dit is vinnig en gerieflik.
  • Gematerialiseerde sienings. Saam met samevoegende datastrukture, laat gematerialiseerde aansigte jou toe om gerieflik te maak real-time samevoeging.
  • ClickHouse SQL. Dit is 'n taaluitbreiding SQL met 'n paar bykomende en eksklusiewe kenmerke wat slegs beskikbaar is in klikhuis. Voorheen was dit soos 'n uitbreiding aan die een kant, en 'n nadeel aan die ander kant. Nou byna al die nadele in vergelyking met SQL 92 ons het dit verwyder, nou is dit net 'n uitbreiding.
  • Lambda-uitdrukkings. Is hulle nog in enige databasis?
  • ML-ondersteuning. Dit is beskikbaar in verskillende databasisse, sommige is beter, sommige is slegter.
  • oop bron. Ons kan uitbrei klikhuis saam. Nou in klikhuis ongeveer 500 bydraers, en hierdie getal groei voortdurend.

Moeilike navrae

В klikhuis daar is baie verskillende maniere om dieselfde ding te doen. Byvoorbeeld, jy kan die laaste waarde van 'n tabel op drie verskillende maniere vir CPU (daar is ook 'n vierde, maar dit is selfs meer eksoties).

Die eerste een wys hoe gerieflik dit is om in te doen klikhuis navrae wanneer jy dit wil kontroleer tupel vervat in die subnavraag. Dit is iets wat ek persoonlik baie gemis het in ander databasisse. As ek iets met 'n subnavraag wil vergelyk, dan kan in ander databasisse slegs 'n skalaar daarmee vergelyk word, maar vir verskeie kolomme moet ek skryf SLUIT. In klikhuis jy kan tuple gebruik:

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

Die tweede metode doen dieselfde ding, maar gebruik 'n totale funksie argMax:

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

В klikhuis daar is 'n paar dosyn totale funksies, en as jy kombinatore gebruik, sal jy volgens die wette van kombinatorika ongeveer duisend daarvan kry. ArgMax - een van die funksies wat die maksimum waarde bereken: die versoek gee die waarde terug gebruik_gebruiker, waarteen die maksimum waarde bereik word geskep_by:

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

ASOF SLUIT AAN — “gom” rye met verskillende tye. Dit is 'n unieke kenmerk vir databasisse wat slegs beskikbaar is in kdb+. As daar twee tydreekse met verskillende tye is, ASOF SLUIT AAN laat jou toe om hulle in een versoek te skuif en saam te voeg. Vir elke waarde in een tydreeks word die naaste waarde in die ander gevind, en hulle word op dieselfde lyn teruggestuur:

Verhuis na ClickHouse: 3 jaar later

Analitiese funksies

In die standaard SQL-2003 jy kan so skryf:

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;

В klikhuis Jy kan dit nie doen nie - dit ondersteun nie die standaard nie SQL-2003 en sal dit waarskynlik nooit doen nie. In plaas daarvan, in klikhuis Dit is gebruiklik om so te skryf:

Verhuis na ClickHouse: 3 jaar later

Ek het lambdas belowe – hier is hulle!

Dit is 'n analoog van die analitiese navraag in die standaard SQL-2003: hy tel die verskil tussen die twee tydstempel, duur, ranggetal - alles wat ons gewoonlik as analitiese funksies beskou. IN klikhuis Ons tel hulle deur skikkings: eers vou ons die data in 'n skikking in, daarna doen ons alles wat ons wil op die skikking, en dan brei ons dit terug uit. Dit is nie baie gerieflik nie, dit vereis ten minste 'n liefde vir funksionele programmering, maar dit is baie buigsaam.

Spesiale eienskappe

Buitendien, in klikhuis baie gespesialiseerde funksies. Byvoorbeeld, hoe om te bepaal hoeveel sessies gelyktydig plaasvind? 'n Tipiese moniteringstaak is om die maksimum vrag met een versoek te bepaal. IN klikhuis Daar is 'n spesiale funksie vir hierdie doel:

Verhuis na ClickHouse: 3 jaar later

Oor die algemeen het ClickHouse spesiale funksies vir baie doeleindes:

  • runningDifference, runningAccumulate, buurman;
  • sumMap (sleutel, waarde);
  • timeSeriesGroupSum(uid, timestamp, value);
  • timeSeriesGroupRateSum(uid, timestamp, value);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • MET VUL / MET DASSE;
  • simpleLinearRegression, stogastieseLineêreRegressie.

Dit is nie 'n volledige lys van funksies nie, daar is 500-600 in totaal. Wenk: alle funksies in klikhuis is in die stelseltabel (nie almal is gedokumenteer nie, maar almal is interessant):

select * from system.functions order by name

klikhuis dit stoor baie inligting oor homself, insluitend log tabelle, query_log, spoor log, log van bedrywighede met data blokke (deel_log), metrieke log, en stelsel log, wat dit gewoonlik op skyf skryf. Log statistieke is tyd reeks в klikhuis eintlik klikhuis: Die databasis self kan 'n rol speel tyd reeks databasisse, en sodoende homself “verslind”.

Verhuis na ClickHouse: 3 jaar later

Dit is ook 'n unieke ding - aangesien ons 'n goeie werk vir tyd reeks, hoekom kan ons nie alles wat ons nodig het in onsself stoor nie? Ons het nie nodig nie Prometheus, ons hou alles vir onsself. Gekoppel grafana en ons monitor onsself. Indien klikhuis val, sal ons nie sien hoekom nie, so hulle doen dit gewoonlik nie.

Groot groepie of baie kleintjies klikhuis

Wat is beter - een groot groepie of baie klein ClickHouses? Tradisionele benadering tot DWH is 'n groot groep waarin stroombane vir elke toepassing toegewys word. Ons het na die databasisadministrateur gekom - gee ons 'n diagram, en hulle het vir ons een gegee:

Verhuis na ClickHouse: 3 jaar later

В klikhuis jy kan dit anders doen. Jy kan elke toepassing jou eie maak klikhuis:

Verhuis na ClickHouse: 3 jaar later

Ons het nie meer die groot monsteragtige een nodig nie DWH en hardnekkige administrateurs. Ons kan elke toepassing sy eie gee klikhuis, en die ontwikkelaar kan dit self doen, aangesien klikhuis baie maklik om te installeer en vereis nie komplekse administrasie nie:

Verhuis na ClickHouse: 3 jaar later

Maar as ons baie het klikhuis, en jy moet dit gereeld installeer, dan wil jy hierdie proses outomatiseer. Hiervoor kan ons byvoorbeeld gebruik Kubernetes и klikhuis-operateur. IN Kubernetes ClickHouse jy kan dit "op-klik" sit: Ek kan 'n knoppie klik, die manifes laat loop en die databasis is gereed. Ek kan dadelik 'n diagram skep, metrieke daar begin oplaai, en binne 5 minute het ek 'n dashboard gereed grafana. Dit is so eenvoudig!

Die resultaat?

So, klikhuis - Dit:

  • vinnig. Almal weet dit.
  • net. 'n Bietjie omstrede, maar ek glo dat dit moeilik is in opleiding, maklik in gevegte. As jy verstaan ​​hoe klikhuis dit werk, dan is alles baie eenvoudig.
  • Heelal. Dit is geskik vir verskillende scenario's: DWH, Tydreeks, Logberging. Maar dit is nie OLTP databasis, so moenie probeer om kort invoegings en lees daar te doen nie.
  • Interessant genoeg. Seker die een met wie werk klikhuis, het baie interessante oomblikke in 'n goeie en slegte sin beleef. Byvoorbeeld, 'n nuwe vrystelling het uitgekom, alles het opgehou werk. Of wanneer jy twee dae lank met 'n taak gesukkel het, maar nadat jy 'n vraag in Telegram-klets gevra het, is die taak in twee minute opgelos. Of soos by die konferensie by die verslag van Lesha Milovidov, 'n kiekie van klikhuis het die uitsending gebreek Hoëlaai++. Hierdie soort ding gebeur heeltyd en maak ons ​​lewens moeilik. klikhuis helder en interessant!

Jy kan die aanbieding kyk hier.

Verhuis na ClickHouse: 3 jaar later

Die langverwagte vergadering van ontwikkelaars van hoëladingstelsels by Hoëlaai++ sal op 9 en 10 November in Skolkovo plaasvind. Ten slotte sal dit 'n vanlyn konferensie wees (al is met alle voorsorgmaatreëls in plek), aangesien die energie van HighLoad++ nie aanlyn verpak kan word nie.

Vir die konferensie vind en wys ons jou gevalle oor die maksimum vermoëns van tegnologie: HighLoad++ was, is en sal die enigste plek wees waar jy binne twee dae kan leer hoe Facebook, Yandex, VKontakte, Google en Amazon werk.

Nadat ons ons vergaderings sedert 2007 sonder onderbreking gehou het, sal ons vanjaar vir die 14de keer vergader. Gedurende hierdie tyd het die konferensie 10 keer gegroei; verlede jaar het die sleutelbedryfgeleentheid 3339 165 deelnemers, 16 sprekers, verslae en ontmoetings bymekaargebring, en XNUMX snitte was gelyktydig aan die gang.
Verlede jaar was daar 20 busse, 5280 liter tee en koffie, 1650 liter vrugtedrankies en 10200 bottels water. En nog 2640 16 kilogram kos, 000 25 borde en 000 100 koppies. Terloops, met die geld wat uit herwinde papier ingesamel is, het ons XNUMX eikehoutsaailinge geplant :)

Jy kan kaartjies koop hier, kry nuus oor die konferensie - hier, en praat op alle sosiale netwerke: telegram, Facebook, Vkontakte и Twitter.

Bron: will.com

Voeg 'n opmerking