Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Pirms trim gadiem uz skatuves Viktors Tarnavskis un Aleksejs Milovidovs no Yandex HighLoad++ stāstīja, cik labs ir ClickHouse un kā tas nepalēninās. Un nākamajā posmā bija Aleksandrs Zaicevs с Ziņot par pārcelšanos uz Noklikšķiniet uz Māja no citas analītiskās DBVS un ar secinājumu, ka Noklikšķiniet uz Māja, protams, labi, bet ne īpaši ērti. Kad uzņēmums 2016.g LifeStreet, kurā Aleksandrs toreiz strādāja, pārveidoja vairāku petabaitu analītisko sistēmu par Noklikšķiniet uz Māja, tas bija aizraujošs "dzelteno ķieģeļu ceļš", kas pilns ar nezināmām briesmām - Noklikšķiniet uz Māja toreiz tas izskatījās pēc mīnu lauka.

Trīs gadus vēlāk Noklikšķiniet uz Māja kļuva daudz labāks - šajā laikā Aleksandrs nodibināja uzņēmumu Altinity, kas ne tikai palīdz cilvēkiem pārcelties uz Noklikšķiniet uz Māja desmitiem projektu, bet arī uzlabo pašu produktu kopā ar kolēģiem no Yandex. Tagad Noklikšķiniet uz Māja joprojām nav bezrūpīga pastaiga, bet vairs nav mīnu lauks.

Aleksandrs strādā ar izplatītajām sistēmām kopš 2003. gada, izstrādājot lielus projektus MySQL, Oracle и Vertica. Pēdējā HighLoad++ 2019 Aleksandrs, viens no lietošanas pionieriem Noklikšķiniet uz Māja, pastāstīja, kas tagad ir šī DBVS. Mēs uzzināsim par galvenajām funkcijām Noklikšķiniet uz Māja: kā tas atšķiras no citām sistēmām un kādos gadījumos to ir efektīvāk izmantot. Izmantojot piemērus, mēs aplūkosim jaunāko un projektos pārbaudīto praksi ēku sistēmām, kuru pamatā ir Noklikšķiniet uz Māja.


Retrospekcija: kas notika pirms 3 gadiem

Pirms trim gadiem mēs nodevām uzņēmumu LifeStreet par Noklikšķiniet uz Māja no citas analītiskās datu bāzes, un reklāmu tīkla analītikas migrācija izskatījās šādi:

  • 2016. gada jūnijs Atvērtā koda parādījās Noklikšķiniet uz Māja un mūsu projekts sākās;
  • Augusts Koncepta pierādījums: liels reklāmas tīkls, infrastruktūra un 200-300 terabaiti datu;
  • oktobris. Pirmie ražošanas dati;
  • decembris. Pilna produktu slodze ir 10–50 miljardi notikumu dienā.
  • 2017. gada jūnijs. Veiksmīga lietotāju migrācija uz Noklikšķiniet uz Māja, 2,5 petabaiti datu 60 serveru klasterī.

Migrācijas procesa laikā pieauga izpratne par to Noklikšķiniet uz Māja ir laba sistēma, ar kuru ir patīkami strādāt, taču tas ir Yandex iekšējais projekts. Tāpēc ir nianses: Yandex vispirms nodarbosies ar saviem iekšējiem klientiem un tikai pēc tam ar sabiedrību un ārējo lietotāju vajadzībām, un ClickHouse pēc tam nesasniedza uzņēmuma līmeni daudzās funkcionālajās jomās. Tāpēc 2017. gada martā nodibinājām Altinity, lai izveidotu Noklikšķiniet uz Māja vēl ātrāk un ērtāk ne tikai Yandex, bet arī citiem lietotājiem. Un tagad mēs:

  • Mēs apmācām un palīdzam izstrādāt risinājumus, pamatojoties uz Noklikšķiniet uz Māja lai klienti nenonāktu nepatikšanās un lai risinājums galu galā darbotos;
  • Mēs sniedzam atbalstu 24/7 Noklikšķiniet uz Māja- instalācijas;
  • Mēs izstrādājam savus ekosistēmu projektus;
  • Mēs aktīvi apņemamies sev Noklikšķiniet uz Māja, atbildot uz to lietotāju pieprasījumiem, kuri vēlas redzēt noteiktas funkcijas.

Un, protams, mēs palīdzam pārcelties uz Noklikšķiniet uz Māja с MySQL, Vertica, Orākuls, Greenplum, Redshift un citas sistēmas. Mēs esam bijuši iesaistīti dažādos gājienos, un tie visi ir bijuši veiksmīgi.

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Kāpēc pārcelties uz Noklikšķiniet uz Māja

Nebremzē! Tas ir galvenais iemesls. Noklikšķiniet uz Māja - ļoti ātra datu bāze dažādiem scenārijiem:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Nejauši citāti no cilvēkiem, kuri jau ilgu laiku strādā ar cilvēkiem Noklikšķiniet uz Māja.

Mērogojamība. Kādā citā datu bāzē jūs varat sasniegt labu veiktspēju vienā aparatūras daļā, bet Noklikšķiniet uz Māja Jūs varat mērogot ne tikai vertikāli, bet arī horizontāli, vienkārši pievienojot serverus. Viss neiet tik gludi kā gribētos, bet darbojas. Jūs varat paplašināt sistēmu, jūsu uzņēmumam augot. Ir svarīgi, lai šobrīd mūs neierobežo risinājums un vienmēr ir attīstības potenciāls.

Pārnesamība. Nav pieķeršanās vienai lietai. Piemēram, ar Amazones sarkanā nobīde Grūti kaut kur pārvākties. A Noklikšķiniet uz Māja varat to instalēt savā klēpjdatorā, serverī, izvietot to mākonī, doties uz Kubernetes — infrastruktūras darbībai nav ierobežojumu. Tas ir ērti ikvienam, un tā ir liela priekšrocība, ar kuru nevar lepoties daudzas citas līdzīgas datu bāzes.

Elastīgums. Noklikšķiniet uz Māja neapstājas pie vienas lietas, piemēram, Yandex.Metrica, bet gan attīstās un tiek izmantots arvien dažādos projektos un nozarēs. To var paplašināt, pievienojot jaunas iespējas jaunu problēmu risināšanai. Piemēram, tiek uzskatīts, ka žurnālu glabāšana datu bāzē ir slikta izturēšanās, tāpēc viņi izdomāja Elastikas meklēšana. Bet pateicoties elastībai Noklikšķiniet uz Māja, tajā var glabāt arī žurnālus, un bieži vien tas ir pat labāk nekā iekšā Elastikas meklēšana - plkst Noklikšķiniet uz Māja tas prasa 10 reizes mazāk dzelzs.

Bezmaksas Atvērtā koda. Jums par neko nav jāmaksā. Nav nepieciešams vienoties par atļauju instalēt sistēmu jūsu klēpjdatorā vai serverī. Nav slēptu maksu. Tajā pašā laikā neviena cita atvērtā pirmkoda datu bāzes tehnoloģija nevar konkurēt ar ātrumu Noklikšķiniet uz Māja. MySQL, MariaDB, Greenplum - viņi visi ir daudz lēnāki.

Kopiena, brauc un jautri. Uz Noklikšķiniet uz Māja lieliska kopiena: tikšanās, tērzēšana un Aleksejs Milovidovs, kurš mūs visus uzlādē ar savu enerģiju un optimismu.

Pārcelšanās uz ClickHouse

Iet uz Noklikšķiniet uz Māja kāda iemesla dēļ jums ir nepieciešamas tikai trīs lietas:

  • Izprotiet ierobežojumus Noklikšķiniet uz Māja un kam tas nav piemērots.
  • Izmantojiet priekšrocības tehnoloģija un tās lielākās stiprās puses.
  • Eksperimentējiet. Pat saprotot, kā tas darbojas Noklikšķiniet uz Māja, ne vienmēr ir iespējams paredzēt, kad tas būs ātrāk, kad tas būs lēnāks, kad tas būs labāk un kad tas būs sliktāk. Tāpēc izmēģiniet to.

Pārvietošanās problēma

Ir tikai viens “bet”: ja pārcelsies uz Noklikšķiniet uz Māja no kaut kā cita, tad parasti kaut kas noiet greizi. Mēs esam pieraduši pie dažām praksēm un lietām, kas darbojas mūsu iecienītākajā datubāzē. Piemēram, ikviens, kas strādā ar SQL-datu bāzes uzskata, ka šādas funkcijas ir obligātas:

  • darījumiem;
  • ierobežojumi;
  • konsistence;
  • indeksi;
  • ATJAUNINĀT/DZĒST;
  • NULL;
  • milisekundes;
  • automātiskā tipa lējumi;
  • vairāki savienojumi;
  • patvaļīgas starpsienas;
  • klasteru pārvaldības rīki.

Pieņemšana darbā ir obligāta, bet pirms trim gadiem in Noklikšķiniet uz Māja Neviena no šīm funkcijām nebija pieejama! Tagad ir palikusi mazāk nekā puse no tā, kas nav ieviests: transakcijas, ierobežojumi, konsekvence, milisekundes un tipa liešana.

Un galvenais, ka iekšā Noklikšķiniet uz Māja dažas standarta prakses un pieejas nedarbojas vai darbojas savādāk, nekā mēs esam pieraduši. Viss, kas parādās Noklikšķiniet uz Māja, attiecas uz "ClickHouse veids", t.i. funkcijas atšķiras no citām datu bāzēm. Piemēram:

  • Indeksi netiek atlasīti, bet tiek izlaisti.
  • ATJAUNINĀT/DZĒST nevis sinhroni, bet asinhroni.
  • Ir vairāki savienojumi, bet nav vaicājumu plānotāja. Cilvēkiem no datu bāzu pasaules parasti nav īsti skaidrs, kā tie tiek veikti.

ClickHouse skripti

1960. gadā ungāru izcelsmes amerikāņu matemātiķis Vīgnera EP uzrakstīja rakstu"Matemātikas nepamatotā efektivitāte dabaszinātnēs” (“Matemātikas neaptveramā efektivitāte dabaszinātnēs”), ka apkārtējo pasauli nez kāpēc labi raksturo matemātikas likumi. Matemātika ir abstrakta zinātne, un fiziskie likumi, kas izteikti matemātiskā formā, nav triviāli, un Vīgnera EP uzsvēra, ka tas ir ļoti dīvaini.

No mana viedokļa, Noklikšķiniet uz Māja - tā pati dīvainība. Pārfrāzējot Vīgneru, mēs varam teikt tā: neaptveramā efektivitāte ir pārsteidzoša Noklikšķiniet uz Māja plašā analītisko lietojumu klāstā!

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Piemēram, ņemsim Reāllaika datu noliktava, kurā dati tiek ielādēti gandrīz nepārtraukti. Mēs vēlamies saņemt pieprasījumus no tā ar otro kavēšanos. Lūdzu - izmantojiet to Noklikšķiniet uz Māja, jo šādam scenārijam tas tika izstrādāts. Noklikšķiniet uz Māja tieši tā to izmanto ne tikai tīmeklī, bet arī mārketingā un finanšu analīzē, AdTech, kā arī iekšā Krāpšanas atklāšanan. IN Reāllaika datu noliktava tiek izmantota sarežģīta strukturēta shēma, piemēram, "zvaigzne" vai "sniegpārsla", daudzas tabulas ar PIEVIENOJIES (dažreiz vairāki), un dati parasti tiek glabāti un mainīti dažās sistēmās.

Paņemsim citu scenāriju - Laika rinda: ierīču, tīklu uzraudzība, lietošanas statistika, lietu internets. Šeit mēs sastopamies ar diezgan vienkāršiem notikumiem, kas pasūtīti laikā. Noklikšķiniet uz Māja sākotnēji netika izstrādāta šim nolūkam, bet ir pierādījusi, ka tā darbojas labi, tāpēc izmanto lielie uzņēmumi Noklikšķiniet uz Māja kā pārraudzības informācijas krātuve. Lai noskaidrotu, vai tas ir piemērots Noklikšķiniet uz Māja laikrindām mēs izveidojām etalonu, pamatojoties uz pieeju un rezultātiem InfluxDB и TermiņšDB - specializēts laikrindas datubāzēm. Tas izslēdzāsKa Noklikšķiniet uz Māja, pat bez optimizācijas šādiem uzdevumiem, uzvar svešā laukumā:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

В laikrindas Parasti tiek izmantota šaura tabula - vairākas mazas kolonnas. Daudz datu var iegūt no monitoringa — miljoniem ierakstu sekundē — un parasti tie tiek iegūti nelielās sērijās (reālā laika straumēšana). Tāpēc ir nepieciešams cits ievietošanas skripts, un pašiem vaicājumiem ir sava specifika.

Žurnālu pārvaldība. Žurnālu apkopošana datu bāzē parasti ir slikta, bet Noklikšķiniet uz Māja to var izdarīt ar dažiem komentāriem, kā aprakstīts iepriekš. Daudzi uzņēmumi izmanto Noklikšķiniet uz Māja tieši šim nolūkam. Šajā gadījumā mēs izmantojam plakanu platu galdu, kurā glabājam visus baļķus (piemēram, formā JSON), vai sagriež gabalos. Dati parasti tiek ielādēti lielās partijās (failos), un mēs meklējam pēc kāda lauka.

Katrai no šīm funkcijām parasti tiek izmantotas specializētas datu bāzes. Noklikšķiniet uz Māja cilvēks to visu var izdarīt tik labi, ka tas pārspēj viņus. Tagad apskatīsim to tuvāk laikrindas scenārijs un kā pareizi “gatavot”. Noklikšķiniet uz Māja šim scenārijam.

Laika rinda

Šobrīd tas ir galvenais scenārijs, kuram Noklikšķiniet uz Māja uzskatīts par standarta risinājumu. Laika rinda ir laikā sakārtotu notikumu kopums, kas atspoguļo izmaiņas kādā procesā laika gaitā. Piemēram, tas varētu būt sirdsdarbības ātrums dienā vai procesu skaits sistēmā. Viss, kas dod laiku, atzīmējas ar kaut kādām dimensijām, ir laikrindas:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Lielākā daļa šāda veida notikumu rodas no uzraudzības. Tas var būt ne tikai tīmekļa uzraudzība, bet arī reālas ierīces: automašīnas, rūpnieciskās sistēmas, IoT, rūpnīcas vai bezpilota taksometri, kuru bagāžniekā jau liek Yandex Noklikšķiniet uz Māja- serveris.

Piemēram, ir uzņēmumi, kas vāc datus no kuģiem. Ik pēc dažām sekundēm konteineru kuģa sensori nosūta simtiem dažādu mērījumu. Inženieri tos pēta, būvē modeļus un cenšas saprast, cik efektīvi kuģis tiek izmantots, jo konteinerkuģis nedrīkst ne mirkli dīkt. Jebkura dīkstāve ir naudas zaudējums, tāpēc ir svarīgi paredzēt maršrutu, lai apstāšanās būtu minimāla.

Mūsdienās pieaug specializētu datubāzu skaits, kas mēra laikrindas. Tiešsaistē DB-dzinēji Dažādas datu bāzes ir kaut kādā veidā sarindotas, un jūs varat tās skatīt pēc veida:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Visstraujāk augošais veids ir laika rindass. Pieaug arī grafiku datu bāzes, bet laika rindaspēdējos gados ir auguši straujāk. Tipiski šīs datu bāzu saimes pārstāvji ir InfluxDB, Prometejs, KDB, TermiņšDB (uzbūvēta uz PostgreSQL), risinājumi no Amazone. Noklikšķiniet uz Māja var izmantot arī šeit, un tiek izmantots. Ļaujiet man sniegt dažus publiskus piemērus.

Viens no pionieriem ir uzņēmums CloudFlare (CDN- nodrošinātājs). Viņi uzrauga savu CDN caur Noklikšķiniet uz Māja (DNS- pieprasījumi, HTTP-vaicājumi) ar milzīgu slodzi - 6 miljoni notikumu sekundē. Viss iet cauri Kafka, iet uz Noklikšķiniet uz Māja, kas nodrošina iespēju reāllaikā redzēt sistēmas notikumu informācijas paneļus.

Comcast - viens no līderiem telekomunikāciju jomā ASV: internets, digitālā televīzija, telefonija. Viņi izveidoja līdzīgu kontroles sistēmu CDN ietvaros Atvērtā koda projekts Apache satiksmes kontrole strādāt ar saviem milzīgajiem datiem. Noklikšķiniet uz Māja izmanto kā analītikas aizmuguri.

Perkona iebūvēts Noklikšķiniet uz Māja tavā iekšienē PMMuzglabāt dažādu uzraudzību MySQL.

Īpašas prasības

Laika rindu datu bāzēm ir savas īpašas prasības.

  • Ātra ievietošana no daudziem aģentiem. Mums ļoti ātri jāievieto dati no daudzām straumēm. Noklikšķiniet uz Māja Tas to dara labi, jo visi tā ieliktņi nebloķē. Jebkurš ievietot ir jauns fails diskā, un mazos ieliktņus var vienā vai otrā veidā buferizēt. IN Noklikšķiniet uz Māja Labāk ir ievietot datus lielās partijās, nevis vienā rindā.
  • Elastīga shēma. Uz laikrindas parasti mēs pilnībā nezinām datu struktūru. Ir iespējams izveidot uzraudzības sistēmu konkrētai lietojumprogrammai, bet pēc tam to ir grūti izmantot citai lietojumprogrammai. Tam nepieciešama elastīgāka shēma. Noklikšķiniet uz Māja, ļauj to izdarīt, lai gan tā ir stingri drukāta bāze.
  • Efektīva datu uzglabāšana un aizmiršana. Parasti iekšā laikrindas milzīgs datu apjoms, tāpēc tie ir jāuzglabā pēc iespējas efektīvāk. Piemēram, plkst InfluxDB laba kompresija ir tā galvenā iezīme. Bet papildus uzglabāšanai jums ir arī jāspēj “aizmirst” vecos datus un kaut ko darīt samazināšana — automātiska agregātu skaitīšana.
  • Ātri apkopoto datu vaicājumi. Dažkārt ir interesanti aplūkot pēdējās 5 minūtes ar milisekundes precizitāti, bet mēneša datos minūtes vai sekundes precizitāte var nebūt nepieciešama – pietiek ar vispārīgu statistiku. Šāds atbalsts ir nepieciešams, pretējā gadījumā pieprasījums uz 3 mēnešiem prasīs ļoti ilgu laiku, lai izpildītu pat iekšā Noklikšķiniet uz Māja.
  • Pieprasījumi, piemēram, "pēdējais punkts, uz». Tie ir raksturīgi laikrindas vaicājumi: skatiet pēdējo mērījumu vai sistēmas stāvokli konkrētajā brīdī t. Tie nav īpaši patīkami vaicājumi datu bāzei, taču jums ir arī jāspēj tos izpildīt.
  • “Līmēšanas” laikrindas. Laika rinda ir laikrinda. Ja ir divas laikrindas, tās bieži ir jāsavieno un jāsaista. Nav ērti to darīt visās datu bāzēs, jo īpaši ar nesaskaņotām laikrindām: šeit ir daži laika punkti, ir citi. Jūs varat uzskatīt par vidējo, bet pēkšņi tur joprojām būs bedre, tāpēc tas nav skaidrs.

Apskatīsim, kā šīs prasības tiek izpildītas Noklikšķiniet uz Māja.

Shēma

В Noklikšķiniet uz Māja shēma priekš laikrindas var veikt dažādos veidos atkarībā no datu regularitātes pakāpes. Ir iespējams izveidot sistēmu, pamatojoties uz regulāriem datiem, ja mēs zinām visus rādītājus iepriekš. Piemēram, es to izdarīju CloudFlare ar uzraudzību CDN ir labi optimizēta sistēma. Varat izveidot vispārīgāku sistēmu, kas uzrauga visu infrastruktūru un dažādus pakalpojumus. Neregulāru datu gadījumā mēs iepriekš nezinām, ko uzraugām – un tas, iespējams, ir visizplatītākais gadījums.

Regulāri dati. Kolonnas. Shēma ir vienkārša - kolonnas ar nepieciešamajiem veidiem:

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

Šī ir parasta tabula, kas uzrauga kādu sistēmas ielādes darbību (lietotājs, sistēma, tukšgaitas, jauki). Vienkārši un ērti, bet ne elastīgi. Ja vēlamies elastīgāku shēmu, tad varam izmantot masīvus.

Neregulāri dati. Masīvi:

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

Struktūra Ligzdots ir divi masīvi: metrika.nosaukums и metrika.vērtība. Šeit jūs varat saglabāt šādus patvaļīgus monitoringa datus kā nosaukumu masīvu un mērījumu masīvu katram notikumam. Tālākai optimizācijai vienas šādas struktūras vietā varat izveidot vairākas. Piemēram, viens priekš peldēt-vērtība, cita - par int- tas nozīmē, jo int Es vēlos uzglabāt efektīvāk.

Bet šādai struktūrai ir grūtāk piekļūt. Jums būs jāizmanto īpaša konstrukcija, izmantojot īpašas funkcijas, lai vispirms izvilktu indeksa un pēc tam masīva vērtības:

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

Bet tas joprojām darbojas diezgan ātri. Vēl viens veids, kā saglabāt neregulārus datus, ir pēc rindas.

Neregulāri dati. Stīgas. Šajā tradicionālajā metodē bez masīviem nosaukumi un vērtības tiek saglabātas vienlaicīgi. Ja no vienas ierīces vienlaikus tiek iegūti 5 mērījumu, datu bāzē tiek ģenerētas 000 rindas:

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

Noklikšķiniet uz Māja tiek galā ar to - tam ir īpaši paplašinājumi Noklikšķiniet uz Māja SQL. Piemēram, maxIf — īpaša funkcija, kas aprēķina maksimumu pēc metrikas, ja ir izpildīts kāds nosacījums. Vienā pieprasījumā varat ierakstīt vairākas šādas izteiksmes un nekavējoties aprēķināt vērtību vairākiem rādītājiem.

Salīdzināsim trīs pieejas:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Sīkāka informācija

Šeit dažas testa datu kopas esmu pievienojis "Diska datu lielumu". Kolonnu gadījumā mums ir mazākais datu lielums: maksimālā saspiešana, maksimālais vaicājuma ātrums, bet mēs maksājam ar to, ka viss ir jāreģistrē uzreiz.

Masīvu gadījumā viss ir nedaudz sliktāk. Dati joprojām ir labi saspiesti, un var saglabāt neregulāru rakstu. Bet Noklikšķiniet uz Māja - kolonnu datubāze, un, kad mēs sākam visu glabāt masīvā, tā pārvēršas par rindu, un mēs maksājam par elastību ar efektivitāti. Jebkurai darbībai viss masīvs būs jānolasa atmiņā, pēc tam jāatrod tajā vajadzīgais elements - un, ja masīvs palielinās, ātrums samazinās.

Vienā no uzņēmumiem, kas izmanto šo pieeju (piemēram, Uber), masīvus sagriež 128 elementu gabalos. Dati no vairākiem tūkstošiem metriku ar 200 TB datu apjomu dienā tiek glabāti nevis vienā masīvā, bet 10 vai 30 masīvos ar īpašu uzglabāšanas loģiku.

Vienkāršākā pieeja ir ar stīgām. Taču dati ir slikti saspiesti, tabulas izmērs ir liels, un pat tad, ja vaicājumi ir balstīti uz vairākiem rādītājiem, ClickHouse nedarbojas optimāli.

Hibrīda shēma

Pieņemsim, ka esam izvēlējušies masīva ķēdi. Taču, ja zinām, ka lielākajā daļā mūsu informācijas paneļu tiek rādīta tikai lietotāju un sistēmas metrika, mēs varam papildus materializēt šo metriku kolonnās no masīva tabulas līmenī šādā veidā:

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

Ievietojot Noklikšķiniet uz Māja automātiski tos uzskaitīs. Tādā veidā jūs varat apvienot biznesu ar prieku: shēma ir elastīga un vispārīga, bet mēs izvilkām visbiežāk izmantotās kolonnas. Ņemiet vērā, ka šim nolūkam nebija jāmaina ieliktnis un ETLkas turpina tabulā ievietot masīvus. Mēs tikko izdarījām ALTER TABLE, pievienoja pāris skaļruņus, un mēs saņēmām hibrīdu un ātrāku shēmu, kuru varat sākt lietot uzreiz.

Kodeki un saspiešana

Par laikrindas Ir svarīgi, cik labi jūs iesaiņojat datus, jo informācijas apjoms var būt ļoti liels. IN Noklikšķiniet uz Māja Ir rīku komplekts, lai sasniegtu kompresijas efektu 1:10, 1:20 un dažreiz vairāk. Tas nozīmē, ka 1 TB neiepakotu datu diskā aizņem 50-100 GB. Mazāks izmērs ir labs, datus var nolasīt un apstrādāt ātrāk.

Lai sasniegtu augstu kompresijas līmeni, Noklikšķiniet uz Māja atbalsta šādus kodekus:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Tabulas piemērs:

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

Šeit mēs definējam kodeku DoubleDelta vienā gadījumā, otrajā - Gorilla, un mēs noteikti pievienosim vēl LZ4 saspiešana. Rezultātā diskā esošo datu apjoms ir ievērojami samazināts:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Tas parāda, cik daudz vietas aizņem tie paši dati, bet izmantojot dažādus kodekus un kompresijas:

  • GZIP failā diskā;
  • in ClickHouse bez kodekiem, bet ar ZSTD kompresiju;
  • in ClickHouse ar kodekiem un kompresiju LZ4 un ZSTD.

Var redzēt, ka tabulas ar kodekiem aizņem daudz mazāk vietas.

Izmēri ir svarīgi

Ne mazāk svarīgi выбрать pareizais datu tips:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Visos iepriekš minētajos piemēros es izmantoju Pludiņš64. Bet, ja mēs izvēlētos Pludiņš32, tad tas būtu vēl labāk. To labi nodemonstrēja puiši no Pērkonas rakstā, kas ir saistīts iepriekš. Ir svarīgi izmantot viskompaktāko veidu, kas ir piemērots uzdevumam: diska izmēram pat mazāk nekā vaicājuma ātrumam. Noklikšķiniet uz Māja ļoti jutīgs pret to.

Ja jūs varat izmantot int32 nevis int64, tad sagaidiet gandrīz divkāršu veiktspējas pieaugumu. Dati aizņem mazāk atmiņas, un visa “aritmētika” darbojas daudz ātrāk. Noklikšķiniet uz Māja iekšēji tā ir ļoti stingri tipizēta sistēma, kas maksimāli izmanto visas mūsdienu sistēmu sniegtās iespējas.

Apkopošana un Realizētie skati

Apkopošanas un materializētie skati ļauj izveidot apkopojumus dažādiem gadījumiem:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Piemēram, jums var būt neapkopoti avota dati, un jūs varat tiem pievienot dažādus materializētus skatus ar automātisku summēšanu, izmantojot īpašu programmu. SummingMergeTree (SMT). SMT ir īpaša datu apkopošanas struktūra, kas apkopo datus automātiski. Neapstrādāti dati tiek ievietoti datu bāzē, tie tiek automātiski apkopoti, un tajā var nekavējoties izmantot informācijas paneļus.

TTL - "aizmirst" vecos datus

Kā “aizmirst” datus, kas vairs nav vajadzīgi? Noklikšķiniet uz Māja zina, kā to izdarīt. Veidojot tabulas, varat norādīt TTL izteiksmes: piemēram, mēs glabājam minūšu datus par vienu dienu, dienas datus par 30 dienām un nekad nepieskaramies nedēļas vai mēneša datiem:

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

Daudzlīmeņu - sadalīt datus pa diskiem

Turpinot šo ideju, datus var saglabāt Noklikšķiniet uz Māja dažādās vietās. Pieņemsim, ka mēs vēlamies saglabāt karstos datus par pēdējo nedēļu ļoti ātrā lokālajā tīklā SSD, un mēs ievietojām vairāk vēsturisko datu citā vietā. IN Noklikšķiniet uz Māja tagad tas ir iespējams:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Varat konfigurēt krātuves politiku (uzglabāšanas politika) Tātad Noklikšķiniet uz Māja automātiski pārsūtīs datus uz citu krātuvi, sasniedzot noteiktus nosacījumus.

Bet tas vēl nav viss. Konkrētas tabulas līmenī varat definēt noteikumus, kas precīzi nosaka, kad dati tiek nodoti aukstajā krātuvē. Piemēram, dati tiek glabāti ļoti ātrā diskā 7 dienas, un viss, kas ir vecāks, tiek pārsūtīts uz lēnu. Tas ir labi, jo tas ļauj uzturēt sistēmas maksimālu veiktspēju, vienlaikus kontrolējot izmaksas un netērējot naudu aukstiem datiem:

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

Unikālas iespējas Noklikšķiniet uz Māja

Gandrīz visā Noklikšķiniet uz Māja Ir šādi “izcēlumi”, taču tos kompensē ekskluzivitāte - tas, kas nav citās datu bāzēs. Piemēram, šeit ir dažas unikālas funkcijas Noklikšķiniet uz Māja:

  • Masīvi. Uz Noklikšķiniet uz Māja ļoti labs atbalsts masīviem, kā arī iespēja uz tiem veikt sarežģītus aprēķinus.
  • Datu struktūru apkopošana. Šī ir viena no "slepkavas funkcijām" Noklikšķiniet uz Māja. Neskatoties uz to, ka Yandex puiši saka, ka mēs nevēlamies apkopot datus, viss tiek apkopots Noklikšķiniet uz Māja, jo tas ir ātri un ērti.
  • Materializēti skati. Kopā ar datu struktūru apkopošanu materializētie skati ļauj ērti reālā laika apkopošana.
  • ClickHouse SQL. Šis ir valodas paplašinājums SQL ar dažām papildu un ekskluzīvām funkcijām, kas ir pieejamas tikai Noklikšķiniet uz Māja. Iepriekš tas bija kā paplašināšanās, no vienas puses, un trūkums, no otras puses. Tagad gandrīz visi trūkumi salīdzinājumā ar SQL 92 mēs to noņēmām, tagad tas ir tikai paplašinājums.
  • Lambda-izteicieni. Vai tie joprojām ir kādā datu bāzē?
  • ML- atbalsts. Tas ir pieejams dažādās datu bāzēs, dažas ir labākas, dažas ir sliktākas.
  • Atvērtais avots. Mēs varam paplašināties Noklikšķiniet uz Māja kopā. Tagad iekšā Noklikšķiniet uz Māja aptuveni 500 atbalstītāju, un šis skaits nepārtraukti pieaug.

Sarežģīti vaicājumi

В Noklikšķiniet uz Māja ir daudz dažādu veidu, kā darīt vienu un to pašu. Piemēram, jūs varat atgriezt pēdējo vērtību no tabulas trīs dažādos veidos CPU (ir arī ceturtā, bet tā ir vēl eksotiskāka).

Pirmais parāda, cik ērti to ir izdarīt Noklikšķiniet uz Māja vaicājumus, kad vēlaties to pārbaudīt dubultā ietverts apakšvaicājumā. Tas ir kaut kas, ko es personīgi ļoti palaidu garām citās datu bāzēs. Ja gribu kaut ko salīdzināt ar apakšvaicājumu, tad citās datubāzēs ar to var salīdzināt tikai skalāru, bet vairākām kolonnām jāraksta PIEVIENOJIES. Uz Noklikšķiniet uz Māja jūs varat izmantot korektoru:

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

Otrā metode dara to pašu, bet izmanto apkopošanas funkciju argMax:

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

В Noklikšķiniet uz Māja ir vairāki desmiti agregātu funkciju, un, ja jūs izmantojat kombinatorus, tad saskaņā ar kombinatorikas likumiem jūs iegūsit apmēram tūkstoti no tiem. ArgMax - viena no funkcijām, kas aprēķina maksimālo vērtību: pieprasījums atgriež vērtību usage_user, pie kuras tiek sasniegta maksimālā vērtība izveidots_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 — rindu “līmēšana” ar dažādiem laikiem. Šī ir unikāla funkcija datu bāzēm, kas ir pieejama tikai kdb+. Ja ir divas laika rindas ar dažādiem laikiem, ASOF JOIN ļauj tos pārvietot un apvienot vienā pieprasījumā. Katrai vērtībai vienā laikrindā tiek atrasta tuvākā vērtība otrā, un tās tiek atgrieztas tajā pašā rindā:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Analītiskās funkcijas

Standartā SQL-2003 tu vari rakstīt šādi:

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;

В Noklikšķiniet uz Māja Jūs to nevarat izdarīt — tas neatbalsta standartu SQL-2003 un droši vien nekad to nedarīs. Tā vietā iekšā Noklikšķiniet uz Māja Ir pieņemts rakstīt šādi:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Apsolīju lambdas - lūk, tās ir!

Šis ir standarta analītiskā vaicājuma analogs SQL-2003: viņš skaita atšķirību starp abiem laika zīmogs, ilgums, kārtas skaitlis - viss, ko mēs parasti uzskatām par analītiskām funkcijām. IN Noklikšķiniet uz Māja Mēs tos uzskaitām, izmantojot masīvus: vispirms sakļaujam datus masīvā, pēc tam masīvā darām visu, ko vēlamies, un tad izvēršam to atpakaļ. Tas nav īpaši ērti, tas prasa vismaz mīlestību pret funkcionālo programmēšanu, taču tas ir ļoti elastīgs.

Speciālas iespējas

Turklāt iekšā Noklikšķiniet uz Māja daudzas specializētas funkcijas. Piemēram, kā noteikt, cik sesiju notiek vienlaikus? Tipisks uzraudzības uzdevums ir ar vienu pieprasījumu noteikt maksimālo slodzi. IN Noklikšķiniet uz Māja Šim nolūkam ir īpaša funkcija:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Kopumā ClickHouse ir īpašas funkcijas daudziem mērķiem:

  • darbojasAtšķirība, darbojasUzkrāt, kaimiņš;
  • sumMap(atslēga, vērtība);
  • timeSeriesGroupSum(uid, timestamp, value);
  • timeSeriesGroupRateSum(uid, timestamp, value);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • AR PILDĪJUMU / AR SAITES;
  • simpleLinearRegression, stochasticLinearRegression.

Tas nav pilnīgs funkciju saraksts, kopā ir 500-600. Padoms: visas funkcijas Noklikšķiniet uz Māja ir sistēmas tabulā (ne visi ir dokumentēti, bet visi ir interesanti):

select * from system.functions order by name

Noklikšķiniet uz Māja tas glabā daudz informācijas par sevi, tostarp baļķu galdi, query_log, izsekošanas žurnāls, operāciju žurnāls ar datu blokiem (part_log), metrikas žurnāls un sistēmas žurnāls, ko tas parasti ieraksta diskā. Žurnāla metrika ir laikrindas в Noklikšķiniet uz Māja patiesībā Noklikšķiniet uz Māja: Datubāzei pati par sevi var būt nozīme laikrindas datubāzēm, tādējādi “aprijot” sevi.

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Šī ir arī unikāla lieta, jo mēs darām labu darbu laikrindas, kāpēc mēs nevaram sevī uzglabāt visu nepieciešamo? Mums nevajag Prometejs, mēs visu paturam pie sevis. Savienots grafana un mēs uzraugām sevi. Tomēr, ja Noklikšķiniet uz Māja krīt, mēs neredzēsim, kāpēc, tāpēc viņi parasti to nedara.

Liels kopums vai daudz mazu Noklikšķiniet uz Māja

Kas ir labāk - viens liels klasteris vai daudzas mazas ClickHouse? Tradicionāla pieeja DWH ir liels klasteris, kurā ķēdes tiek piešķirtas katrai lietojumprogrammai. Mēs nonācām pie datu bāzes administratora - iedodiet mums diagrammu, un viņi mums to iedeva:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

В Noklikšķiniet uz Māja tu vari darīt savādāk. Katru pieteikumu varat izveidot savu Noklikšķiniet uz Māja:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Mums vairs nav vajadzīgs lielais briesmīgais DWH un neatrisināmi administratori. Katram pieteikumam varam piešķirt savu Noklikšķiniet uz Māja, un izstrādātājs to var izdarīt pats, kopš Noklikšķiniet uz Māja ļoti viegli uzstādīt un neprasa sarežģītu administrēšanu:

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Bet ja mums ir daudz Noklikšķiniet uz Māja, un jums tas ir jāinstalē bieži, tad vēlaties automatizēt šo procesu. Šim nolūkam mēs varam, piemēram, izmantot Kubernetes и Clickhouse- operators. IN Kubernetes ClickHouse Jūs varat to ievietot “uz klikšķi”: es varu noklikšķināt uz pogas, palaist manifestu un datu bāze ir gatava. Es varu uzreiz izveidot diagrammu, sākt tajā augšupielādēt metriku, un pēc 5 minūtēm man ir gatavs informācijas panelis grafana. Tas ir tik vienkārši!

Rezultāts?

Tātad, Noklikšķiniet uz Māja - tas ir:

  • Ātri. To zina visi.
  • Vienkārši. Mazliet pretrunīgi, bet uzskatu, ka treniņos ir grūti, cīņā – viegli. Ja jūs saprotat, kā Noklikšķiniet uz Māja tas darbojas, tad viss ir ļoti vienkārši.
  • Universāli. Tas ir piemērots dažādiem scenārijiem: DWH, laikrindas, baļķu glabāšana. Bet tā nav OLTP datubāze, tāpēc nemēģiniet tur veikt īsus ieliktņus un nolasījumus.
  • Interesanti. Droši vien tas, kurš strādā ar Noklikšķiniet uz Māja, piedzīvoja daudz interesantu brīžu labā un sliktā nozīmē. Piemēram, iznāca jauns laidiens, viss pārstāja darboties. Vai arī tad, kad divas dienas cīnījāties ar uzdevumu, bet pēc jautājuma uzdošanas Telegram čatā uzdevums tika atrisināts divās minūtēs. Vai kā konferencē pēc Lešas Milovidova ziņojuma, ekrānuzņēmums no Noklikšķiniet uz Māja pārtrauca raidījumu HighLoad++. Šādas lietas notiek visu laiku un apgrūtina mūsu dzīvi. Noklikšķiniet uz Māja spilgti un interesanti!

Jūs varat noskatīties prezentāciju šeit.

Pārcelšanās uz ClickHouse: 3 gadus vēlāk

Ilgi gaidītā augstas slodzes sistēmu izstrādātāju tikšanās plkst HighLoad++ notiks 9. un 10. novembrī Skolkovā. Visbeidzot, šī būs bezsaistes konference (lai gan ar visiem piesardzības pasākumiem), jo HighLoad++ enerģiju nevar iepakot tiešsaistē.

Konferencei atrodam un parādām gadījumus par tehnoloģiju maksimālajām iespējām: HighLoad++ bija, ir un būs vienīgā vieta, kur divu dienu laikā varēs uzzināt, kā darbojas Facebook, Yandex, VKontakte, Google un Amazon.

Sapulces noritot bez pārtraukuma kopš 2007. gada, šogad tiksimies jau 14. reizi. Šajā laikā konferences apjoms ir izaudzis 10 reizes; pagājušajā gadā nozares galvenais notikums pulcēja 3339 dalībniekus, 165 runātājus, ziņojumus un tikšanās, un vienlaikus darbojās 16 dziesmas.
Pērn kursēja 20 autobusi, 5280 litri tējas un kafijas, 1650 litri augļu dzērienu un 10200 pudeles ūdens. Un vēl 2640 kilogrami ēdiena, 16 000 šķīvju un 25 000 tasīšu. Starp citu, par no pārstrādātā papīra savākto naudu iestādījām 100 ozolu stādus :)

Jūs varat iegādāties biļetes šeit, saņemiet ziņas par konferenci - šeit, un runājiet visos sociālajos tīklos: Telegram, Facebook, Vkontakte и Twitter.

Avots: www.habr.com

Pievieno komentāru