Гузариш ба ClickHouse: 3 сол пас

Се сол пеш Виктор Тарнавский ва Алексей Миловидов аз Яндекс дар саҳна HighLoad++ гуфт, то чӣ андоза хуб ClickHouse аст, ва чӣ тавр он суст намешавад. Ва дар марҳилаи оянда буд Александр Зайцев с гузориш дар бораи гузаштан ба кликхона аз дигар МДМ аналитики ва бо хулосае, ки кликхона, албатта, хуб, вале хеле қулай нест. Вақте ки дар соли 2016 ширкат Ҳаёти кӯча, ки Искандар он вакт кор мекард, системаи аналитикии бисьёрпетабайтиро ба кликхона, он «рохи хишти зард»-и ҷолиби пур аз хатарҳои номаълум буд - кликхона дар он вакт ба майдони мина монанд менамуд.

Се сол баъд кликхона хеле беҳтар шуд - дар ин муддат Александр ширкати Altinity-ро таъсис дод, ки на танҳо ба одамон кӯчидан кӯмак мекунад кликхона даҳҳо лоиҳаҳо, балки худи маҳсулотро дар якҷоягӣ бо ҳамкорони Яндекс такмил медиҳад. Ҳозир кликхона хануз як сайру гашти бепарво нест, вале миназор нест.

Александр аз соли 2003 инҷониб бо системаҳои тақсимшуда кор карда, лоиҳаҳои калонро таҳия мекунад MySQL, Oracle и Вертика. Дар охир HighLoad++ 2019 Александр, яке аз пешравони истифода кликхона, гуфт, ки ин DBMS ҳоло чӣ аст. Мо дар бораи хусусиятҳои асосии он меомӯзем кликхона: чи тавр он аз дигар системахо фарк мекунад ва дар кадом маврид истифода бурдани он самараноктар аст. Бо истифода аз мисолҳо, мо ба амалияҳои охирин ва дар лоиҳа санҷидашуда барои сохтани системаҳо дар асоси он назар хоҳем кард кликхона.


Ретроспектив: он чи 3 сол пеш рух дода буд

Се сол пеш аз ин мо ширкатро дигар кардем Ҳаёти кӯча ба кликхона аз дигар махзани таҳлилӣ ва муҳоҷирати таҳлили шабакаи таблиғот чунин менамуд:

  • Июни соли 2016. Дар Манбаи кушод зоҳир шуд кликхона ва лоиҳаи мо оғоз ёфт;
  • август. Исботи консепсия: шабакаи бузурги таблиғотӣ, инфрасохтор ва 200-300 терабайт маълумот;
  • октябр. Маълумоти аввалини истеҳсолот;
  • декабр. Сарбории пурраи маҳсулот дар як рӯз 10-50 миллиард ҳодисаро ташкил медиҳад.
  • Июни 2017. Муҳоҷирати бомуваффақияти корбарон ба кликхона, 2,5 петабайт маълумот дар кластери 60 сервер.

Дар рафти муњољират дарки вуљуд дошт, ки кликхона системаи хубест, ки бо он кор кардан гуворо аст, аммо ин лоиҳаи дохилии Яндекс аст. Аз ин рӯ, нозукиҳо вуҷуд доранд: Яндекс аввал бо муштариёни дохилии худ ва танҳо баъд бо ҷомеа ва ниёзҳои корбарони беруна сару кор хоҳад кард ва ClickHouse пас аз он дар бисёр соҳаҳои функсионалӣ ба сатҳи корхона нарасид. Аз ин рӯ, мо Altinity-ро дар моҳи марти соли 2017 таъсис додем кликхона ҳатто тезтар ва қулайтар на танҳо барои Яндекс, балки барои корбарони дигар. Ва ҳоло мо:

  • Мо таълим медиҳем ва ба сохтани қарорҳо дар асоси кликхона то ки муштариён ба мушкилот дучор нашаванд ва ҳалли ниҳоят кор кунад;
  • Мо дастгирии 24/7 таъмин мекунем кликхона- установкахо;
  • Мо лоиҳаҳои экосистемаи худро таҳия мекунем;
  • Мо ба худ фаъ-олона ухдадор мешавем кликхона, посух додан ба дархостҳои корбароне, ки мехоҳанд хусусиятҳои муайянро бубинанд.

Ва албатта, мо дар ҳаракат ба он кӯмак мекунем кликхона с MySQL, Вертика, Oracle, сабз, Redshift ва дигар системаҳо. Мо дар ҳаракатҳои гуногун ширкат доштем ва ҳамаи онҳо муваффақ шуданд.

Гузариш ба ClickHouse: 3 сол пас

Чаро ба кликхона

Суръатро суст намекунад! Сабаби асосй хамин аст. кликхона - базаи хеле зуд барои сенарияҳои гуногун:

Гузариш ба ClickHouse: 3 сол пас

Иқтибосҳои тасодуфӣ аз одамоне, ки муддати тӯлонӣ бо одамон кор мекунанд кликхона.

Миқёспазирӣ. Дар баъзе махзани дигар шумо метавонед дар як порчаи сахтафзор кори хуб ба даст оред, аммо кликхона шумо метавонед на танҳо амудӣ, балки ба таври уфуқӣ, танҳо тавассути илова кардани серверҳо миқёс кунед. Ҳама чиз на он қадар ҳамвор кор мекунад, ки мо мехоҳем, аммо он кор мекунад. Шумо метавонед системаро бо афзоиши тиҷорати шумо васеъ кунед. Муҳим аст, ки мо ҳоло бо роҳи ҳалли масъала маҳдуд набошем ва барои рушд ҳамеша потенсиали вуҷуд дорад.

Интиқолпазирӣ. Ба як чиз вобастагӣ надорад. Масалан, бо Amazon RedShift Ба ҷое ҳаракат кардан душвор аст. А кликхона шумо метавонед онро дар ноутбук, сервери худ насб кунед, онро дар абр ҷойгир кунед, равед Кубернитель — дар кори инфраструктура ягон махдудият мавчуд нест. Ин барои ҳама қулай аст ва ин бартарии бузургест, ки бисёр дигар базаҳои шабеҳ бо он фахр карда наметавонанд.

Интихоби. кликхона дар як чиз намеистад, масалан, Yandex.Metrica, балки дар лоиҳаҳо ва соҳаҳои гуногун инкишоф меёбад ва истифода мешавад. Онро тавассути илова кардани қобилиятҳои нав барои ҳалли мушкилоти нав васеъ кардан мумкин аст. Масалан, чунин мешуморанд, ки нигоҳ доштани гузоришҳо дар пойгоҳи додаҳо одоби бад аст, аз ин рӯ онҳо ба миён омаданд Ҷустуҷӯи Elastics. Аммо ба шарофати чандирӣ кликхона, шумо инчунин метавонед дар он гузоришҳоро нигоҳ доред ва аксар вақт ин аз он беҳтар аст Ҷустуҷӯи Elastics - дар кликхона ин 10 баробар кам оханро талаб мекунад.

озод Манбаи кушода. Шумо набояд барои чизе пардохт кунед. Барои насб кардани система дар ноутбук ё сервери шумо иҷозати гуфтушунид кардан лозим нест. Ҳеҷ гуна пардохтҳои пинҳонӣ. Дар айни замон, ягон технологияи дигари махзани кушодаасос бо суръат рақобат карда наметавонад кликхона. MySQL, MariaDB, Greenplum — хамаи онхо хеле сусттаранд.

Ҷамъият, ронандагӣ ва шавковар. Дар кликхона ҷомеаи олӣ: вохӯриҳо, сӯҳбатҳо ва Алексей Миловидов, ки ҳамаи моро бо энергия ва хушбинии худ пур мекунад.

Гузариш ба ClickHouse

Рафтан ба кликхона бо баъзе сабабҳо ба шумо танҳо се чиз лозим аст:

  • Маҳдудиятҳоро фаҳмед кликхона ва он барои чӣ мувофиқ нест.
  • Бартарӣ гиред технология ва бузургтарин қувваҳои он.
  • Таҷриба. Ҳатто фаҳмидани он ки чӣ тавр кор мекунад кликхона, на хама вакт пешгуй кардан мумкин аст, ки он кай тезтар мешавад, кай сусттар мешавад, кай бехтар мешавад ва кай бадтар мешавад. Пас кӯшиш кунед.

Мушкилоти ҳаракат

Танҳо як "аммо" вуҷуд дорад: агар шумо ба он ҳаракат кунед кликхона аз чизи дигар, пас одатан чизе нодуруст меравад. Мо ба баъзе таҷрибаҳо ва чизҳое, ки дар базаи дӯстдоштаи мо кор мекунанд, одат кардаем. Масалан, касе, ки бо он кор мекунад SQПойгоҳи додаҳои L маҷмӯи вазифаҳои зеринро ҳатмӣ мешуморанд:

  • муомилот;
  • маҳдудиятҳо;
  • мувофиқат;
  • индексҳо;
  • НАВОРӢ/НОЗӢ;
  • NULLs;
  • миллисонияҳо;
  • чархҳои навъи автоматӣ;
  • пайвастагиҳои сершумор;
  • тақсимоти худсарона;
  • воситаҳои идоракунии кластер.

Ҷалбкунӣ ҳатмист, аммо се сол пеш дар кликхона Ҳеҷ яке аз ин функсияҳо дастрас набуданд! Ҳоло камтар аз нисфи он чизе, ки иҷро нашудааст, боқӣ мемонад: транзаксияҳо, маҳдудиятҳо, Пайвастагӣ, миллисонияҳо ва навъи кастинг.

Ва чизи асосӣ ин аст, ки дар кликхона баъзе таҷрибаҳо ва равишҳои стандартӣ кор намекунанд ё ба таври дигар кор мекунанд, ки мо одат кардаем. Ҳар чизе ки дар он пайдо мешавад кликхона, мувофиқат мекунад "Роҳи ClickHouse", яъне. функсияҳо аз дигар пойгоҳи додаҳо фарқ мекунанд. Барои намуна:

  • Индексҳо интихоб карда намешаванд, вале гузаронида мешаванд.
  • НАВОРӢ/НОЗӢ на синхронӣ, балки асинхронӣ.
  • Якчанд пайвастагӣ вуҷуд дорад, аммо банақшагирии дархост вуҷуд надорад. Чӣ тавр онҳо пас аз он иҷро карда мешаванд, умуман барои одамони ҷаҳони пойгоҳи додаҳо чандон равшан нест.

Скриптҳои ClickHouse

Соли 1960 математики амрикоии венгерӣ Wigner EP мақола навишт"Самаранокии беасоси математика дар илмҳои табиатшиносӣ» («Самаранокии нофаҳмо будани математика дар илмҳои табиатшиносӣ»), ки ҷаҳони гирду атрофи мо бо баъзе сабабҳо бо қонунҳои математикӣ хуб тавсиф шудааст. Математика як илми абстрактист ва қонунҳои физикӣ, ки дар шакли математикӣ ифода шудаанд, ночиз нестанд ва Wigner EP таъкид кард, ки ин хеле ачиб аст.

Аз нигоҳи ман, кликхона — ҳамон ғарибӣ. Барои ифодаи Вигнер, мо метавонем инро бигӯем: самаранокии беақл ҳайратовар аст кликхона дар доираи васеи барномаҳои таҳлилӣ!

Гузариш ба ClickHouse: 3 сол пас

Масалан, гирем Анбори маълумот дар вақти воқеӣ, ки ба он маълумот қариб пайваста бор карда мешавад. Мо мехоҳем дархостҳоро аз он бо таъхири дуюм қабул кунем. Лутфан - онро истифода баред кликхона, зеро ин сенарияи он тарҳрезӣ шудааст. кликхона Маҳз ҳамин тавр он на танҳо дар веб, балки дар маркетинг ва таҳлили молиявӣ низ истифода мешавад, AdTecч, инчунин дар Ошкор кардани қаллобӣн. ДАР Анбори маълумот дар вақти воқеӣ як схемаи мураккаби сохторӣ ба монанди "ситора" ё "барфреза" истифода мешавад, ҷадвалҳои зиёде бо ҶОЙҲО (баъзан якчанд) ва маълумот одатан дар баъзе системаҳо нигоҳ дошта мешавад ва иваз карда мешавад.

Биёед як сенарияи дигарро гирем - Силсилаи вақт: мониторинги дастгоҳҳо, шабакаҳо, омори истифода, Интернети чизҳо. Дар ин ҷо мо бо рӯйдодҳои хеле оддӣ дучор мешавем, ки сари вақт фармоиш дода шудаанд. кликхона дар ибтидо барои ин таҳия нашуда буд, балки худро барои хуб кор кардан нишон дод, ки чаро ширкатҳои бузург истифода мебаранд кликхона ҳамчун анбори иттилооти мониторинг. Барои фаҳмидани он ки оё он мувофиқ аст кликхона барои силсилаи вақт, мо дар асоси равиш ва натиҷаҳо нишондод кардем InfluxDB и TimescaleDB - махсусгардонидашуда силсилаи вақт базахои маълумотхо. Маълум шуд, ки кликхона, ҳатто бе оптимизатсия барои чунин вазифаҳо, дар майдони хориҷӣ ғолиб меояд:

Гузариш ба ClickHouse: 3 сол пас

В силсилаи вақт Одатан ҷадвали танг истифода мешавад - якчанд сутунҳои хурд. Бисёр маълумот метавонад аз мониторинг ба даст ояд - миллионҳо сабт дар як сония - ва онҳо одатан бо таркишҳои хурд меоянд (вақти ҳақиқӣ ҷараён). Аз ин рӯ, скрипти дигари воридкунӣ лозим аст ва худи дархостҳо хусусиятҳои худро доранд.

Идоракунӣ Log. Ҷамъоварии гузоришҳо дар пойгоҳи додаҳо одатан бад аст, аммо кликхона ин метавонад бо баъзе шарҳҳое, ки дар боло тавсиф шудааст, анҷом дода шавад. Бисёр ширкатҳо истифода мебаранд кликхона махз барои хамин максад. Дар ин ҳолат, мо мизи васеъи ҳамворро истифода мебарем, ки дар он тамоми гузоришҳо нигоҳ дошта мешаванд (масалан, дар шакли JSON), ё ба қисмҳо бурида. Маълумот одатан дар қисмҳои калон (файлҳо) бор карда мешавад ва мо аз рӯи ягон майдон ҷустуҷӯ мекунем.

Барои ҳар яке аз ин функсияҳо, маъмулан пойгоҳи додаҳои махсус истифода мешаванд. кликхона кас хамаи инро ва чунон хуб карда метавонад, ки вай аз онхо бартарй медихад. Биёед ҳоло бодиққат назар кунем силсилаи вақт сенария, ва чӣ гуна "пухтан" дуруст кликхона барои ин сенария.

Силсилаи вақт

Дар айни замон ин сенарияи асосии он аст кликхона ҳалли стандартиро баррасӣ карданд. Силсилаи вақт маҷмӯи рӯйдодҳоест, ки бо вақт тартиб дода шудаанд, ки тағиротро дар баъзе равандҳо бо мурури замон ифода мекунанд. Масалан, ин метавонад суръати дил дар як рӯз ё шумораи равандҳо дар система бошад. Ҳар чизе, ки вақтро бо баъзе андозаҳо медиҳад силсилаи вақт:

Гузариш ба ClickHouse: 3 сол пас

Аксарияти ин намуди рӯйдодҳо аз мониторинг бармеоянд. Ин метавонад на танҳо мониторинги веб, балки дастгоҳҳои воқеӣ бошад: мошинҳо, системаҳои саноатӣ, IoT, заводхо ва ё таксихои бесарнишин, ки Яндекс аллакай дар бордони онхо гузошта истодааст кликхона-сервер.

Масалан, ширкатҳое ҳастанд, ки маълумотро аз киштиҳо ҷамъ мекунанд. Ҳар чанд сония сенсорҳо дар киштии контейнерӣ садҳо ченакҳои гуногунро мефиристанд. Муҳандисон онҳоро меомӯзанд, моделҳо месозанд ва кӯшиш мекунанд фаҳманд, ки киштӣ то чӣ андоза самаранок истифода мешавад, зеро киштии контейнерӣ набояд як сония ҳам бекор истад. Ҳар як вақти бекорӣ талафоти пул аст, аз ин рӯ пешгӯии масир муҳим аст, то таваққуф кам бошад.

Имрӯзҳо афзоиши базаҳои махсусгардонидашуда, ки чен мекунанд силсилаи вақт. Дар сайт DB-муҳаррикҳо Пойгоҳҳои гуногун ба таври муайян гурӯҳбандӣ шудаанд ва шумо метавонед онҳоро аз рӯи намуд дидан кунед:

Гузариш ба ClickHouse: 3 сол пас

Навъи босуръат афзоишёбанда аст силсилаи вақтс. Пойгоҳҳои графикӣ низ афзоиш меёбанд, аммо силсилаи вақтs дар давоми чанд соли охир тезтар меафзояд. Намояндагони маъмулии ин оилаи пойгоҳи додаҳо мебошанд InfluxDB, Prometheus, КДБ, TimescaleDB (сохт PostgreSQL), ҳалли аз Amazon. кликхона дар ин чо низ истифода бурдан мумкин аст ва истифода мешавад. Ичозат дихед ба шумо чанд мисоли оммавй дихам.

Яке аз пешкадамон ин корхона мебошад CloudFlare (CDN-таъминкунанда). Онҳо назорат мекунанд CDN через кликхона (DNS- дархостҳо, HTTP-пурсишҳо) бо бори бузург - 6 миллион ҳодиса дар як сония. Ҳама чиз мегузарад Кафка, меравад кликхона, ки қобилияти дидани панелҳои рӯйдодҳоро дар система дар вақти воқеӣ таъмин мекунад.

Comcast - яке аз пешвоёни телекоммуникатсия дар ИМА: Интернет, телевизиони рақамӣ, телефония. Онҳо системаи якхелаи назоратро ба вуҷуд оварданд CDN дар доираи Манбаи кушода лоиҳа Назорати трафики Apache ки бо маълумоти бузурги шумо кор кунед. кликхона ҳамчун пуштибонии таҳлил истифода мешавад.

Перкона сохта шудааст кликхона даруни шумо ПММбарои нигоҳ доштани мониторинги гуногун MySQL.

Талаботи мушаххас

Пойгоҳҳои силсилаи вақтҳо талаботи махсуси худро доранд.

  • Ҷойгиркунии зуд аз бисёр агентҳо. Мо бояд маълумотро аз бисёр ҷараёнҳо хеле зуд ворид кунем. кликхона Он ин корро хуб мекунад, зеро ҳамаи замимаҳои он баста намешаванд. Ягон гузоред файли нав дар диск аст ва замимаҳои хурдро бо ин ё он роҳ буферӣ кардан мумкин аст. ДАР кликхона Беҳтар аст, ки маълумотро ба қисмҳои калон ворид кунед, на як сатр дар як вақт.
  • Нақшаи чандир. Дар силсилаи вақт мо одатан сохтори маълумотро пурра намедонем. Барои як барномаи мушаххас системаи мониторинг сохтан мумкин аст, аммо пас аз он барои барномаи дигар истифода бурдан душвор аст. Ин схемаи бештар фасењро талаб мекунад. кликхона, ба шумо имкон медиҳад, ки ин корро кунед, гарчанде ки он базаи сахт чопшуда аст.
  • Нигоҳдории муассир ва фаромӯш кардани маълумот. Одатан дар силсилаи вақт миқдори зиёди маълумот, бинобар ин он бояд то ҳадди имкон самаранок нигоҳ дошта шавад. Масалан, дар InfluxDB фишурдани хуб хусусияти асосии он аст. Аммо ба ғайр аз нигоҳдорӣ, шумо инчунин бояд маълумоти кӯҳнаро "фаромӯш кунед" ва ягон намуди корҳоро анҷом диҳед паст кардани намуна — ба таври автоматй хисоб кардани агрегатхо.
  • Дархостҳои фаврӣ дар бораи маълумоти ҷамъшуда. Баъзан дидани 5 дақиқаи охир бо дақиқии миллисонияҳо ҷолиб аст, аммо дар дақиқаи маълумотҳои моҳона ё миқдори дуюм шояд лозим набошад - омори умумӣ кофӣ аст. Дастгирии ин гуна зарур аст, вагарна дархост барои 3 моҳ ҳатто вақти хеле тӯлонӣ мегирад кликхона.
  • Дархостҳо ба монанди "нуқтаи охирин, аз». Инҳо барои силсилаи вақт пурсишҳо: ба андозагирии охирин ё ҳолати система дар як лаҳза нигаред t. Ин дархостҳо барои пойгоҳи додаҳо чандон гуворо нестанд, аммо шумо инчунин бояд онҳоро иҷро карда тавонед.
  • Силсилаи вақтҳои "Черкашӣ". Силсилаи вақт силсилаи вақт аст. Агар ду силсилаи вақт вуҷуд дошта бошанд, аксар вақт онҳо бояд пайваст ва мутақобила шаванд. Ин корро дар ҳама пойгоҳи додаҳо қулай нест, алахусус бо силсилаи вақтҳои ҳамоҳангнашуда: дар ин ҷо баъзе нуқтаҳои вақт ҳастанд, дигарон ҳастанд. Шумо метавонед ҳисоби миёнаро ҳисоб кунед, аммо ногаҳон дар он ҷо сӯрох пайдо мешавад, бинобар ин равшан нест.

Биёед бубинем, ки ин талабот дар чӣ гуна иҷро карда мешаванд кликхона.

Нақшаи

В кликхона схема барои силсилаи вақт вобаста ба дарачаи мунтазам будани маълумотхо бо роххои гуногун анчом дода мешавад. Вақте ки мо ҳама нишондиҳандаҳоро пешакӣ медонем, системаро аз рӯи маълумоти муқаррарӣ сохтан мумкин аст. Масалан, ман ин корро кардам CloudFlare бо мониторинг CDN системаи хуб оптимизатсияшуда аст. Шумо метавонед як системаи умумие бунёд кунед, ки тамоми инфрасохтор ва хидматҳои гуногунро назорат мекунад. Дар мавриди маълумоти номунтазам, мо пешакӣ намедонем, ки мо чӣ назорат мекунем - ва ин эҳтимолан маъмултарин ҳолат аст.

Маълумоти муқаррарӣ. Сутунҳо. Нақша оддӣ аст - сутунҳо бо намудҳои зарурӣ:

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

Ин ҷадвали муқаррарӣ аст, ки як навъ фаъолияти боркунии системаро назорат мекунад (истифода, система, бекор, хуб). Содда ва қулай, вале чандир нест. Агар мо нақшаи чандиртарро хоҳем, пас мо метавонем массивҳоро истифода барем.

Маълумоти номунтазам. Массивҳо:

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

сохтори Лона ду массив мебошанд: metrics.name и метрика.арзиш. Дар ин ҷо шумо метавонед чунин маълумоти мониторинги худсаронаро ҳамчун массиви номҳо ва массиви андозагирӣ барои ҳар як ҳодиса нигоҳ доред. Барои оптимизатсияи минбаъда, ба ҷои як чунин сохтор, шумо метавонед якчанд созед. Масалан, яке барои данд-арзиш, дигаре - барои Int-маънои зеро Int Ман мехоҳам, ки самараноктар захира кунам.

Аммо дастрасӣ ба чунин сохтор душвортар аст. Шумо бояд як сохтори махсусро истифода баред, ки бо истифода аз функсияҳои махсус арзишҳои аввал индекс ва сипас массивро берун кунед:

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

Аммо он ҳанӯз ҳам хеле зуд кор мекунад. Роҳи дигари нигоҳ доштани маълумоти номунтазам аз рӯи сатр аст.

Маълумоти номунтазам. Сатрҳо. Дар ин усули анъанавӣ, бе массивҳо, номҳо ва арзишҳо ҳамзамон нигоҳ дошта мешаванд. Агар 5 андозагирӣ якбора аз як дастгоҳ гирифта шавад, дар базаи маълумот 000 сатр тавлид мешавад:

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

кликхона бо ин мубориза мебарад - он дорои васеъшавии махсус мебошад кликхона SQL. Масалан, maxIf — функсияи махсус, ки ҳадди аксарро аз рӯи метрика ҳангоми иҷро шудани ягон шарт ҳисоб мекунад. Шумо метавонед якчанд чунин ифодаҳоро дар як дархост нависед ва дарҳол арзиши чанд метрикаро ҳисоб кунед.

Биёед се равишро муқоиса кунем:

Гузариш ба ClickHouse: 3 сол пас

тафсилоти

Дар ин ҷо ман барои баъзе маҷмӯи маълумоти санҷишӣ "Андозаи маълумотҳои диск" -ро илова кардам. Дар мавриди сутунҳо, мо хурдтарин андозаи маълумот дорем: фишурдани ҳадди аксар, суръати максималии дархост, аммо мо бо роҳи сабт кардани ҳама чизро якбора пардохт мекунем.

Дар мавриди массивҳо, ҳама чиз каме бадтар аст. Маълумот ҳоло ҳам хуб фишурда шудааст ва намунаи номунтазамро нигоҳ доштан мумкин аст. Аммо кликхона - пойгоҳи додаҳои сутунӣ ва вақте ки мо ҳама чизро дар массив нигоҳ медорем, он ба як қатор табдил меёбад ва мо барои чандирӣ бо самаранокӣ пардохт мекунем. Барои ҳама гуна амалиёт, шумо бояд тамоми массивро дар хотира хонед, пас дар он элементи дилхоҳро пайдо кунед - ва агар массив афзоиш ёбад, суръат паст мешавад.

Дар яке аз ширкатҳое, ки ин усулро истифода мебаранд (масалан, Uber), массивҳо ба қисмҳои 128 элемент бурида мешаванд. Маълумот аз якчанд ҳазор метрика бо ҳаҷми 200 ТБ маълумот/рӯз на дар як массив, балки дар 10 ё 30 массив бо мантиқи махсуси нигоҳдорӣ нигоҳ дошта мешавад.

Усули соддатарин бо сатрҳо мебошад. Аммо маълумот суст фишурда шудааст, андозаи ҷадвал калон аст ва ҳатто вақте ки дархостҳо ба якчанд ченакҳо асос ёфтаанд, ClickHouse ба таври оптималӣ кор намекунад.

Схемаи гибридӣ

Фарз мекунем, ки мо схемаи массивро интихоб кардем. Аммо агар мо донем, ки аксари панелҳои мо танҳо ченакҳои корбар ва системаро нишон медиҳанд, мо метавонем ин нишондиҳандаҳоро ба таври илова ба сутунҳо аз массив дар сатҳи ҷадвал бо ин роҳ амалӣ созем:

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

Ҳангоми ворид кардан кликхона онҳоро ба таври худкор ҳисоб мекунад. Бо ин роҳ шумо метавонед тиҷоратро бо хушнудӣ муттаҳид кунед: нақша чандир ва умумӣ аст, аммо мо сутунҳои бештар истифодашавандаро кашида гирифтем. Дар хотир доред, ки ин тағир додани варақаро талаб намекунад ETLки ба ҷадвал дохил кардани массивҳоро идома медиҳад. Мо танҳо кардем САВОЛҲО, якчанд баландгӯякҳоро илова кард ва мо як схемаи гибридӣ ва тезтар гирифтем, ки шумо метавонед фавран истифода баред.

Codecs ва фишурдасозӣ

барои силсилаи вақт Муҳим аст, ки шумо маълумотро то чӣ андоза хуб бастаед, зеро миқдори маълумот метавонад хеле калон бошад. ДАР кликхона Маҷмӯи асбобҳо барои ноил шудан ба таъсири фишурдани 1:10, 1:20 ва баъзан бештар вуҷуд дорад. Ин маънои онро дорад, ки 1 TB маълумоти кушодашуда дар диск 50-100 ГБ-ро мегирад. Андозаи хурдтар хуб аст, маълумотро зудтар хондан ва коркард кардан мумкин аст.

Барои ноил шудан ба сатҳи баланди фишурдасозӣ, кликхона кодекҳои зеринро дастгирӣ мекунад:

Гузариш ба ClickHouse: 3 сол пас

Ҷадвали мисол:

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

Дар ин ҷо мо кодекро муайян мекунем DoubleDelta дар як ҳолат, дар дуюм - Гилла, ва мо бешубҳа бештар илова хоҳем кард LZ4 фишурда. Дар натиҷа, андозаи маълумот дар диск хеле кам мешавад:

Гузариш ба ClickHouse: 3 сол пас

Ин нишон медиҳад, ки ҳамон маълумот чӣ қадар ҷойро ишғол мекунад, аммо бо истифода аз кодекҳо ва фишурдаҳои гуногун:

  • дар файли GZIP дар диск;
  • дар ClickHouse бе кодекҳо, аммо бо фишурдани ZSTD;
  • дар ClickHouse бо кодекҳо ва фишурдани LZ4 ва ZSTD.

Дидан мумкин аст, ки ҷадвалҳои дорои кодекҳо хеле кам ҷой мегиранд.

Андозаи масъалаҳо

На камтар муҳим выбрать намуди дурусти маълумот:

Гузариш ба ClickHouse: 3 сол пас

Дар ҳама мисолҳои боло ман истифода кардам Float 64. Аммо агар мо интихоб кунем Float 32, он гоҳ ин боз ҳам беҳтар мебуд. Инро бачаҳои Перкона дар мақолаи дар боло зикршуда хуб нишон доданд. Муҳим аст, ки навъи паймоне, ки барои вазифа мувофиқ аст, истифода баред: ҳатто барои андозаи диск камтар аз суръати дархост. кликхона ба ин хеле ҳассос аст.

Агар шумо метавонед истифода баред int32 ба ҷои int64, пас кариб ду баробар зиёд шудани самараро интизор шавед. Маълумот хотираи камро ишғол мекунад ва ҳама «арифметика» хеле тезтар кор мекунанд. кликхона дар дохили он як системаи ба таври қатъӣ чопшуда мебошад, он аз тамоми имкониятҳое, ки системаҳои муосир пешкаш мекунанд, ба таври максималӣ истифода мебаранд.

Ҷамъоварӣ ва Дидашудаҳои моддӣ

Ҷамъоварӣ ва намоишҳои моддӣ ба шумо имкон медиҳанд, ки барои ҳолатҳои гуногун агрегатҳо эҷод кунед:

Гузариш ба ClickHouse: 3 сол пас

Масалан, шумо метавонед маълумоти сарчашмаи ҷамъшуда дошта бошед ва шумо метавонед ба онҳо бо ҷамъбасти автоматӣ тавассути муҳаррики махсус намуди зоҳирии гуногун замима кунед. SummingMergeTree (SMT). СМТ сохтори махсуси ҷамъкунандаи маълумот аст, ки агрегатҳоро ба таври худкор ҳисоб мекунад. Маълумоти хом ба пойгоҳи додаҳо ворид карда мешавад, он ба таври худкор ҷамъ карда мешавад ва панелҳои идоракуниро фавран дар он истифода бурдан мумкин аст.

TTL - маълумоти кӯҳнаро "фаромӯш кунед"

Чӣ тавр маълумотеро, ки дигар лозим нестанд, «фаромӯш кардан» мумкин аст? кликхона ин корро медонад. Ҳангоми сохтани ҷадвалҳо шумо метавонед муайян кунед TTL ибораҳо: масалан, ки мо маълумоти дақиқаиро барои як рӯз, маълумоти ҳаррӯза дар тӯли 30 рӯз нигоҳ медорем ва ҳеҷ гоҳ ба маълумоти ҳафтаина ё моҳона даст нарасонем:

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

Мунтазам - тақсим кардани маълумот дар байни дискҳо

Бо назардошти ин идея, маълумотро дар он нигоҳ доштан мумкин аст кликхона дар ҷойҳои гуногун. Фарз мекунем, ки мо мехоҳем маълумоти гармро дар ҳафтаи охир дар маҳалли хеле зуд нигоҳ дорем SSD, ва мо маълумоти бештари таърихиро дар ҷои дигар мегузорем. ДАР кликхона ин ҳоло имконпазир аст:

Гузариш ба ClickHouse: 3 сол пас

Шумо метавонед сиёсати нигоҳдорӣ (сиёсати нигоҳдорӣ) Ҳамин тавр кликхона ҳангоми расидан ба шароити муайян маълумотро ба таври худкор ба нигаҳдории дигар интиқол медиҳад.

Аммо ин ҳама нест. Дар сатҳи ҷадвали мушаххас шумо метавонед қоидаҳоро барои маҳз вақте ки маълумот ба нигаҳдории хунук ворид мешавад, муайян кунед. Масалан, маълумот дар як диски хеле зуд 7 рӯз нигоҳ дошта мешавад ва ҳама чизи кӯҳна ба диски суст интиқол дода мешавад. Ин хуб аст, зеро он ба шумо имкон медиҳад, ки системаро дар ҳадди аксар нигоҳ доред, дар ҳоле ки хароҷотро назорат кунед ва пулро барои маълумоти хунук сарф накунед:

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

Хусусиятҳои беназир кликхона

Қариб дар ҳама чиз кликхона Чунин "ҷиҳатҳои барҷаста" мавҷуданд, аммо онҳо бо истисноӣ ҷуброн карда мешаванд - чизе, ки дар дигар пойгоҳи додаҳо нест. Масалан, дар ин ҷо баъзе аз хусусиятҳои беназир мебошанд кликхона:

  • Массивҳо. Дар кликхона дастгирии хеле хуб барои массивҳо, инчунин қобилияти иҷрои ҳисобҳои мураккаб аз рӯи онҳо.
  • Ҷамъоварии сохторҳои маълумот. Ин яке аз "хусусиятҳои қотил" аст кликхона. Сарфи назар аз он, ки бачаҳои Яндекс мегӯянд, ки мо намехоҳем маълумотро ҷамъ кунем, ҳама чиз дар кликхона, зеро он зуд ва қулай аст.
  • Намоишҳои моддӣ. Якҷоя бо маҷмӯи сохторҳои додаҳо, манзараҳои моддӣ ба шумо имкон медиҳанд, ки қулай кунед вақти ҳақиқӣ ҷамъоварӣ.
  • ClickHouse SQL. Ин васеъшавии забон аст SQL бо баъзе хусусиятҳои иловагӣ ва истисноӣ, ки танҳо дар дастрас мебошанд кликхона. Пештар, он аз як тараф васеъшавӣ ва аз тарафи дигар камбудӣ буд. Холо кариб хамаи камбудихо нисбат ба SQL 92 мо онро хориҷ кардем, ҳоло он танҳо як тамдид аст.
  • Lambda- ифодаҳо. Оё онҳо то ҳол дар ягон базаи маълумот?
  • ML-дастгирӣ. Ин дар пойгоҳи додаҳои гуногун дастрас аст, баъзеҳо беҳтаранд, баъзеҳо бадтаранд.
  • манбаи кушода. Мо метавонем васеъ кунем кликхона якҷоя. Холо дар кликхона кариб 500 нафар сахмгузорон буда, ин ракам мунтазам меафзояд.

Саволҳои ҷолиб

В кликхона роҳҳои гуногуни анҷом додани як чиз вуҷуд дорад. Масалан, шумо метавонед арзиши охирини ҷадвалро бо се роҳи гуногун барои ВПМ - Воҳиди Пардозиши Марказӣ (чаҳорум низ ҳаст, аммо боз ҳам экзотиктар аст).

Якум нишон медиҳад, ки чӣ гуна қулай будан дар он аст кликхона вақте ки шумо мехоҳед инро тафтиш кунед, пурсед корт дар зерпурсиш мавҷуд аст. Ин чизест, ки ман шахсан дар дигар пойгоҳи додаҳо пазмон шудам. Агар ман мехоҳам чизеро бо зерпурсиш муқоиса кунам, пас дар дигар пойгоҳи додаҳо танҳо скалярро метавон бо он муқоиса кард, аммо барои якчанд сутунҳо ман бояд нависам ҶОЙҲО. Дар кликхона шумо метавонед tuple истифода баред:

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

Усули дуюм ҳамон корро мекунад, аммо функсияи ҷамъро истифода мебарад argMax:

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

В кликхона якчанд даҳҳо функсияҳои агрегатӣ вуҷуд доранд ва агар шумо комбинаторҳоро истифода баред, пас мувофиқи қонунҳои комбинаторика шумо тақрибан ҳазори онҳоро ба даст меоред. ArgMax - яке аз функсияҳое, ки арзиши максималиро ҳисоб мекунад: дархост арзишро бармегардонад user_usage, ки дар он арзиши максималӣ мерасад сохта_дар:

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

ASOF ХАМРОХ шавед — «часпондани» каторхои вактхои гуногун. Ин як хусусияти беназир барои пойгоҳи додаҳост, ки танҳо дар он дастрас аст kdb+. Агар ду силсилаи вақт бо вақтҳои гуногун мавҷуд бошанд, ASOF ХАМРОХ шавед ба шумо имкон медиҳад, ки онҳоро дар як дархост интиқол диҳед ва якҷоя кунед. Барои ҳар як арзиш дар як силсилаи вақт, арзиши наздиктарин дар дигараш пайдо мешавад ва онҳо дар як сатр баргардонида мешаванд:

Гузариш ба ClickHouse: 3 сол пас

Функсияҳои таҳлилӣ

Дар стандарт SQL-2003 шумо метавонед чунин нависед:

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;

В кликхона Шумо ин корро карда наметавонед - он стандартро дастгирӣ намекунад SQL-2003 ва шояд ҳеҷ гоҳ ин корро нахоҳад кард. Ба ҷои ин, дар кликхона Чунин навиштан одат шудааст:

Гузариш ба ClickHouse: 3 сол пас

Ман ба лямбдаҳо ваъда додам - ​​инҳоянд!

Ин як аналоги дархости таҳлилӣ дар стандарт аст SQL-2003: вай фарқи байни ин дуро ҳисоб мекунад тамғаи вақт, давомнокӣ, рақами тартибӣ - ҳама чизест, ки мо одатан функсияҳои таҳлилиро баррасӣ мекунем. ДАР кликхона Мо онҳоро тавассути массивҳо ҳисоб мекунем: аввал мо маълумотро ба массив мепӯшонем, баъд аз он мо ҳама чизеро, ки дар массив мехоҳем, иҷро мекунем ва сипас онро боз васеъ мекунем. Ин чандон қулай нест, он ҳадди аққал дӯст доштани барномасозии функсионалӣ талаб мекунад, аммо он хеле чандир аст.

Хусусиятҳои махсус

Гайр аз ин, дар кликхона бисёр вазифаҳои махсус. Масалан, чӣ тавр муайян кардан мумкин аст, ки чанд сессия дар як вақт баргузор мешавад? Вазифаи маъмулии мониторинг ин муайян кардани сарбории ҳадди аксар бо як дархост мебошад. ДАР кликхона Барои ин вазифаи махсус вуҷуд дорад:

Гузариш ба ClickHouse: 3 сол пас

Умуман, ClickHouse дорои вазифаҳои махсус барои бисёр мақсадҳо мебошад:

  • давидан Фарқият, давидан Ҷамъ кардан, ҳамсоя;
  • sumMap(калид, арзиш);
  • timeSeriesGroupSum(uid, тамғаи вақт, арзиш);
  • timeSeriesGroupRateSum(uid, тамғаи вақт, арзиш);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • БО ПУР / БО галстукхо;
  • SimpleLinearRegression, stochasticLinearRegression.

Ин рӯйхати пурраи функсияҳо нест, дар маҷмӯъ 500-600 вуҷуд дорад. Маслиҳат: ҳама функсияҳо дар кликхона дар ҷадвали система ҷойгир аст (на ҳама ҳуҷҷатгузорӣ шудаанд, аммо ҳама ҷолибанд):

select * from system.functions order by name

кликхона дар бораи худ, аз чумла, бисьёр маълумотро махфуз медорад ҷадвалҳои сабт, query_log, сабти пайгирӣ, сабти амалиёт бо блокҳои додаҳо (part_log), сабти ченакҳо ва сабти система, ки одатан ба диск менависад. Метрикҳои сабт аст силсилаи вақт в кликхона дар асл кликхона: Худи база метавонад нақш бозад силсилаи вақт базахои маълумотхо, хамин тавр худро «хурдан» мекунад.

Гузариш ба ClickHouse: 3 сол пас

Ин ҳам як чизи беназир аст - зеро мо барои он кори хуб мекунем силсилаи вақт, чаро мо наметавонем ҳама чизеро, ки ба мо лозим аст, дар дохили худ нигоҳ дорем? Ба мо лозим нест Prometheus, мо ҳама чизро барои худ нигоҳ медорем. пайваст Графана ва мо худамонро назорат мекунем. Аммо, агар кликхона меафтад, мо намефаҳмем, ки чаро, бинобар ин онҳо одатан ин корро намекунанд.

Кластери калон ё бисёри хурд кликхона

Кадомаш беҳтар аст - як кластери калон ё бисёр ClickHouses хурд? Муносибати анъанавӣ ба DWH кластери калонест, ки дар он схемаҳо барои ҳар як барнома ҷудо карда шудаанд. Мо назди мудири пойгоҳи додаҳо омадем - ба мо диаграмма диҳед ва онҳо ба мо як диаграмма доданд:

Гузариш ба ClickHouse: 3 сол пас

В кликхона шумо онро ба таври дигар карда метавонед. Шумо метавонед ҳар як барномаро худатон созед кликхона:

Гузариш ба ClickHouse: 3 сол пас

Мо дигар ба даҳшатноки калон лозим нест DWH ва маъмурони душвор. Мо метавонем ҳар як аризаи худро пешниҳод кунем кликхона, ва таҳиякунанда метавонад ин корро худаш, зеро кликхона насб кардан хеле осон аст ва маъмурияти мураккабро талаб намекунад:

Гузариш ба ClickHouse: 3 сол пас

Аммо агар мо бисьёр кликхона, ва шумо бояд онро зуд-зуд насб кунед, пас шумо мехоҳед ин равандро автоматӣ кунед. Барои ин мо метавонем, масалан, истифода барем Кубернитель и кликхона-оператор. ДАР Kubernetes ClickHouse шумо метавонед онро "бо клик" гузоред: Ман метавонам тугмаро пахш кунам, манифестро иҷро кунам ва базаи маълумот омода аст. Ман фавран метавонам диаграмма эҷод кунам, ба боргузории метрикҳо дар он ҷо шурӯъ кунам ва дар 5 дақиқа ман панели идоракуниро омода мекунам Графана. Ин хеле содда аст!

Дар охир чӣ?

Ва ҳамин тавр, кликхона - ин:

  • Бо зудӣ. Инро хама медонад.
  • Содда. Каме баҳсбарангез аст, аммо ман боварӣ дорам, ки дар омӯзиш душвор аст, дар ҷанг осон аст. Агар шумо фаҳмед, ки чӣ тавр кликхона он кор мекунад, пас ҳама чиз хеле оддӣ аст.
  • Умуман. Он барои сенарияҳои гуногун мувофиқ аст: DWH, Силсилаи вақт, Сабти сабт. Аммо ин тавр нест OLTP базаи маълумотҳо, бинобар ин кӯшиш накунед, ки дар он ҷо дохилкуниҳои кӯтоҳ ва хонданро иҷро кунед.
  • Зебо. Эҳтимол он касе, ки бо он кор мекунад кликхона, бисьёр лахзахои шавковарро ба маънои хубу бад аз cap гузарондаанд. Масалан, версияи нав баромад, ҳама чиз кор намекунад. Ё вақте ки шумо дар тӯли ду рӯз бо як кор мубориза бурдед, аммо пас аз додани савол дар чати Telegram, вазифа дар ду дақиқа ҳал карда шуд. Ё мисли дар конфронс дар гузориши Леша Миловидов, скриншот аз кликхона пахшро вайрон кард HighLoad++. Ин гуна ходиса хамеша руй медихад ва зиндагии моро душвор мегардонад. кликхона равшан ва ҷолиб!

Шумо метавонед презентатсияро тамошо кунед дар ин ҷо.

Гузариш ба ClickHouse: 3 сол пас

Вохӯрии деринтизоршудаи таҳиягарони системаҳои пурбор дар HighLoad++ 9 ва 10 ноябрь дар Сколково барпо мегардад. Ниҳоят, ин конфронси офлайнӣ хоҳад буд (ҳарчанд бо тамоми чораҳои эҳтиётӣ), зеро энергияи HighLoad++-ро онлайн баста кардан мумкин нест.

Барои конфронс мо мисолҳоро дар бораи имкониятҳои максималии технология пайдо мекунем ва ба шумо нишон медиҳем: HighLoad++ ягона ҷое буд, ҳаст ва хоҳад буд, ки шумо метавонед дар ду рӯз чӣ гуна кор кардани Facebook, Яндекс, ВКонтакте, Google ва Amazonро омӯзед.

Мо, ки аз соли 2007 инҷониб ҷаласаҳои худро бидуни таваққуф мегузаронем, имсол бори 14-ум вохӯрем. Дар ин муддат конфронс 10 маротиба афзоиш ёфт; соли гузашта чорабинии калидии саноатӣ 3339 иштирокчӣ, 165 баромадкунанда, гузоришҳо ва вохӯриҳо ҷамъ овард ва 16 трек ҳамзамон иҷро мешуд.
Соли гузашта 20 автобус, 5280 литр чой ва кахва, 1650 литр нушокии мевагй, 10200 шиша об. Ва боз 2640 килограмм хурок, 16 хазор табак ва 000 хазор пиёла. Воқеан, бо пули аз коғази коркардшуда 25 ниҳоли дуб шинондем :)

Шумо метавонед билет харед дар ин ҷо, дар бораи конфронс хабар гиред - дар ин ҷо, ва дар ҳама шабакаҳои иҷтимоӣ сӯҳбат кунед: телеграмма, Facebook, ВКонтакте и Twitter.

Манбаъ: will.com

Илова Эзоҳ