Plënneren op ClickHouse: 3 Joer méi spéit

Virun dräi Joer de Viktor Tarnavsky an den Alexey Milovidov vu Yandex op der Bühn HighLoad++ erzielt, Wéi gutt ClickHouse ass, a wéi et net verlangsamt gëtt. An op der nächster Etapp gouf et Alexander Zaitsev с mellen iwwer Plënneren op clickhouse vun engem aneren analyteschen DBMS a mat der Konklusioun datt clickhouse, natierlech, gutt, awer net ganz bequem. Wann 2016 d'Firma LifeStreet, wou den Alexander dunn geschafft huet, gouf e Multi-Petabyte analytesche System ëmgewandelt clickhouse, et war eng faszinéierend "giel Mauerstrooss" voller onbekannte Gefore - clickhouse deemools huet et ausgesinn wéi e Minefeld.

Dräi Joer méi spéit clickhouse gouf vill besser - während dëser Zäit Alexander gegrënnt der Firma Altinity, déi net nëmmen hëlleft Leit ze plënneren clickhouse Dosende vu Projeten, awer verbessert och de Produit selwer zesumme mat Kollegen aus Yandex. Elo clickhouse nach net eng Suergfalt Bummel, awer net méi e Minefeld.

Alexander schafft mat verdeelt Systemer zënter 2003, entwéckelt grouss Projeten op MySQL, Oracle и Vertikal. Op der leschter HighLoad++ 2019 Alexander, ee vun de Pionéier vum Gebrauch clickhouse, gesot wat dës DBMS elo ass. Mir wäerten iwwer d'Haaptmerkmale léieren clickhouse: wéi et vun anere Systemer ënnerscheet an a wéi enge Fäll et méi effektiv ass et ze benotzen. Mat Beispiller wäerte mir rezent a Projet-getest Praktiken kucken fir Systemer ze bauen baséiert op clickhouse.


Réckbléck: wat virun 3 Joer geschitt ass

Virun dräi Joer hu mir d'Firma iwwerginn LifeStreet op clickhouse vun enger anerer analytescher Datebank, an d'Annonce Network Analytics Migratioun huet esou ausgesinn:

  • Juni 2016. An Open Source wossten clickhouse an eise Projet huet ugefaangen;
  • August. Proof Of Concept: grousst Reklammennetz, Infrastruktur an 200-300 Terabytes vun Daten;
  • Oktober. Éischt Produktiounsdaten;
  • Dezember. Déi voll Produktbelaaschtung ass 10-50 Milliarden Eventer pro Dag.
  • Juni 2017. Erfolleg Migratioun vu Benotzer op clickhouse, 2,5 Petabytes vun Daten op engem Cluster vun 60 Serveren.

Wärend dem Migratiounsprozess gouf et e wuessende Verständnis datt clickhouse ass e gudde System deen agreabel ass mat ze schaffen, awer dëst ass en internen Yandex Projet. Dofir ginn et Nuancen: Yandex wäert fir d'éischt mat hiren eegene internen Clienten ëmgoen an nëmmen dann mat der Gemeinschaft an de Besoine vun externe Benotzer, an ClickHouse huet dann net den Enterpriseniveau a ville funktionnelle Beräicher erreecht. Dofir hu mir Altinity am Mäerz 2017 gegrënnt fir ze maachen clickhouse nach méi séier a méi praktesch net nëmme fir Yandex, awer och fir aner Benotzer. An elo mir:

  • Mir trainéieren an hëllefen Léisungen ze bauen baséiert op clickhouse fir datt d'Clienten net an de Schwieregkeete kommen, a fir datt d'Léisung schlussendlech funktionnéiert;
  • Mir bidden 24/7 Ënnerstëtzung clickhouse- Installatiounen;
  • Mir entwéckelen eis eege Ecosystem Projeten;
  • Mir engagéieren eis aktiv fir eis selwer clickhouse, reagéiert op Ufroe vu Benotzer déi verschidde Features gesinn wëllen.

An natierlech, mir hëllefen mat Plënneren ze clickhouse с MySQL, Vertikal, entscheet, Greenplum, Redshift an aner Systemer. Mir sinn an enger Rei vu Beweegunge involvéiert, a si sinn all erfollegräich.

Plënneren op ClickHouse: 3 Joer méi spéit

Firwat plënneren op clickhouse

Bréngt net méi lues! Dëst ass den Haaptgrond. clickhouse - ganz séier Datebank fir verschidden Szenarien:

Plënneren op ClickHouse: 3 Joer méi spéit

Zoufälleg Zitater vu Leit, déi scho laang mat Leit geschafft hunn clickhouse.

Skalierbarkeet. Op e puer aner Datebank kënnt Dir gutt Leeschtung op engem Stéck Hardware erreechen, mä clickhouse Dir kënnt net nëmme vertikal, awer och horizontal skaléieren, einfach andeems Dir Server bäigefüügt. Alles funktionnéiert net sou glat wéi mir wëllen, awer et funktionnéiert. Dir kënnt de System ausbaue wéi Äre Betrib wiisst. Et ass wichteg datt mir elo net vun der Léisung limitéiert sinn an et ëmmer Potenzial fir Entwécklung ass.

Portabilitéit. Et gëtt keng Uschloss un eng Saach. Zum Beispill, mat Amazon RedShift Et ass schwéier iergendwou ze plënneren. A clickhouse Dir kënnt et op Ärem Laptop, Server installéieren, se an d'Wollek ofsetzen, gitt op Kubernetes - et gi keng Restriktiounen op den Fonctionnement vun der Infrastruktur. Dëst ass praktesch fir jiddereen, an dëst ass e grousse Virdeel vun deem vill aner ähnlech Datenbanken net kënne prägen.

Flexibilitéit. clickhouse hält net op eng Saach, zum Beispill, Yandex.Metrica, mee entwéckelt a gëtt a méi a méi verschidde Projeten an Industrien benotzt. Et kann erweidert ginn andeems nei Fäegkeeten derbäigesat ginn fir nei Probleemer ze léisen. Zum Beispill gëtt ugeholl datt d'Späichere vu Logbicher an enger Datebank schlecht Manéieren ass, sou datt se erauskomm sinn Elastikerzuch. Awer dank der Flexibilitéit clickhouse, Dir kënnt och Logbicher dran späicheren, an dacks ass dat nach besser wéi an Elastikerzuch - an clickhouse dëst erfuerdert 10 Mol manner Eisen.

fräi Open Source. Dir musst fir näischt bezuelen. Et ass net néideg fir d'Erlaabnis ze verhandelen fir de System op Ärem Laptop oder Server z'installéieren. Keng verstoppte Käschten. Zur selwechter Zäit kann keng aner Open Source Datebank Technologie a Geschwindegkeet konkurréiere mat clickhouse. MySQL, MariaDB, Greenplum - si sinn all vill méi lues.

Communautéit, fueren an Spaass. Hutt clickhouse excellent Communautéit: meetups, Chat an Alexey Milovidov, deen eis all mat senger Energie an Optimismus charge.

Plënneren op ClickHouse

Fir ze goen clickhouse aus iergendengem Grond braucht Dir nëmmen dräi Saachen:

  • Verstinn d'Aschränkungen clickhouse a wat et net gëeegent fir.
  • Profitéiert Technologie a seng gréisste Stäerkten.
  • Experimentéieren. Och ze verstoen wéi et funktionnéiert clickhouse, et ass net ëmmer méiglech virauszesoen, wéini et méi séier wäert sinn, wéini et méi lues ass, wéini et besser gëtt a wéini et méi schlëmm ass. Also probéiert et.

Plënneren Problem

Et gëtt nëmmen een "awer": wann Dir plënnert op clickhouse vun soss eppes, dann geet normalerweis eppes falsch. Mir si gewinnt un e puer Praktiken a Saachen déi an eiser Liiblingsdatenbank funktionnéieren. Zum Beispill, jiddereen mat schaffen SQL-Datenbanken betruechten déi folgend Set vu Funktiounen obligatoresch:

  • Transaktiounen;
  • Aschränkungen;
  • Konsequenz;
  • Indizes;
  • UPDATEN/LÄSCHEN;
  • NULL;
  • Millisekonnen;
  • automatesch Typ Goss;
  • Multiple Joint;
  • arbiträr Partitionen;
  • Cluster Management Tools.

Recrutement ass obligatoresch, awer virun dräi Joer an clickhouse Keng vun dëse Funktiounen waren verfügbar! Elo bleift manner wéi d'Halschent vun deem wat net ëmgesat gouf: Transaktiounen, Aschränkungen, Konsistenz, Millisekonnen an Typgoss.

An den Haapt Saach ass, datt am clickhouse e puer Standardpraktiken an Approche funktionnéieren oder funktionnéieren net anescht wéi mir gewinnt sinn. Alles wat erschéngt an clickhouse, entsprécht "ClickHouse Manéier", d.h. Funktiounen ënnerscheede sech vun aneren Datenbanken. Zum Beispill:

  • Indexe ginn net ausgewielt, awer iwwersprangen.
  • UPDATEN/LÄSCHEN net synchron, awer asynchron.
  • Et gi verschidde Joint, awer et gëtt keen Ufroplaner. Wéi se dann duerchgefouert ginn ass allgemeng net ganz kloer fir Leit aus der Datebankwelt.

ClickHouse Scripten

1960, en amerikanesche Mathematiker vun ungareschen Hierkonft Wigner EP geschriwwen en Artikel "Déi onverständlech Effektivitéit vun der Mathematik an den Naturwëssenschaften" ("The Incomprehensible Effectiveness of Mathematics in the Natural Sciences"), datt d'Welt ronderëm eis aus iergendengem Grond gutt duerch mathematesch Gesetzer beschriwwe gëtt. Mathematik ass eng abstrakt Wëssenschaft, a kierperlech Gesetzer ausgedréckt a mathematesch Form sinn net trivial, an Wigner EP betount, datt dat ganz komesch ass.

Aus menger Siicht, clickhouse - déi selwecht Friemheet. Fir de Wigner ëmzeschreiwen, kënne mir dëst soen: déi ondenkbar Effizienz ass erstaunlech clickhouse an enger grousser Villfalt vun analyteschen Uwendungen!

Plënneren op ClickHouse: 3 Joer méi spéit

Zum Beispill, loosst eis huelen Echtzäit Data Warehouse, an déi Daten bal kontinuéierlech gelueden ginn. Mir wëllen Demanden dovunner mat enger zweeter Retard kréien. Weg - benotzt et clickhouse, well dëst de Szenario ass fir deen entworf gouf. clickhouse dat ass genau wéi et net nëmmen um Internet benotzt gëtt, awer och a Marketing a Finanzanalyse, AdTech, wéi och an Bedruch Detektiounn. IN Echtzäit Data Warehouse eng komplex strukturéiert Schema wéi "Stär" oder "Snowflake" benotzt gëtt, vill Dëscher mat JOIN (heiansdo multiple), an d'Donnéeë ginn normalerweis an e puer Systemer gespäichert a geännert.

Loosst eis en aneren Szenario huelen - Zäit Serie: Iwwerwaachung vun Apparater, Netzwierker, Benotzungsstatistiken, Internet vun de Saachen. Hei begéine mir zimlech einfach Evenementer, déi an der Zäit bestallt sinn. clickhouse war net ursprénglech fir dës entwéckelt, mä huet gewisen, wie gutt ze schaffen, déi ass firwat grouss Betriber benotzen clickhouse als Repository fir Informatioun iwwerwaachen. Fir ze entdecken ob et gëeegent ass clickhouse fir Zäit-Serie, mir hunn e Benchmark baséiert op der Approche an Resultater Influx DB и ZäitplangDB - spezialiséiert Zäit-Serie Datenbanken. Et huet sech erausgestalltdat clickhouse, och ouni Optimisatioun fir sou Aufgaben, gewënnt op engem frieme Feld:

Plënneren op ClickHouse: 3 Joer méi spéit

В Zäit-Serie Normalerweis gëtt e schmuele Dësch benotzt - e puer kleng Sailen. Vill Daten kënnen aus Iwwerwaachung kommen - Millioune Rekorder pro Sekonn - a si kommen normalerweis a klenge Bursts (Echtzäit Streaming). Dofir ass en anert Insertskript gebraucht, an d'Ufroe selwer hunn hir eege Spezifizitéiten.

Log Management. Logbicher an eng Datebank sammelen ass normalerweis schlecht, awer clickhouse dëst kann mat e puer Kommentaren gemaach ginn wéi uewen beschriwwen. Vill Firmen benotzen clickhouse genee fir dësen Zweck. An dësem Fall benotze mir e flaach breet Dësch, wou mir déi ganz Logbicher späicheren (zum Beispill an der Form Language), oder a Stécker geschnidden. Daten ginn normalerweis a grousse Chargen (Dateien) gelueden, a mir sichen no engem Feld.

Fir all eenzel vun dëse Funktiounen gi spezialiséiert Datenbanken normalerweis benotzt. clickhouse et kann een alles maachen an esou gutt, datt et hinnen besser ass. Loosst eis elo méi genau kucken Zäit-Serie Szenario, a wéi Dir richteg "kacht". clickhouse fir dëst Szenario.

Zäit-Serie

De Moment ass dëst den Haaptszenario fir deen clickhouse als Standard Léisung ugesinn. Zäit-Serie ass eng Rei vun Eventer, déi an der Zäit bestallt sinn, déi Ännerungen an engem Prozess mat der Zäit representéieren. Zum Beispill kann dëst den Häerzgeschwindegkeet pro Dag oder d'Zuel vun de Prozesser am System sinn. Alles wat Zäit Ticken mat e puer Dimensiounen gëtt ass Zäit-Serie:

Plënneren op ClickHouse: 3 Joer méi spéit

Déi meescht vun dësen Aarte vun Eventer kommen aus Iwwerwaachung. Dëst kann net nëmmen d'Iwwerwaachung vum Internet sinn, awer och real Apparater: Autoen, Industriesystemer, IoT, Fabriken oder onbemannt Taxis, an de Kofferraum vun deem Yandex scho setzt clickhouse-Server.

Zum Beispill ginn et Firmen déi Daten vu Schëffer sammelen. All puer Sekonnen schécken Sensoren um Containerschëff Honnerte vu verschiddene Miessunge. D'Ingenieuren studéieren se, bauen Modeller a probéieren ze verstoen wéi effizient d'Schëff benotzt gëtt, well e Containerschëff sollt net eng Sekonn idle sinn. All Downtime ass e Verloscht vu Suen, also ass et wichteg d'Streck virauszesoen sou datt d'Stoppen minimal sinn.

Hautdesdaags gëtt et e Wuesstum vu spezialiséierten Datenbanken déi moossen Zäit-Serie. Op de Site DB-Motoren Déi verschidden Datenbanken sinn iergendwéi klasséiert, an Dir kënnt se no Typ kucken:

Plënneren op ClickHouse: 3 Joer méi spéit

Déi séierst wuessend Aart ass Zäit Series. Grafik Datenbanken wuessen och, mä Zäit Series sinn an de leschte Joren méi séier gewuess. Typesch Vertrieder vun dëser Famill vun Datenbanken sinn Influx DB, Prometheus, KDB, ZäitplangDB (opgebaut PostgreSQL), Léisungen aus Amazon. clickhouse kann och hei benotzt ginn, a gëtt benotzt. Loosst mech Iech e puer ëffentlech Beispiller ginn.

Ee vun de Pionéier ass d'Firma CloudFlare (CDN-Provider). Si iwwerwaachen hir CDN duerch clickhouse (DNS-Ufroen, HTTP-Query) mat enger riseger Laascht - 6 Milliounen Eventer pro Sekonn. Alles geet duerch Kafka, geet op clickhouse, déi d'Méiglechkeet gëtt, Dashboards vun Eventer am System an Echtzäit ze gesinn.

Comcast - ee vun de Leader am Telekommunikatioun an den USA: Internet, digital Televisioun, Telefonie. Si hunn en ähnleche Kontrollsystem erstallt CDN am Kader Open Source de Projet Apache Verkéier Kontroll fir mat Äre groussen Donnéeën ze schaffen. clickhouse als Backend fir Analyse benotzt.

percona agebaut clickhouse bannen Är PMMze Buttek Iwwerwachung vun verschiddenen MySQL.

Spezifesch Ufuerderunge

Zäit-Serie Datenbanken hunn hir eege spezifesch Ufuerderunge.

  • Schnell Einféierung vu ville Agenten. Mir mussen Daten aus ville Streame ganz séier aginn. clickhouse Et mécht dat gutt well all seng Inserts net blockéieren. All anzeginn ass eng nei Datei op Disk, a kleng Inserts kënnen op déi eng oder aner Manéier gebuffert ginn. IN clickhouse Et ass besser Daten a grousse Chargen anzeféieren anstatt eng Zeil gläichzäiteg.
  • Flexibel Schema. d' Zäit-Serie mir kennen normalerweis d'Datenstruktur net komplett. Et ass méiglech en Iwwerwaachungssystem fir eng spezifesch Applikatioun ze bauen, awer dann ass et schwéier et fir eng aner Applikatioun ze benotzen. Dëst erfuerdert e méi flexibele Schema. clickhouse, erlaabt Iech dëst ze maachen, obwuel et eng staark getippten Basis ass.
  • Effikass Späicheren an Vergiess vun Daten. Normalerweis an Zäit-Serie eng enorm Quantitéit un Donnéeën, dofir musse se sou effizient wéi méiglech gespäichert ginn. Zum Beispill, um Influx DB gutt Kompressioun ass seng Haaptfunktioun. Awer nieft späicheren, musst Dir och fäeg sinn al Donnéeën ze "vergiess" an eng Aart maachen downsampling - automatesch zielen vun aggregéiert.
  • Schnell Ufroen op aggregéiert Daten. Heiansdo ass et interessant fir déi lescht 5 Minutte mat enger Genauegkeet vu Millisekonnen ze kucken, awer op monatlecht Donnéeën Minutt oder zweet Granularitéit kann net gebraucht ginn - allgemeng Statistike si genuch. Ënnerstëtzung vun dëser Aart ass néideg, soss eng Demande fir 3 Méint dauert eng ganz laang Zäit bis komplett och an clickhouse.
  • Ufroen wéi "leschte Punkt, wéi vun». Dës sinn typesch fir Zäit-Serie Ufroen: kuckt op déi lescht Mooss oder Zoustand vum System zu engem Moment an der Zäit t. Dëst sinn net ganz agreabel Ufroe fir eng Datebank, awer Dir musst se och kënnen ausféieren.
  • "Gluing" Zäit Serie. Zäit-Serie ass eng Zäitserie. Wann et zwou Zäitreihe gëtt, musse se dacks verbonne a korreléiert ginn. Et ass net bequem dëst op all Datenbanken ze maachen, besonnesch mat net ausgeriichten Zäitreihen: hei sinn e puer Zäitpunkten, et ginn anerer. Dir kënnt duerchschnëttlech betruechten, awer op eemol gëtt et nach ëmmer e Lach do, also ass et net kloer.

Loosst eis kucken wéi dës Ufuerderunge erfëllt sinn clickhouse.

De Schema

В clickhouse Schema fir Zäit-Serie kann op verschidde Manéiere gemaach ginn, jee no dem Grad vun der Regularitéit vun den Donnéeën. Et ass méiglech e System op reegelméissegen Donnéeën ze bauen wa mir all Metriken am Viraus wëssen. Zum Beispill hunn ech dat gemaach CloudFlare mat Iwwerwaachung CDN ass e gutt optiméiert System. Dir kënnt e méi allgemenge System bauen, deen d'ganz Infrastruktur a verschidde Servicer iwwerwaacht. Am Fall vun onregelméissegen Donnéeën wësse mir am Viraus net wat mir iwwerwaachen - an dat ass wuel am meeschte verbreet.

Regelméisseg Daten. Kolonnen. De Schema ass einfach - Saile mat den erfuerderlechen Typen:

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

Dëst ass e reegelméissegen Dësch deen eng Aart vu System Luede Aktivitéit iwwerwaacht (Benotzersäit, System, Leed, léif). Einfach a praktesch, awer net flexibel. Wa mir e méi flexibel Schema wëllen, da kënne mir Arrays benotzen.

Onregelméisseg Donnéeën. Arrays:

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 ...

Struktur Nestéiert sinn zwee Arrays: metrics.name и metrics.value. Hei kënnt Dir sou arbiträr Iwwerwaachungsdaten als eng Rei vun Nimm an eng Rei vu Miessunge fir all Event späicheren. Fir weider Optimisatioun, amplaz vun enger esou Struktur, kënnt Dir e puer maachen. Zum Beispill, eent fir fléien-wäert, aner - fir INT-Bedeitung well INT Ech wëll méi effizient späicheren.

Awer esou eng Struktur ass méi schwéier z'erreechen. Dir musst eng speziell Konstruktioun benotzen, mat spezielle Funktiounen fir d'Wäerter vum Index an dann d'Array erauszezéien:

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

Awer et funktionnéiert ëmmer nach zimlech séier. Eng aner Manéier fir onregelméisseg Daten ze späicheren ass duerch Zeil.

Onregelméisseg Donnéeën. Strings. An dëser traditioneller Method, ouni Arrays, ginn Nimm a Wäerter gläichzäiteg gespäichert. Wann 5 Miessunge vun engem Apparat gläichzäiteg kommen, ginn 000 Reihen an der Datebank generéiert:

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


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

clickhouse copes mat dësem - et huet speziell Extensiounen clickhouse SQL. Zum Beispill maxIf - eng speziell Funktioun déi de Maximum duerch eng Metrik berechent wann eng Bedingung erfëllt ass. Dir kënnt e puer esou Ausdréck an enger Ufro schreiwen an direkt de Wäert fir verschidde Metriken berechnen.

Loosst eis dräi Approche vergläichen:

Plënneren op ClickHouse: 3 Joer méi spéit

Detailer

Hei hunn ech "Disk Data Size" fir e puer Testdaten bäigefüügt. Am Fall vu Kolonnen hu mir déi klengst Dategréisst: maximal Kompressioun, maximal Ufrogeschwindegkeet, awer mir bezuelen andeems mir alles gläichzäiteg ophuelen.

Am Fall vun Arrays ass alles e bësse méi schlëmm. D'Daten sinn nach ëmmer gutt kompriméiert an en onregelméisseg Muster ka gespäichert ginn. Mee clickhouse - eng columnar Datebank, a wa mir ufänken alles an engem Array ze späicheren, gëtt et an eng Rei, a mir bezuelen fir Flexibilitéit mat Effizienz. Fir all Operatioun musst Dir de ganze Array an d'Erënnerung liesen, dann de gewënschte Element dran fannen - a wann d'Array wächst, da gëtt d'Geschwindegkeet degradéiert.

An enger vun de Firmen déi dës Approche benotzt (z.B. Uber), Arrays ginn a Stécker vun 128 Elementer geschnidden. Daten aus e puer dausend Metriken mat engem Volume vun 200 TB vun Daten / Dag ginn net an engem Array gespäichert, mee an 10 oder 30 Arrays mat spezieller Späicherlogik.

Déi einfachst Approche ass mat Strings. Awer d'Donnéeën si schlecht kompriméiert, d'Tabelle Gréisst ass grouss, an och wann Ufroen op verschidde Metriken baséieren, funktionnéiert ClickHouse net optimal.

Hybrid Schema

Loosst eis unhuelen datt mir en Array Circuit gewielt hunn. Awer wa mir wëssen datt déi meescht vun eisen Dashboards nëmme Benotzer- a Systemmetriken weisen, kënne mir dës Metriken zousätzlech a Kolonnen aus enger Array um Dëschniveau op dës Manéier materialiséieren:

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

Beim Asetzen clickhouse wäert se automatesch zielen. Op dës Manéier kënnt Dir Geschäfter mat Freed kombinéieren: de Schema ass flexibel an allgemeng, awer mir hunn déi meescht benotzte Sailen erausgezunn. Bedenkt datt dëst net erfuerdert d'Insert z'änneren an ETLdéi weider Arrays an den Dësch setzen. Mir hu just gemaach ALTER TISCH, huet e puer Spriecher bäigefüügt a mir hunn en Hybrid a méi séier Schema, deen Dir direkt benotze kënnt.

Codecs a Kompressioun

fir Zäit-Serie Et ass wichteg wéi gutt Dir d'Donnéeë packt, well d'Quantitéit vun Informatioun ka ganz grouss sinn. IN clickhouse Et gëtt eng Rei vun Tools fir e Kompressiounseffekt vun 1:10, 1:20, an heiansdo méi z'erreechen. Dëst bedeit datt 1 TB vun ausgepackten Daten op der Disk 50-100 GB hëlt. Méi kleng Gréisst ass gutt, Daten kënne méi séier gelies a veraarbecht ginn.

Fir en héijen Niveau vu Kompressioun z'erreechen, clickhouse ënnerstëtzt déi folgend Codecs:

Plënneren op ClickHouse: 3 Joer méi spéit

Beispill Dësch:

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

Hei definéiere mir de Codec Duebel Delta an engem Fall, am zweeten - Gorilla, a mir wäerten definitiv méi LZ4 Kompressioun. Als Resultat ass d'Gréisst vun den Daten op der Disk staark reduzéiert:

Plënneren op ClickHouse: 3 Joer méi spéit

Dëst weist wéi vill Plaz déiselwecht Daten ophuelen, awer mat verschiddene Codecs a Kompressiounen:

  • an enger GZIP Datei op Disk;
  • am ClickHouse ouni Codecs, awer mat ZSTD Kompressioun;
  • am ClickHouse mat Codecs a Kompressioun LZ4 an ZSTD.

Et kann gesi ginn datt Dëscher mat Codecs vill manner Plaz ophuelen.

Gréissten

Net manner wichteg decidéieren korrekt Datentyp:

Plënneren op ClickHouse: 3 Joer méi spéit

An all de Beispiller hei uewen hunn ech benotzt Schwämm 64. Awer wa mir gewielt hunn Schwämm 32, da wier dat nach besser. Dëst gouf gutt bewisen vun de Leit aus Perkona am Artikel hei uewen verlinkt. Et ass wichteg déi kompaktst Typ ze benotzen déi fir d'Aufgab gëeegent ass: nach manner fir Diskgréisst wéi fir Ufrogeschwindegkeet. clickhouse ganz sensibel fir dës.

Wann Dir kënnt benotzen int 32 anstatt int 64, erwaart dann eng bal duebel Erhéijung vun der Leeschtung. D'Donnéeën huelen manner Erënnerung, an all "Arithmetik" funktionnéiert vill méi séier. clickhouse intern ass et e ganz strikt getippten System; et mécht maximal Benotzung vun all de Méiglechkeeten déi modern Systemer ubidden.

Aggregatioun an Materialiséiert Views

Aggregatioun a materialiséiert Meenungen erlaben Iech Aggregater fir verschidden Occasiounen ze kreéieren:

Plënneren op ClickHouse: 3 Joer méi spéit

Zum Beispill, Dir hutt vläicht net aggregéiert Quelldaten, an Dir kënnt verschidde materialiséiert Meenungen un hinnen mat automatescher Summatioun duerch e spezielle Motor befestigen SummingMergeTree (SMT). SMT ass eng speziell Aggregatiounsdatenstruktur déi Aggregaten automatesch berechent. Raw Daten ginn an d'Datebank agebaut, se ginn automatesch aggregéiert, an Dashboards kënnen direkt drop benotzt ginn.

TTL - "vergiess" al Donnéeën

Wéi "vergiess" Daten déi net méi gebraucht ginn? clickhouse weess wéi dat ze maachen. Wann Dir Dëscher erstellt, kënnt Dir uginn TTL Ausdréck: zum Beispill, datt mir Minutt Daten fir een Dag späicheren, alldeeglech Daten fir 30 Deeg, an ni wëchentlech oder monatlech Daten beréieren:

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 - deelt Daten iwwer Disken

Dës Iddi weider ze huelen, kënnen Daten gespäichert ginn clickhouse op verschiddene Plazen. Ugeholl mir wëllen waarm Daten fir déi lescht Woch op e ganz schnelle lokale späicheren natierlech nach, a mir setzen méi historesch Donnéeën op eng aner Plaz. IN clickhouse dat ass elo méiglech:

Plënneren op ClickHouse: 3 Joer méi spéit

Dir kënnt eng Späicherpolitik konfiguréieren (Stockage Politik) Also clickhouse wäert automatesch Daten iwwerdroen wann Dir bestëmmte Konditiounen op eng aner Späichere erreecht.

Mä dat ass net alles. Um Niveau vun engem spezifeschen Dësch kënnt Dir Regele definéieren fir genau wéini d'Donnéeën an d'Kältelagerung ginn. Zum Beispill ginn d'Donnéeën op enger ganz schneller Scheif fir 7 Deeg gespäichert, an alles wat méi al ass gëtt op eng lues transferéiert. Dëst ass gutt well et Iech erlaabt de System op maximal Leeschtung ze halen, wärend d'Käschte kontrolléiert an net Suen op kal Daten verschwenden:

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

Eenzegaarteg Méiglechkeeten clickhouse

An bal alles clickhouse Et gi sou "Highlights", awer si ginn duerch Exklusivitéit kompenséiert - eppes wat net an aneren Datenbanken ass. Zum Beispill, hei sinn e puer vun den eenzegaartegen Features clickhouse:

  • Arrays. d' clickhouse ganz gutt Ënnerstëtzung fir Arrays, wéi och d'Fäegkeet fir komplex Berechnungen op hinnen ze maachen.
  • Aggregéieren Daten Strukturen. Dëst ass ee vun de "Killer Features" clickhouse. Trotz der Tatsaach, datt d'Kärelen aus Yandex soen datt mir keng Daten aggregéiere wëllen, ass alles aggregéiert an clickhouse, well et séier a praktesch ass.
  • Materialiséiert Meenung. Zesumme mat aggregéierten Datestrukturen, materialiséierte Meenungen erlaben Iech bequem ze maachen Echtzäit Aggregatioun.
  • ClickHouse SQL. Dëst ass eng Sproochextensioun SQL mat e puer zousätzlech an exklusiv Fonctiounen datt nëmmen sinn sinn an clickhouse. Virdrun war et wéi eng Expansioun op der enger Säit, an engem Nodeel op der anerer. Elo bal all d'Nodeeler am Verglach zu SQL 92 mir hu se ewechgeholl, elo ass et just eng Verlängerung.
  • lambda- Ausdréck. Sinn se nach an enger Datebank?
  • ML- Ënnerstëtzung. Dëst ass verfügbar a verschiddenen Datenbanken, e puer si besser, e puer méi schlecht.
  • oppe Quell. Mir kënnen ausbauen clickhouse zesummen. Elo an clickhouse ongeféier 500 Mataarbechter, an dës Zuel wiisst konstant.

Schwiereg Ufroen

В clickhouse et gi vill verschidde Manéieren déi selwecht Saach ze maachen. Zum Beispill, kënnt Dir de leschte Wäert vun engem Dësch an dräi verschidde Manéieren Retour fir cpu (et gëtt och e véierten, awer et ass nach méi exotesch).

Déi éischt weist wéi bequem et ass ze maachen clickhouse Ufroen wann Dir wëllt dat kontrolléieren Tupel an der Ënnerquery enthalen. Dëst ass eppes wat ech perséinlech wierklech an aneren Datenbanken verpasst hunn. Wann ech eppes mat enger Ënnerquery vergläiche wëll, da kann an aneren Datenbanken nëmmen e Skalar domat verglach ginn, awer fir verschidde Kolonnen muss ech schreiwen JOIN. d' clickhouse Dir kënnt Tuple benotzen:

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

Déi zweet Method mécht datselwecht awer benotzt eng aggregéiert Funktioun argMax:

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

В clickhouse et ginn e puer Dutzend aggregéiert Funktiounen, a wann Dir Combinatoren benotzt, da kritt Dir no de Gesetzer vun der Combinatorik ongeféier dausend vun hinnen. ArgMax - eng vun de Funktiounen déi de maximale Wäert berechent: d'Ufro gëtt de Wäert zréck usage_user, bei deem de maximale Wäert erreecht gëtt erstallt_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 - "Klemmen" Reihen mat verschiddenen Zäiten. Dëst ass eng eenzegaarteg Feature fir Datenbanken déi nëmme verfügbar ass an kdb+. Wann et zwou Zäitreihe mat verschiddenen Zäiten, ASOF JOIN erlaabt Iech se an enger Ufro ze plënneren an ze fusionéieren. Fir all Wäert an enger Zäitserie gëtt de nootste Wäert an der anerer fonnt, a si ginn op der selwechter Linn zréckginn:

Plënneren op ClickHouse: 3 Joer méi spéit

Analytesch Funktiounen

Am Standard SQL-2003 du kanns esou schreiwen:

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;

В clickhouse Dir kënnt dat net maachen - et ënnerstëtzt net de Standard SQL-2003 a wäert et wahrscheinlech ni maachen. Amplaz, an clickhouse Et ass üblech esou ze schreiwen:

Plënneren op ClickHouse: 3 Joer méi spéit

Ech hunn Lambdas versprach - hei sinn se!

Dëst ass en Analog vun der analytescher Ufro am Standard SQL-2003: hien zielt den Ënnerscheed tëscht deenen zwee Zäitstempel, Dauer, Ordinalnummer - alles wat mir normalerweis analytesch Funktiounen betruechten. IN clickhouse Mir zielen se duerch Arrays: als éischt zerbriechen mir d'Donnéeën an eng Array, duerno maache mir alles wat mir wëllen op der Array, an dann erweidere mir se zréck. Et ass net ganz bequem, et erfuerdert eng Léift vu funktionneller Programméierung op e Minimum, awer et ass ganz flexibel.

Special Fonctiounen

Ausserdeem, an clickhouse vill spezialiséiert Funktiounen. Zum Beispill, wéi bestëmmen ech wéivill Sessiounen gläichzäiteg stattfannen? Eng typesch Iwwerwaachungsaufgab ass déi maximal Belaaschtung mat enger Ufro ze bestëmmen. IN clickhouse Et gëtt eng speziell Funktioun fir dësen Zweck:

Plënneren op ClickHouse: 3 Joer méi spéit

Am Allgemengen, ClickHouse huet speziell Funktiounen fir vill Zwecker:

  • runningDifference, runningAccumulate, Noper;
  • sumMap(Schlëssel, Wäert);
  • timeSeriesGroupSum(uid, Zäitstempel, Wäert);
  • timeSeriesGroupRateSum(uid, timestamp, value);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • MAT FILL / MAT BINNEN;
  • simpleLinearRegression, stochasticLinearRegression.

Dëst ass net eng komplett Lëscht vu Funktiounen, et sinn am Ganzen 500-600. Hiweis: all Funktiounen an clickhouse ass an der Systemtabelle (net all sinn dokumentéiert, awer all sinn interessant):

select * from system.functions order by name

clickhouse et Geschäfter vill vun Informatiounen iwwert selwer, dorënner aloggen Dëscher, query_log, Trace Log, Log vun Operatiounen mat Datenblocken (deel_log), Metrik Log, a System Log, déi et normalerweis op Disk schreift. Log Metriken ass Zäit-Serie в clickhouse tatsächlech clickhouse: D'Datebank selwer kann eng Roll spillen Zäit-Serie Datenbanken, also "verschlësselt" sech.

Plënneren op ClickHouse: 3 Joer méi spéit

Dëst ass och eng eenzegaarteg Saach - well mir maachen eng gutt Aarbecht fir Zäit-Serie, Firwat kënne mir net alles wat mir brauchen an eis selwer späicheren? Mir brauchen net Prometheus, mir halen alles fir eis selwer. Ugeschloss grafana a mir iwwerwaachen eis. Allerdéngs, wann clickhouse fällt, mir wäerten net gesinn firwat, also si maachen dat normalerweis net.

Grousse Stärekoup oder vill kleng clickhouse

Wat ass besser - ee grousse Cluster oder vill kleng ClickHouses? Traditionell Approche zu DWH ass e grousse Cluster an deem Circuiten fir all Applikatioun zougewisen sinn. Mir si bei den Datebankadministrator komm - gitt eis en Diagramm, a si hunn eis een ginn:

Plënneren op ClickHouse: 3 Joer méi spéit

В clickhouse Dir kënnt et anescht maachen. Dir kënnt all Applikatioun Är eege maachen clickhouse:

Plënneren op ClickHouse: 3 Joer méi spéit

Mir brauchen dee grousse monstréisen net méi DWH an intractable Administrateuren. Mir kënnen all Applikatioun seng eege ginn clickhouse, an den Entwéckler kann et selwer maachen, zënter clickhouse ganz einfach ze installéieren an erfuerdert keng komplex Administratioun:

Plënneren op ClickHouse: 3 Joer méi spéit

Awer wa mir vill hunn clickhouse, an Dir musst et dacks installéieren, da wëllt Dir dëse Prozess automatiséieren. Fir dëst kënne mir zum Beispill benotzen Kubernetes и clickhouse-operateur. IN Kubernetes ClickHouse Dir kënnt et "op-klickt" setzen: Ech kann e Knäppchen klickt, de Manifest lafen an d'Datebank ass prett. Ech kann direkt en Diagramm erstellen, ufänken Metriken do eropzelueden, an a 5 Minutten hunn ech en Dashboard prett grafana. Et ass sou einfach!

Wat am Ende?

An dofir, clickhouse - dëst ass:

  • Séier. Jidderee weess dëst.
  • Einfach. E bësse kontrovers, awer ech gleewen datt et schwéier ass am Training, einfach am Kampf. Wann Dir verstitt wéi clickhouse et klappt, dann ass alles ganz einfach.
  • Universell. Et ass gëeegent fir verschidden Szenarie: DWH, Zäit Serie, Log Stockage. Awer et ass net OLTP Datebank, also probéiert net kuerz Inserts ze maachen an do ze liesen.
  • Interessant. Wahrscheinlech deen deen schafft mat clickhouse, vill interessant Momenter a gudden a schlechte Sënn erlieft hunn. Zum Beispill ass eng nei Verëffentlechung erauskomm, alles huet opgehalen ze schaffen. Oder wann Dir zwee Deeg mat enger Aufgab gekämpft hutt, awer nodeems Dir eng Fro am Telegram Chat gestallt hutt, gouf d'Aufgab an zwou Minutten geléist. Oder wéi op der Konferenz am Bericht vum Lesha Milovidov, e Screenshot vun clickhouse d'Sendung gebrach HighLoad++. Dës Zort vun Saach geschitt all Zäit a mécht eist Liewen schwéier. clickhouse hell an interessant!

Dir kënnt d'Presentatioun kucken hei.

Plënneren op ClickHouse: 3 Joer méi spéit

Déi laang-erwaarde Versammlung vun Entwéckler vun héich-Laascht Systemer um HighLoad++ fënnt den 9. an 10. November zu Skolkovo statt. Schlussendlech wäert dëst eng offline Konferenz sinn (och wann all Virsiichtsmoossnamen op der Plaz sinn), well d'Energie vun HighLoad ++ net online verpackt ka ginn.

Fir d'Konferenz fanne a weisen Iech Fäll iwwer déi maximal Fäegkeeten vun der Technologie: HighLoad++ war, ass a wäert déi eenzeg Plaz sinn, wou Dir an zwee Deeg léiere kënnt wéi Facebook, Yandex, VKontakte, Google an Amazon funktionnéieren.

Zanter 2007 eis Versammlungen ouni Ënnerbriechung ofgehalen hunn, treffen mir eis dëst Joer fir déi 14. Kéier. Wärend dëser Zäit ass d'Konferenz 10 Mol gewuess; d'lescht Joer huet de Schlësselindustrie Event 3339 Participanten zesummebruecht, 165 Spriecher, Berichter a Meetups, a 16 Tracks ware gläichzäiteg lafen.
D'lescht Joer waren et 20 Bussen, 5280 Liter Téi a Kaffi, 1650 Liter Uebstdrénken an 10200 Fläschen Waasser. An nach 2640 Kilogramm Iessen, 16 Telleren a 000 Tassen. Iwwregens, mat deene Sue vu recycléiertem Pabeier gesammelt, hu mir 25 Eiche seedlings gepflanzt :)

Dir kënnt Ticketen kafen hei, kritt Neiegkeeten iwwer d'Konferenz - hei, a schwätzt op all sozialen Netzwierker: Hëllefe profitéieren, Facebook, Vkontakte и Twitter.

Source: will.com

Setzt e Commentaire