För tre Ă„r sedan pĂ„ scenen presenterade Viktor Tarnavsky och Alexey Milovidov frĂ„n Yandex HighLoad++ , hur bra ClickHouse Ă€r, och hur snabbt det Ă€r. PĂ„ en intilliggande scen fanns Alexander Zaytsev med om flytten till ClickHouse frĂ„n en annan analytisk databas med slutsatsen att ClickHouse, förstĂ„s, Ă€r bra, men inte sĂ€rskilt bekvĂ€m. NĂ€r företaget LifeStreet, dĂ€r Alexander dĂ„ arbetade, flyttade sin multipetabytes analytiska system till ClickHouse, var det en spĂ€nnande "vĂ€g av gult tegel" full av okĂ€nda faror â ClickHouse det kĂ€ndes som ett minfĂ€lt.
Tre Ă„r senare ClickHouse har blivit mycket bĂ€ttre â under denna tid grundade Alexander företaget Altinity, som inte bara hjĂ€lper till med flytten till ClickHouse tio projekt, utan ocksĂ„ förbĂ€ttrar produkten tillsammans med sina kollegor pĂ„ Yandex. Nu ClickHouse Ă€r det fortfarande ingen bekymmerslös promenad, men det Ă€r inte lĂ€ngre ett minfĂ€lt.
Alexander har arbetat med distribuerade system sedan 2003 och har utvecklat stora projekt pÄ MySQL, Oracle och Vertica. PÄ den nyligen hÄllna HighLoad++ 2019 berÀttade Alexander, en av pionjÀrerna inom anvÀndningen av ClickHouse, hur denna databas ser ut idag. Vi fÄr veta om de viktigaste funktionerna ClickHouse: hur den skiljer sig frÄn andra system och i vilka fall den Àr mer effektiv att anvÀnda. Vi kommer att titta pÄ fÀrska och beprövade projekt för att bygga system pÄ ClickHouse.

Retrospektiv: vad hÀnde för 3 Är sedan
För tre Är sedan flyttade vi företaget LifeStreet till ClickHouse frÄn en annan analytisk databas, och migreringen av reklamnÀtverkets analys sÄg ut sÄ hÀr:
- Juni 2016. I OpenSource upptrÀdde ClickHouse och vÄrt projekt startade;
- Augusti. Proof Of Concept: ett stort reklamnÀtverk, infrastruktur och 200-300 terabyte data;
- Oktober. De första produktionsdata;
- December. FullstĂ€ndig produktbelastning â 10-50 miljarder hĂ€ndelser per dag.
- Juni 2017. FramgÄngsrik flytt av anvÀndare till ClickHouse, 2,5 petabyte data pÄ en kluster av 60 servrar.
Under migreringen ökade förstĂ„elsen för att ClickHouse â det Ă€r ett bra system som Ă€r trevligt att arbeta med, men det Ă€r ett internt projekt av Yandex. SĂ„ det finns nyanser: Yandex kommer först att hantera sina egna interna bestĂ€llare och först dĂ€refter â gemenskapen och behoven hos externa anvĂ€ndare, och ClickHouse nĂ„dde dĂ„ inte upp till enterprise-nivĂ„ inom mĂ„nga funktionella omrĂ„den. SĂ„ i mars 2017 grundade vi företaget Altinity för att göra ClickHouse Ă€nnu snabbare och enklare för inte bara Yandex, utan ocksĂ„ för andra anvĂ€ndare. Och nu vi:
- Utbildar och hjÀlper till att bygga lösningar pÄ ClickHouse sÄ att kunderna inte gör misstag och sÄ att lösningen faktiskt fungerar;
- SÀkerstÀller 24/7 support ClickHouse-installationer;
- Utvecklar egna ekosystemprojekt;
- Aktivt Ätar oss ClickHouse, som svarar pÄ anvÀndarnas förfrÄgningar om att se vissa funktioner.
Och sjÀlvklart hjÀlper vi till med övergÄngen till ClickHouse med MySQL, Vertica, Oracle, Greenplum, Redshift och andra system. Vi har deltagit i olika övergÄngar, och alla har varit framgÄngsrika.
Varför ens övergÄ till ClickHouse
Det bromsar inte! Detta Ă€r den frĂ€msta anledningen. ClickHouse â en mycket snabb databas för olika scenarier:
Slumptalscitat frÄn personer som har arbetat lÀnge med ClickHouse.
Skalbarhet. PÄ en annan databas kan man uppnÄ bra prestanda pÄ en enskild maskin, men ClickHouse kan skalas inte bara vertikalt, utan ocksÄ horisontellt, helt enkelt genom att lÀgga till servrar. Allt fungerar inte alltid sÄ smidigt som man skulle vilja, men det fungerar. Man kan vÀxa systemet i takt med företagets tillvÀxt. Det Àr viktigt att vi inte Àr begrÀnsade av lösningen just nu och alltid har potential för utveckling.
Portabilitet. Ingen bindning till nĂ„got speciellt. Till exempel med Amazon Redshift Ă€r det svĂ„rt att flytta nĂ„gonstans. Men ClickHouse kan installeras pĂ„ sin bĂ€rbara dator, server, deployas i molnet, gĂ„ in i Kubernetes â det finns inga begrĂ€nsningar pĂ„ drift av infrastrukturen. Det Ă€r bekvĂ€mt för alla, och det Ă€r en stor fördel som mĂ„nga andra liknande databaser inte kan skryta med.
Flexibilitet. ClickHouse stannar inte vid nĂ„got speciellt, som Yandex.Metrica, utan utvecklas och anvĂ€nds i allt fler olika projekt och industrier. Det kan utvidgas genom att lĂ€gga till nya funktioner för att lösa nya uppgifter. Till exempel anses det att lagra loggar i databasen Ă€r en brist, sĂ„ för detta uppfanns Elasticsearch. Men, tack vare flexibiliteten i ClickHouse, kan man ocksĂ„ lagra loggar dĂ€r, och ofta Ă€r det till och med bĂ€ttre Ă€n i Elasticsearch â i ClickHouse för detta krĂ€vs 10 gĂ„nger mindre hĂ„rdvara.
Gratis Ăppen kĂ€llkod. Inga kostnader. Ingen överenskommelse behövs för att installera systemet pĂ„ sin bĂ€rbara dator eller server. Inga dolda avgifter. Inga andra databasteknologier med öppen kĂ€llkod kan konkurrera med hastigheten hos ClickHouse. MySQL, MariaDB, Greenplum â alla Ă€r mycket lĂ„ngsammare.
Gemenskap, driv och kul. Vi ClickHouse ett utmÀrkt samhÀlle: meetups, chattar och Alexey Milovidov, som ger oss all energi och optimism.
Flytt till ClickHouse
För att migrera till ClickHouse frÄn nÄgot annat, behövs bara tre saker:
- FörstÄ begrÀnsningarna ClickHouse och nÀr det inte passar.
- Utnyttja fördelarna med teknologin och dess starkaste sidor.
- Experimentera. Ăven om man förstĂ„r hur ClickHousefungerar, Ă€r det inte alltid möjligt att förutse nĂ€r det kommer att vara snabbare, nĂ€r lĂ„ngsammare, nĂ€r bĂ€ttre och nĂ€r sĂ€mre. SĂ„ försök.
Problemet med migrationen
Det finns bara ett "men": om du flyttar till ClickHouse frÄn nÄgot annat, Àr det vanligtvis nÄgot som gÄr fel. Vi Àr vana vid vissa praxis och saker som fungerar i vÄr favoritdatabas. Till exempel anser alla som arbetar med SQL-databaser att ett visst urval av funktioner Àr obligatoriska:transaktioner;
- constraints;
- consistency;
- index;
- UPDATE/DELETE
- NULLs;
- millisekunder;;
- automatiska typkonverteringar;
- flera joins;
- fria partitioner;
- klusterhanteringsverktyg.
- Settet Àr obligatoriskt, men för tre Är sedan fanns det inga av dessa funktioner i
. Nu finns mindre Ă€n hĂ€lften av det som inte har genomförts kvar: transaktioner, constraints, consistency, millisekunder och typkonvertering. ClickHouse Och viktigast av alltâ i
fungerar vissa standardpraxis och tillvÀgagÄngssÀtt inte eller fungerar inte pÄ det sÀtt som vi Àr vana vid. Allt som dyker upp i ClickHouse följer " ClickHouseClickHouse way", dvs. funktioner skiljer sig frÄn andra databaser. Till exempel:Index vÀljs inte, utan hoppar över.
- Àr inte synkrona, utan asynkrona.
- NULLs Flera joins finns, men det finns ingen frÄgeplanerare. Hur de dÄ utförs Àr överhuvudtaget inte sÀrskilt klart för personer frÄn databasvÀrlden.
- ClickHouse-scenarier
Ă r 1960 skrev den amerikanske matematikern med ungerskt ursprung
Wigner E. P. en artikel " The unreasonable effectiveness of mathematics in the natural sciences" om att den omgivande vÀrlden av nÄgon anledning beskrivas vÀl av matematiska lagar. Matematiken Àr en abstrakt vetenskap, och de fysikaliska lagarna, som uttrycks i matematisk form, Àr inte triviala, ochbetonade att det Àr mycket konstigt. en artikel " Ur min synvinkel,
â Ă€r samma slags underlighet. Omskriver man Wigner kan man sĂ€ga sĂ„ hĂ€r: den ofattbara effektiviteten Ă€r ClickHouse i de mest varierande analytiska tillĂ€mpningar! ClickHouse Till exempel, lĂ„t oss ta
Real-Time Data Warehouse. Data Warehouse i Realtid, dÀr data laddas nÀstan kontinuerligt. Vi vill ta emot förfrÄgningar frÄn den med en sekunders försening. VÀnligen - anvÀnd ClickHouse, eftersom det var just för detta scenario som det utvecklades. ClickHouse precis sÄ anvÀnds det inte bara inom webben, utan Àven inom marknadsföring och finansiell analys, AdTech, samt inom BedrÀgeridetektion. I Real-time Data Warehouse anvÀnds en komplex strukturerad schema av typ 'stjÀrna' eller 'snöflinga', mÄnga tabeller med JOIN (ibland flera), och data lagras och Àndras vanligtvis i olika system.
LĂ„t oss ta ett annat scenario - Tidsserie: övervakning av enheter, nĂ€tverk, anvĂ€ndningsstatistik, internet of things. HĂ€r stöter vi pĂ„ tidsordnade, ganska enkla hĂ€ndelser. ClickHouse för detta var inte ursprungligen utvecklat, men det har visat sig fungera bra, och dĂ€rför anvĂ€nder stora företag ClickHouse som ett lagringsutrymme för övervakningsinformation. För att undersöka om ClickHouse Ă€r lĂ€mpligt för tidsserier, gjorde vi en benchmark baserat pĂ„ metoden och resultaten InfluxDB och TimescaleDB â specialiserade tidsserie databaser. , att ClickHouse, Ă€ven utan optimering för sĂ„dana uppgifter, vinner och pĂ„ andras plan:
I tidsserie anvÀnds vanligtvis en smal tabell - nÄgra smÄ kolumner. Det kan komma en mycket stor mÀngd data frÄn övervakningen - miljoner poster per sekund - och vanligtvis kommer de i smÄ insÀttningar (real-time streaming). DÀrför behövs ett annat insÀttningsscenario, och sjÀlva förfrÄgningarna har sin egen specifika karaktÀr.
Loggförvaltning. Att samla loggar i databasen Àr vanligtvis dÄligt, men i ClickHouse kan det göras med vissa förbehÄll, som beskrivits ovan. MÄnga företag anvÀnder ClickHouse just för detta. I detta fall anvÀnds en platt, bred tabell, dÀr vi lagrar loggar helt (till exempel i form av JSON), eller delar upp dem. Data laddas vanligtvis i stora batchar (filer), och vi söker efter ett visst fÀlt.
För varje av dessa funktioner anvÀnds vanligtvis specialiserade databaser. ClickHouse en kan göra allt detta sÄ bra att den övertrÀffar dem i prestanda. LÄt oss nu titta noggrant pÄ tidsserie scenariot, och hur man korrekt förbereder ClickHouse för detta scenario.
Tidsserie
I nulĂ€get Ă€r detta huvudsakliga scenariot, för vilket ClickHouse betraktas som en standardlösning. Tidsserie â Ă€r en uppsĂ€ttning tidsordnade hĂ€ndelser som representerar förĂ€ndringar i en process över tid. Till exempel kan det vara pulsfrevens under en dag eller antalet processer i systemet. Allt som ger tidsstĂ€mplar med nĂ„got mĂ„tt â Ă€r detta tidsserie:
Den största mÀngden sÄdana hÀndelser kommer frÄn övervakning. Det kan vara inte bara övervakning av webben, utan Àven av verkliga enheter: bilar, industriella system, IoT, fabriker eller sjÀlvkörande taxibilar, i vars bagageutrymme Yandex redan nu lÀgger ClickHouse-servrar.
Till exempel finns det företag som samlar in data frÄn fartyg. Varje nÄgra sekunder skickar sensorer frÄn ett containerfartyg hundratals olika mÄtt. Ingenjörer studerar dem, bygger modeller och försöker förstÄ hur effektivt fartyget anvÀnds, eftersom containerfartyget inte ska stÄ still en sekund. Allt stillestÄnd Àr en förlust av pengar, sÄ det Àr viktigt att förutsÀga rutten sÄ att stoppen blir minimala.
Det finns en ökande mÀngd specialiserade databaser som mÀter tidsserie. PÄ webbplatsen DB-Engines rankas olika databaser pÄ nÄgot sÀtt, och de kan ses efter typer:
Den snabbast vÀxande typen Àr tidsserier. Grafdatabaser vÀxer ocksÄ, men tidsseriervÀxer snabbare de senaste Ären. Typiska representanter för denna databasfamilj Àr InfluxDB, Prometheus, KDB, TimescaleDB (byggd pÄ PostgreSQL), lösningar frÄn Amazon. ClickHouse kan ocksÄ anvÀndas hÀr, och det anvÀnds. Jag kommer att ge nÄgra offentliga exempel.
En av pionjĂ€rerna Ă€r företaget CloudFlare (CDN-leverantör). De övervakar sina CDN via ClickHouse (DNS-förfrĂ„gningar, HTTP-förfrĂ„gningar) med enorm belastning â 6 miljoner hĂ€ndelser per sekund. Allt gĂ„r genom Kafka, skickas till ClickHouse, vilket ger möjlighet att se hĂ€ndelsedashboards i systemet i realtid.
Comcast â en av ledarna inom telekommunikation i USA: internet, digital TV, telefoni. De har skapat ett liknande system för hantering av CDN inom Ăppen kĂ€llkod projektet Apache Traffic Control för att arbeta med sina enorma data. ClickHouse anvĂ€nds som back-end för analys.
Percona har integrerat ClickHouse inuti sin PMM, för att lagra övervakning av olika MySQL.
Specifika krav
Tidsserie-databaser har sina specifika krav.
- Snabb insĂ€ttning frĂ„n mĂ„nga agenter.Vi mĂ„ste mycket snabbt sĂ€tta in data frĂ„n mĂ„nga flöden. ClickHouse gör det bra, eftersom den har alla insĂ€ttningar icke-blockerande. Varje insĂ€ttning â detta Ă€r en ny fil pĂ„ disken, och smĂ„ insatser kan buffras pĂ„ ett eller annat sĂ€tt. I ClickHouse bĂ€sta fall bör data infogas i stora paket snarare Ă€n rad för rad.
- Flexibel struktur. I tidsserie vi vet vanligtvis inte datans struktur helt och hÄllet. Det gÄr att bygga ett övervakningssystem för en specifik applikation, men dÄ Àr det svÄrt att anvÀnda det för en annan applikation. För detta behövs en mer flexibel struktur. ClickHouse, tillÄter detta, trots att det Àr en strikt typad databas.
- Effektiv lagring och "glömska" av data. Vanligtvis i tidsserie en enorm mĂ€ngd data, vilket innebĂ€r att de mĂ„ste lagras sĂ„ effektivt som möjligt. Till exempel, en InfluxDB bra komprimering â det Ă€r dess huvudsakliga funktion. Men förutom lagring mĂ„ste man ocksĂ„ kunna "glömma" gammal data och göra nĂ„gon form av nedskĂ€rning â automatisk berĂ€kning av aggregat.
- Snabba förfrĂ„gningar av aggregerade data. Ibland vill man se de senaste 5 minuterna med millisekunders noggrannhet, men vid mĂ„natlig data kan minut- eller sekundgranularitet vara onödig â det rĂ€cker med övergripande statistik. Stöd för sĂ„dana typer Ă€r nödvĂ€ndigt, annars kommer en förfrĂ„gan för 3 mĂ„nader att ta mycket lĂ„ng tid Ă€ven i ClickHouse.
- FörfrÄgningar av typ "sista punkt, per». Detta Àr typiska för tidsserie förfrÄgningar: vi ser den senaste mÀtningen eller tillstÄndet i systemet vid en given tidpunkt t. För databaser Àr detta inte sÀrskilt trevliga förfrÄgningar, men de mÄste ocksÄ kunna utföras.
- "Sammanfogning" av tidsserier. Tidsserie â det Ă€r en tidsserie. Om det finns tvĂ„ tidsserier, mĂ„ste de ofta sammanfogas och korreleras. Det Ă€r inte alltid enkelt att göra detta i databaser, sĂ€rskilt med oregelbundna tidsserier: hĂ€r â en tidsmarkering, dĂ€r â en annan. Man kan rĂ€kna medelvĂ€rden, men om det fortfarande finns hĂ„l Ă€r det oklart.
LÄt oss se hur dessa krav uppfylls i ClickHouse.
Diagram
I ClickHouse struktur för tidsserie kan göras pĂ„ olika sĂ€tt, beroende pĂ„ graden av datans regelbundenhet. Man kan bygga ett system pĂ„ regelbundna data, nĂ€r vi kĂ€nner till alla mĂ€tvĂ€rden pĂ„ förhand. Till exempel, sĂ„ gjorde CloudFlare med övervakning CDN â det Ă€r ett vĂ€loptimerat system. Man kan bygga ett mer allmĂ€nt system som övervakar hela infrastrukturen, olika tjĂ€nster. I fallet med oregelbundna data vet vi inte i förvĂ€g vad som övervakas â och det Ă€r förmodligen det vanligaste fallet.
Regelbundna data. Kolumner. Strukturen Ă€r enkel â kolumner med de nödvĂ€ndiga typerna:
SKAPA TABELL cpu (
created_date Datum DEFAULT today(),
created_at DatumTid DEFAULT now(),
time StrÀng,
tags_id UInt32,
/* anslutning till 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
) MOTOR = MergeTree(created_date, (tags_id, created_at), 8192);Detta Àr en vanlig tabell som övervakar nÄgon aktivitet relaterad till systembelastning (anvÀndare, system, inaktiv, trevlig). Enkelt och bekvÀmt, men inte flexibelt. Om vi vill ha en mer flexibel struktur kan vi anvÀnda matriser.
Oregelbundna data. Matriser:
SKAPA TABELL cpu_alc (
created_date Datum,
created_at DatumTid,
time StrÀng,
tags_id UInt32,
metrics Nestad(
name LowCardinality(StrÀng),
value Float64
)
) MOTOR = MergeTree(created_date, (tags_id, created_at), 8192);
VĂLJ max(metrics.value[indexOf(metrics.name,'usage_user')]) FRĂ
N ...
Struktur Nestad â det finns tvĂ„ matriser: metrics.name och metrics.value. HĂ€r kan vi lagra sĂ„dana godtyckliga övervakningsdata som en matris av namn och en matris av mĂ„tt för varje hĂ€ndelse. För ytterligare optimering kan vi skapa flera sĂ„dana strukturer istĂ€llet för en. Till exempel, en för float-vĂ€rde, en annan för int-vĂ€rde, eftersom int vi vill lagra det mer effektivt.
Men att anvÀnda en sÄdan struktur Àr mer komplicerat. Vi mÄste anvÀnda en speciell konstruktion, genom speciella funktioner för att först hÀmta vÀrden frÄn indexet och sedan frÄn matrisen:
VĂLJ max(metrics.value[indexOf(metrics.name,'usage_user')]) FRĂ
N ...Men det fungerar ÀndÄ tillrÀckligt snabbt. Ett annat sÀtt att lagra oregelbundna data Àr i rader.
Oregelbundna data. Rader. I denna traditionella metod utan matriser lagras bĂ„de namn och vĂ€rden direkt. Om en enhet skickar 5 000 mĂ€tningar pĂ„ en gĂ„ng â genereras 5 000 rader i databasen:
SKAPA TABELL cpu_rlc (
created_date Datum,
created_at DatumTid,
time StrÀng,
tags_id UInt32,
metric_name LowCardinality(StrÀng),
metric_value Float64
) MOTOR = MergeTree(created_date, (metric_name, tags_id, created_at), 8192);
VĂLJ
maxIf(metric_value, metric_name = 'usage_user'),
...
FRĂ
N cpu_r
DĂR metric_name I ('usage_user', ...)
ClickHouse detta klarar sig â det har speciella tillĂ€gg ClickHouse SQL. Till exempel, maxIf â en speciell funktion som berĂ€knar maximum för en mĂ€tning under ett visst villkor. Man kan skriva flera sĂ„dana uttryck i en och samma frĂ„ga och rĂ€kna ut vĂ€rdet för flera mĂ€tningar samtidigt.
LÄt oss jÀmföra tre metoder:
HÀr har jag lagt till "Datastorlek pÄ disken" för en viss testdatasats. I fallet med kolumner har vi den minsta datastorleken: maximal komprimering, maximal förfrÄgningshastighet, men vi betalar för att allt mÄste fixeras direkt.
I fallet med arrayer Ă€r det lite sĂ€mre. Data komprimeras fortfarande bra, och det gĂ„r att lagra oregelbundna scheman. Men ClickHouse â en kolumndatabas, och nĂ€r vi börjar lagra allt i en array, förvandlas den till en strĂ€ngdatabas, och vi betalar för flexibilitet med effektivitet. För varje operation mĂ„ste hela arrayen lĂ€sas in i minnet, varefter vi hittar det nödvĂ€ndiga elementet â och om arrayen vĂ€xer försĂ€mras hastigheten.
I ett av företagen som anvÀnder ett sÄdant tillvÀgagÄngssÀtt (till exempel, ), delas arrayer upp i bitar om 128 element. Data frÄn flera tusen metrik i storlek av 200 TB per dag lagras inte i en enda array, utan i 10 eller 30 arrayer med speciell logik för lagring.
Ett sĂ„ enkelt tillvĂ€gagĂ„ngssĂ€tt som möjligt â med strĂ€ngar. Men data komprimeras dĂ„ligt, och storleken pĂ„ tabellen blir stor, sĂ€rskilt nĂ€r förfrĂ„gningar görs om flera metrik, vilket gör att ClickHouse arbetar suboptimalt.
Hybrid schema
Anta att vi valt schema med array. Men om vi vet att de flesta av vÄra dashboards endast visar metrik som user och system, kan vi ytterligare materialisera dessa metrik frÄn arrayen pÄ tabellnivÄ pÄ följande sÀtt:
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);
Vid insÀttning ClickHouse berÀknar den automatiskt. SÄ kan vi kombinera det trevliga med det nyttiga: schemat Àr flexibelt och allmÀnt, men de mest anvÀnda kolumnerna har vi hÀmtat. Jag pÄpekar att detta inte krÀvde att vi Àndrade insÀttningen och ETL, som fortsÀtter att injicera arrayer i tabellen. Vi gjorde helt enkelt ALTER TABLE, lade till nÄgra kolumner, och vi fick ett hybrid- och snabbare schema som kan anvÀndas direkt.
Kodningar och kompression
För tidsserie Àr viktigt, eftersom hur bra du packar data Àr avgörande, eftersom informationen kan vara mycket stor. I ClickHouse det finns en uppsÀttning verktyg för att uppnÄ komprimeringseffekter pÄ 1:10, 1:20, och ibland Ànnu mer. Det betyder att opackade data pÄ 1 TB pÄ disken tar upp 50-100 GB. En mindre storlek Àr bra, eftersom data kan lÀsas och bearbetas snabbare.
För att uppnÄ en hög nivÄ av komprimering, ClickHouse stöder följande codecs:
Exempel pÄ tabell:
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);HĂ€r definierar vi codec DoubleDelta i ett fall, och i det andra â Gorilla, och vi lĂ€gger dessutom till LZ4 komprimering. Som ett resultat minskar datastorleken pĂ„ disken avsevĂ€rt:
HĂ€r visas hur mycket plats samma data tar, men med olika codecs och komprimeringar:
- i GZIP-fil pÄ disken;
- i ClickHouse utan codecs, men med ZSTD-kompression;
- i ClickHouse med codecs och LZ4 och ZSTD-komprimering.
Det Àr tydligt att tabeller med codecs tar upp mycket mindre plats.
Storleken spelar roll
Inte mindre viktigt rÀtt datatyp:
I alla exempel ovan har jag anvÀnt Float64. Men om vi hade valt Float32, skulle det vara Ànnu bÀttre. Detta visade killarna frÄn Percona i artikeln i lÀnken ovan. Det Àr viktigt att anvÀnda den mest kompakta typen som passar uppgiften: Àven i mindre grad för storlek pÄ disken, Àn för hastigheten pÄ förfrÄgningar. ClickHouse Àr mycket kÀnslig för detta.
Om du kan anvĂ€nda int32 istĂ€llet för int64, förvĂ€nta dig nĂ€stan en dubbel prestandaökning. Data tar upp mindre minne, och all "aritmetik" fungerar mycket snabbare. ClickHouse inuti sig â ett mycket strikt typat system, utnyttjar det alla möjligheter som moderna system erbjuder.
Aggregering och Materialiserade vyer
Aggregering och materialiserade vyer gör det möjligt att göra aggregat för olika situationer:
Till exempel kan du ha oaggregidata och du kan koppla olika materialiserade vyer med automatisk summering via en speciell motor. SummingMergeTree (SMT). SMT Àr en speciell aggregationsdatastruktur som automatiskt berÀknar aggregat. RÄdata sÀtts in i databasen, de aggregeras automatiskt och kan omedelbart anvÀndas i dashboards.
TTL glömmer bort gamla data
Hur "glömmer" man data som inte lÀngre behövs? ClickHouse kan detta. Vid skapande av tabeller kan du ange TTL uttryck: till exempel att minuterna lagras i en dag, dagsdata i 30 dagar och veckodata eller mÄnadsdata aldrig rörs:
CREATE TABLE aggr_by_minute
âŠ
TTL time + interval 1 day
CREATE TABLE aggr_by_day
âŠ
TTL time + interval 30 day
CREATE TABLE aggr_by_week
âŠ
/* no TTL */
Multi-tier separerar data över diskar
Utvecklar detta koncept kan data lagras i ClickHouse olika platser. Anta att vi vill lagra heta data frÄn den senaste veckan pÄ en mycket snabb lokal SSD, medan mer historiska data lagras pÄ en annan plats. I ClickHouse Àr detta nu möjligt:
Det gÄr att konfigurera lagringspolicy (storage policy) sÄ att ClickHouse data automatiskt flyttas till ett annat lagringsutrymme nÀr vissa villkor uppfylls.
Men det Àr fortfarande inte allt. PÄ nivÄn av en specifik tabell kan du definiera regler för nÀr data övergÄr till kall lagring baserat pÄ tid. Till exempel, data lagras pÄ en mycket snabb disk i 7 dagar och allt som Àr Àldre flyttas till en lÄngsammare disk. Detta Àr bra eftersom det gör att systemet kan hÄllas med maximal prestanda, samtidigt som kostnaderna kontrolleras utan att spendera pengar pÄ kalla data:
CREATE TABLE
...
TTL date + INTERVAL 7 DAY TO VOLUME 'cold_volume',
date + INTERVAL 180 DAY DELETE
Unika möjligheter ClickHouse
Det finns nĂ€stan alltid sĂ„dana "speciella drag" i ClickHouse men dessa neutraliseras av exklusivitet â av det som inte finns i andra databaser. Till exempel, hĂ€r Ă€r nĂ„gra av de unika funktionerna ClickHouse:
- Arrayer. I ClickHouse mycket bra stöd för arrayer samt möjlighet att utföra komplexa berÀkningar pÄ dem.
- Aggregationsdatastrukturer. Detta Àr en av "killer-features" ClickHouse. Trots att grabbarna frÄn Yandex sÀger att vi inte vill aggreggera data, sÄ aggreggerar alla i ClickHouse, eftersom det Àr snabbt och bekvÀmt.
- Materialiserade vyer. Tillsammans med aggregerande datakonstruktioner möjliggör materialiserade vyer enklare real-time aggregering.
- ClickHouse SQL. Detta Àr en utvidgning av sprÄket SQL med vissa ytterligare och exklusiva funktioner som endast finns i ClickHouse. Tidigare var det bÄde en utvidgning och en nackdel. Nu har vi nÀstan raderat alla nackdelar jÀmfört med SQL 92 . nu Àr det bara en utvidgning.
- Lambda-uttryck.Finns de i nÄgon annan databas?
- ML-stöd.Det finns i olika databaser, vissa Àr bÀttre Àn andra.
- Ăppen kod. Vi kan expandera ClickHouse tillsammans. Nu Ă€r vi ClickHouse ungefĂ€r 500 bidragsgivare, och det antalet vĂ€xer stĂ€ndigt.
Smart frÄgor
I ClickHouse det finns mÄnga olika sÀtt att göra samma sak. Till exempel kan vi fÄ det senaste vÀrdet frÄn tabellen pÄ tre olika sÀtt för CPU (det finns Àven ett fjÀrde, men det Àr Àn mer exotiskt).
Det första visar hur enkelt det Àr att göra i ClickHouse frÄgor, nÀr du vill verifiera att tuple finns i en underfrÄga. Det Àr nÄgot som jag personligen har saknat i andra databaser. Om jag vill jÀmföra nÄgot med en underfrÄga kan jag i andra databaser bara jÀmföra med en skalÀr, och för flera kolumner mÄste jag skriva JOIN. I ClickHouse vi kan anvÀnda tuple:
SELECT *
FROM cpu
WHERE (tags_id, created_at) IN
(SELECT tags_id, max(created_at)
FROM cpu
GROUP BY tags_id)Det andra sÀttet gör samma sak, men anvÀnder en aggregatfunktion argMax:
SELECT
argMax(usage_user), created_at),
argMax(usage_system), created_at),
...
FROM cpu I ClickHouse det finns flera dussin aggregatfunktioner, och om vi anvÀnder kombinatorer, enligt kombinatorikens lagar, finns det ungefÀr tusen. ArgMax Àr en av funktionerna som berÀknar det maximala vÀrdet: frÄgan returnerar vÀrdet usage_user, vid vilket det maximala vÀrdet uppnÄs 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 â âsammanfogningâ av rader med olika tidsstĂ€mplar. Detta Ă€r en unik funktion för databaser som ocksĂ„ finns i kdb+. Om det finns tvĂ„ tidsserier med olika tidpunkter, ASOF JOIN möjliggör det att förskjuta och sammanfoga dem i en och samma frĂ„ga. För varje vĂ€rde i en tidsserie hittas det nĂ€rmaste vĂ€rdet i den andra, och de returneras pĂ„ en rad:
Analytiska funktioner
I standarden SQL-2003 kan man skriva sÄ hÀr:
VĂ€lj origin,
tidsstÀmpel,
tidsstĂ€mpel -LAG(tidsstĂ€mpel, 1) ĂVER (PARTITION BY origin ORDER BY tidsstĂ€mpel) AS varaktighet,
tidsstĂ€mpel -MIN(tidsstĂ€mpel) ĂVER (PARTITION BY origin ORDER BY tidsstĂ€mpel) AS startseq_varaktighet,
RAD_NUMMER() ĂVER (PARTITION BY origin ORDER BY tidsstĂ€mpel) AS sekvens,
ANTAL() ĂVER (PARTITION BY origin ORDER BY tidsstĂ€mpel) AS nb
FRĂ
N mytable
ORDER BY origin, tidsstÀmpel;
I ClickHouse det gĂ„r inte â det stöder inte standarden SQL-2003 och troligen kommer det aldrig att göra det. IstĂ€llet Ă€r det ClickHouse vanligt att skriva sĂ„ hĂ€r:
Jag lovade lambdas â hĂ€r Ă€r de!
Detta Ă€r en motsvarighet till analytisk frĂ„ga i standarden SQL-2003: den berĂ€knar skillnaden mellan tvĂ„ tidsstĂ€mplar, varaktighet, sekvensnummer â allt som vi vanligtvis rĂ€knar som analytiska funktioner. I ClickHouse berĂ€knar vi dem via arrayer: först komprimerar vi data i en array, efter det gör vi allt vi vill med arrayen, och sedan utvecklar vi den igen. Det Ă€r inte sĂ€rskilt bekvĂ€mt och krĂ€ver en viss förkĂ€rlek för funktionell programmering, minst sagt, men det Ă€r mycket flexibelt.
SĂ€rskilda funktioner
Dessutom har ClickHouse mÄnga specialiserade funktioner. Till exempel, hur kan man bestÀmma hur mÄnga sessioner som pÄgÄr samtidigt? En typisk uppgift för övervakning Àr att faststÀlla maximal belastning frÄn en förfrÄgan. I ClickHouse finns det en speciell funktion för detta ÀndamÄl:
Ăverlag finns det mĂ„nga specialfunktioner i ClickHouse:
- runningDifference, runningAccumulate, neighbor;
- sumMap(key, value);
- timeSeriesGroupSum(uid, tidsstÀmpel, vÀrde);
- timeSeriesGroupRateSum(uid, tidsstÀmpel, vÀrde);
- skewPop, skewSamp, kurtPop, kurtSamp;
- WITH FILL / WITH TIES;
- simpleLinearRegression, stochasticLinearRegression.
Detta Àr inte en fullstÀndig lista av funktioner, totalt finns det 500-600. En hint: alla funktioner i ClickHouse finns i systemtabellen (inte alla dokumenterade, men alla intressanta):
vÀlj * frÄn system.functions orderera efter namnClickHouse sjÀlv innehÄller mycket information om sig sjÀlv, inklusive loggar, query_log, spÄrningslogg, logg för operationer med datablokkar (part_log), logg för metrik, och systemloggar som vanligtvis skrivs till disk. Metrikloggen Àr tidsserie pÄ ClickHouse i sjÀlva verket: ClickHouseDB kan faktiskt fungera som tidsserie databaser, vilket pÄ sÄ sÀtt "Àter" sig sjÀlv.
Detta Ă€r ocksĂ„ en unik sak â eftersom vi gör ett bra jobb för tidsserie, varför kan vi inte lagra allt som behövs inom oss sjĂ€lva? Vi behöver inte Prometheus, vi lagrar allt i oss. Vi kopplade in Grafana och övervakar oss sjĂ€lva. Men om ClickHouse skulle falla, kan vi inte se varför â dĂ€rför görs det vanligtvis inte sĂ„.
Stort kluster eller mÄnga smÄ ClickHouse
Vad Ă€r bĂ€st â ett stort kluster eller mĂ„nga smĂ„ ClickHouse? Den traditionella ansatsen till DWH â Ă€r en stor kluster dĂ€r scheman sĂ€rskiljs för varje applikation. Vi gick till DB-administratören â ge oss schemat, och vi fick det:
I ClickHouse detta kan göras pÄ ett annat sÀtt. Man kan ge varje applikation sitt eget ClickHouse:
Vi behöver inte lÀngre stora monster DWH och osamarbetsvilliga administratörer. Vi kan ge varje applikation sitt eget ClickHouse, och utvecklaren kan göra det sjÀlv, eftersom ClickHouse det installeras mycket enkelt och krÀver ingen komplicerad administration:
Men om vi har mÄnga ClickHouse, och mÄste ofta installera det, sÄ vill man automatisera den processen. För detta kan vi till exempel anvÀnda Kubernetes och clickhouse-operatör. I Kubernetes ClickHouse kan man installera "med ett klick": Jag kan trycka pÄ knappen, starta manifestet och databasen Àr klar. Man kan omedelbart skapa ett schema, börja ladda upp mÀtvÀrden, och efter 5 minuter har jag redan en fÀrdig dashboard Grafana. SÄ enkelt Àr det!
Vad blir resultatet?
SĂ„, ClickHouse â Ă€r:
- Snabbt. Det Àr allmÀnt kÀnt.
- Enkelt. Lite kontroversiellt, men jag anser att det Àr svÄrt i studier, lÀtt i strid. Om man förstÄr hur ClickHouse det fungerar, Àr allt vÀldigt enkelt.
- Universellt. Det passar för olika scenarier: DWH, Tidsserier, Loggförvaring. Men det Àr ingen OLTP databas, sÄ försök inte göra korta insÀttningar och lÀsningar dÀr.
- Intressant. Troligen har den som arbetar med ClickHouse, upplevt mÄnga intressanta minuter i bÄde gott och ont. Till exempel, en ny version slÀpptes, allt slutade fungera. Eller nÀr du kÀmpat med en uppgift i tvÄ dagar, men efter frÄgan i Telegram-chatten löstes den pÄ tvÄ minuter. Eller som vid konferensen nÀr Alexey Milovidov höll ett föredrag och skÀrmdumpen frÄn ClickHouse bröt sÀndningen HighLoad++. Den typen av saker hÀnder hela tiden och gör vÄrt liv med ClickHouse ljus och intressant!
Presentation kan ses .
Den efterlĂ€ngtade trĂ€ffen för utvecklare av högbelastade system pĂ„ kommer att Ă€ga rum den 9 och 10 november i Skolkovo. Ăntligen blir detta en offline-konferens (Ă€ven om med alla försiktighetsĂ„tgĂ€rder), för energin frĂ„n HighLoad++ kan inte packas in online.
För konferensen hittar vi och visar dig fallstudier om de maximala möjligheterna med teknologier: HighLoad++ har varit, Àr och kommer alltid att vara den enda platsen dÀr man kan fÄ veta hur Facebook, Yandex, VKontakte, Google och Amazon Àr organiserade pÄ tvÄ dagar.
Sedan vi började vÄra möten utan avbrott 2007 kommer vi i Är att trÀffas för 14:e gÄngen. Under denna tid har konferensen vÀxt tiofaldigt, och förra Äret samlade branschens huvudevenemang 3339 deltagare, 165 talare och 16 spÄr som pÄgick samtidigt.
Förra Ă„ret hade vi 20 bussar, 5280 liter te och kaffe, 1650 liter bĂ€rdrycker och 10200 flaskor vatten. Dessutom 2640 kilogram mat, 16000 tallrikar och 25000 glas. Förresten, med de pengar som tjĂ€nats pĂ„ Ă„tervunnet papper planterade vi 100 ekplantor đDu kan köpa biljetter , fĂ„ nyheter om konferensen â , och prata â pĂ„ alla sociala medier: , , och .
KĂ€lla: habr.com
