ClickHouse-ga o'tish: 3 yildan keyin

Uch yil oldin Viktor Tarnavskiy va Aleksey Milovidov Yandexdan sahnada Yuqori yuk ++ dedi, ClickHouse qanchalik yaxshi va u qanday sekinlashmaydi. Va keyingi bosqichda bor edi Aleksandr Zaytsev с hisobot ga ko'chish haqida ClickHouse boshqa analitik DBMSdan va xulosa bilan ClickHouse, albatta, yaxshi, lekin juda qulay emas. Qachon 2016 yilda kompaniya LifeStreet, Aleksandr o'sha paytda ishlagan, ko'p petabaytli analitik tizimni o'zgartirgan ClickHouse, bu noma'lum xavf-xatarlarga to'la maftunkor "sariq g'ishtli yo'l" edi - ClickHouse o'sha paytda u minalangan maydonga o'xshardi.

Uch yildan keyin ClickHouse ancha yaxshilandi - bu vaqt ichida Aleksandr Altinity kompaniyasiga asos soldi, bu nafaqat odamlarga ko'chib o'tishga yordam beradi ClickHouse o'nlab loyihalar, balki Yandeksdagi hamkasblar bilan birgalikda mahsulotning o'zini yaxshilaydi. Hozir ClickHouse hali ham beparvo sayr emas, balki endi mina maydoni emas.

Aleksandr 2003 yildan beri taqsimlangan tizimlar bilan ishlaydi va yirik loyihalarni ishlab chiqadi MySQL, Oracle и Vertika. Oxirgi qismida HighLoad++ 2019 Aleksandr, foydalanishning kashshoflaridan biri ClickHouse, bu DBMS hozir nima ekanligini aytdi. Biz asosiy xususiyatlarni bilib olamiz ClickHouse: u boshqa tizimlardan qanday farq qiladi va qanday hollarda undan foydalanish samaraliroq. Misollar yordamida biz tizimlarni qurish bo'yicha so'nggi va loyiha sinovidan o'tgan amaliyotlarni ko'rib chiqamiz ClickHouse.


Retrospektiv: 3 yil oldin sodir bo'lgan voqea

Uch yil oldin biz kompaniyani o'tkazdik LifeStreet haqida ClickHouse boshqa analitik ma'lumotlar bazasidan va reklama tarmog'ining tahliliy migratsiyasi quyidagicha ko'rinish oldi:

  • 2016 yil iyun. In Ochiq manba paydo ClickHouse va bizning loyihamiz boshlandi;
  • avgust. Kontseptsiyani isbotlash: katta reklama tarmog'i, infratuzilma va 200-300 terabayt ma'lumotlar;
  • oktyabr. Birinchi ishlab chiqarish ma'lumotlari;
  • dekabr. To'liq mahsulot yuki kuniga 10-50 milliard hodisa.
  • Iyun 2017. Foydalanuvchilarning muvaffaqiyatli migratsiyasi ClickHouse, 2,5 ta serverdan iborat klasterda 60 petabayt ma'lumot.

Migratsiya jarayonida buni tushunish kuchaydi ClickHouse yaxshi tizim, u bilan ishlash yoqimli, lekin bu Yandex kompaniyasining ichki loyihasi. Shuning uchun, nuanslar bor: Yandex birinchi navbatda o'zining ichki mijozlari bilan shug'ullanadi va shundan keyingina jamiyat va tashqi foydalanuvchilarning ehtiyojlari bilan shug'ullanadi va ClickHouse keyinchalik ko'plab funktsional sohalarda korxona darajasiga etib bormadi. Shuning uchun biz 2017 yil mart oyida Altinity kompaniyasiga asos solganmiz ClickHouse nafaqat Yandex uchun, balki boshqa foydalanuvchilar uchun ham tezroq va qulayroq. Va endi biz:

  • Biz o'rgatamiz va asosida yechimlar yaratishga yordam beramiz ClickHouse mijozlar muammoga duch kelmasliklari va yechim oxir-oqibat ishlashi uchun;
  • Biz 24/7 qo'llab-quvvatlaymiz ClickHouse- o'rnatish;
  • Biz o'z ekotizim loyihalarimizni ishlab chiqamiz;
  • Biz o'zimizga faol ravishda va'da beramiz ClickHouse, ba'zi xususiyatlarni ko'rishni xohlaydigan foydalanuvchilarning so'rovlariga javob berish.

Va, albatta, biz ko'chib o'tishga yordam beramiz ClickHouse с MySQL, Vertika, Oracle, Yashil olxo'ri, Redshift va boshqa tizimlar. Biz turli harakatlarda qatnashdik va ularning barchasi muvaffaqiyatli bo'ldi.

ClickHouse-ga o'tish: 3 yildan keyin

Nima uchun ko'chish ClickHouse

Sekinlashmaydi! Bu asosiy sababdir. ClickHouse - turli stsenariylar uchun juda tez ma'lumotlar bazasi:

ClickHouse-ga o'tish: 3 yildan keyin

Uzoq vaqt davomida odamlar bilan ishlagan odamlarning tasodifiy iqtiboslari ClickHouse.

Masshtablilik. Boshqa ma'lumotlar bazasida siz bitta uskunada yaxshi ishlashga erishishingiz mumkin, ammo ClickHouse serverlarni qo'shish orqali nafaqat vertikal, balki gorizontal ravishda ham o'lchashingiz mumkin. Hamma narsa biz xohlagandek muammosiz ishlamaydi, lekin u ishlaydi. Sizning biznesingiz o'sishi bilan tizimni kengaytirishingiz mumkin. Muhimi, biz hozir yechim bilan cheklanmasligimiz va rivojlanish uchun har doim salohiyat mavjud.

Portativlik. Bitta narsaga bog'liqlik yo'q. Masalan, bilan Amazon RedShift Biror joyga ko'chib o'tish qiyin. A ClickHouse siz uni noutbukingizga, serveringizga o'rnatishingiz, bulutga o'rnatishingiz, o'ting Kubernetes — infratuzilma faoliyatida hech qanday cheklovlar yo‘q. Bu hamma uchun qulay va bu boshqa ko'plab shunga o'xshash ma'lumotlar bazalari bilan maqtana olmaydigan katta afzallikdir.

Moslashuvchanlik. ClickHouse bir narsada to'xtamaydi, masalan, Yandex.Metrica, lekin rivojlanadi va tobora ko'proq turli loyihalar va sohalarda qo'llaniladi. U yangi muammolarni hal qilish uchun yangi imkoniyatlarni qo'shish orqali kengaytirilishi mumkin. Misol uchun, ma'lumotlar bazasida jurnallarni saqlash yomon xulq deb hisoblanadi, shuning uchun ular o'ylab topdilar Elasticsearch. Ammo moslashuvchanlik tufayli ClickHouse, siz unda jurnallarni ham saqlashingiz mumkin va ko'pincha bu undan ham yaxshiroq Elasticsearch - In ClickHouse buning uchun 10 barobar kamroq temir kerak bo'ladi.

ozod Ochiq manbalar. Hech narsa uchun pul to'lashingiz shart emas. Tizimni noutbuk yoki serveringizga o'rnatish uchun ruxsat olish uchun muzokara qilishning hojati yo'q. Yashirin to'lovlar yo'q. Shu bilan birga, boshqa hech qanday Open Source ma'lumotlar bazasi texnologiyasi tezlikda raqobatlasha olmaydi ClickHouse. MySQL, MariaDB, Greenplum - ularning barchasi ancha sekinroq.

Jamiyat, haydash va qiziqarli. Have ClickHouse ajoyib hamjamiyat: uchrashuvlar, suhbatlar va barchamizni o'zining energiya va nekbinligi bilan quvvatlaydigan Aleksey Milovidov.

ClickHouse-ga o'tish

Ga bormoq ClickHouse negadir faqat uchta narsa kerak:

  • Cheklovlarni tushuning ClickHouse va nima uchun mos emas.
  • Foyda oling texnologiya va uning eng kuchli tomonlari.
  • Tajriba. Hatto uning qanday ishlashini tushunish ClickHouse, qachon tezroq, qachon sekinroq, qachon yaxshiroq va qachon yomonroq bo'lishini oldindan aytish har doim ham mumkin emas. Shunday qilib, sinab ko'ring.

Ko'chirish muammosi

Faqat bitta "lekin" bor: agar siz ko'chsangiz ClickHouse boshqa narsadan, keyin odatda biror narsa noto'g'ri ketadi. Biz sevimli ma'lumotlar bazamizda ishlaydigan ba'zi amaliyotlar va narsalarga o'rganib qolganmiz. Masalan, u bilan ishlaydigan har bir kishi SQL-ma'lumotlar bazalari quyidagi funktsiyalar to'plamini majburiy deb hisoblaydi:

  • operatsiyalar;
  • cheklovlar;
  • izchillik;
  • indekslar;
  • YANGILASH/O‘CHIRISh;
  • NULLlar;
  • millisekundlar;
  • avtomatik turdagi quyma;
  • bir nechta ulanish;
  • ixtiyoriy qismlar;
  • klasterlarni boshqarish vositalari.

Ishga yollash majburiy, ammo uch yil oldin ClickHouse Bu funksiyalarning hech biri mavjud emas edi! Endi amalga oshirilmaganlarning yarmidan kamrog'i qolmoqda: tranzaktsiyalar, cheklovlar, izchillik, millisekundlar va turdagi kasting.

Va asosiysi - bu ClickHouse ba'zi standart amaliyotlar va yondashuvlar ishlamaydi yoki biz o'rganganimizdan boshqacha ishlaydi. Ko'rinadigan hamma narsa ClickHouse, mos keladi "ClickHouse usuli", ya'ni. funktsiyalari boshqa ma'lumotlar bazalaridan farq qiladi. Masalan:

  • Indekslar tanlanmaydi, lekin o'tkazib yuboriladi.
  • YANGILASH/O‘CHIRISh sinxron emas, balki asinxron.
  • Bir nechta qo'shilish mavjud, ammo so'rovni rejalashtiruvchi yo'q. Ularning qanday bajarilishi ma'lumotlar bazasi dunyosidagi odamlar uchun umuman tushunarli emas.

ClickHouse skriptlari

1960 yilda vengriyalik amerikalik matematik Wigner EP maqola yozdi "Tabiiy fanlarda matematikaning asossiz samaradorligi” (“Tabiiy fanlarda matematikaning tushunarsiz samaradorligi”) atrofimizdagi dunyo negadir matematik qonunlar bilan yaxshi tasvirlangan. Matematika mavhum fan bo'lib, matematik shaklda ifodalangan fizik qonunlar ahamiyatsiz emas va Wigner EP bu juda g'alati ekanligini ta'kidladi.

Mening nuqtai nazarimdan, ClickHouse - xuddi shunday g'alatilik. Vignerni qayta ibora qilish uchun biz buni aytishimiz mumkin: aql bovar qilmaydigan samaradorlik hayratlanarli ClickHouse turli xil tahliliy ilovalarda!

ClickHouse-ga o'tish: 3 yildan keyin

Masalan, olaylik Haqiqiy vaqtda ma'lumotlar ombori, unga ma'lumotlar deyarli doimiy ravishda yuklanadi. Biz undan so'rovlarni ikkinchi kechikish bilan qabul qilmoqchimiz. Iltimos - foydalaning ClickHouse, chunki bu stsenariy uchun ishlab chiqilgan. ClickHouse u nafaqat internetda, balki marketing va moliyaviy tahlilda ham aynan shunday qo'llaniladi, AdTech, shuningdek, ichida Firibgarlikni aniqlashn. IN Haqiqiy vaqtda ma'lumotlar ombori "yulduz" yoki "qor parchasi" kabi murakkab tuzilgan sxema ishlatiladi, ko'plab jadvallar mavjud. JOIN (ba'zan bir nechta) va ma'lumotlar odatda ba'zi tizimlarda saqlanadi va o'zgartiriladi.

Keling, boshqa stsenariyni olaylik - Vaqt seriyasi: qurilmalar, tarmoqlar, foydalanish statistikasi, narsalarning interneti monitoringi. Bu erda biz o'z vaqtida buyurtma qilingan juda oddiy voqealarga duch kelamiz. ClickHouse dastlab buning uchun ishlab chiqilmagan, lekin o'zini yaxshi ishlashini ko'rsatdi, shuning uchun yirik kompaniyalar foydalanadi ClickHouse monitoring axborot ombori sifatida. Bu mos keladimi yoki yo'qligini o'rganish uchun ClickHouse vaqt seriyasi uchun biz yondashuv va natijalarga asoslangan benchmark qildik InfluxDB и Vaqt shkalasi JB - ixtisoslashgan vaqt seriyasi ma'lumotlar bazalari. Bu chiqdi, deb ClickHouse, hatto bunday vazifalarni optimallashtirmasdan ham, xorijiy maydonda g'alaba qozonadi:

ClickHouse-ga o'tish: 3 yildan keyin

В vaqt seriyasi Odatda tor jadval ishlatiladi - bir nechta kichik ustunlar. Ko'p ma'lumotlar monitoringdan olinishi mumkin - soniyada millionlab yozuvlar - va ular odatda kichik portlashlarda keladi (haqiqiy vaqt oqim). Shuning uchun, boshqa kiritish skripti kerak va so'rovlarning o'ziga xos xususiyatlari bor.

Kundalik boshqarish. Ma'lumotlar bazasiga jurnallarni yig'ish odatda yomon, lekin ClickHouse bu yuqorida tavsiflangan ba'zi izohlar bilan amalga oshirilishi mumkin. Ko'pgina kompaniyalar foydalanadi ClickHouse aynan shu maqsadda. Bunday holda, biz butun jurnallarni (masalan, shaklda) saqlaydigan tekis keng stoldan foydalanamiz JSON) yoki bo'laklarga bo'ling. Ma'lumotlar odatda katta partiyalarda (fayllarda) yuklanadi va biz ba'zi maydonlar bo'yicha qidiramiz.

Ushbu funktsiyalarning har biri uchun odatda maxsus ma'lumotlar bazalaridan foydalaniladi. ClickHouse bir kishi hammasini qila oladi va shu qadar yaxshiki, u ulardan ustun turadi. Keling, batafsilroq ko'rib chiqaylik vaqt seriyasi stsenariy va qanday qilib to'g'ri "pishirish" kerak ClickHouse ushbu stsenariy uchun.

Vaqt seriyasi

Hozirda bu asosiy stsenariy ClickHouse standart yechim hisoblanadi. Vaqt seriyasi vaqt bo'yicha tartiblangan hodisalar to'plami bo'lib, vaqt o'tishi bilan qandaydir jarayondagi o'zgarishlarni ifodalaydi. Masalan, bu kunlik yurak urishi yoki tizimdagi jarayonlar soni bo'lishi mumkin. Ba'zi o'lchovlar bilan vaqt belgilarini beradigan har bir narsa vaqt seriyasi:

ClickHouse-ga o'tish: 3 yildan keyin

Ushbu turdagi hodisalarning aksariyati monitoringdan kelib chiqadi. Bu nafaqat Internetni, balki haqiqiy qurilmalarni ham kuzatishi mumkin: avtomobillar, sanoat tizimlari, suruv, zavodlar yoki uchuvchisiz taksilar, Yandex allaqachon yukxonasiga qo'ygan ClickHouse-server.

Masalan, kemalardan ma'lumotlarni yig'adigan kompaniyalar bor. Har bir necha soniyada konteyner kemasidagi sensorlar yuzlab turli o'lchovlarni yuboradi. Muhandislar ularni o'rganadilar, modellar quradilar va kema qanchalik samarali ishlatilishini tushunishga harakat qiladilar, chunki konteyner kemasi bir soniya ham bo'sh qolmasligi kerak. Har qanday to'xtab qolish pul yo'qotishdir, shuning uchun to'xtashlar minimal bo'lishi uchun marshrutni taxmin qilish muhimdir.

Hozirgi vaqtda o'lchaydigan maxsus ma'lumotlar bazalarining o'sishi kuzatilmoqda vaqt seriyasi. Saytda JB-dvigatellari Turli ma'lumotlar bazalari qandaydir tarzda tartiblangan va ularni turlari bo'yicha ko'rishingiz mumkin:

ClickHouse-ga o'tish: 3 yildan keyin

Eng tez o'sadigan tur vaqt seriyasis. Grafik ma'lumotlar bazalari ham o'sib bormoqda, lekin vaqt seriyasis so'nggi bir necha yil ichida tezroq o'sib bormoqda. Ushbu ma'lumotlar bazalari oilasining tipik vakillari InfluxDB, Prometheus, KDB, Vaqt shkalasi JB (qurilgan PostgreSQL), dan yechimlar Amazon. ClickHouse bu yerda ham foydalanish mumkin va ishlatiladi. Sizga bir nechta ommaviy misollar keltiraman.

Kashshoflardan biri kompaniya hisoblanadi CloudFlare (CDN-provayder). Ularni kuzatib boradilar CDN ichidan ClickHouse (DNS- so'rovlar, HTTP-so'rovlar) katta yuk bilan - soniyada 6 million hodisa. Hamma narsa o'tib ketadi Kafka, boradi ClickHouse, bu real vaqt rejimida tizimdagi voqealar boshqaruv panelini ko'rish imkoniyatini beradi.

Comcast - AQShda telekommunikatsiya sohasidagi yetakchilardan biri: Internet, raqamli televideniye, telefoniya. Ular xuddi shunday nazorat tizimini yaratdilar CDN doirasida Ochiq manbalar loyiha Apache trafik nazorati katta ma'lumotlaringiz bilan ishlash uchun. ClickHouse analitik uchun backend sifatida ishlatiladi.

Perkona qurilgan ClickHouse sizning ichingizda PMMturli monitoringni saqlash uchun MySQL.

Maxsus talablar

Vaqt seriyali ma'lumotlar bazalari o'ziga xos talablarga ega.

  • Ko'p agentlardan tezkor kiritish. Biz juda tez ko'p oqimlardan ma'lumotlarni kiritishimiz kerak. ClickHouse U buni yaxshi bajaradi, chunki uning barcha qo'shimchalari bloklanmaydi. Har qanday qo'shing diskdagi yangi fayl bo'lib, kichik qo'shimchalar u yoki bu tarzda buferlanishi mumkin. IN ClickHouse Bir vaqtning o'zida bitta satr emas, balki katta partiyalarda ma'lumotlarni kiritish yaxshiroqdir.
  • Moslashuvchan sxema. The vaqt seriyasi Biz odatda ma'lumotlar strukturasini to'liq bilmaymiz. Muayyan dastur uchun monitoring tizimini yaratish mumkin, ammo keyin uni boshqa dastur uchun ishlatish qiyin. Bu yanada moslashuvchan sxemani talab qiladi. ClickHouse, kuchli terilgan baza bo'lsa-da, buni amalga oshirishga imkon beradi.
  • Ma'lumotlarni samarali saqlash va unutish. Odatda ichida vaqt seriyasi katta hajmdagi ma'lumotlar, shuning uchun uni iloji boricha samarali saqlash kerak. Masalan, at InfluxDB yaxshi siqish uning asosiy xususiyati hisoblanadi. Ammo saqlashdan tashqari, siz eski ma'lumotlarni "unutishingiz" va qandaydir ishlarni bajarishingiz kerak namunani pasaytirish — agregatlarni avtomatik hisoblash.
  • Birlashtirilgan ma'lumotlar bo'yicha tezkor so'rovlar. Ba'zan so'nggi 5 daqiqani millisekundlar aniqligi bilan ko'rish qiziq, ammo oylik ma'lumotlarda daqiqa yoki ikkinchi darajalilik kerak bo'lmasligi mumkin - umumiy statistika etarli. Bunday qo'llab-quvvatlash zarur, aks holda 3 oylik so'rovni bajarish juda uzoq vaqt talab etadi ClickHouse.
  • kabi so'rovlaroxirgi nuqta, hozirgacha». Bular uchun xosdir vaqt seriyasi so'rovlar: bir vaqtning o'zida tizimning oxirgi o'lchovi yoki holatiga qarang t. Bu ma'lumotlar bazasi uchun unchalik yoqimli so'rovlar emas, lekin siz ularni ham bajarishingiz kerak.
  • "Yopishtirish" vaqt seriyasi. Vaqt seriyasi vaqt seriyasidir. Agar ikkita vaqt seriyasi mavjud bo'lsa, ular ko'pincha bog'lanishi va korrelyatsiya qilinishi kerak. Buni barcha ma'lumotlar bazalarida, ayniqsa hizalanmagan vaqt seriyalarida qilish qulay emas: bu erda vaqt nuqtalari bor, boshqalari ham bor. Siz o'rtacha deb hisoblashingiz mumkin, lekin to'satdan u erda hali ham teshik bo'ladi, shuning uchun bu aniq emas.

Keling, ushbu talablar qanday bajarilishini ko'rib chiqaylik ClickHouse.

Sxema

В ClickHouse uchun sxema vaqt seriyasi ma'lumotlarning muntazamlik darajasiga qarab turli usullar bilan amalga oshirilishi mumkin. Agar biz barcha ko'rsatkichlarni oldindan bilsak, tizimni muntazam ma'lumotlar asosida qurish mumkin. Masalan, men buni qildim CloudFlare monitoring bilan CDN yaxshi optimallashtirilgan tizimdir. Siz butun infratuzilmani va turli xizmatlarni kuzatadigan umumiy tizimni yaratishingiz mumkin. Noqonuniy ma'lumotlar bo'lsa, biz nima kuzatayotganimizni oldindan bilmaymiz - va bu, ehtimol, eng keng tarqalgan holat.

Oddiy ma'lumotlar. Ustunlar. Sxema oddiy - kerakli turlarga ega ustunlar:

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

Bu tizimni yuklashning ayrim turlarini kuzatuvchi oddiy jadval (foydalanuvchi, tizim, Bo'sh, yaxshi). Oddiy va qulay, lekin moslashuvchan emas. Agar biz yanada moslashuvchan sxemani xohlasak, u holda massivlardan foydalanishimiz mumkin.

Noto'g'ri ma'lumotlar. Massivlar:

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

tuzilma Ichki ikkita massiv: metrics.name и metrika.qiymat. Bu yerda siz har bir hodisa uchun nomlar massivi va o'lchovlar qatori kabi o'zboshimchalik bilan kuzatuv ma'lumotlarini saqlashingiz mumkin. Keyinchalik optimallashtirish uchun bitta bunday tuzilma o'rniga siz bir nechtasini qilishingiz mumkin. Masalan, biri uchun suzmoq-qiymat, boshqasi - uchun int- chunki ma'nosi int Men yanada samarali saqlashni xohlayman.

Ammo bunday tuzilishga kirish qiyinroq. Avval indeks, keyin esa massiv qiymatlarini chiqarish uchun maxsus funktsiyalardan foydalangan holda maxsus konstruktsiyadan foydalanishingiz kerak bo'ladi:

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

Ammo u hali ham juda tez ishlaydi. Noqonuniy ma'lumotlarni saqlashning yana bir usuli - bu qatorlar.

Noto'g'ri ma'lumotlar. Strings. Ushbu an'anaviy usulda massivlarsiz nomlar va qiymatlar bir vaqtning o'zida saqlanadi. Agar bir vaqtning o'zida 5 ta o'lchov bir qurilmadan kelsa, ma'lumotlar bazasida 000 qator hosil bo'ladi:

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 bu bilan kurashadi - u maxsus kengaytmalarga ega ClickHouse SQL. Masalan, maxIf — baʼzi shartlar bajarilganda maksimalni koʻrsatkich boʻyicha hisoblaydigan maxsus funksiya. Siz bitta so'rovda bir nechta bunday iboralarni yozishingiz va darhol bir nechta ko'rsatkichlar uchun qiymatni hisoblashingiz mumkin.

Keling, uchta yondashuvni taqqoslaylik:

ClickHouse-ga o'tish: 3 yildan keyin

details

Bu erda men ba'zi test ma'lumotlar to'plami uchun "Disk ma'lumotlarining hajmi" ni qo'shdim. Ustunlar holatida biz eng kichik ma'lumotlar hajmiga egamiz: maksimal siqish, maksimal so'rov tezligi, lekin biz hamma narsani bir vaqtning o'zida yozib olish orqali to'laymiz.

Massivlar bo'lsa, hamma narsa biroz yomonroq. Ma'lumotlar hali ham yaxshi siqilgan va tartibsiz naqsh saqlanishi mumkin. Lekin ClickHouse - ustunli ma'lumotlar bazasi va biz hamma narsani massivda saqlashni boshlaganimizda, u bir qatorga aylanadi va biz moslashuvchanlik uchun samaradorlik bilan to'laymiz. Har qanday operatsiya uchun siz butun massivni xotiraga o'qib chiqishingiz kerak, keyin undagi kerakli elementni topishingiz kerak - va agar massiv o'ssa, tezlik pasayadi.

Ushbu yondashuvdan foydalanadigan kompaniyalardan birida (masalan, Uber), massivlar 128 ta elementdan iborat bo'laklarga bo'linadi. Kuniga 200 TB ma'lumot hajmiga ega bo'lgan bir necha ming ko'rsatkichlardan olingan ma'lumotlar bir massivda emas, balki maxsus saqlash mantig'i bilan 10 yoki 30 massivda saqlanadi.

Eng oddiy yondashuv strings bilan. Ammo ma'lumotlar yomon siqilgan, jadval hajmi katta va so'rovlar bir nechta ko'rsatkichlarga asoslangan bo'lsa ham, ClickHouse optimal ishlamaydi.

Gibrid sxema

Faraz qilaylik, biz massiv sxemasini tanladik. Ammo, agar biz ko'pchilik asboblar panelida faqat foydalanuvchi va tizim ko'rsatkichlarini ko'rsatishini bilsak, biz ushbu ko'rsatkichlarni jadval darajasidagi massivdan ustunlarga qo'shimcha ravishda quyidagicha amalga oshirishimiz mumkin:

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

Kiritganda ClickHouse ularni avtomatik ravishda hisoblab chiqadi. Shunday qilib, siz biznesni zavq bilan birlashtira olasiz: sxema moslashuvchan va umumiydir, lekin biz eng tez-tez ishlatiladigan ustunlarni tortib oldik. E'tibor bering, bu qo'shimchani o'zgartirishni talab qilmadi va ETLjadvalga massivlarni kiritishda davom etadi. Biz shunchaki qildik ALTER TABLE, bir nechta dinamik qo'shildi va biz gibrid va tezroq sxemaga ega bo'ldik, siz darhol foydalanishni boshlashingiz mumkin.

Kodeklar va siqish

uchun vaqt seriyasi Ma'lumotni qanchalik yaxshi to'plaganingiz muhim, chunki ma'lumotlar miqdori juda katta bo'lishi mumkin. IN ClickHouse 1:10, 1:20 va ba'zan ko'proq siqish effektiga erishish uchun vositalar to'plami mavjud. Bu shuni anglatadiki, diskdagi 1 TB ochilmagan ma'lumotlar 50-100 Gb ni egallaydi. Kichikroq hajm yaxshi, ma'lumotlarni tezroq o'qish va qayta ishlash mumkin.

Yuqori darajadagi siqilishga erishish uchun, ClickHouse quyidagi kodeklarni qo'llab-quvvatlaydi:

ClickHouse-ga o'tish: 3 yildan keyin

Misol jadvali:

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

Bu erda biz kodekni aniqlaymiz DoubleDelta bir holatda, ikkinchisida - gorilla, va biz, albatta, ko'proq qo'shamiz LZ4 siqilish. Natijada, diskdagi ma'lumotlar hajmi sezilarli darajada kamayadi:

ClickHouse-ga o'tish: 3 yildan keyin

Bu bir xil ma'lumotlarning qancha joy egallashini ko'rsatadi, lekin turli kodeklar va siqishlardan foydalanadi:

  • diskdagi GZIP faylida;
  • ClickHouse-da kodeksiz, lekin ZSTD siqish bilan;
  • kodek va siqish LZ4 va ZSTD bilan ClickHouse-da.

Ko'rinib turibdiki, kodekli jadvallar juda kam joy egallaydi.

Muhim masalalar

Kamroq muhim emas выбрать to'g'ri ma'lumotlar turi:

ClickHouse-ga o'tish: 3 yildan keyin

Yuqoridagi barcha misollarda men ishlatganman Float64. Ammo agar biz tanlagan bo'lsak Float32, keyin bu yanada yaxshi bo'lar edi. Buni Perkonalik yigitlar yuqorida havola qilingan maqolada yaxshi ko'rsatgan. Vazifa uchun mos bo'lgan eng ixcham turdan foydalanish muhim: so'rov tezligidan ko'ra disk hajmi uchun ham kamroq. ClickHouse bunga juda sezgir.

Agar foydalana olsangiz int32 o'rniga int64, keyin ishlashning deyarli ikki barobar oshishini kuting. Ma'lumotlar kamroq xotirani egallaydi va barcha "arifmetika" juda tez ishlaydi. ClickHouse ichki jihatdan bu juda qattiq terilgan tizim bo'lib, u zamonaviy tizimlar taqdim etayotgan barcha imkoniyatlardan maksimal darajada foydalanadi.

Birlashtirish va Moddiy ko'rinishlar

Birlashtirish va moddiylashtirilgan ko'rinishlar turli holatlar uchun agregatlar yaratishga imkon beradi:

ClickHouse-ga o'tish: 3 yildan keyin

Misol uchun, sizda yig'ilmagan manba ma'lumotlari bo'lishi mumkin va siz ularga turli xil moddiylashtirilgan ko'rinishlarni maxsus vosita orqali avtomatik yig'ish bilan biriktirishingiz mumkin. SummingMergeTree (SMT). SMT agregatlarni avtomatik ravishda hisoblaydigan maxsus yig'uvchi ma'lumotlar strukturasidir. Xom ma'lumotlar ma'lumotlar bazasiga kiritiladi, ular avtomatik ravishda jamlanadi va asboblar panelida darhol foydalanish mumkin.

TTL - eski ma'lumotlarni "unutish"

Endi kerak bo'lmagan ma'lumotlarni qanday qilib "unutish" mumkin? ClickHouse buni qanday qilishni biladi. Jadvallarni yaratishda siz belgilashingiz mumkin TTL iboralar: masalan, biz bir kun davomida daqiqali ma'lumotlarni, 30 kun davomida kundalik ma'lumotlarni saqlaymiz va haftalik yoki oylik ma'lumotlarga hech qachon tegmaymiz:

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

Ko'p darajali - ma'lumotlarni disklar bo'ylab taqsimlash

Ushbu fikrni davom ettiradigan bo'lsak, ma'lumotlar saqlanishi mumkin ClickHouse turli joylarda. Aytaylik, biz so'nggi haftadagi issiq ma'lumotlarni juda tez mahalliy tarmoqda saqlamoqchimiz SSD, va biz boshqa joyga ko'proq tarixiy ma'lumotlarni joylashtirdik. IN ClickHouse bu endi mumkin:

ClickHouse-ga o'tish: 3 yildan keyin

Siz saqlash siyosatini sozlashingiz mumkin (saqlash siyosati) shunday qilib ClickHouse muayyan shartlarga erishgandan so'ng, ma'lumotlarni avtomatik ravishda boshqa xotiraga o'tkazadi.

Lekin bu hammasi emas. Muayyan jadval darajasida siz ma'lumotlar sovuq saqlashga aniq qachon tushishi uchun qoidalarni belgilashingiz mumkin. Misol uchun, ma'lumotlar juda tez diskda 7 kun davomida saqlanadi va eski bo'lgan hamma narsa sekin diskka o'tkaziladi. Bu yaxshi, chunki u tizimni maksimal darajada ishlashga imkon beradi, shu bilan birga xarajatlarni nazorat qiladi va sovuq ma'lumotlarga pul sarflamaydi:

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

Noyob xususiyatlar ClickHouse

Deyarli hamma narsada ClickHouse Bunday "ta'kidlash" bor, lekin ular eksklyuzivlik bilan qoplanadi - boshqa ma'lumotlar bazalarida bo'lmagan narsa. Misol uchun, bu erda bir nechta noyob xususiyatlar mavjud ClickHouse:

  • Arrays. The ClickHouse massivlarni juda yaxshi qo'llab-quvvatlash, shuningdek ular bo'yicha murakkab hisob-kitoblarni amalga oshirish qobiliyati.
  • Ma'lumotlar tuzilmalarini yig'ish. Bu "qotil xususiyatlardan" biri ClickHouse. Yandeksning yigitlari biz ma'lumotlarni jamlashni xohlamasligimizni aytishlariga qaramay, hamma narsa jamlangan. ClickHouse, chunki u tez va qulay.
  • Materiallashtirilgan ko'rinishlar. Ma'lumotlar tuzilmalarini yig'ish bilan birga, moddiylashtirilgan ko'rinishlar sizga qulaylik yaratishga imkon beradi haqiqiy vaqt yig'ish.
  • ClickHouse SQL. Bu til kengaytmasi SQL faqat mavjud bo'lgan ba'zi qo'shimcha va eksklyuziv xususiyatlar bilan ClickHouse. Ilgari, bu bir tomondan kengayish, boshqa tomondan esa noqulaylik kabi edi. Endi deyarli barcha kamchiliklar bilan solishtirganda SQL 92 biz uni olib tashladik, endi bu faqat kengaytma.
  • Lambda- ifodalar. Ular hali ham biron bir ma'lumotlar bazasidami?
  • ML- qo'llab-quvvatlash. Bu turli ma'lumotlar bazalarida mavjud, ba'zilari yaxshiroq, ba'zilari esa yomonroq.
  • ochiq manba. Biz kengaytira olamiz ClickHouse birga. Endi kir ClickHouse 500 ga yaqin hissa qo'shgan va bu raqam doimiy ravishda o'sib bormoqda.

Qiyin so'rovlar

В ClickHouse bir xil narsani qilishning turli xil usullari mavjud. Masalan, jadvaldagi oxirgi qiymatni uch xil usulda qaytarishingiz mumkin Markaziy protsessor (to'rtinchisi ham bor, lekin u yanada ekzotik).

Birinchisi, kirish qanchalik qulayligini ko'rsatadi ClickHouse tekshirmoqchi bo'lganingizda so'rovlar panjara pastki so'rovda mavjud. Bu boshqa ma'lumotlar bazalarida men shaxsan o'tkazib yuborgan narsadir. Agar biror narsani pastki so'rov bilan solishtirmoqchi bo'lsam, boshqa ma'lumotlar bazalarida u bilan faqat skaler solishtirish mumkin, lekin bir nechta ustunlar uchun yozishim kerak. JOIN. The ClickHouse tuple dan foydalanishingiz mumkin:

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

Ikkinchi usul xuddi shu ishni bajaradi, lekin agregat funktsiyasidan foydalanadi argMaks:

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

В ClickHouse bir necha o'nlab agregat funktsiyalar mavjud va agar siz kombinatorlardan foydalansangiz, kombinatorika qonunlariga ko'ra siz ulardan mingga yaqinini olasiz. ArgMax - maksimal qiymatni hisoblaydigan funktsiyalardan biri: so'rov qiymatni qaytaradi use_user, bunda maksimal qiymatga erishiladi yaratilgan_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 QO'SHILING - har xil vaqtga ega qatorlarni "yopishtirish". Bu faqat mavjud bo'lgan ma'lumotlar bazalari uchun noyob xususiyatdir kdb+. Vaqtlari har xil bo'lgan ikkita vaqt seriyasi bo'lsa, ASOF QO'SHILING ularni bitta so'rovda ko'chirish va birlashtirish imkonini beradi. Bitta vaqt qatoridagi har bir qiymat uchun boshqasidagi eng yaqin qiymat topiladi va ular bir xil satrda qaytariladi:

ClickHouse-ga o'tish: 3 yildan keyin

Analitik funktsiyalar

Standartda SQL-2003 siz shunday yozishingiz mumkin:

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 Siz buni qilolmaysiz - bu standartni qo'llab-quvvatlamaydi SQL-2003 va, ehtimol, buni hech qachon qilmaydi. Buning o'rniga, ichida ClickHouse Bunday yozish odatiy holdir:

ClickHouse-ga o'tish: 3 yildan keyin

Men lambdalarga va'da berdim - ular mana!

Bu standartdagi analitik so'rovning analogidir SQL-2003: u ikkalasi orasidagi farqni hisoblaydi vaqt tamg'asi, muddat, tartib raqami - biz odatda analitik funktsiyalarni ko'rib chiqadigan hamma narsa. IN ClickHouse Biz ularni massivlar orqali hisoblaymiz: avval biz ma'lumotlarni massivga yig'amiz, shundan so'ng biz massivda xohlagan hamma narsani qilamiz va keyin uni yana kengaytiramiz. Bu juda qulay emas, u kamida funktsional dasturlashni yaxshi ko'rishni talab qiladi, lekin u juda moslashuvchan.

Maxsus xususiyatlar

Bundan tashqari, ichida ClickHouse ko'plab maxsus funktsiyalar. Masalan, bir vaqtning o'zida nechta seans o'tkazilayotganini qanday aniqlash mumkin? Oddiy monitoring vazifasi bitta so'rov bilan maksimal yukni aniqlashdir. IN ClickHouse Buning uchun maxsus funktsiya mavjud:

ClickHouse-ga o'tish: 3 yildan keyin

Umuman olganda, ClickHouse ko'p maqsadlar uchun maxsus funktsiyalarga ega:

  • runDifference, runningAccumulation, qo‘shni;
  • sumMap(kalit, qiymat);
  • timeSeriesGroupSum(uid, vaqt tamg'asi, qiymat);
  • timeSeriesGroupRateSum(uid, vaqt tamg'asi, qiymat);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • TO'LDIRGAN / BO'LGANLAR BILAN;
  • simpleLinearRegression, stoxastikLinearRegression.

Bu funktsiyalarning to'liq ro'yxati emas, jami 500-600 ta. Maslahat: barcha funktsiyalar ichida ClickHouse tizim jadvalida (barchasi hujjatlashtirilmagan, lekin hammasi qiziq):

select * from system.functions order by name

ClickHouse o'zi haqida juda ko'p ma'lumotlarni saqlaydi, shu jumladan jurnal jadvallari, query_log, kuzatuv jurnali, ma'lumotlar bloklari bilan operatsiyalar jurnali (part_log), ko'rsatkichlar jurnali va tizim jurnali, u odatda diskka yozadi. Jurnal ko'rsatkichlari vaqt seriyasi в ClickHouse Aslini olib qaraganda ClickHouse: Ma'lumotlar bazasining o'zi rol o'ynashi mumkin vaqt seriyasi ma'lumotlar bazalari, shuning uchun o'zini "yutib yuboradi".

ClickHouse-ga o'tish: 3 yildan keyin

Bu ham noyob narsa - chunki biz yaxshi ish qilamiz vaqt seriyasi, nega biz kerak bo'lgan hamma narsani o'zimizda saqlay olmaymiz? Bizga kerak emas Prometheus, biz hamma narsani o'zimizga saqlaymiz. Ulangan grafana va biz o'zimizni kuzatib boramiz. Biroq, agar ClickHouse tushadi, biz nima uchun buni ko'rmaymiz, shuning uchun ular odatda buni qilmaydi.

Katta klaster yoki ko'plab kichiklar ClickHouse

Qaysi biri yaxshiroq - bitta katta klastermi yoki ko'plab kichik ClickHousesmi? An'anaviy yondashuv DWH har bir dastur uchun sxemalar ajratilgan katta klasterdir. Biz ma'lumotlar bazasi ma'muriga keldik - bizga diagramma bering va ular bizga bittasini berishdi:

ClickHouse-ga o'tish: 3 yildan keyin

В ClickHouse siz buni boshqacha qilishingiz mumkin. Har bir dasturni o'zingiz qilishingiz mumkin ClickHouse:

ClickHouse-ga o'tish: 3 yildan keyin

Bizga endi katta dahshatlisi kerak emas DWH va qiyin administratorlar. Biz har bir dasturning o'ziga xosligini berishimiz mumkin ClickHouse, va ishlab chiquvchi buni o'zi qila oladi, chunki ClickHouse o'rnatish juda oson va murakkab boshqaruvni talab qilmaydi:

ClickHouse-ga o'tish: 3 yildan keyin

Ammo bizda juda ko'p bo'lsa ClickHouse, va siz uni tez-tez o'rnatishingiz kerak, keyin bu jarayonni avtomatlashtirishni xohlaysiz. Buning uchun biz, masalan, foydalanishimiz mumkin Kubernetes и klik uyi-operator. IN Kubernetes ClickHouse uni "klik" bilan qo'yishingiz mumkin: men tugmani bosishim mumkin, manifestni ishga tushiraman va ma'lumotlar bazasi tayyor. Men darhol diagramma yarata olaman, u erda ko'rsatkichlarni yuklashni boshlayman va 5 daqiqada menda asboblar paneli tayyor grafana. Bu juda oddiy!

Nima oxir-oqibat?

Va shunday qilib, ClickHouse - Bu:

  • Tezda. Buni hamma biladi.
  • faqat. Bir oz munozarali, lekin menimcha, bu mashg'ulotda qiyin, jangda oson. Agar tushunsangiz, qanday qilib ClickHouse u ishlaydi, keyin hamma narsa juda oddiy.
  • Umumjahon. Turli stsenariylar uchun javob beradi: DWH, vaqt seriyasi, jurnalni saqlash. Lekin unday emas OLTP ma'lumotlar bazasi, shuning uchun u erda qisqa qo'shimchalar va o'qishlar qilishga urinmang.
  • Qiziqarli. Ehtimol, u bilan ishlaydigan kishi ClickHouse, yaxshi va yomon ma'noda ko'plab qiziqarli daqiqalarni boshdan kechirgan. Misol uchun, yangi nashr chiqdi, hamma narsa ishlashni to'xtatdi. Yoki ikki kun davomida biror vazifa bilan qiynalganingizda, lekin Telegram chatida savol berganingizdan so‘ng, vazifa ikki daqiqada hal bo‘ldi. Yoki Lesha Milovidovning ma'ruzasidagi konferentsiyadagi kabi, skrinshot ClickHouse translyatsiyani buzdi Yuqori yuk ++. Bunday holatlar har doim sodir bo'ladi va hayotimizni qiyinlashtiradi. ClickHouse yorqin va qiziqarli!

Taqdimotni tomosha qilishingiz mumkin shu yerda.

ClickHouse-ga o'tish: 3 yildan keyin

Yuqori yuklangan tizimlarni ishlab chiquvchilarning uzoq kutilgan uchrashuvi Yuqori yuk ++ 9 va 10 noyabr kunlari Skolkovoda bo'lib o'tadi. Nihoyat, bu oflayn konferentsiya bo'ladi (garchi barcha ehtiyot choralari mavjud bo'lsa ham), chunki HighLoad++ energiyasini onlayn tarzda paketlab bo'lmaydi.

Konferensiya uchun biz sizga texnologiyaning maksimal imkoniyatlariga oid keyslarni topamiz va ko‘rsatamiz: HighLoad++ Facebook, Yandex, VKontakte, Google va Amazon qanday ishlashini ikki kun ichida bilib olishingiz mumkin bo‘lgan yagona joy edi, hozir va shunday bo‘ladi.

2007 yildan buyon uzluksiz yig'ilishlarimizni o'tkazib kelayotgan bo'lsak, bu yil 14-marta uchrashamiz. Shu vaqt ichida konferentsiya 10 barobar ko'paydi; o'tgan yili asosiy sanoat tadbiri 3339 ishtirokchini, 165 ma'ruzachini, hisobot va uchrashuvlarni birlashtirdi va bir vaqtning o'zida 16 trek ishladi.
O‘tgan yili 20 ta avtobus, 5280 litr choy va kofe, 1650 litr mevali ichimliklar va 10200 shisha suv qatnovi amalga oshirildi. Va yana 2640 kilogramm ovqat, 16 ta tovoq va 000 stakan. Aytgancha, qayta ishlangan qog'ozdan yig'ilgan pulga biz 25 ta eman ko'chatlarini ekdik :)

Siz chiptalarni sotib olishingiz mumkin shu yerda, konferentsiya haqida yangiliklar oling - shu yerda, va barcha ijtimoiy tarmoqlarda gaplashing: Telegram, Facebook, Vkontakte и Twitter.

Manba: www.habr.com

a Izoh qo'shish