{"id":91438,"date":"2020-08-13T19:42:36","date_gmt":"2020-08-13T17:42:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks"},"modified":"2020-08-13T19:42:36","modified_gmt":"2020-08-13T17:42:36","slug":"effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","title":{"rendered":"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8e42c1fffffcc964eacef240ea90bbc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Av\u00e2nd \u00een vedere c\u0103 ClickHouse este un sistem specializat, este important s\u0103 \u021binem cont de particularit\u0103\u021bile arhitecturii sale \u00een utilizarea acestuia. \u00cen aceast\u0103 prezentare, Alexey va discuta despre exemplele tipice de gre\u0219eli \u00een utilizarea ClickHouse care pot duce la o func\u021bionare ineficient\u0103. Vor fi prezentate exemple practice care vor ar\u0103ta cum alegerea unei anumite scheme de prelucrare a datelor poate schimba semnificativ performan\u021ba.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Salut tuturor! M\u0103 numesc Alexey \u0219i lucrez cu ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7f5fc01663be58d3d25e518a4169b8cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cent\u00e2i de toate, trebuie s\u0103 v\u0103 bucur c\u0103 ast\u0103zi nu voi vorbi despre ce este ClickHouse. Sincer, mi s-a s\u0103turat s\u0103 explic asta. Cred c\u0103 toat\u0103 lumea \u0219tie deja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/fae6bd07d098200643d591b8e5bf51e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen schimb, voi discuta despre posibilele capcane, adic\u0103 despre cum poate fi utilizat gre\u0219it ClickHouse. De fapt, nu trebuie s\u0103 v\u0103 fie fric\u0103, deoarece dezvolt\u0103m ClickHouse ca un sistem care este simplu, convenabil \u0219i func\u021bioneaz\u0103 din prima. L-ai instalat \u0219i asta e, f\u0103r\u0103 probleme. <\/p>\n<p><\/p>\n<p>Dar, cu toate acestea, trebuie s\u0103 \u021binem cont c\u0103 acest sistem este specializat \u0219i este u\u0219or s\u0103 te love\u0219ti de un scenariu neobi\u0219nuit de utilizare care s\u0103 scoat\u0103 sistemul din zona sa de confort.<\/p>\n<p><\/p>\n<p>A\u0219adar, care sunt capcanele? \u00cen principal, voi vorbi despre lucruri evidente. Toat\u0103 lumea \u0219tie, to\u021bi \u00een\u021beleg \u0219i se pot bucura c\u0103 sunt at\u00e2t de de\u0219tep\u021bi, iar cei care nu \u00een\u021beleg vor \u00eenv\u0103\u021ba ceva nou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/bffacf353ff31b361460178e911f0e16.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Primul \u0219i cel mai simplu exemplu, care din p\u0103cate se \u00eent\u00e2lne\u0219te frecvent, este un num\u0103r mare de inser\u021bii cu loturi mici, adic\u0103 un num\u0103r mare de inser\u021bii mici.<\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la modul \u00een care ClickHouse efectueaz\u0103 inser\u021biile, pute\u021bi trimite un flux de date de p\u00e2n\u0103 la un terabyte cu o singur\u0103 cerere. Asta nu este o problem\u0103. <\/p>\n<p><\/p>\n<p>S\u0103 vedem care ar fi o performan\u021b\u0103 tipic\u0103. De exemplu, avem o mas\u0103 cu date de la Yandex.Metrica. Afi\u0219\u0103ri. 105 coloane de orice fel. 700 de bytes \u00een form\u0103 necomprimat\u0103. \u0218i vom insera, \u00een mod corespunz\u0103tor, loturi de c\u00e2te un milion de r\u00e2nduri. <\/p>\n<p><\/p>\n<p>Inser\u0103m \u00een tabela MergeTree, rezult\u00e2nd jum\u0103tate de milion de r\u00e2nduri pe secund\u0103. Excelent. \u00cen tabela replicat\u0103 \u2013 va fi pu\u021bin mai pu\u021bin, aproximativ 400.000 de r\u00e2nduri pe secund\u0103. <\/p>\n<p><\/p>\n<p>Dac\u0103 activ\u0103m inser\u021bia cu cvorum, vom ob\u021bine pu\u021bin mai pu\u021bin, dar totu\u0219i o performan\u021b\u0103 decent\u0103, 250.000 de r\u00e2nduri pe secund\u0103. Inser\u021bia cu cvorum \u2013 este o func\u021bionalitate nedocumentat\u0103 \u00een ClickHouse*.<\/p>\n<p><\/p>\n<p>* la data de 2020, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/operations\/settings\/settings\/#settings-insert_quorum\">deja documentat\u0103<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/668498fc82a0f6e851d05e6e1ea67033.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce se \u00eent\u00e2mpl\u0103 dac\u0103 facem lucruri prost? Introducem c\u00e2te un r\u00e2nd \u00een tabelul MergeTree \u0219i ob\u021binem 59 de r\u00e2nduri pe secund\u0103. Asta e de 10.000 de ori mai lent. \u00cen ReplicatedMergeTree \u2013 6 r\u00e2nduri pe secund\u0103. \u0218i dac\u0103 se adaug\u0103 un cvorum, atunci ob\u021binem 2 r\u00e2nduri pe secund\u0103. P\u0103rerea mea este c\u0103 asta e o adev\u0103rat\u0103 prostie. Cum po\u021bi s\u0103 te mi\u0219ti at\u00e2t de lent? Chiar \u0219i pe tricoul meu scrie c\u0103 ClickHouse nu ar trebui s\u0103 fie lent. Dar, totu\u0219i, se mai \u00eent\u00e2mpl\u0103 uneori. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4c771eddc4e8453f60ef91123ae5d109.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De fapt \u2013 acesta este defectul nostru. Am fi putut foarte bine s\u0103 facem astfel \u00eenc\u00e2t totul s\u0103 func\u021bioneze normal, dar nu am f\u0103cut. \u0218i nu am f\u0103cut acest lucru pentru c\u0103 pentru scenariul nostru \u2013 nu era necesar. Aveam deja batch-uri. Pur \u0219i simplu primeam batch-uri, \u0219i nu erau probleme. Introducem \u0219i totul func\u021bioneaz\u0103 bine. Dar, desigur, pot ap\u0103rea tot felul de scenarii. De exemplu, c\u00e2nd ai o mul\u021bime de servere pe care datele sunt generate. \u0218i acestea introduc date nu at\u00e2t de des, dar totu\u0219i ob\u021bii inser\u021bii frecvente. \u0218i trebuie s\u0103 evi\u021bi asta cumva. <\/p>\n<p><\/p>\n<p>Din punct de vedere tehnic, esen\u021ba este c\u0103 atunci c\u00e2nd faci un insert \u00een ClickHouse, datele nu intr\u0103 \u00een niciun memtable. Noi chiar nu avem un MergeTree cu structur\u0103 de log, ci doar un MergeTree, pentru c\u0103 nu exist\u0103 niciun log, niciun memTable. Pur \u0219i simplu scriem datele direct \u00een sistemul de fi\u0219iere, deja organizate pe coloane. \u0218i dac\u0103 ai 100 de coloane, atunci va trebui s\u0103 scrii mai mult de 200 de fi\u0219iere \u00eentr-un director separat. Toate acestea sunt destul de voluminoase. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/24688fe3d39d81b92f12ac1b8b21425b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i apare \u00eentrebarea: \u201eCum se face corect?\u201d, \u00een cazul \u00een care este o astfel de situa\u021bie, c\u0103 trebuie totu\u0219i s\u0103 \u00eenregistrezi datele \u00een ClickHouse.<\/p>\n<p><\/p>\n<p>Metoda 1. Aceasta este cea mai simpl\u0103 metod\u0103. Folose\u0219te o coad\u0103 distribuit\u0103. De exemplu, Kafka. Pur \u0219i simplu sco\u021bi datele din Kafka, le grupezi la fiecare secund\u0103. \u0218i totul va fi bine, \u00eenregistrezi, totul func\u021bioneaz\u0103 bine. <\/p>\n<p><\/p>\n<p>Dezavantajele sunt c\u0103 Kafka este \u00eenc\u0103 un alt sistem distribuit voluminos. \u00cen\u021beleg dac\u0103 \u00een compania ta exist\u0103 deja Kafka. Este bine, este convenabil. Dar dac\u0103 nu exist\u0103, atunci merit\u0103 s\u0103 te g\u00e2nde\u0219ti de trei ori \u00eenainte de a aduce un alt sistem distribuit \u00een proiectul t\u0103u. A\u0219adar, ar trebui s\u0103 consideri alternative. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4f687221e8c7443abf02fb002c4eba5b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda 2. Este o alternativ\u0103 old-school, dar foarte simpl\u0103. Ave\u021bi un server care genereaz\u0103 jurnalele dvs. \u0219i le scrie \u00eentr-un fi\u0219ier. O dat\u0103 pe secund\u0103, de exemplu, redenumi\u021bi acest fi\u0219ier, deschide\u021bi unul nou. \u0218i un script separat, fie prin cron, fie un daemon, preia cel mai vechi fi\u0219ier \u0219i \u00eel scrie \u00een ClickHouse. Dac\u0103 \u00eenregistra\u021bi jurnalele o dat\u0103 pe secund\u0103, totul va fi perfect. <\/p>\n<p><\/p>\n<p>Dar dezavantajul acestei metode este c\u0103, dac\u0103 serverul de pe care sunt generate jurnalele dispare, \u0219i datele vor disp\u0103rea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b4c28b6df87386c42b6908bdfccb6b90.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda 3. Exist\u0103 o alt\u0103 metod\u0103 interesant\u0103, care nu folose\u0219te fi\u0219iere temporare. De exemplu, ave\u021bi un agent de publicitate sau un alt daemon interesant care genereaz\u0103 date. Pute\u021bi acumula un pachet de date direct \u00een RAM, \u00een buffer. \u0218i dup\u0103 ce a trecut o perioad\u0103 suficient\u0103 de timp, pune\u021bi acest buffer deoparte, crea\u021bi unul nou, iar \u00eentr-un fir separat, ceea ce a fost deja acumulat, \u00eel insera\u021bi \u00een ClickHouse.<\/p>\n<p><\/p>\n<p>Pe de alt\u0103 parte, datele se pierd \u0219i \u00een caz de kill -9. Dac\u0103 serverul dvs. cade, ve\u021bi pierde aceste date. \u0218i exist\u0103 o alt\u0103 problem\u0103, c\u0103 dac\u0103 nu a\u021bi reu\u0219it s\u0103 scrie\u021bi \u00een baz\u0103, datele se vor acumula \u00een RAM. \u0218i fie se va termina RAM-ul, fie ve\u021bi pierde pur \u0219i simplu datele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/dc375b22fcb26cfa111d0bdb4563aa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda 4. O alt\u0103 metod\u0103 interesant\u0103. Ave\u021bi un proces server care poate trimite date c\u0103tre ClickHouse imediat, dar f\u0103c\u00e2nd asta \u00eentr-o singur\u0103 conexiune. De exemplu, a trimis o cerere http cu transfer-encoding: chunked cu un insert. \u0218i genereaz\u0103 fragmente nu foarte rar, se poate trimite fiecare linie, de\u0219i va exista un overhead pe cadrul acestor date. <\/p>\n<p><\/p>\n<p>Dar, cu toate acestea, \u00een acest caz, datele vor fi trimise imediat \u00een ClickHouse. \u0218i ClickHouse le va bufferiza singur. <\/p>\n<p><\/p>\n<p>Dar apar \u0219i probleme. Acum ve\u021bi pierde date, inclusiv atunci c\u00e2nd procesul dvs. se opre\u0219te \u0219i, dac\u0103 procesul ClickHouse se opre\u0219te, pentru c\u0103 va fi un insert neterminat. \u00cen ClickHouse, inser\u021biile sunt atomice p\u00e2n\u0103 la un anumit prag specificat \u00een num\u0103rul de linii. \u00cen principiu, aceasta este o metod\u0103 interesant\u0103. Poate fi utilizat\u0103 \u0219i ea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6a18a974b9600ade377a870390e95d3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda 5. Iat\u0103 \u00eenc\u0103 o metod\u0103 interesant\u0103. Este un server dezvoltat de comunitate pentru procesarea batch a datelor. Eu nu l-am verificat, a\u0219a c\u0103 nu pot garanta nimic. Totu\u0219i, nici pentru ClickHouse nu se ofer\u0103 garan\u021bii. Este, de asemenea, open source, dar pe de alt\u0103 parte, s-ar putea s\u0103 te fi obi\u0219nuit cu un anumit standard de calitate pe care \u00eencerc\u0103m s\u0103-l asigur\u0103m. Dar pentru aceast\u0103 solu\u021bie \u2013 nu \u0219tiu, intr\u0103 pe GitHub, verific\u0103 codul. Poate au scris ceva rezonabil. <\/p>\n<p><\/p>\n<p>* la data de 2020, ar trebui s\u0103 ad\u0103ug\u0103m la considerare <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/vk\/blog\/430168\/\">KittenHouse<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae6a04af63ae4e7fa160c002fdb6d506.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda 6. O alt\u0103 metod\u0103 este utilizarea tabelelor Buffer. Avantajele acestei metode sunt c\u0103 este foarte simplu s\u0103 \u00eencepi s\u0103 o folose\u0219ti. Creezi o tabel\u0103 Buffer \u0219i inserezi \u00een ea. <\/p>\n<p><\/p>\n<p>Dezavantajul este c\u0103 problema nu este rezolvat\u0103 complet. Dac\u0103 la inser\u021bia de tip MergeTree trebuie s\u0103 grupezi datele la un lot pe secund\u0103, atunci la inser\u021bia \u00een tabela buffer, trebuie s\u0103 grupezi cel pu\u021bin c\u00e2teva mii pe secund\u0103. Dac\u0103 vor fi mai mult de 10 000 pe secund\u0103, va fi tot r\u0103u. \u0218i dac\u0103 inserezi \u00een loturi, ai v\u0103zut c\u0103 acolo ob\u021bii sute de mii de r\u00e2nduri pe secund\u0103. Iar asta se \u00eent\u00e2mpl\u0103 deja pe date destul de grele. <\/p>\n<p><\/p>\n<p>De asemenea, tabelele buffer nu au jurnal. \u0218i dac\u0103 ceva nu merge bine cu serverul t\u0103u, datele vor fi pierdute. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/9bb16bf5e8145cc8368b11e54c86c837.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i ca un bonus, recent a ap\u0103rut \u00een ClickHouse posibilitatea de a prelua date din Kafka. Exist\u0103 un motor de tabele \u2013 Kafka. Pur \u0219i simplu creezi. \u0218i po\u021bi s\u0103 ata\u0219ezi vizualiz\u0103ri materializate. \u00cen acest caz, el va extrage automat datele din Kafka \u0219i le va insera \u00een tabelele de care ai nevoie. <\/p>\n<p><\/p>\n<p>\u0218i ceea ce este deosebit de \u00eenc\u00e2nt\u0103tor la aceast\u0103 posibilitate este c\u0103 nu noi am dezvoltat-o. Este o func\u021bie a comunit\u0103\u021bii. \u0218i c\u00e2nd spun \u201efunc\u021bie a comunit\u0103\u021bii\u201d, spun f\u0103r\u0103 niciun fel de dispre\u021b. Am citit codul, am f\u0103cut recenzia, ar trebui s\u0103 func\u021bioneze bine. <\/p>\n<p><\/p>\n<p>* la data de 2020, a ap\u0103rut un suport similar pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/engines\/table-engines\/integrations\/rabbitmq\/\">RabbitMQ<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15dc61dfd435f5f8640395b7de480fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce altceva poate fi inconvenient sau nea\u0219teptat la inser\u021bia de date? Dac\u0103 faci o cerere insert values \u0219i \u00een values scrii expresii calculabile. De exemplu, now() \u2013 aceasta este o expresie calculabil\u0103. \u00cen acest caz, ClickHouse este nevoit s\u0103 lanseze interpretatorul pentru fiecare r\u00e2nd, iar performan\u021ba va sc\u0103dea drastic. Ar fi mai bine s\u0103 evi\u021bi asta.<\/p>\n<p><\/p>\n<p>* \u00een prezent, problema a fost complet rezolvat\u0103, regresiile de performan\u021b\u0103 la utilizarea expresiilor \u00een VALUES nu mai exist\u0103.<\/p>\n<p><\/p>\n<p>Un alt exemplu de probleme poate ap\u0103rea atunci c\u00e2nd, \u00eentr-un singur lot, datele se refer\u0103 la mai multe parti\u021bii. \u00cen mod default, \u00een ClickHouse, parti\u021biile sunt pe luni. Dac\u0103 insera\u021bi un lot de un milion de r\u00e2nduri \u0219i datele sunt pe parcursul mai multor ani, atunci ve\u021bi avea zeci de parti\u021bii. Este echivalent cu a avea loturi de dimensiuni de c\u00e2teva zeci de ori mai mici, deoarece acestea sunt \u00eentotdeauna \u00eemp\u0103r\u021bite mai \u00eent\u00e2i pe parti\u021bii.<\/p>\n<p><\/p>\n<p>* recent, \u00een ClickHouse, a fost ad\u0103ugat\u0103 \u00een modul experimental suportul pentru un format compact de buc\u0103\u021bi \u0219i buc\u0103\u021bi \u00een memorie cu write-ahead log, ceea ce rezolv\u0103 aproape complet problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b8c6cecdba53559dad31ed11713a980d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum s\u0103 analiz\u0103m al doilea tip de problem\u0103 \u2013 acest lucru se refer\u0103 la tipizarea datelor. <\/p>\n<p><\/p>\n<p>Tipizarea datelor poate fi strict\u0103 sau bazat\u0103 pe string. Tipul string este c\u00e2nd a\u021bi declarat c\u0103 toate c\u00e2mpurile sunt de tip string. Asta este inacceptabil. Nu trebuie s\u0103 proceda\u021bi astfel. <\/p>\n<p><\/p>\n<p>Hai s\u0103 vedem cum s\u0103 facem corect \u00een cazurile \u00een care vrem s\u0103 spunem c\u0103 un anumit c\u00e2mp este un string \u0219i l\u0103s\u0103m ClickHouse s\u0103 se descurce, f\u0103r\u0103 s\u0103 ne stres\u0103m. Totu\u0219i, merit\u0103 s\u0103 depunem ceva efort. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a0fdcf6423933293318411242fe2ede7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De exemplu, avem o adres\u0103 IP. \u00centr-un caz, am p\u0103strat-o ca string. De exemplu, 192.168.1.1. \u00cen alt caz, va fi un num\u0103r de tip UInt32*. 32 de bi\u021bi sunt suficien\u021bi pentru o adres\u0103 IPv4.<\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, ciudat cum poate p\u0103rea, datele se vor comprima aproximativ la fel. Vor exista, desigur, diferen\u021be, dar nu sunt at\u00e2t de mari. A\u0219adar, nu exist\u0103 probleme semnificative \u00een ceea ce prive\u0219te input-ul\/output-ul pe disc. <\/p>\n<p><\/p>\n<p>Dar exist\u0103 o diferen\u021b\u0103 semnificativ\u0103 \u00een ceea ce prive\u0219te timpul de procesor \u0219i timpul de executare a interog\u0103rii. <\/p>\n<p><\/p>\n<p>S\u0103 calcul\u0103m num\u0103rul de adrese IP unice, dac\u0103 sunt stocate sub form\u0103 de numere. Rezultatul este de 137 de milioane de r\u00e2nduri pe secund\u0103. Dac\u0103 facem aceea\u0219i interogare sub form\u0103 de stringuri, obtinem 37 de milioane de r\u00e2nduri pe secund\u0103. Nu \u0219tiu de ce s-a \u00eent\u00e2mplat o astfel de coinciden\u021b\u0103. Eu \u00eensumi am efectuat aceste interog\u0103ri. Totu\u0219i, este aproximativ de 4 ori mai lent. <\/p>\n<p><\/p>\n<p>Dac\u0103 calcul\u0103m diferen\u021ba \u00een ceea ce prive\u0219te spa\u021biul pe disc, exist\u0103 de asemenea o diferen\u021b\u0103. \u0218i aceasta este de aproximativ un sfert, deoarece exist\u0103 multe adrese IP unice. Dac\u0103 ar fi fost r\u00e2nduri cu un num\u0103r mic de valori diferite, acestea s-ar fi comprimat relativ la acela\u0219i volum. <\/p>\n<p><\/p>\n<p>\u0218i o diferen\u021b\u0103 de patru ori \u00een timp pe drum nu este de ignorat. Poate c\u0103 pentru tine nu conteaz\u0103, dar atunci c\u00e2nd v\u0103d o astfel de diferen\u021b\u0103, m\u0103 \u00eentristeaz\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f74dbfdab5a9e26fa044a5870a8cc00d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 analiz\u0103m diferite cazuri. <\/p>\n<p><\/p>\n<p>1. Un caz este atunci c\u00e2nd ave\u021bi pu\u021bine valori unice. \u00cen acest caz, folosim o practic\u0103 simpl\u0103 pe care probabil o cunoa\u0219te\u021bi \u0219i o pute\u021bi aplica \u00een orice sistem de gestionare a bazelor de date. Acest lucru are sens nu doar pentru ClickHouse. Pur \u0219i simplu introduce\u021bi identificatori numerici \u00een baz\u0103. Conversia \u00een \u0219iruri \u0219i invers se poate face la nivelul aplica\u021biei dumneavoastr\u0103. <\/p>\n<p><\/p>\n<p>De exemplu, ave\u021bi o regiune. \u0218i \u00eencerca\u021bi s\u0103 o salva\u021bi ca un \u0219ir. Acolo va fi scris: Moscova \u0219i MO. \u0218i c\u00e2nd v\u0103d c\u0103 este scris \u201eMoscova\u201d, nu e nimic, dar c\u00e2nd vine vorba \u0219i de MO, devine oarecum trist. Ce mul\u021bi bi\u021bi trebuie s\u0103 aib\u0103. <\/p>\n<p><\/p>\n<p>\u00cen loc de aceasta, pur \u0219i simplu scriem num\u0103rul Ulnt32 \u0219i 250. Avem 250 \u00een Yandex, iar la voi ar putea fi diferit. Pentru c\u0103, \u00een ClickHouse, exist\u0103 o func\u021bionalitate \u00eencorporat\u0103 pentru gestionarea bazei de date geografice. Pur \u0219i simplu scrie\u021bi un dic\u021bionar cu regiunile, inclusiv ierarhic, adic\u0103 va fi at\u00e2t Moscova, c\u00e2t \u0219i MO, \u0219i tot ce ave\u021bi nevoie. \u0218i se poate realiza conversia la nivel de interogare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/cc6e871136dab8f8a35246a5af512cda.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A doua op\u021biune este similar\u0103, dar cu suport \u00een interiorul ClickHouse. Acesta este tipul de date Enum. Pur \u0219i simplu \u00een Enum specifica\u021bi toate valorile necesare. De exemplu, tipul de dispozitiv \u0219i scrie\u021bi: desktop, mobil, tablet\u0103, televizor. \u00cen total, 4 variante. <\/p>\n<p><\/p>\n<p>Dezavantajul este c\u0103 trebuie s\u0103 face\u021bi periodic modific\u0103ri. A\u021bi ad\u0103ugat doar o variant\u0103. Facem alter table. \u00cen realitate, alter table \u00een ClickHouse este gratuit. Mai ales pentru Enum, deoarece datele de pe disc nu se schimb\u0103. Totu\u0219i, o modificare capteaz\u0103 blocarea* pe tabel \u0219i trebuie s\u0103 a\u0219tepte p\u00e2n\u0103 se finalizeaz\u0103 toate selects-urile. \u0218i abia apoi alter va fi efectuat, adic\u0103 totu\u0219i anumite nepl\u0103ceri exist\u0103.<\/p>\n<p><\/p>\n<p>* \u00een versiunile recente ale ClickHouse, ALTER a fost realizat complet f\u0103r\u0103 blocare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7284fa5be583ab063bb6de0b60f54d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 op\u021biune destul de unic\u0103 pentru ClickHouse este conectarea dic\u021bionarelor externe. Pute\u021bi introduce numere \u00een ClickHouse, iar dic\u021bionarele s\u0103 le p\u0103stra\u021bi \u00een orice sistem convenabil. De exemplu, pute\u021bi folosi: MySQL, Mongo, Postgres. Pute\u021bi chiar s\u0103 construi\u021bi un microserviciu care va returna aceste date prin http. \u0218i la nivelul ClickHouse scrie\u021bi o func\u021bie care va transforma aceste date din numere \u00een \u0219iruri. <\/p>\n<p><\/p>\n<p>Aceasta este o metod\u0103 specializat\u0103, dar foarte eficient\u0103 de a efectua un join cu o tabel\u0103 extern\u0103. Exist\u0103 dou\u0103 variante. \u00centr-o variant\u0103, aceste date vor fi complet cache-uite, vor fi complet prezente \u00een memorie \u0219i se vor actualiza periodic. \u00cen cealalt\u0103 variant\u0103, dac\u0103 aceste date nu \u00eencap \u00een memorie, atunci le putem cache-ui par\u021bial. <\/p>\n<p><\/p>\n<p>Iat\u0103 un exemplu. Exist\u0103 Yandex.Direct. \u0218i acolo exist\u0103 o campanie publicitar\u0103 \u0219i bannere. Num\u0103rul campaniilor publicitare este probabil de ordinul zecilor de milioane. \u0218i se pot \u00eencadra \u00een memorie. Iar bannerele \u2013 miliarde, nu \u00eencap. \u0218i folosim un dic\u021bionar cache-uit din MySQL.<\/p>\n<p><\/p>\n<p>Singura problem\u0103 este c\u0103 dic\u021bionarul cache-uit va func\u021biona corect dac\u0103 rata de hit-uri este aproape de 100 %. Dac\u0103 este mai mic\u0103, atunci la procesarea cererilor pentru fiecare lot de date va trebui s\u0103 lu\u0103m efectiv cheile lips\u0103 \u0219i s\u0103 aducem datele din MySQL. \u00cen ceea ce prive\u0219te ClickHouse, pot garanta c\u0103 nu \u00eent\u00e2mpin\u0103 \u00eent\u00e2rzieri, dar nu voi comenta despre alte sisteme.<\/p>\n<p><\/p>\n<p>Ca bonus, dic\u021bionarele sunt o modalitate foarte simpl\u0103 de a actualiza datele \u00een ClickHouse retroactiv. Adic\u0103, dac\u0103 a\u021bi avut un raport pe campanii publicitare, utilizatorul a schimbat pur \u0219i simplu campania publicitar\u0103, iar \u00een toate datele vechi, \u00een toate rapoartele, aceste date s-au schimbat \u0219i ele. Dac\u0103 a\u021bi scrie r\u00e2nduri direct \u00een tabel\u0103, actualizarea lor ar fi imposibil\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a5a2919d6be7d00c0ad5875b9a8f0f31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 metod\u0103, atunci c\u00e2nd nu \u0219ti\u021bi de unde s\u0103 ob\u021bine\u021bi identificatorii pentru r\u00e2ndurile dvs., este s\u0103 face\u021bi pur \u0219i simplu un hash. Cea mai simpl\u0103 variant\u0103 este s\u0103 lua\u021bi un hash de 64 de bi\u021bi. <\/p>\n<p><\/p>\n<p>Singura problem\u0103 este c\u0103, dac\u0103 hash-ul este de 64 de bi\u021bi, coliziunile vor ap\u0103rea aproape cu siguran\u021b\u0103. Deoarece, dac\u0103 ave\u021bi un miliard de r\u00e2nduri, probabilitatea devine semnificativ\u0103. <\/p>\n<p><\/p>\n<p>\u0218i nu ar fi foarte bine s\u0103 hash-ui\u021bi numele campaniilor publicitare astfel. Dac\u0103 campaniile publicitare ale diferitelor companii se \u00eemp\u0103rt\u0103\u0219esc, atunci va ap\u0103rea ceva neclar. <\/p>\n<p><\/p>\n<p>\u0218i exist\u0103 un truc simplu. Adev\u0103rul este c\u0103 pentru datele serioase nu se potrive\u0219te foarte bine, dar dac\u0103 este ceva care nu este foarte serios, atunci pur \u0219i simplu ad\u0103uga\u021bi un identificator al clientului \u00een cheia dic\u021bionarului. Astfel, ve\u021bi avea coliziunile, dar numai \u00een cadrul unui singur client. Aceast\u0103 metod\u0103 este utilizat\u0103 pentru harta linkurilor \u00een Yandex.Metrica. Avem acolo URL-uri, stoc\u0103m hash-uri. \u0218tim c\u0103, desigur, coliziunile exist\u0103. Dar atunci c\u00e2nd se afi\u0219eaz\u0103 pagina, probabilitatea ca pe o singur\u0103 pagin\u0103, pentru un singur utilizator, s\u0103 existe anumite URL-uri care se suprapun \u0219i s\u0103 fie observate este at\u00e2t de sc\u0103zut\u0103 \u00eenc\u00e2t se poate neglija. <\/p>\n<p><\/p>\n<p>Ca bonus \u2013 pentru multe opera\u021bii, doar hash-urile sunt suficiente \u0219i nu este nevoie s\u0103 stoca\u021bi \u0219irurile \u00een vreun loc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/abbb73aaba29d10e3b7e7650bf68e6a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un alt exemplu, dac\u0103 \u0219irurile sunt scurte, cum ar fi domeniile site-urilor. Le pute\u021bi stoca a\u0219a cum sunt. Sau, de exemplu, limba browser-ului ru \u2013 2 bytes. Mi-e sincer, foarte mil\u0103 de bytes, dar nu v\u0103 face\u021bi griji, 2 bytes nu afecteaz\u0103. V\u0103 rog, stoca\u021bi a\u0219a cum sunt, nu v\u0103 stresa\u021bi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/901eaed0029da6ea59630b57ccf80c25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 situa\u021bie este c\u00e2nd exist\u0103 foarte multe \u0219iruri \u0219i acestea con\u021bin extrem de multe unice, iar num\u0103rul lor poate fi poten\u021bial nelimitat. Un exemplu tipic sunt expresiile de c\u0103utare sau URL-urile. Expresiile de c\u0103utare, inclusiv din cauza gre\u0219elilor de tipar. S\u0103 vedem c\u00e2te expresii de c\u0103utare unice sunt \u00eentr-o zi. \u0218i se dovede\u0219te c\u0103 aproape jum\u0103tate din toate evenimentele sunt acestea. \u0218i \u00een acest caz, s-ar putea s\u0103 te g\u00e2nde\u0219ti c\u0103 ar trebui s\u0103 normalizezi datele, s\u0103 numeri identificatorii, s\u0103 le pui \u00eentr-un tabel separat. Dar nu trebuie s\u0103 faci asta. Pur \u0219i simplu stocheaz\u0103 aceste \u0219iruri a\u0219a cum sunt. <\/p>\n<p><\/p>\n<p>Cel mai bine \u2013 nu inventa nimic, pentru c\u0103 dac\u0103 le stochezi separat, va fi necesar s\u0103 faci un join. Iar acest join \u2013 \u00een cel mai bun caz, va necesita acces aleator \u00een memorie, dac\u0103 mai \u00eencape \u00een memorie. Dac\u0103 nu \u00eencape, vor fi probleme. <\/p>\n<p><\/p>\n<p>Dac\u0103 datele sunt stocate \u00een in place, atunci ele sunt pur \u0219i simplu citite \u00een ordinea necesar\u0103 din sistemul de fi\u0219iere \u0219i totul este \u00een regul\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15f1d632083def16ccbc939579c1cf6b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 ave\u021bi URL-uri sau orice alt \u0219ir lung sau complex, trebuie s\u0103 v\u0103 g\u00e2ndi\u021bi c\u0103 ar putea fi calculat\u0103 o reducere anticipat\u0103 \u0219i \u00eenregistrat\u0103 \u00eentr-o coloan\u0103 separat\u0103. <\/p>\n<p><\/p>\n<p>Pentru URL-uri, de exemplu, pute\u021bi stoca separat domeniul. \u0218i dac\u0103 ave\u021bi cu adev\u0103rat nevoie de domeniu, folosi\u021bi pur \u0219i simplu aceast\u0103 coloan\u0103, iar URL-urile vor r\u0103m\u00e2ne acolo \u0219i nu le ve\u021bi atinge niciodat\u0103. <\/p>\n<p><\/p>\n<p>Hai s\u0103 vedem care este diferen\u021ba. \u00cen ClickHouse exist\u0103 o func\u021bie specializat\u0103 care calculeaz\u0103 domeniul. Este foarte rapid\u0103, am optimizat-o. \u0218i, ca s\u0103 fiu sincer, nu respect\u0103 RFC, dar totu\u0219i calculeaz\u0103 tot ce ne trebuie. <\/p>\n<p><\/p>\n<p>\u00centr-un caz, vom extrage pur \u0219i simplu URL-urile \u0219i vom calcula domeniul. Asta dureaz\u0103 166 de milisecunde. Dac\u0103 lu\u0103m un domeniu deja preg\u0103tit, dureaz\u0103 doar 67 de milisecunde, adic\u0103 aproape de trei ori mai repede. De fapt, mai repede nu pentru c\u0103 ar trebui s\u0103 facem ni\u0219te calcule, ci pentru c\u0103 citim mai pu\u021bine date. <\/p>\n<p><\/p>\n<p>Dintr-un motiv oarecare, unii interog\u0103ri, care sunt mai lente, au o vitez\u0103 mai mare \u00een gigabi\u021bi pe secund\u0103. Pentru c\u0103 citesc mai mul\u021bi gigabi\u021bi. Acestea sunt date complet inutile. Interogarea pare s\u0103 func\u021bioneze mai repede, dar dureaz\u0103 mai mult timp.<\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la volumul de date pe disc, URL-ul are 126 de megabai\u021bi, iar domeniul doar 5 megabai\u021bi. Asta \u00eenseamn\u0103 de 25 de ori mai pu\u021bin. Cu toate acestea, interogarea se execut\u0103 de doar 4 ori mai repede. Dar asta se datoreaz\u0103 faptului c\u0103 datele sunt fierbin\u021bi. Dac\u0103 ar fi fost reci, ar fi fost cu siguran\u021b\u0103 de 25 de ori mai repede din cauza intr\u0103rii\/ie\u0219irii de pe disc. <\/p>\n<p><\/p>\n<p>Apropo, dac\u0103 evalu\u0103m c\u00e2t de mult mai mic este domeniul comparativ cu URL-ul, rezult\u0103 c\u0103 este de aproximativ 4 ori mai mic. Dar dintr-un motiv oarecare, pe disc datele ocup\u0103 de 25 de ori mai pu\u021bin. De ce? Din cauza compresiei. At\u00e2t URL-urile, c\u00e2t \u0219i domeniile sunt comprimate. Dar adesea URL-urile con\u021bin o mul\u021bime de gunoi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/c93d2128a41561ed7abb25d77414bc2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i, desigur, ar trebui s\u0103 folosi\u021bi tipurile de date corecte, care sunt special concepute pentru valorile necesare sau care se potrivesc. Dac\u0103 ave\u021bi IPv4, p\u0103stra\u021bi-l ca UInt32*. Dac\u0103 este IPv6, utiliza\u021bi FixedString(16), pentru c\u0103 adresa IPv6 are 128 de bi\u021bi, adic\u0103 p\u0103stra\u021bi-o direct \u00een format binar. <\/p>\n<p><\/p>\n<p>Ce s\u0103 face\u021bi dac\u0103 ave\u021bi uneori adrese IPv4 \u0219i alteori IPv6? Da, pute\u021bi stoca ambele. O coloan\u0103 pentru IPv4, alta pentru IPv6. Desigur, exist\u0103 op\u021biunea de a map\u0103 IPv4 \u00een IPv6. Aceasta va func\u021biona de asemenea, dar dac\u0103 ave\u021bi nevoie adesea de adresa IPv4 \u00een interog\u0103ri, ar fi bine s\u0103 o pune\u021bi \u00eentr-o coloan\u0103 separat\u0103. <\/p>\n<p><\/p>\n<p>* Acum, \u00een ClickHouse exist\u0103 tipuri de date separate pentru IPv4 \u0219i IPv6, care stocheaz\u0103 datele la fel de eficient ca numerele, dar le prezint\u0103 la fel de comod ca \u0219i \u0219iruri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7d6342ebd6b8b4f3526b3cd8a06cf26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De asemenea, este important s\u0103 observa\u021bi c\u0103 datele ar trebui preprocesate \u00een avans. De exemplu, dac\u0103 primi\u021bi unele jurnale brute. \u0218i poate c\u0103 nu ar trebui s\u0103 le introduce\u021bi imediat \u00een ClickHouse, de\u0219i este foarte tentant s\u0103 nu face\u021bi nimic \u0219i s\u0103 func\u021bioneze totul. Totu\u0219i, este mai bine s\u0103 efectua\u021bi acele calcule posibile.<\/p>\n<p><\/p>\n<p>De exemplu, versiunea browserului. \u00centr-un alt departament din vecin\u0103tate, pe care nu vreau s\u0103-l indic cu degetul, versiunea browserului este p\u0103strat\u0103 astfel, adic\u0103 ca un \u0219ir: 12.3. Apoi, pentru a genera un raport, ei iau acest \u0219ir \u0219i \u00eel \u00eempart la un array, iar apoi la primul element al array-ului. Evident, totul se blocheaz\u0103. Am \u00eentrebat de ce fac asta. Ei mi-au r\u0103spuns c\u0103 nu le place optimizarea prematur\u0103. Eu nu iubesc, \u00een schimb, pesimismul prematur.<\/p>\n<p><\/p>\n<p>A\u0219adar, \u00een acest caz, ar fi mai corect s\u0103 \u00eemp\u0103r\u021bi\u021bi \u00een 4 coloane. Nu v\u0103 teme\u021bi, deoarece acesta este ClickHouse. ClickHouse este o baz\u0103 de date pe coloane. \u0218i cu c\u00e2t ave\u021bi mai multe coloane mici \u0219i \u00eengrijite, cu at\u00e2t mai bine. Dac\u0103 va fi 5 BrowserVersion, crea\u021bi 5 coloane. Este normal. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f9a67221bf8508933d7bd336b16f9e04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum s\u0103 lu\u0103m \u00een considerare ce s\u0103 face\u021bi dac\u0103 ave\u021bi multe \u0219iruri foarte lungi, foarte multe array-uri lungi. Nu ar trebui s\u0103 le p\u0103stra\u021bi \u00een ClickHouse deloc. \u00cen locul acesta, pute\u021bi s\u0103 salva\u021bi \u00een ClickHouse doar un identificator. Iar aceste \u0219iruri lungi s\u0103 le muta\u021bi \u00een vreun alt sistem. <\/p>\n<p><\/p>\n<p>De exemplu, \u00eentr-unul dintre serviciile noastre analitice, exist\u0103 anumite parametrii ai evenimentelor. \u0218i dac\u0103 la evenimente vin mul\u021bi parametri, pur \u0219i simplu p\u0103str\u0103m primele 512 \u00eent\u00e2lnite. Pentru c\u0103 512 nu este mult. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/755271e8788ba4bd638f493bf320c820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 nu v\u0103 pute\u021bi decide asupra tipurilor de date, atunci pute\u021bi de asemenea scrie datele \u00een ClickHouse, dar \u00eentr-o tabel\u0103 temporar\u0103, de tip Log, special pentru date temporare. Dup\u0103 aceea, pute\u021bi analiza ce distribu\u021bie a valorilor ave\u021bi acolo, ce exist\u0103 de fapt \u0219i s\u0103 compune\u021bi tipurile corecte.<\/p>\n<p><\/p>\n<p>* acum \u00een ClickHouse exist\u0103 un tip de date <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/data-types\/lowcardinality\/\">LowCardinality<\/a><\/noindex> care permite stocarea eficient\u0103 a \u0219irurilor cu un consum mai mic de resurse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7e9e53d86a4189783c28ce56a669198c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum s\u0103 lu\u0103m \u00een considerare un alt caz interesant. Uneori, lucrurile func\u021bioneaz\u0103 ciudat pentru oameni. Intru \u0219i v\u0103d a\u0219a ceva. \u0218i imediat \u00eemi imaginez c\u0103 acest lucru a fost f\u0103cut de un administrator foarte experimentat \u0219i inteligent, care are mult\u0103 experien\u021b\u0103 \u00een configurarea MySQL versiunea 3.23. <\/p>\n<p><\/p>\n<p>Aici vedem o mie de tabele, fiecare dintre ele av\u00e2nd scris restul unei \u00eemp\u0103r\u021biri neclare la o mie. <\/p>\n<p><\/p>\n<p>\u00cen principiu, respect experien\u021ba altora, inclusiv \u00een\u021beleg cu ce suferin\u021be a fost ob\u021binut\u0103 aceast\u0103 experien\u021b\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3a5e21ef2076966fcc627670485c5b3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iar motivele sunt mai mult sau mai pu\u021bin clare. Acestea sunt stereotipuri vechi care s-au acumulat \u00een urma lucrului cu alte sisteme. De exemplu, \u00een tabelele MyISAM nu exist\u0103 cheie primar\u0103 clusterizat\u0103. Iar aceast\u0103 metod\u0103 de separare a datelor poate fi o \u00eencercare disperat\u0103 de a ob\u021bine aceea\u0219i func\u021bionalitate. <\/p>\n<p><\/p>\n<p>O alt\u0103 cauz\u0103 este c\u0103 opera\u021bii de tip alter pe tabele mari sunt greu de realizat. Totul va fi blocat. Cu toate acestea, \u00een versiunile moderne ale MySQL, aceast\u0103 problem\u0103 nu mai este at\u00e2t de grav\u0103. <\/p>\n<p><\/p>\n<p>Sau, de exemplu, micro-sharding, dar despre asta pu\u021bin mai t\u00e2rziu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/321b1d9caa8db7aca5b96e08c61d05b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen ClickHouse nu este necesar s\u0103 proceda\u021bi astfel, deoarece, pe de o parte, cheia primar\u0103 este clusterizat\u0103, iar datele sunt ordonate dup\u0103 cheia primar\u0103. <\/p>\n<p><\/p>\n<p>\u0218i uneori m\u0103 \u00eentreab\u0103: \u201eCum se modific\u0103 performan\u021ba interog\u0103rilor pe interval \u00een ClickHouse \u00een func\u021bie de dimensiunea tabelului?\u201d. Eu spun c\u0103 nu se modific\u0103. De exemplu, ave\u021bi un tabel cu un miliard de r\u00e2nduri \u0219i citi\u021bi un interval de un milion de r\u00e2nduri. Totul este \u00een regul\u0103. Dac\u0103 tabelul are un trilion de r\u00e2nduri \u0219i citi\u021bi un milion de r\u00e2nduri, atunci va fi aproape la fel. <\/p>\n<p><\/p>\n<p>\u0218i, pe de alt\u0103 parte, nu sunt necesare lucruri precum parti\u021bii manuale. Dac\u0103 intra\u021bi \u0219i verifica\u021bi ce se \u00eent\u00e2mpl\u0103 \u00een sistemul de fi\u0219iere, ve\u021bi observa c\u0103 tabelul este o entitate destul de serioas\u0103. \u0218i acolo \u00een interior exist\u0103 ceva asem\u0103n\u0103tor partitiilor. Adic\u0103, ClickHouse face totul pentru dumneavoastr\u0103 \u0219i nu trebuie s\u0103 suferi\u021bi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/652f3742ad3a44f172d0d7302abd09f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alter \u00een ClickHouse este gratuit, dac\u0103 se face add\/drop column. <\/p>\n<p><\/p>\n<p>\u0218i nu este bine s\u0103 ave\u021bi tabele mici, pentru c\u0103 dac\u0103 ave\u021bi 10 r\u00e2nduri sau 10.000 de r\u00e2nduri \u00een tabel, acest lucru nu conteaz\u0103 deloc. ClickHouse este un sistem care optimizeaz\u0103 throughput-ul, nu laten\u021ba, astfel c\u0103 procesarea a 10 r\u00e2nduri nu are sens. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/144144b4740e9c5daec80c8dadc445f9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este corect s\u0103 folosi\u021bi un singur tabel mare. Sc\u0103pa\u021bi de stereotipurile vechi, totul va fi bine. <\/p>\n<p><\/p>\n<p>\u0218i ca bonus, \u00een ultima versiune am introdus posibilitatea de a crea o cheie de parti\u021bionare arbitrar\u0103 pentru a putea efectua diverse opera\u021bii de \u00eentre\u021binere asupra parti\u021biilor individuale. <\/p>\n<p><\/p>\n<p>De exemplu, ave\u021bi nevoie de multe tabele mici, de exemplu, atunci c\u00e2nd este necesar s\u0103 procesa\u021bi anumite date intermediare, primi\u021bi buc\u0103\u021bi \u0219i trebuie s\u0103 efectua\u021bi transform\u0103ri asupra lor \u00eenainte de a le scrie \u00een tabela final\u0103. Pentru acest caz, exist\u0103 un motor excelent pentru tabele \u2013 StripeLog. Este cam ca TinyLog, doar c\u0103 mai bun. <\/p>\n<p><\/p>\n<p>* Acum \u00een ClickHouse exist\u0103 \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/table-functions\/input\/\">func\u021bia de tabel input<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d62f0b3d29876c29c6c0ba236b200186.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 antipattern este microsharding. De exemplu, trebuie s\u0103 shard-ui\u021bi datele \u0219i ave\u021bi 5 servere, iar m\u00e2ine vor fi 6 servere. \u0218i v\u0103 g\u00e2ndi\u021bi cum s\u0103 reechilibra\u021bi aceste date. \u0218i \u00een loc s\u0103 le \u00eemp\u0103r\u021bi\u021bi \u00een 5 sharding-uri, le \u00eemp\u0103r\u021bi\u021bi \u00een 1 000 sharding-uri. Apoi, fiecare dintre aceste microsharding-uri este mapat pe un server separat. \u0218i, de exemplu, pe un singur server ve\u021bi avea 200 ClickHouse, fiecare instan\u021b\u0103 pe porturi separate sau baze de date separate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3e550ef7e338b84e4394eb9fa4538769.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar \u00een ClickHouse, acest lucru nu este foarte bine. Deoarece chiar \u0219i o singur\u0103 instan\u021b\u0103 ClickHouse \u00eencearc\u0103 s\u0103 utilizeze toate resursele disponibile ale serverului pentru a procesa o singur\u0103 interogare. Adic\u0103, ave\u021bi un server care, de exemplu, dispune de 56 de nuclee de procesor. Rula\u021bi o interogare care dureaz\u0103 o secund\u0103 \u0219i va utiliza cele 56 de nuclee. Iar dac\u0103 a\u021bi plasat 200 ClickHouse pe un singur server, atunci vor fi lansate 10 000 de fire. \u00cen concluzie, totul va decurge foarte prost.<\/p>\n<p><\/p>\n<p>O alt\u0103 cauz\u0103 este c\u0103 distribu\u021bia muncii \u00eentre aceste instan\u021be va fi inegal\u0103. Unele vor termina mai devreme, altele mai t\u00e2rziu. Dac\u0103 totul ar avea loc \u00eentr-o singur\u0103 instan\u021b\u0103, ClickHouse ar \u0219ti cum s\u0103 distribuie corect datele \u00eentre fire. <\/p>\n<p><\/p>\n<p>\u0218i \u00eenc\u0103 o cauz\u0103 este c\u0103 va exista interac\u021biune \u00eentre procesoare prin TCP. Datele vor trebui s\u0103 fie serializate, deserializate \u0219i acest num\u0103r mare de microsharding-uri este pur \u0219i simplu ineficient.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/18cacc17d22ae1cb2977c6be74769896.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 antipattern, de\u0219i este greu de numit a\u0219a. Este un num\u0103r mare de pre-agregare.<\/p>\n<p><\/p>\n<p>\u00cen general, pre-agregarea este o idee bun\u0103. A\u021bi avut un miliard de r\u00e2nduri, le-a\u021bi agregat \u0219i au devenit 1 000 de r\u00e2nduri, iar acum interogarea se execut\u0103 instantaneu. Totul este minunat. A\u0219a se poate face. \u0218i pentru asta, chiar \u0219i \u00een ClickHouse exist\u0103 un tip special de tabel AggregatingMergeTree, care face agregare incremental\u0103 pe m\u0103sur\u0103 ce datele sunt inserate. <\/p>\n<p><\/p>\n<p>Dar exist\u0103 cazuri \u00een care crede\u021bi c\u0103 vom agrega datele astfel \u0219i \u00eenc\u0103 astfel. \u0218i \u00eentr-un departament vecin, nu vreau s\u0103 spun care, folosesc tabelele SummingMergeTree pentru a suma dup\u0103 cheia primar\u0103, iar ca cheie primar\u0103 utilizeaz\u0103 vreo 20 de coloane. Am schimbat numele unor coloane pentru a p\u0103stra confiden\u021bialitatea, dar cam a\u0219a este.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/54e3a02ab4bbce7c63ded595780ae1f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i apar astfel de probleme. \u00cen primul r\u00e2nd, volumul de date nu se reduce prea mult. De exemplu, se reduce de trei ori. De trei ori \u2013 ar fi fost un pre\u021b bun pentru a avea posibilit\u0103\u021bi nelimitate pentru analiz\u0103, care apar atunci c\u00e2nd datele nu sunt agregate. Dac\u0103 datele sunt agregate, atunci \u00een loc de analiz\u0103 ob\u021bine\u021bi doar o statistic\u0103 lamentabil\u0103. <\/p>\n<p><\/p>\n<p>\u0218i ce deranjeaz\u0103 \u00een special? C\u0103 ace\u0219ti oameni din departamentul vecin vin \u0219i cer uneori s\u0103 adauge \u00eenc\u0103 o coloan\u0103 \u00een cheia primar\u0103. Adic\u0103, am agregat datele astfel, iar acum vrem pu\u021bin mai mult. Dar \u00een ClickHouse nu exist\u0103 alterare a cheii primare. A\u0219a c\u0103 trebuie s\u0103 scriem diverse scripturi \u00een C++. \u0218i nu \u00eemi plac scripturile, nici m\u0103car cele \u00een C++.<\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 ne uit\u0103m pentru ce a fost creat ClickHouse, datele neagregate sunt exact scenariul pentru care a fost conceput. Dac\u0103 folosi\u021bi ClickHouse pentru date neagregate, face\u021bi totul corect. Dac\u0103 agrega\u021bi, atunci este uneori iertabil. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/09fafd4c8a3ea8c22e586cb7a5cf6564.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 situa\u021bie interesant\u0103 este cererile \u00eentr-un ciclu infinit. Uneori intru pe un server de produc\u021bie \u0219i m\u0103 uit la show processlist. \u0218i de fiecare dat\u0103 descop\u0103r c\u0103 se \u00eent\u00e2mpl\u0103 ceva teribil. <\/p>\n<p><\/p>\n<p>De exemplu, a\u0219a. Aici este clar c\u0103 totul putea fi executat \u00eentr-o singur\u0103 cerere. Pur \u0219i simplu scrie\u021bi acolo url in \u0219i lista.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae03b659f178962f50e0640614517296.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De ce sunt at\u00e2t de multe cereri \u00eentr-un ciclu infinit \u2013 este r\u0103u? Dac\u0103 indexul nu este folosit, ve\u021bi avea multe treceri prin acelea\u0219i date. Dar dac\u0103 indexul este folosit, de exemplu, ave\u021bi o cheie primar\u0103 pe ru \u0219i scrie\u021bi url = ceva anume. \u0218i crede\u021bi c\u0103 va fi citit din tabel un singur url, va fi totul \u00een regul\u0103. Dar de fapt nu este a\u0219a. Pentru c\u0103 ClickHouse face totul pe grupuri. <\/p>\n<p><\/p>\n<p>C\u00e2nd trebuie s\u0103 citeasc\u0103 un anumit interval de date, cite\u0219te pu\u021bin mai mult, deoarece indexul \u00een ClickHouse este sparse. Acest index nu permite g\u0103sirea unei singure linii \u00een tabel, ci doar a unui anumit interval. Iar datele sunt comprimate pe blocuri. Pentru a citi o linie, trebuie s\u0103 iei \u00eentregul bloc \u0219i s\u0103-l decomprimi. \u0218i dac\u0103 face\u021bi o mul\u021bime de interog\u0103ri, ve\u021bi avea multe suprapuneri \u0219i o mul\u021bime de munc\u0103 va fi efectuat\u0103 din nou \u0219i din nou.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/95eef43c5b869f8b145c61ce3c616cfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i ca bonus, se poate observa c\u0103 \u00een ClickHouse nu trebuie s\u0103 v\u0103 fie fric\u0103 s\u0103 transmite\u021bi chiar \u0219i megabyte \u0219i sute de megabyte \u00een sec\u021biunea IN. \u00cemi amintesc din practica noastr\u0103 c\u0103, dac\u0103 \u00een MySQL transmitem o mul\u021bime de valori \u00een sec\u021biunea IN, de exemplu, 100 de megabytes de numere, MySQL consum\u0103 10 gigabytes de memorie \u0219i nimic mai mult nu se \u00eent\u00e2mpl\u0103, totul func\u021bioneaz\u0103 prost. <\/p>\n<p><\/p>\n<p>Iar al doilea aspect este c\u0103, \u00een ClickHouse, dac\u0103 interog\u0103rile dvs. folosesc indexul, atunci aceasta nu este niciodat\u0103 mai lent dec\u00e2t o scanare complet\u0103, adic\u0103, dac\u0103 trebuie s\u0103 citi\u021bi aproape \u00eentregul tabel, acesta va merge secven\u021bial \u0219i va citi \u00eentregul tabel. \u00cen general, se va descurca singur.<\/p>\n<p><\/p>\n<p>Dar totu\u0219i exist\u0103 unele dificult\u0103\u021bi. De exemplu, faptul c\u0103 IN cu subinterogarea nu folose\u0219te indexul. Dar aceasta este problema noastr\u0103 \u0219i trebuie s\u0103 o corect\u0103m. Nu este nimic fundamental aici. O s\u0103 repar\u0103m. <\/p>\n<p><\/p>\n<p>Iar o alt\u0103 chestiune interesant\u0103 este c\u0103, dac\u0103 ave\u021bi o interogare foarte lung\u0103 \u0219i procesarea distribuit\u0103 a interog\u0103rilor are loc, atunci aceast\u0103 interogare foarte lung\u0103 va fi trimis\u0103 pe fiecare server f\u0103r\u0103 compresie. De exemplu, 100 de megabytes \u0219i 500 de servere. \u0218i, \u00een consecin\u021b\u0103, 50 de gigabytes vor fi transmise prin re\u021bea. Va fi transmis \u0219i apoi totul se va finaliza cu succes.<\/p>\n<p><\/p>\n<p>* deja folose\u0219te; totul a fost reparat, a\u0219a cum am promis.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/5fcde9bf04fff0645be2530daa12743f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i este un caz destul de frecvent ca interog\u0103rile s\u0103 vin\u0103 din API. De exemplu, a\u021bi creat un serviciu propriu. \u0218i dac\u0103 serviciul dvs. este necesar cuiva, a\u021bi deschis API-ul \u0219i, aproape imediat, dup\u0103 dou\u0103 zile vede\u021bi c\u0103 se \u00eent\u00e2mpl\u0103 ceva neclar. Totul este supra\u00eenc\u0103rcat \u0219i vin unele interog\u0103ri teribile care nu ar fi trebuit s\u0103 existe niciodat\u0103. <\/p>\n<p><\/p>\n<p>\u0218i solu\u021bia aici este una. Dac\u0103 a\u021bi deschis API-ul, va trebui s\u0103-l restric\u021biona\u021bi. De exemplu, s\u0103 introduce\u021bi ni\u0219te cote. Nu exist\u0103 alte op\u021biuni normale. Altfel, imediat vor scrie un script \u0219i vor ap\u0103rea probleme. <\/p>\n<p><\/p>\n<p>\u0218i ClickHouse are o capacitate special\u0103 \u2013 calcularea cotelor. De asemenea, po\u021bi transmite cheia ta de cot\u0103. De exemplu, un identificator intern al utilizatorului. \u0218i cotele vor fi calculate independent pentru fiecare dintre ele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/532438d0f116919e62f04e32ebbd3c45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum, un alt lucru interesant. Este replicarea manual\u0103. <\/p>\n<p><\/p>\n<p>\u0218tiu multe cazuri \u00een care, de\u0219i ClickHouse are suport \u00eencorporat pentru replicare, oamenii replic\u0103 ClickHouse manual.<\/p>\n<p><\/p>\n<p>Care este principiul? Ai un pipeline de procesare a datelor. \u0218i func\u021bioneaz\u0103 independent, de exemplu, \u00een centre de date diferite. Scrii acelea\u0219i date \u00een acela\u0219i mod \u00een ClickHouse. Totu\u0219i, practica arat\u0103 c\u0103 datele tot vor diverge din cauza anumitor particularit\u0103\u021bi din codul t\u0103u. Sper c\u0103 nu \u00eei ai. <\/p>\n<p><\/p>\n<p>\u0218i periodic va trebui s\u0103 sincronizezi manual. De exemplu, o dat\u0103 pe lun\u0103, administratorii fac rsync.<\/p>\n<p><\/p>\n<p>De fapt, este mult mai simplu s\u0103 folose\u0219ti replicarea \u00eencorporat\u0103 \u00een ClickHouse. Dar aici pot exista unele contraindica\u021bii, deoarece pentru asta trebuie s\u0103 folose\u0219ti ZooKeeper. Nu am nimic r\u0103u de spus despre ZooKeeper; \u00een principiu, sistemul func\u021bioneaz\u0103, dar uneori oamenii nu \u00eel folosesc din cauza fobiei de Java, deoarece ClickHouse este un sistem bun, scris \u00een C++, care poate fi utilizat \u0219i va func\u021biona excelent. Iar ZooKeeper este pe Java. \u0218i cumva, nici nu vrei s\u0103 te ui\u021bi, dar po\u021bi folosi replicarea manual\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3b5b68996daef6b8920f067b189f25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse este un sistem practic. Ia \u00een considerare nevoile tale. Dac\u0103 ai replicare manual\u0103, po\u021bi crea o tabel\u0103 Distribuit\u0103 care se uit\u0103 la replicile tale manuale \u0219i face failover \u00eentre ele. Exist\u0103 chiar \u0219i o op\u021biune special\u0103 care permite evitarea flapping-urilor, chiar dac\u0103 replicile tale deviaz\u0103 sistematic.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/70f6630f8b14756163923a7db8dd7391.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apoi pot ap\u0103rea probleme dac\u0103 folose\u0219ti motoare de tabel primitive. ClickHouse este un constructor care are o mul\u021bime de motoare de tabele diferite. Pentru toate cazurile serioase, a\u0219a cum este scris \u00een documenta\u021bie, folose\u0219te tabele din familia MergeTree. Iar celelalte sunt doar pentru cazuri specifice sau pentru teste.<\/p>\n<p><\/p>\n<p>\u00cen tabelul MergeTree nu este obligatoriu s\u0103 ai o dat\u0103 \u0219i o or\u0103. Po\u021bi folosi oricum. Dac\u0103 nu ai dat\u0103 \u0219i or\u0103, scrie c\u0103 default \u2013 2000. Aceasta va func\u021biona \u0219i nu va necesita resurse. <\/p>\n<p><\/p>\n<p>\u00cen noua versiune a serverului, po\u021bi chiar s\u0103 specifici c\u0103 vrei o particionare personalizat\u0103 f\u0103r\u0103 o cheie de parti\u021bie. Va fi la fel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6d4046d11afdd1e5962d49a1612b666a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pe de alt\u0103 parte, po\u021bi folosi motoare de tabele primitiv. De exemplu, po\u021bi \u00eenc\u0103rca datele o dat\u0103 \u0219i apoi s\u0103 le vizualizezi, s\u0103 le manipulezi \u0219i s\u0103 le \u0219tergi. Po\u021bi folosi Log.<\/p>\n<p><\/p>\n<p>Sau stocarea unor cantit\u0103\u021bi mici pentru procesare intermediar\u0103 \u2013 este StripeLog sau TinyLog.<\/p>\n<p><\/p>\n<p>Memory poate fi utilizat dac\u0103 ai o cantitate mic\u0103 de date \u0219i vrei doar s\u0103 manipulezi ceva \u00een RAM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8a3d4e0e3a8c26dd3a2b2f64123e2bf9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse nu prea-i place datele supranormalizate. <\/p>\n<p><\/p>\n<p>Iat\u0103 un exemplu tipic. Este un num\u0103r uria\u0219 de URL-uri. Le-ai pus \u00eentr-un tabel adiacent. Apoi ai decis s\u0103 faci JOIN cu ele, dar nu va func\u021biona, de obicei, pentru c\u0103 ClickHouse suport\u0103 doar Hash JOIN. Dac\u0103 nu ai suficient\u0103 RAM pentru cantitatea de date cu care trebuie s\u0103 faci conexiuni, nu vei putea realiza JOIN-ul*. <\/p>\n<p><\/p>\n<p>Dac\u0103 datele au o cardinalitate mare, nu te stresa, stocheaz\u0103-le \u00een form\u0103 denormalizat\u0103, URL-urile direct \u00een tabelul principal. <\/p>\n<p><\/p>\n<p>* De acum, ClickHouse are \u0219i merge join, care func\u021bioneaz\u0103 \u00een condi\u021bii c\u00e2nd datele intermediare nu \u00eencap \u00een RAM. Dar aceasta este ineficient \u0219i recomandarea r\u0103m\u00e2ne valabil\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/e8160a8db17c18d48f810092c55b094c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cenc\u0103 c\u00e2teva exemple, dar m\u0103 \u00eendoiesc dac\u0103 sunt anti-modele sau nu. <\/p>\n<p><\/p>\n<p>\u00cen ClickHouse exist\u0103 un dezavantaj cunoscut. Nu suport\u0103 actualiz\u0103ri*. \u00centr-un fel, acesta este un lucru bun. Dac\u0103 ai date importante, de exemplu, contabilitate, nimeni nu le poate modifica, deoarece nu exist\u0103 actualiz\u0103ri.<\/p>\n<p><\/p>\n<p>* suportul pentru update \u0219i delete \u00een mod batch este deja disponibil de mult timp.<\/p>\n<p><\/p>\n<p>Dar exist\u0103 unele modalit\u0103\u021bi speciale care permit actualiz\u0103rile s\u0103 fie f\u0103cute ca \u0219i cum ar fi \u00een fundal. De exemplu, tabelele de tip ReplaceMergeTree. Ele fac actualiz\u0103ri \u00een timpul fuziunilor de fundal. Po\u021bi for\u021ba acest proces folosind optimize table. Dar nu face asta prea des, pentru c\u0103 va fi o rescriere complet\u0103 a parti\u021biei. <\/p>\n<p><\/p>\n<p>JOIN-urile distribuite \u00een ClickHouse sunt, de asemenea, slab gestionate de planificatorul de interog\u0103ri. <\/p>\n<p><\/p>\n<p>Slab, dar uneori acceptabil.<\/p>\n<p><\/p>\n<p>Folosirea ClickHouse numai pentru a citi datele \u00eenapoi cu ajutorul select*.<\/p>\n<p><\/p>\n<p>Nu a\u0219 recomanda utilizarea ClickHouse pentru calcule complexe. Totu\u0219i, lucrurile s-au schimbat pu\u021bin, deoarece ne \u00eendep\u0103rt\u0103m de aceast\u0103 recomandare. Recent, am ad\u0103ugat posibilitatea de a aplica modele de \u00eenv\u0103\u021bare automat\u0103 \u00een ClickHouse \u2013 Catboost. Acest lucru m\u0103 \u00eengrijoreaz\u0103, pentru c\u0103 m\u0103 g\u00e2ndesc: \u201eCe groaznic. C\u00e2te cicluri pe octet facem aici!\u201d. \u00cemi pare foarte r\u0103u s\u0103 risipesc cicluri pe octe\u021bi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Utilizarea eficient\u0103 a ClickHouse. Alexei Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f686d5d352ccb444cd06e2ae68897137.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar nu v\u0103 teme\u021bi, instala\u021bi ClickHouse, totul va fi bine. \u0218i dac\u0103 ave\u021bi probleme, ave\u021bi comunitatea noastr\u0103. Apropo, comunitatea sunte\u021bi voi. Dac\u0103 ave\u021bi vreo problem\u0103, pute\u021bi s\u0103 intra\u021bi \u00een chatul nostru \u0219i, sper, s\u0103 primi\u021bi ajutor. <\/p>\n<p><\/p>\n<p>\u00centreb\u0103ri<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare! Unde pot face pl\u00e2ngere pentru c\u0103derea ClickHouse?<\/em><\/p>\n<p><\/p>\n<p>Pute\u021bi s\u0103 v\u0103 pl\u00e2nge\u021bi direct mie chiar acum. <\/p>\n<p><\/p>\n<p><em>Recent am \u00eenceput s\u0103 folosesc ClickHouse. Imediat am c\u0103zut cli-ul.<\/em><\/p>\n<p><\/p>\n<p>A\u021bi avut noroc. <\/p>\n<p><\/p>\n<p><em>Pu\u021bin mai t\u00e2rziu, am c\u0103zut serverul cu un select mic.<\/em><\/p>\n<p><\/p>\n<p>Ave\u021bi talent. <\/p>\n<p><\/p>\n<p><em>Am deschis un bug pe GitHub, dar a fost ignorat.<\/em> <\/p>\n<p><\/p>\n<p>S\u0103 vedem. <\/p>\n<p><\/p>\n<p><em>Alexey m-a adus cu viclenie la prezentare, promi\u021b\u00e2nd c\u0103 va vorbi despre cum \u00eenghesui\u021bi datele.<\/em><\/p>\n<p><\/p>\n<p>Foarte simplu. <\/p>\n<p><\/p>\n<p><em>Asta am realizat \u00eenc\u0103 de ieri. Mai multe detalii.<\/em> <\/p>\n<p><\/p>\n<p>Nu sunt trucuri groaznice. Este pur \u0219i simplu o comprimare pe blocuri. Din default se folose\u0219te LZ4; se poate activa ZSTD*. Blocurile variaz\u0103 de la 64 de kilobyte la 1 megabyte.<\/p>\n<p><\/p>\n<p>* exist\u0103 suport pentru codecuri specializate de comprimare care pot fi utilizate \u00een lan\u021b cu alte algoritmi.<\/p>\n<p><\/p>\n<p><em>\u00cen blocuri sunt doar date brute?<\/em><\/p>\n<p><\/p>\n<p>Nu tocmai brute. Acolo sunt array-uri. Dac\u0103 ave\u021bi o coloan\u0103 numeric\u0103, numerele sunt stocate \u00eentr-un array unul dup\u0103 altul. <\/p>\n<p><\/p>\n<p><em>\u00cen\u021beles.<\/em> <\/p>\n<p><\/p>\n<p><em>Alexey, exemplul pe care l-a\u021bi avut cu uniqExact pe adrese IP, adic\u0103 ceea ce a\u021bi spus c\u0103 uniqExact pe \u0219iruri se calculeaz\u0103 mai lent dec\u00e2t pe numere etc. \u0218i dac\u0103 aplic\u0103m un truc \u0219i facem conversia \u00een timpul citirii? Adic\u0103, a\u021bi spus c\u0103 pe disc nu se deosebe\u0219te prea mult. Dac\u0103 citim \u0219irurile de pe disc, facem conversia, atunci agregatele noastre vor fi mai rapide sau nu? Sau totu\u0219i nu vom c\u00e2\u0219tiga semnificativ aici? Mi se pare c\u0103 a\u021bi testat asta, dar dintr-un motiv oarecare nu a\u021bi men\u021bionat \u00een benchmark.<\/em> <\/p>\n<p><\/p>\n<p>Cred c\u0103 va fi mai lent dec\u00e2t f\u0103r\u0103 cast. \u00cen acest caz, adresa IP trebuie s\u0103 fie extras\u0103 din \u0219ir. Desigur, \u00een ClickHouse, parsarea adreselor IP este optimizat\u0103. Am \u00eencercat foarte mult, dar acolo ave\u021bi numerele scrise \u00een forma zecimal\u0103. Foarte incomod. Pe de alt\u0103 parte, func\u021bia uniqExact va func\u021biona mai lent pe \u0219iruri nu doar pentru c\u0103 sunt \u0219iruri, ci \u0219i pentru c\u0103 se alege o alt\u0103 specializare a algoritmului. \u0218irurile sunt procesate complet diferit.<\/p>\n<p><\/p>\n<p><em>Dar dac\u0103 lu\u0103m un tip de date mai primitiv? De exemplu, am scris user id-ul, care este \u00een, l-am scris ca pe un \u0219ir \u0219i apoi l-am convertit, va fi mai distractiv sau nu?<\/em><\/p>\n<p><\/p>\n<p>M\u0103 \u00eendoiesc. Cred c\u0103 va fi chiar mai trist, pentru c\u0103, totu\u0219i, parsarea numerelor este o problem\u0103 serioas\u0103. Mi se pare c\u0103 acest coleg a avut chiar o prezentare despre c\u00e2t de greu este s\u0103 parsem numere \u00een forma zecimal\u0103, dar poate c\u0103 nu. <\/p>\n<p><\/p>\n<p><em>Alexey, mul\u021bumesc foarte mult pentru prezentare! \u0218i, de asemenea, mul\u021bumesc pentru ClickHouse! Am o \u00eentrebare legat\u0103 de planuri. Exist\u0103 planuri pentru o func\u021bionalitate de actualizare a dic\u021bionarelor par\u021bial?<\/em><\/p>\n<p><\/p>\n<p>Adic\u0103, re\u00eenc\u0103rcare par\u021bial\u0103?<\/p>\n<p><\/p>\n<p><em>Da-da. O posibilitate de a specifica acolo un c\u00e2mp MySQL, adic\u0103 de a actualiza dup\u0103, pentru a \u00eenc\u0103rca doar acele date, dac\u0103 dic\u021bionarul este foarte mare.<\/em><\/p>\n<p><\/p>\n<p>O caracteristic\u0103 foarte interesant\u0103. \u0218i, mi se pare, cineva a propus-o \u00een chat-ul nostru. Poate chiar a\u021bi fost dumneavoastr\u0103. <\/p>\n<p><\/p>\n<p><em>Nu cred c\u0103 eu.<\/em><\/p>\n<p><\/p>\n<p>Excelent, acum se dovede\u0219te c\u0103 sunt dou\u0103 cereri. \u0218i putem \u00eencepe cu calm. Dar vreau s\u0103 v\u0103 avertizez imediat c\u0103 aceast\u0103 caracteristic\u0103 este destul de simpl\u0103 de implementat. Adic\u0103, \u00een principiu, trebuie doar s\u0103 scrie\u021bi un num\u0103r de versiune \u00een tabel \u0219i apoi s\u0103 scrie\u021bi: versiunea este mai mic\u0103 dec\u00e2t asta. \u0218i asta \u00eenseamn\u0103 c\u0103, cel mai probabil, vom propune s\u0103 facem asta entuzia\u0219tilor. Sunte\u021bi entuziast? <\/p>\n<p><\/p>\n<p><em>Da, dar, din p\u0103cate, nu \u00een C++.<\/em><\/p>\n<p><\/p>\n<p>Colegul vostru \u0219tie s\u0103 scrie \u00een C++? <\/p>\n<p><\/p>\n<p><em>O s\u0103 g\u0103sesc pe cineva.<\/em><\/p>\n<p><\/p>\n<p>Excelent*.<\/p>\n<p><\/p>\n<p>* posibilitatea a fost ad\u0103ugat\u0103 la dou\u0103 luni dup\u0103 prezentare \u2013 a fost dezvoltat\u0103 de autorul \u00eentreb\u0103rii \u0219i trimis\u0103. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/pull\/1771\">pull request<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc!<\/em><\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! V\u0103 mul\u021bumesc pentru prezentare! A\u021bi men\u021bionat c\u0103 ClickHouse consum\u0103 foarte bine toate resursele disponibile. Iar prezentatorul de l\u00e2ng\u0103 Luxoft a vorbit despre solu\u021bia sa pentru Po\u0219ta Rus\u0103. El a spus c\u0103 le-a pl\u0103cut foarte mult ClickHouse, dar nu l-au folosit \u00een locul principalului lor competitor tocmai pentru c\u0103 consuma tot procesorul. \u0218i nu au putut s\u0103-l integreze \u00een arhitectura lor, \u00een ZooKeeper-ul lor cu containere. Exist\u0103 vreo posibilitate de a limita somehow ClickHouse, astfel \u00eenc\u00e2t s\u0103 nu consume tot ce \u00eei devine disponibil?<\/em><\/p>\n<p><\/p>\n<p>Da, se poate \u0219i foarte u\u0219or. Dac\u0103 dori\u021bi s\u0103 consume mai pu\u021bine nuclee, pur \u0219i simplu scrie\u021bi <code>set max_threads = 1<\/code>. \u0218i gata, va executa cererea pe un singur nucleu. De altfel, pute\u021bi specifica utilizatori diferi\u021bi pentru aceast\u0103 setare. A\u0219a c\u0103 nu sunt probleme. \u0218i colegilor de la Luxoft transmite\u021bi c\u0103 nu e bine c\u0103 nu au g\u0103sit aceast\u0103 setare \u00een documenta\u021bie. <\/p>\n<p><\/p>\n<p><em>Alexey, bun\u0103 ziua! A\u0219 dori s\u0103 \u00eentreb un astfel de lucru. Nu pentru prima dat\u0103 aud c\u0103 mul\u021bi \u00eencep s\u0103 foloseasc\u0103 ClickHouse ca depozit pentru loguri. La prezentare a\u021bi spus c\u0103 nu trebuie s\u0103 facem asta, adic\u0103 nu trebuie s\u0103 stoc\u0103m \u0219iruri lungi. Ce p\u0103rere ave\u021bi despre asta?<\/em><\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, logurile nu sunt, de obicei, \u0219iruri lungi. Exist\u0103, desigur, excep\u021bii. De exemplu, un serviciu scris \u00een Java arunc\u0103 excep\u021bii, care sunt \u00eenregistrate. \u0218i a\u0219a \u00eentr-un ciclu infinit, termin\u00e2nd spa\u021biul pe discul dur. Solu\u021bia este foarte simpl\u0103. Dac\u0103 \u0219irurile sunt foarte lungi, atunci t\u0103ia\u021bi-le. Ce \u00eenseamn\u0103 lungi? Zecile de kilobi\u021bi \u2013 aceasta este o problem\u0103.*<\/p>\n<p><\/p>\n<p>* \u00een versiunile recente ale ClickHouse, a fost inclus\u0103 &quot;granularitatea adaptiv\u0103 a indexului&quot;, ceea ce rezolv\u0103 problema stoc\u0103rii \u0219irurilor lungi \u00een cea mai mare parte.<\/p>\n<p><\/p>\n<p><em>Dar un kilobit este ok?<\/em><\/p>\n<p><\/p>\n<p>Ok. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! V\u0103 mul\u021bumesc pentru prezentare! Am \u00eentrebat deja despre asta \u00een chat, dar nu-mi amintesc dac\u0103 am primit un r\u0103spuns. Se planific\u0103 extinderea sec\u021biunii WITH \u00een stil CTE?<\/em><\/p>\n<p><\/p>\n<p>Deocamdat\u0103 nu. Sec\u021biunea WITH este oarecum neserioas\u0103. Este o caracteristic\u0103 mic\u0103.<\/p>\n<p><\/p>\n<p><em>Am \u00een\u021beles. Mul\u021bumesc!<\/em><\/p>\n<p><\/p>\n<p><em>V\u0103 mul\u021bumesc pentru prezentare! Foarte interesant! O \u00eentrebare global\u0103. Se planific\u0103 s\u0103 facem, poate, o modificare a elimin\u0103rii datelor sub form\u0103 de anumite stub-uri?<\/em><\/p>\n<p><\/p>\n<p>Cu siguran\u021b\u0103. Aceasta este prima noastr\u0103 sarcin\u0103 pe lista noastr\u0103. Acum ne g\u00e2ndim activ la cum s\u0103 facem totul corect. \u0218i ar trebui s\u0103 \u00eencepem s\u0103 ap\u0103s\u0103m pe tastatur\u0103*.<\/p>\n<p><\/p>\n<p>* am ap\u0103sat taste pe tastatur\u0103 \u0219i am f\u0103cut totul.<\/p>\n<p><\/p>\n<p><em>Va afecta asta cumva performan\u021ba sistemului sau nu? Inserarea va fi la fel de rapid\u0103 ca acum?<\/em><\/p>\n<p><\/p>\n<p>Poate c\u0103 delete-urile \u0219i update-urile \u00een sine vor fi foarte grele, dar asta nu va afecta performan\u021ba select-urilor \u0219i performan\u021ba insert-urilor.<\/p>\n<p><\/p>\n<p><em>\u0218i \u00eenc\u0103 o \u00eentrebare mic\u0103. La prezentare a\u021bi vorbit despre cheia primar\u0103. Deci, avem parti\u021bionare care, implicit, sunt lunare, corect? \u0218i c\u00e2nd definim un interval de date care se \u00eencadreaz\u0103 \u00eentr-o lun\u0103, atunci se cite\u0219te doar aceast\u0103 parti\u021bie, nu-i a\u0219a?<\/em><\/p>\n<p><\/p>\n<p>Da.<\/p>\n<p><\/p>\n<p><em>Am o \u00eentrebare. Dac\u0103 nu putem identifica o cheie primar\u0103, este corect s\u0103 o facem pe baza c\u00e2mpului \u201eDat\u0103\u201d pentru a reduce reorganizarea acestor date \u00een fundal, astfel \u00eenc\u00e2t s\u0103 fie mai ordonate? Dac\u0103 nu ave\u021bi cereri pe baze de interval \u0219i niciun fel de cheie primar\u0103, merit\u0103 s\u0103 includem data \u00een cheia primar\u0103?<\/em><\/p>\n<p><\/p>\n<p>Da.<\/p>\n<p><\/p>\n<p>Poate c\u0103 are sens s\u0103 incluzi \u00een cheia primar\u0103 un c\u00e2mp pe baza c\u0103ruia datele se vor comprima mai bine, dac\u0103 acestea sunt sortate dup\u0103 acest c\u00e2mp. De exemplu, identificatorul utilizatorului. Utilizatorul, de exemplu, acceseaz\u0103 acela\u0219i site. \u00cen acest caz, incluzi id-ul utilizatorului \u0219i timpul. Astfel, datele tale se vor comprima mai bine. \u00cen ceea ce prive\u0219te data, dac\u0103 nu ave\u021bi \u0219i nu ve\u021bi avea niciodat\u0103 cereri pe interval de date, nu este nevoie s\u0103 include\u021bi data \u00een cheia primar\u0103. <\/p>\n<p><\/p>\n<p><em>Bine, mul\u021bumesc mult!<\/em><\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/514840\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91439,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Utilizarea eficient\u0103 a ClickHouse. Alexey Milovido (Yandex) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-13T17:42:36+00:00","article:modified_time":"2020-08-13T17:42:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91438","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:27:23","updated":"2022-09-28 17:25:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/91438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=91438"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/91438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/91439"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=91438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=91438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=91438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}