Aprillis kogunesid Avito insenerid veebikohtumisele ClickHouse peaarendaja Aleksei Milovidovi ja Integrosest pĂ€rit Golang arendaja Kirill Shvakoviga. Arutati, kuidas me kasutame andmebaasisĂŒsteemi ja milliseid raskusi meile tekib.
Koosoleku pĂ”hjal oleme kokku pannud artikli ekspertide vastustega meie ja vaatajate kĂŒsimustele varukoopiate, andmete reshardingu, vĂ€listes sĂ”nastikes, Golang draiveris ja ClickHouse versioonide uuendamises. See vĂ”iks olla kasulik arendajatele, kes juba aktiivselt töötavad Yandexi andmebaasisĂŒsteemiga ja huvituvad selle praegusest ja tulevikust. Aleksei Milovidovi vastused on vaikimisi, kui ei ole mĂ€rgitud teisiti.
Olge ettevaatlik, sest allpool on palju teksti. Loodame, et kĂŒsimustega sisu aitab teil orientiirida.

Sisu
Kui teksti lugemine ei huvi, saab vaadata koosolekute salvestust . Aja koodid on video all olevas esimeses kommentaaris.
ClickHouse uuendatakse pidevalt, kuid meie andmed ei uuene. Mida sellega teha?
ClickHouse uuendatakse pidevalt, kuid meie andmed, mis on lÔplikult optimeeritud, ei uuene ja jÀÀvad varukoopiasse.
Oletame, et meil tekkis mÔni probleem ja andmed kaotati. Otsustasime taastuda ja selgus, et vanad partiid, mis on salvestatud varukoopiate serveritesse, erinevad vÀga palju praegu kasutatava ClickHouse'i versioonist. Mida teha sellises olukorras, ja kas see on vÔimalik?
Situatsioon, kus olete taastanud andmed varukoopiast vanas formaadis ja need ei ole uue versiooniga ĂŒhildatavad, ei ole vĂ”imalik. Me hoolime, et ClickHouse andmevormaat jÀÀks alati tagasiĂŒhilduvaks. See on palju tĂ€htsam kui funktsionaalsuse tagasipöördumine, kui mĂ”ne harva kasutatava funktsiooni kĂ€itumine on muutunud. Andmed, mis on salvestatud kettale, peab uue versiooniga ClickHouse alati suutma lugeda. See on seadus.
Millised on hetkel parimad praktikad ClickHouse andmete varundamiseks?
Kuidas teha varukoopiaid arvesse vÔttes, et meil on optimeerimise lÔppoperatsioonid, tohutu andmebaas terabaitides ja andmed, mis uuenevad eeldatavasti viimase kolme pÀeva jooksul, pÀrast mida nendega mingit protseduuri ei toimu?
Me vÔime teha oma lahenduse ja kirjutada Bashis: koguge niimoodi ja niimoodi need varukoopiad. VÔib-olla pole midagi inovatiivselt leiutada ja rattast on juba ammu leiutatud?
Esiteks parimate praktikate osas. Mu kolleegid soovitavad alati, et varukoopiate kĂŒsimustele vastates meenutada "Yandex Cloud" teenust, kus see ĂŒlesanne on juba lahendatud. Nii et kasutage seda, kui vĂ”imalus on.
ClickHouse'iga tĂ€ielikult integreeritud lahendust varundamiseks ei ole. On mĂ”ned mallid, mida saab kasutada. TĂ€ieliku lahenduse saamiseks tuleb kas natuke kĂ€sitsi tööd teha vĂ”i kirjutada skripti kujul ĂŒmberpakendusi.
Alustan lihtsaimatest lahendustest ja lÔpetan kÔige keerulisematega, sÔltuvalt andmete mahust ja klastrist. Mida suurem on klaster, seda keerulisemaks lahendus muutub.
Kui andmetabel hÔivab vaid paar gigabaiti, saab varunduse teha nii:
- Salvestada tabelite mÀÀratlemise ehk metaandmed â show create table.
- Teha dump ClickHouse'i kliendi abil â select * from table faili. Vaikimisi saate faili TabSeparated formaadis. Kui soovite efektiivsemalt â saate kasutada Native formaati.
Kui andmete maht on suurem, vÔtab varundamine rohkem aega ja palju rohkem ruumi. Seda nimetatakse loogiliseks varundamiseks, see ei ole seotud ClickHouse'i andmeformaatidega. Kui see on olemas, saate viimase vÔimalusena varunduse vÔtta ja laadida MySQL-i taastamiseks.
ClickHouse'is on veel arenen vĂ”imalus luua partitsioonide snapshot kohaliku failisĂŒsteemi. See funktsioon on saadaval pĂ€ringu vormis alter table freeze partition. VĂ”i lihtsalt alter table freeze â see on kogu tabeli snapshot.
Snapshot luuakse ĂŒhte klassifikaatoritöötlusse konsistentse maksab, see tĂ€hendab, et ei saa luua konsistentset snapshot't kogu klastrile niimoodi. Kuid enamikul juhtudel ei ole see vajalik ja piisab, kui iga shardi puhul kĂ€ivitada pĂ€ring ja saada konsistentne snapshot. See luuakse kĂ”vade sidemetega ja seetĂ”ttu ei vĂ”ta see tĂ€iendavat ruumi. SeejĂ€rel kopeerite selle snapshot'i varundusserverisse vĂ”i salvestusse, mida kasutate varukoopiate jaoks.
Sellise varukoopia taastamine on ĂŒsna lihtne. Esiteks loote tabelid olemasolevate tabelite mÀÀratlemiste pĂ”hjal. SeejĂ€rel kopeerite salvestatud partitsioonide snapshot'id Directory-Detached andmete tabelite jaoks ja kĂ€ivitate pĂ€ringu attach partition. Selline lahendus sobib suuremate andmehulkade jaoks.
MĂ”nikord on vajalik midagi veelgi vĂ”imsamat â juhul, kui teil on kĂŒmneid vĂ”i isegi sadu terabajte igas serveris ja sadu servereid. Siin on lahendus, mille ma avastasin kolleegidelt 'Yandex.Metrics'. Ma ei soovitaks seda igaĂŒhele â lugege ja otsustage ise, kas see sobib teile vĂ”i mitte.
Esmalt on vaja luua mitu serverit koos suurte kettasahtlitega. Edasi tuleb nendele serveritele seadistada mitu ClickHouse serverit ja seadistada need töötama nagu veel ĂŒks koopia samade shardide jaoks. SeejĂ€rel tuleks nendel serveritel kasutada failisĂŒsteemi vĂ”i mĂ”nda tööriista, mis vĂ”imaldab luua snapshots. Siin on kaks varianti. Esimene variant on LVM snapshots, teine variant on ZFS Linuxil.
PĂ€rast seda tuleb iga pĂ€ev luua snapshot, mis jÀÀb ja vĂ”tab mingisuguse ruumi. Loomulikult, kui andmed muutuvad, suurenevad mahtude osas vĂ”imalused aja jooksul. Selle snapshot'i saab igal ajal vĂ€lja vĂ”tta ja andmed taastada, selline imelik lahendus. Lisaks tuleks piirata nende replikate kompaktset konfiguratsiooni, et nad ei pĂŒĂŒaks saada juhtideks.
Kas on vÔimalik korraldada koormuse all kontrollitud replikate viivitust?
Kas sel aastal plaanite ClickHouse'is teha valli? Kas saaks seal korraldada replikate kontrollitud viivitust? Tahame seda kasutada, et end kaitsta negatiivsete stsenaariumide, nagu alternatiivide ja teiste muudatuste, eest.
Kas on vÔimalik teha mingeid tagasipöördeid alternatiivide jaoks? NÀiteks olemasolevas valli vÔtta ja öelda, et kuni selle ajani rakenda muudatused, aga alates sellest ajast Àra rakenda muudatusi?
Kui meie klastrisse siseneb rĂŒhm ja rikub selle, siis meil on tinglik replik viivitusega tund, kus me saame öelda, et kasutame just seda hetkel, kuid viimase kĂŒmne minuti muudatusi ei rakenda?
Alustame replikate kontrollitud viivituse temaatikast. Selline kĂŒsimus on kasutajatelt tulnud ja me lĂ”ime GitHubis teema palvega: 'Kui kellelegi see vajalik on, pange like vĂ”i sĂŒda'. Keegi ei pannud, ja teema suleti. Siiski on juba praegu vĂ”imalik selline vĂ”imalus saada, seadistades ClickHouse'i. TĂ”si, see on vĂ”imalik alates versioonist 20.3.
ClickHouse teostab pidevalt andmete sulandamist â merge. Kui sulandumine on toimunud, asendatakse teatud andmeplokkide kogum suurema plokiga. Sellegipoolest jÀÀvad varasemad andmeplokid kĂ”vakettale teatud ajaks.
Esiteks, need jÀÀvad alles seni, kuni on olemas select pÀringud, mis neid kasutavad, et tagada mitteblokeeriv töö. Select pÀringud saavad rahulikult lugeda vanadest plokkidest.
Teiseks, on ka ajapiir â vanad andmeplokid jÀÀvad kĂ”vakettale kaheks minutiks. Need kaheksa minutit saab konfigureerida ja muuta isegi ĂŒheks pĂ€evaks. See vĂ”tab kĂ”vakettal ruumi: sĂ”ltuvalt andmevoolust vĂ”ib viimase pĂ€eva andmete maht mitte ainult kahekordistuda, vaid kasvada isegi viis korda rohkem. Kuid tĂ”sise probleemi korral saate ClickHouse'i serveri peatada ja kĂ”ike lahendada.
NĂŒĂŒd tĂ”statub kĂŒsimus, kuidas see kaitseb alterite eest. Siin tasub sĂŒgavamale vaadata, sest ClickHouse'i vanemates versioonides töötas alter nii, et see muutis lihtsalt otse plokke. On andmeplokk, kus on mingid failid, ja teeme nĂ€iteks, alter drop column. Siis see veerg eemaldatakse fĂŒĂŒsiliselt kĂ”igist tĂŒkkidest.
Kuid alates versioonist 20.3 on alterite mehhanism tĂ€ielikult muutunud ning nĂŒĂŒd on andme tĂŒkkide allikad alati muutumatud. Need ei muutu ĂŒldse â alterid töötavad nĂŒĂŒd ligikaudu nagu sulandumised. Selle asemel, et muuta tĂŒkk koha peal, loome uue. Uues tĂŒkis muutumatuid faile kĂ€sitletakse kĂ”vapingutustena ja kui me oleme mĂ”ne veeru eemaldanud, siis see lihtsalt ei ole uues tĂŒkis. Vana tĂŒkk eemaldatakse vaikimisi kaheksanda minutiga ning siinsa saab seadistusi kohandada, nagu eelnevalt öeldud.
Sama kehtib mutatsioonide tĂŒĂŒpi alterite kohta. Kui teete alter delete vĂ”i alter update, ei muuda see tĂŒkki, vaid loob uue. Ja seejĂ€rel eemaldab vana.
Kuidas kÀituda, kui tabeli struktuur on muutunud?
Kuidas taastada varukoopia, mis on tehtud vana skeemiga? Ja teine kĂŒsimus seoses snapshotâide ja failisĂŒsteemi tööriistadega. Kas Btrfs sobib siia ZFS asemel Linux LVM-is?
Kui teete attach partition Kui partitsioonide struktuur on erinev, ĂŒtleb ClickHouse, et seda ei saa teha. Lahendus on selline: esmalt luua ajutine MergeTree tĂŒĂŒpi tabel vana struktuuriga, liita sinna andmed attach abil ja teha alter pĂ€ring. SeejĂ€rel saate kas need andmed kopeerida vĂ”i ĂŒmber tĂ”sta ja attach teha uuesti, vĂ”i kasutada pĂ€ringut. alter table move partition.
NĂŒĂŒd teine kĂŒsimus â kas Btrfs on kasutatav? Esiteks, kui teil on LVM, siis piisavad LVM-i snapshot'id ja failisĂŒsteem vĂ”ib olla ext4, sellel pole tĂ€htsust. Btrfs puhul sĂ”ltub kĂ”ik teie kogemustest selle kasutamisel. See on kĂŒps failisĂŒsteem, kuid siiski on mĂ”ned kahtlused selle ĂŒle, kuidas kĂ”ik praktikas konkreetsetes stsenaariumites toimib. Ma ei soovitaks seda kasutada, kui teil pole Btrfs-i tootmises.
Millised on praegu parimad praktikad andmete resharde tegemiseks?
KĂŒsimus ĂŒmberjaotamiseks on keeruline ja mitmekesine. Siin saab vastata mitmete variantide kaudu. Ăhelt poolt vĂ”ib öelda, et ClickHouse'is ei ole sisseehitatud vĂ”imalust ĂŒmberjaotamiseks. Kuid ma kardan, et see vastus kedagi ei rahulda. SeetĂ”ttu vĂ”ib teiselt poolt öelda, et ClickHouse'is on palju viise andmete ĂŒmberjaotamiseks.
Kui klastris lĂ”ppeb koht vĂ”i see ei suuda koormust taluda, lisate uusi servereid. Kuid need serverid on vaikimisi tĂŒhjad, andmeid neis ei ole, koormust ei ole. Teil on vaja andmeid ĂŒmber tĂ”sta, et need oleksid uues, suurendatud klastris ĂŒhtlaselt jaotatud.
Esimene viis, kuidas seda teha, on osade partitsioonide kopeerimine uutele serveritele pĂ€ringu abil alter table fetch partition. NĂ€iteks kui teil olid partitsioonid kuude kaupa, siis vĂ”tate esimese kuu 2017. aastast ja kopeerite selle uuele serverile ning seejĂ€rel - kolmanda kuu kopeerite mĂ”nda teise uude serverisse. Ja teete nii, kuni see on enam-vĂ€hem ĂŒhtlaselt jaotatud.
Ălekannet saab teha ainult nende partitsioonide puhul, mis ei muutu kirjutamise ajal. Uute partitsioonide puhul tuleb kirjutamine vĂ€lja lĂŒlitada, kuna nende ĂŒlekandmine ei ole atomaarne. Vastasel juhul vĂ”ite saada dubleeritud vĂ”i puuduvaid andmeid. Siiski on see meetod praktiline ja töötab piisavalt tĂ”husalt. VĂ”rgus edastatakse juba valmis kokkusurutud partitsioonid, mis tĂ€hendab, et andmeid ei pigistata ega kodeerita uuesti.
Sellel meetodil on ĂŒks puudus, mis sĂ”ltub shardimise skeemist, millele te panustasite, ning milline oli teie shardimise vĂ”ti. Teie nĂ€ites, mis kĂ€sitleb mÔÔdikuid, on shardimise vĂ”ti - see on hash teelt. Kui teete Distributed tabelis select pĂ€ringu, lĂ€heb see kohe kĂ”igile klastri shardidele ja toob sealt andmed.
See tĂ€hendab, et tegelikult ei oma tĂ€htsust, millised andmed millisel shardil asuvad. Peamine on see, et andmed ĂŒhel teel asuvad ĂŒhel shardil ja millisel tĂ€pselt, pole oluline. Sel juhul sobib valmiste partiide ĂŒlekandmine suurepĂ€raselt, kuna select-pĂ€ringute puhul saate te samuti â olgu see enne vĂ”i pĂ€rast uue shard'i loomist, skeemil pole erilist tĂ€htsust â tĂ€ielikud andmed.
Kuid on ka keerulisemaid juhtumeid. Kui rakenduse loogika tasemel toetate te spetsiaalset sharding'u skeemi, mis nĂ€eb ette, et see klient asub teatud shardil, ja pĂ€ring saab saata otse sinna, mitte Distributed tabelisse. VĂ”i kasutate piisavalt uut ClickHouse'i versiooni ja olete aktiveerinud seadistuse optimize skip unused shards. Sel juhul analĂŒĂŒsitakse select-pĂ€ringu ajal where-i ja arvutatakse, millistele shardidele minna vastavalt sharding'u skeemile. See töötab eeldusel, et andmed on paigutatud just selle sharding'u skeemi jĂ€rgi. Kui olete need kĂ€sitsi ĂŒmber paigutanud, vĂ”ib vastavus muutuda.
Nii et, see on esimene vÔimalus. Ootan teie vastust: kas see sobib vÔi liigume edasi.
Vladimir Kolobaev, peamine sĂŒsteemiadministraator Avitos: Alexei, see viis, mida mainisite, ei sobi hĂ€sti, kui on vaja koormust jagada ka lugemiseks. Saame vĂ”tta kuupĂ”hise partitsiooni ja viia eelmise kuu teisele sĂ”lmele, kuid kui kĂŒsitakse nende andmete jĂ€rele, koormame ainult seda. Sooviksime aga koormata kogu klastri, sest muidu jÀÀb kogu lugemisekoormus teatud ajaks kahte shard'i.
Alexei Milovidov: Vastus on siin kummaline â jah, halb, aga vĂ”ib ka toimida. Selgitan, kuidas tĂ€pselt. Tuleb vaadata koormusskeemi, mis kaasneb teie andmetega. Kui need on jĂ€lgimisandmed, siis vĂ”ib peaaegu kindlasti öelda, et enamik pĂ€ringutest puudutab vĂ€rskeid andmeid.
Te olete installinud uued serverid, migreerinud vana partitsioonid, kuid muutnud ka seda, kuidas vĂ€rskeid andmeid salvestatakse. Nii et vĂ€rsked andmed jaotatakse kogu klastrisse. Seega, juba viie minuti pĂ€rast laevad viimase viie minuti pĂ€ringud ĂŒhtlaselt klastrit, pĂ€eva jooksul laevad viimase pĂ€eva pĂ€ringud ĂŒhtlaselt klastrit. Kahjuks lĂ€hevad eelmine kuu pĂ€ringud ainult osa klastriserveritesse.
Kuid sageli pole teil pĂ€ringuid just veebruaris 2019. TĂ”enĂ€oliselt, kui pĂ€ringud juba 2019. aastal kĂ€ivad, siis need on kogu 2019. aasta vĂ€ltel â pika aja jooksul, mitte mingisuguste vĂ€ikeste vahemike kaupa. Ja sellised pĂ€ringud saavad samuti klastrit ĂŒhtlaselt koormata. Kuid teie tĂ€helepanek on tĂ€ielikult Ă”ige, et see on ad hoc lahendus, mis ei jaota andmeid tĂ€ielikult ĂŒhtlaselt.
Mul on veel mĂ”ned punktid, et vastata kĂŒsimusele. Ăks neist on see, kuidas algselt luua shardimise skeem, et taasjagamisest saaks vĂ€hem valu. See ei pruugi alati olla vĂ”imalik.
NÀiteks, teil on jÀlgimisandmed. JÀlgimisandmed kasvavad kolmel pÔhjusel. Esimene on ajalooliste andmete kogumine. Teine on liikluse suurenemine. Ja kolmas on jÀlgimise alla kuuluvate elementide arvu suurenemine. Uued mikroteenused ja mÔÔdikud, mida tuleb salvestada, ilmuvad pidevalt.
VĂ”ib-olla on neist kĂ”ige suurem kasv seotud just kolmanda pĂ”hjusega â see on jĂ€lgimise kasutamise suurenemine. Sellisel juhul tasub vaadata koormuse iseloomu, millised on peamised select-pĂ€ringud. Peamised select-pĂ€ringud tulevad tĂ”enĂ€oliselt mingist alamkogumist mÔÔdikutest.
NĂ€iteks, CPU kasutamine mĂ”nes serveris mingi teenuse poolt. Tulemuseks on, et on olemas teatud alamkogum vĂ”tmeid, mille alusel need andmed kĂ€tte saadakse. Ja pĂ€ring nende andmete jĂ€rele on tĂ”enĂ€oliselt piisavalt lihtne ja toimub kĂŒmnete millisekundite jooksul. Kasutatakse jĂ€lgimisteenuste ja juhtpaneelide jaoks. Loodan, et ma saan seda Ă”igesti aru.
Vladimir Kolobaev: Asi on see, et me viidame sageli ajaloolistele andmetele, kuna me reaalajas vÔrreldame praegust seisundit ajaloolisega. Meie jaoks on oluline, et meil oleks kiire juurdepÀÀs suurele andmemahule, ja ClickHouse teeb selles osas suurepÀrast tööd.
Te olete tĂ€iesti Ă”iged, enamus lugemisetaotlusi tekib meil viimase pĂ€eva jooksul, nagu igasugustes enda jĂ€lgimissĂŒsteemides. Kuid ajaloolistele andmetele on ka suurem koormus. See tuleb peamiselt alarmisĂŒsteemist, mis kĂ€ib iga kolmekĂŒmne sekundi tagant ja ĂŒtleb ClickHouse'ile: 'Anna mulle andmeid viimase kuue nĂ€dala jooksul. Ja nĂŒĂŒd ehita mulle sealt mingisugune liikuv keskmine ning vĂ”rdleme praegust vÀÀrtust ajaloolisega.'
Soovin öelda, et meil on selliste vĂ€ga vĂ€rskete pĂ€ringute jaoks veel ĂŒks vĂ€ike tabel, kus me hoiame ainult kahe pĂ€eva andmeid, ja peamised pĂ€ringud suunduvad sinna. Suures sharditud tabelis saadame ainult suured ajaloolised pĂ€ringud.
Alexei Milovidov: Kahjuks ei sobi teie stsenaarium hÀsti, kuid ma rÀÀgin kahest halvast ja keerulisest shardimise skeemist, mida ei tohiks kasutada, kuid mis on minu sÔprade teenuses kasutuses.
On olemas peamine klaster «Yandex.Metrika» sĂŒndmustega. SĂŒndmused on lehevaated, klikkimised ja ĂŒleminekud. Enamus pĂ€ringutest suundub konkreetsele veebisaidile. Avate teenuse «Yandex.Metrika», teil on sait â avito.ru, sisenete raportisse ja toimub pĂ€ring teie saidi kohta.
Kuid on ka teisi pĂ€ringuid â analĂŒĂŒtilisi ja globaalseid, mida teevad sisemised analĂŒĂŒtikud. Igaks juhuks mainin, et sisemised analĂŒĂŒtikud teevad pĂ€ringuid ainult «Yandexi» teenuste kohta. Siiski, isegi «Yandexi» teenused hĂ”ivavad mĂ€rkimisvÀÀrse osa kĂ”ikidest andmetest. Need pĂ€ringud ei ole konkreetsed loendurite, vaid laiemate filtreerimiste kohta.
Kuidas korraldada andmeid nii, et ĂŒksikute andurite kaudu töötaks kĂ”ik efektiivselt ja globaalsetele pĂ€ringutele vastaks samuti? Probleem on ka see, et pĂ€ringute arv ClickHouse'i 'Metrika' klastri kohta ulatub mitme tuhande pĂ€ringuni sekundi jooksul. Selliste keeruliste pĂ€ringute puhul ei suuda ĂŒks ClickHouse'i server taluda sellist koormust.
Klastri suurus on ĂŒle kuue saja serveri. Kui lihtsalt rakendada selle klastri kohal jaotatud tabelit ja suunata sinna mitut tuhat pĂ€ringut, lĂ€heb asi veel hullemaks kui need suunata ĂŒhele serverile. Teisalt, variant, kus andmed on ĂŒhtlaselt jaotatud ja me kĂŒsime kĂ”igilt serveritelt, tĂ”ukame kohe kĂ”rvale.
On olemas tĂ€iesti vastupidine variant. Kujutage ette, et me shardime andmed veebisaitide kaupa, ja ĂŒhe saidi pĂ€ring suunatakse ĂŒhele shardile. NĂŒĂŒd suudab klaster tĂ”mmata kuni kĂŒmme tuhat pĂ€ringut sekundis, kuid ĂŒhel shardil vĂ”ib mingi kindel pĂ€ring töötada liiga aeglaselt. See ei skaala enam lĂ€bilaskevĂ”ime jĂ€rgi. Eriti kui see on veebisait avito.ru. Ma ei avalda saladust, kui ĂŒtlen, et Avito on ĂŒks kĂ”ige kĂŒlastatumaid saite Venemaa internetis. Ja selle töötlemine ĂŒhel shardil oleks meeletus.
SeetĂ”ttu on shardinguskeem keerulisem. Kogu klaster on jagatud teatud arvu klastriteks, mida me nimetame kihtideks. Iga klaster sisaldab kĂŒmmet kuni mitukĂŒmmend shardit. Kokku on selliseid klastreid kolmkĂŒmmend ĂŒheksa.
Kuidas see kĂ”ik skaleerub? Klusterite arv ei muutu â nagu oli paar aastat tagasi kolmkĂŒmmend ĂŒheksa, nii on see endiselt. Kuid iga kihi sees suurendame jĂ€rk-jĂ€rgult shardide arvu andmete kogunedes. Ja shardimise skeem ĂŒldiselt on selline â jaotus nende klasterite jĂ€rgi kĂ€ib veebisaitide pĂ”hjal ning selleks, et mĂ”ista, milline sait millises klusteris asub, kasutatakse eraldi metabasi MySQL-is. Ăks sait â ĂŒhes klusteris. Ja selle sees kĂ€ib shardimine kĂŒlastajate tuvastajate jĂ€rgi.
Kirjutamise ajal jagame neid kĂŒlastaja tuvastaja arvu jÀÀgi jĂ€rgi. Kuid uue shardi lisamisel muutub shardimise skeem, me jĂ€tkame purustamist, kuid ĂŒlestĂ€hendamisel teise numbri jÀÀgi jĂ€rgi. See tĂ€hendab, et ĂŒks kĂŒlastaja on siiski mitmetes serverites, ja sellele ei saa toetuda. See on tehtud lihtsalt selleks, et andmed pigem kokku suruda. Ja pĂ€ringute korral liigume Distributed tabelisse, mis vaatab klusterile ja pöördub kĂŒmnete serverite poole. Selline kummaline skeem.
Aga minu jutt jÀÀks puudulikuks, kui ma ei ĂŒtleks, et sellest skeemist me loobusime. Uues skeemis muutsime kĂ”ik ja kĂ”ik andmed kopeeriti clickhouse-copier abil.
Uues skeemis jagunevad kĂ”ik saidid kahe kategooria vahel â suured ja vĂ€ikesed. Ma ei tea, kuidas seal valitakse piir, aga tulemuseks on see, et suured saidid registreeritakse ĂŒhes klastris, kus on 120 shard'i, igas kolm koopiat â kokku 360 serverit. Ja shardimise skeem on selline, et iga pĂ€ring lĂ€heb kohe kĂ”igile shard'idele. Kui te praegu "Yandex.Metrica" avate ja vaatate mis tahes aruande lehte avito.ru jaoks, lĂ€heb pĂ€ring 120 serverile. Suuri saite on rĂŒnnetes vĂ€he. Ja pĂ€ringute arv ei ole tuhat sekundis, vaid isegi vĂ€hem kui sada. KĂ”ike seda suudab rahulikult töödelda Distributed tabel, mida iga neist haldab 120 serverit.
Teine klaster on vĂ€ikeste saitide jaoks. Siin on shardimise skeem saidi ĐžĐŽĐ”ĐœŃĐžŃĐžĐșatori jĂ€rgi, ja iga pĂ€ring lĂ€heb tĂ€pselt ĂŒhe shardi peale.
ClickHouse'is on olemas utiliit clickhouse-copier. Kas saaksite rÀÀkida selle kohta?
Ma ĂŒtlen kohe, et see lahendus on mahukam ja veidi vĂ€hem efektiivne. Eelis on see, et see jagab andmed tĂ€ielikult vastavalt teie mÀÀratud skeemile. Kuid utiliidi puuduseks on see, et see ei teosta ĂŒlekohandamist. See kopeerib andmed ĂŒhest klastriskeemist teise klastriskeemi.
See tÀhendab, et selle töötamiseks peab teil olema kaks klastrit. Need vÔivad asuda samadel serveritel, kuid andmeid ei liikuda inkrementaalselt, vaid nad kopeeritakse.
NĂ€iteks, kui oli neli serverit, saab kaheksa. Loote kĂ”igis serverites uue jaotatud tabeli, uued kohalikud tabelid ja kĂ€ivitate clickhouse-copier'i, mÀÀrates selle töö skeemi, millest ta peab lugema, et aktsepteerida uut jagamisskeemi ja teisaldada andmed sinna. Ja vanadel serveritel on vaja kohta poole vĂ”rra rohkem, kui praegu on, sest need vanad andmed peavad seal jÀÀma ja nende peale tuleb pool neist vanadest andmetest. Kui olete eelnevalt mĂ”elnud, et andmeid tuleb ĂŒlekohandada ja ruumi on, siis sobib see meetod.
Kuidas clickhouse-copier töötas? See jagab kogu töö ĂŒlesandeks ĂŒhe partitsiooni ĂŒhe tabeli ĂŒhel shard'il töötlemiseks. KĂ”ik need ĂŒlesanded saavad toimuda paralleelselt, ning clickhouse-copier vĂ”ib töötada erinevates masinates mitmes eksemplaris, kuid see, mida ta ĂŒhele partitsioonile teeb, on mitte midagi muud kui insert select. Andmed loetakse, dekompressitakse, ĂŒmber jagatakse, seejĂ€rel kompressitakse uuesti, kirjutatakse kuhugi, ĂŒmber sorteeritakse. See on keerukam lahendus.
Teie kÀes oli prooviversioon, mille nimi oli resharde. Mis sellest saanud on?
Teie pilootprojekti, mis kandis nime resharding, oli juba 2017. aastal. Isegi ClickHouse'is on olemas valik. Arusaamatult ei hakanud see tööle. Kas saaksite rÀÀkida, miks see nii juhtus? See tundub ju vÀga asjakohane.
Probleem seisneb selles, et vajadusel nĂ”uab andmete ĂŒmberasustamine kohapeal liigset keerulist sĂŒnkroneerimist, et see oleks aatomaarne. Kui hakkasime vaatama, kuidas see sĂŒnkroneerimine toimub, sai selgeks, et on pĂ”hilisi probleeme. Need pĂ”hilised probleemid ei ole mitte ainult teoreetilised, vaid ilmusid kohe ka praktikas nĂ€htavale, sellega, et seda on lihtne seletada â mitte midagi ei toimi.
Kas on vĂ”imalik kĂ”ik andmeosad enne aeglastele ketastele liikumist ĂŒhte koondada?
TTL kĂŒsimus seoses slow diskile liikumise valikuga konteksti liitumistes. Kas on olemas viis, kuidas peale cron'i kĂ”ik osad kokku sulandada enne nende liigutamist aeglastele ketastele?
KĂŒsimusele, kas on kuidagi vĂ”imalik automaatselt kĂ”ik tĂŒkid kokku liita enne nende ĂŒleviimist â ei, seda ei ole. Minu arvates ei ole selles vajadust. Ei pea kĂ”ik osad kokku sulandama, vaid vĂ”ib lihtsalt loota, et need kantakse aeglastele ketastele automaatselt.
Meil on kaks andmete migreerimise kriteeriumi. Esimene on tĂ€ituvuse jĂ€rgi. Kui praegusel salvestustaseme vabal kohal on alla teatud protsendi, valime ĂŒhe osa ja viime selle aeglasemale salvestusele. TĂ€psemalt öeldes mitte aeglasemale, vaid jĂ€rgmisele â nagu olete seadnud.
Teine kriteerium on suuruse jĂ€rgi. See kĂ€sitleb suurte osade migreerimist. Saate kohandada kĂŒnnist kiirel kettal oleva vaba ruumi pĂ”hjal, ja andmed kantakse automaatselt ĂŒle.
Kuidas liikuda uutele ClickHouse'i versioonidele, kui eelnevalt ĂŒhilduvust kontrollida ei ole vĂ”imalik?
Seda teemat arutatakse regulaarselt erinevate versioonide arvestusega, ja siiski. Kui turvaline on versioonilt 19.11 versioonile 19.16 uuendamine ja nĂ€iteks versioonilt 19.16 versioonile 20.3? Kuidas on parem uutele versionitele ĂŒle minna, kui ei ole vĂ”imalust eelnevalt kontrollida ĂŒhilduvust liivakastis?
Siin on mĂ”ned âkuldreeglidâ. Esimene on . See on ulatuslik, kuid seal on eraldi punktid, mis kĂ€sitlevad tagasiĂŒhilduvad muudatused. Neid punkte ei tohiks pidada punaseks lipuks. TĂŒĂŒpiliselt on need vĂ€ikesed ĂŒhilduvuse probleemid, mis on seotud teatud ÀÀrefunktsionaalsusega, mida tĂ”enĂ€oliselt ei kasutata.
Teiseks, kui pole vĂ”imalik kontrollida ĂŒhilduvust liivakastis ja soovite kohe tootmisesse uuendada, on soovitus selline â Ă€rge tehke seda. Esiteks looge liivakast ja kontrollige. Kui katsekeskkonda ei ole, siis tĂ”enĂ€oliselt ei ole teie ettevĂ”te vĂ€ga suur, seega vĂ”ib andmete osa kopeerida oma sĂŒlearvutisse ja seal veenduda, et kĂ”ik töötab Ă”igesti. VĂ”ite isegi oma masinas mitmeid koopiaid ĂŒles tĂ”sta. VĂ”i vĂ”ite kuskil lĂ€hedal tĂ”sta ĂŒles uue versiooni ja laadida sinna osa andmeid â see tĂ€hendab, et looge improvisatsiooniline katsekeskkond.
Veel ĂŒks reegel â pĂ€rast versiooni vĂ€ljaandet ei tohi nĂ€dal aega uuendada, et vead tootmises kinni pĂŒĂŒda ja jĂ€rgmisi kiireid parandusi teha. Vaatame ClickHouse'i versioonide numbreid, et mitte segadusse minna.
On versioon 20.3.4. Number 20 tĂ€histab vĂ€ljaandmise aastat â 2020. Sisu poolest pole sellel mingit tĂ€htsust, seega ei pea me sellele tĂ€helepanu pöörama. JĂ€rgmine number on 20.3. Teist numbrit â antud juhul 3 â suurendame iga kord, kui vabastame uue versiooni, millel on uus funktsionaalsus. Kui soovime ClickHouse'i lisada mĂ”nda vĂ”imalust, peame seda numbrit suurendama. See tĂ€hendab, et versioonis 20.4 töötab ClickHouse veel paremini. Kolmas number â 20.3.4. Siin on 4 â see tĂ€histab patĆĄiversioonide arvu, kus me uusi vĂ”imalusi ei lisanud, kuid parandasime teatud vigu. Ja 4 tĂ€hendab, et oleme seda teinud neli korda.
Ărge arvake, et see on midagi kohutavat. Tavaliselt saab kasutaja installida kĂ”ige vĂ€rskema versiooni, ja see töötab aasta jooksul probleemideta. Kuid kujutage ette, et mingis bitmapide töötlemise funktsioonis, mille meie Hiina kolleegid lisasid, server kaob vale argumentide edastamisel. Peame selle parandama. Me vabastame uue patĆĄiversiooni ja ClickHouse muutub stabiilsemaks.
Kui ClickHouse on teil tootmises töötamas ja tuleb vĂ€lja uus versioon ClickHouse'ist koos uue funktsionaalsusega â nĂ€iteks 20.4.1 â siis Ă€rge kiirustage seda tootmisesse esimesel pĂ€eval paigaldama. Miks see ĂŒldse vajalik on? Kui te veel ClickHouse'i ei kasuta, siis vĂ”ite selle paigaldada ja tĂ”enĂ€oliselt lĂ€heb kĂ”ik hĂ€sti. Kuid kui ClickHouse töötab juba stabiilselt, jĂ€lgige plaastrite ja vĂ€rskenduste ĂŒle â milliseid probleeme me lahendame.
Kirill Shvakov: Tahaksin veidi rÀÀkida testkeskkondadest. KĂ”ik kardavad testkeskkondi ja kuidagi arvavad, et kui teil on vĂ€ga suur ClickHouse'i klaster, peab ka testkeskkond olema vĂ€hemalt sama suur vĂ”i vĂ€hemalt kĂŒmme korda vĂ€iksem. See ei ole sugugi nii.
VĂ”in rÀÀkida oma kogemusest. Mul on projekt ja seal on ClickHouse. Meie testkeskkond selle jaoks on vĂ€ike virtuaalmasin Hetzneris, mis maksab kakskĂŒmmend eurot, kus on kĂ”ik tĂ€ielikult kasutusele vĂ”etud. Selle saavutamiseks on meil tĂ€ielik automatiseerimine Ansible'is, nii et pĂ”himĂ”tteliselt ei ole vahet, kas rakendada fĂŒĂŒsilistele serveritele vĂ”i lihtsalt virtuaalmasinatesse.
Mida on vĂ”imalik teha? Oleks hea, kui ClickHouse dokumentatsioonis oleks nĂ€ide, kuidas ĂŒles seada vĂ€ike klaster - Dockeris, LXC-s, vĂ”ib-olla luua Ansible playbook, kuna erinevatel inimestel on erinevad paigaldused. See lihtsustab palju. Kui suudate klastrit ĂŒles seada viie minutiga, on palju lihtsam proovida millegi kallal töötada. Nii on palju mugavam, sest minna tootmisversiooni, mida te ei ole kontrollinud - on tee mitte kuhugi. MĂ”nikord see töötab, mĂ”nikord ei tööta. SeetĂ”ttu on lootmine edule halb.
Maksim Kotjakov, vanem backendi insener Avitos: Lisa, et nĂ€itaksin suurettevĂ”tete probleemide testimisringide kohta. Meil on tĂ€ielik ClickHouse'i vastuvĂ”tuklasster, mis on andmemudelite ja seadistuste osas tĂ€pselt sama, mis tootmises. See klaster on paigaldatud piisavalt nĂ”rkadesse konteineritesse, kus on minimaalsed ressursid. Me suuname sinna teatud protsendi tootmisandmetest, kuna meil on vĂ”imalik Kafkas voolu replikeerida. Seal on kĂ”ik sĂŒnkroniseeritud ja skaleeritud - nii vĂ”imekus, vool kui ka teoorias, vĂ”rreldes teistega peaks see kĂ€ituma nagu tootmine. KĂ”ik potentsiaalselt plahvatusohtlikud elemendid suunatakse kĂ”igepealt sellele katsetuskeskkonnale ja seal nad seisavad mitu pĂ€eva, kuni on valmis. Kuid loomulikult on see lahendus kallis, raske ja nĂ”uab mĂ€rkimisvÀÀrseid hoolduskulusid.
Alexei Milovidov: RÀÀgin, milline on meie sĂ”prade «Yandex.Metrica» testikeskkond. Ăks klaster koosnes 600-st serverist ja teine 360-st, lisaks on veel kolmas ja mitu klastrit. Ăhe neist testikeskkond on lihtsalt kaks shard'i, kus igas on kaks replikat. Miks kaks shard'i? Et poleks ainult ĂŒhte. Ja replikad on samuti vajalikud. Lihtsalt minimaalne arv, mida endale lubada saab.
See testikeskkond vÔimaldab kontrollida pÀringute töökindlust ja seda, kas midagi suurt on katki lÀinud. Kuid sageli tekivad probleemid hoopis teistsuguse iseloomuga, kui kÔik töötab, kuid koormuses on mÔned vÀikesed muutused.
TĂ”in nĂ€iteks. Otsustasime installida uue ClickHouse versiooni. See on ĂŒles laetud testikeskkonda, automaatkatsetused «Yandex.Metricas» on lĂ€bi viidud, mis vĂ”rdlevad andmeid vanas ja uues versioonis, lĂ€bides kogu torustiku. Ja loomulikult meie CI rohelised testid. Vastasel juhul ei oleks me isegi seda versiooni pakkunud.
KĂ”ik on suurepĂ€rane. Alustame tootmisse viimist. Mul tuleb teade, et diagrammidel on koormus mitu korda suurenenud. Me tĂŒhistame versiooni. Vaatan diagrammi ja nĂ€en: koormus on tĂ”epoolest vĂ€ljalaskmisel mitu korda tĂ”usnud ning tagasi vĂ€henenud, kui see vĂ€lja lasti. Siis hakkasime versiooni tagasi pöörama. Ja koormus tĂ”usis tĂ€pselt samuti ja tĂ€pselt sama palju kukkus tagasi. Nii et jĂ€reldus on selline â koormus suurenes seoses vĂ€ljalaskmisega, pole midagi ĂŒllatavat.
Edasi oli keeruline veenda kolleege ikkagi uut versiooni paigaldama. Ătlen: "KĂ”ik on korras, laske vĂ€lja. Hoidke pöialt, kĂ”ik töötab. Praegu on diagrammidel koormus tĂ”usnud, aga kĂ”ik on korras. Hoidke vastu." KokkuvĂ”ttes tegime nii ja kĂ”ik â versioon on tootmises. Kuid peaaegu iga vĂ€ljalaskmisega tekivad sarnased probleemid.
KÀsku Kill query peaks lÔpetama pÀringud, kuid see ei toimi. Miks?
KĂŒlastaja tuli minu juurde, mingi analĂŒĂŒtik, ja esitas kĂŒsimuse, mis pĂ”hjustas minu ClickHouse klastrisse probleeme. MĂ”ni sĂ”lm vĂ”i kogu klaster â sĂ”ltuvalt sellest, kuhu repliika vĂ”i shard see pĂ€ring sattus. NĂ€en, et kĂ”ik CPU ressursid sellel serveril on ĂŒletĂ€itunud, kĂ”ik punane. Sellegipoolest vastab ClickHouse pĂ€ringutele. Ja ma kirjutan: "Palun nĂ€ita mulle protsesside nimekirja, milline pĂ€ring tekitas selle segaduse."
Leian selle pĂ€ringu ja kirjutame kill. Ja nĂ€en, et midagi ei juhtu. Minu server on ĂŒletĂ€itunud, ClickHouse annab mulle endiselt mĂ”ned kĂ€sud, nĂ€itab, et server on elus, ja kĂ”ik on korras. Aga mul on kĂ”ikides kasutajapĂ€ringutes halvenemine, hakkab halvenema ka kirjutamine ClickHouse'i, ja minu kill query ei tööta. Miks? Ma arvasin, et kill query peaks pĂ€ringud tapma, aga seda ei juhtu.
Praegu tuleb ĂŒsna kummaline vastus. Asi on selles, et kill query ei tapa pĂ€ringuid.
Kill query seadistab vĂ€ikese lipu nimega âma tahan, et see pĂ€ring tapetaksâ. Ja ise pĂ€ring töötlemise iga andmepaketi puhul vaatab seda lippu. Kui see on seatud, siis pĂ€ring lĂ”petab oma töö. Tulemusena ei tapa keegi pĂ€ringut, see peab ise kĂ”ik kontrollima ja peatuma. Ja see peaks töötama kĂ”igis olukordades, kui pĂ€ring on andmepakettide töötlemise seisundis. See töötleb jĂ€rgmise andmepaketi, kontrollib lippu ja peatub.
See ei toimi juhtudel, kui pĂ€ring on mingis operatsioonis blokeeritud. TĂ”si, kĂ”ige tĂ”enĂ€olisemalt ei ole see teie juhtum, kuna teie sĂ”nul kasutab see tohutult serveri ressursse. VĂ”ib-olla ei tööta see vĂ€lise sortimise juhul ja veel mĂ”nedes detailides. Kuid ĂŒldiselt ei tohiks sellist asja juhtuda, see on viga. Ja ainus, mida soovitada saan, on ClickHouse'i uuendamine.
Kuidas arvutada vastuse aega lugemisekoormuse korral?
On tabel, kus hoitakse erinevaid kontoaggregate item'i jÀrgi. Ridade arv on umbes sada miljonit. Kas on vÔimalik arvestada ennustatavat vastuse aega, kui lasta sisse 1K RPS 1K item'i kohta?
Kontekti pĂ”hjal rÀÀgime lugemisest, kuna kirjutamise osas pole probleeme â saab sisestada nii tuhandeid, sadu tuhandeid kui ka miljoneid ridu.
LugemispĂ€ringud on vĂ€ga erinevad. Select 1 puhul suudab ClickHouse teostada kĂŒmneid tuhandeid pĂ€ringuid sekundis, seega isegi ĂŒhe vĂ”tmega pĂ€ringud vajavad juba mĂ”ningaid ressursse. Sellised tĂ€psed pĂ€ringud on keerulisemad kui mĂ”nes key-value andmebaasis, kuna iga lugemise jaoks on vajalik lugeda andmepakett indeksi kaudu. Meie indeks ei aadresseeri iga kirjeid, vaid iga vahemikku. See tĂ€hendab, et tuleb lugeda kogu vahemik â see on vaikimisi 8192 rida. Ja tuleb dekompressida 64 Kb suurune andmepakett 1 Mb-ni. TĂŒĂŒpiliselt kulub sellistele tĂ€psetele pĂ€ringutele mitu millisekundit. Kuid see on kĂ”ige lihtsam variant.
Proovime teha lihtsat aritmeetikat. Kui korrutada mitu millisekundit tuhandele, saame paar sekundit. Just nagu hoida tuhat pĂ€ringut sekundis ei saa, kuid tegelikult on see vĂ”imalik, sest meil on mitu protsessorituuma. Nii et pĂ”himĂ”tteliselt vĂ”ib 1000 RPS ClickHouse mĂ”nikord taluda, kuid lĂŒhikeste pĂ€ringute, just punktipĂ€ringute puhul.
Kui on vaja suurendada ClickHouse klastrit lihtsete pĂ€ringute arvu osas, soovitan kĂ”ige lihtsamat - suurendada replikate arvu ja saata pĂ€ringud juhuslikule replikale. Kui ĂŒks replik suudab taluda viissada pĂ€ringut sekundis, mis on tĂ€iesti reaalne, siis kolm replikat suudavad taluda poolteist tuhat.
MĂ”nikord on loomulikult vĂ”imalik ka ClickHouse seadistada maksimaalse arvu punktisel lugemiseks. Mida selleks teha? Esiteks, vĂ€hendada indeksi granulaarsust. Siiski tuleks seda vĂ€hendada mitte ĂŒksuseni, vaid arvestades, et indeksi sissekandeid on serveris paar miljonit vĂ”i kymmened miljonid. Kui tabelis on sada miljonit rida, vĂ”ib granulaarsuse seadistamiseks mÀÀrata 64.
Kompresseeritud ploki suurust on vĂ”imalik vĂ€hendada. Selleks on olemas seadistused. min. kompressioonibloki suurus, max. kompressioonibloki suurus. Nende vĂ€henemine ja andmete ĂŒmberlaadimine kiirendab punktipĂ€ringute tĂ€itmist. Kuid ClickHouse ei ole siiski key-value andmebaas. Suur hulk vĂ€ikeseid pĂ€ringuid on koormuse antipaater.
Kirill Shvakov: Annan nĂ”u, juhul kui seal on tavalised kontod. See on ĂŒsna tavaline olukord, kui ClickHouse'is hoitakse mingit arvestit. Mul on kasutaja, ta on pĂ€rit sellisest riigist, veel mingi kolmas vĂ€li, ja on vaja inkrementeerida midagi. VĂ”tke MySQL, looge unikaalne vĂ”ti - MySQL'is on see duplicate key, PostgreSQL'is on see conflict - ja lisage plusse. See töötab oluliselt paremini.
Kui teil on vĂ€he andmeid, siis ClickHouse'i kasutamisel ei ole eriti mĂ”tet. On tavalised andmebaasid, mis selle ĂŒlesandega hĂ€sti hakkama saavad.
Mida Tuneerida ClickHouse'is, et rohkem andmeid oleks vahemÀlus?
Kujutame ette olukorda - serverites on 256 GB RAM, igapĂ€evases rutiinis kasutab ClickHouse umbes 60â80 GB, tipul kuni 130. Mida saab sisse lĂŒlitada ja timmida, et rohkem andmeid oleks vahemĂ€lus ja seega vĂ€hem kĂ€ike kettale?
Ăldiselt tegeleb operatsioonisĂŒsteemi page cache selle ĂŒlesandega hĂ€sti. Kui avate lihtsalt top-i ja vaatate seal cached vĂ”i free, on seal ka nĂ€ha, kui palju on vahemĂ€llu salvestatud. Saate mĂ€rgata, et kogu vabamĂ€lu kasutatakse vahemĂ€luks. Sel juhul loetakse need andmed mitte diskilt, vaid mĂ€lust. VĂ”in öelda, et vahemĂ€lu kasutatakse tĂ”husalt, kuna salvestatakse kompressitud andmed.
Siiski, kui soovite mĂ”ned lihtsad pĂ€ringud veelgi kiiremaks muuta, on vĂ”imalik ClickHouse'is sisse lĂŒlitada vahemĂ€lu dekompressitud andmete jaoks. Seda nimetatakse uncompressed cache. Konfiguratsioonifailis config.xml seadistage uncompressed cache size soovitud vÀÀrtuseks â soovitan mitte rohkem kui poole vabast mĂ€lust, kuna ĂŒlejÀÀnu lĂ€heb page cache'i alla.
Lisaks on olemas kaks pĂ€ringutaseme seadistust. Esimene seadistus on use uncompressed cache â seda kasutatakse. Soovitame seda rakendada kĂ”igi pĂ€ringute jaoks, vĂ€lja arvatud raskete puhul, mis vĂ”ivad kogu andmevahemiku kustutada. Teine seadistus on midagi sellist nagu maksimaalne ridade arv vahemĂ€lu kasutamiseks. See piirab automaatselt suuremaid pĂ€ringuid, et nad ei oleks vahemĂ€lust mööda.
Kuidas kohandada storage_configuration, et andmeid hoida mÀlus?
Uues ClickHouse dokumentatsioonis leidisin jaotis, mis oli seotud . Kirjelduses on nÀide kiire SSD-ga.
Huvitav, kuidas saaks sarnast seadistust konfigureerida mahtkuum mĂ€lu jaoks. Ja veel ĂŒks kĂŒsimus. Kuidas select töötleb sellise andmete korraldusega, kas ta loeb kogu komplekti vĂ”i ainult selle, mis on kettal, ja kas need andmed komprimeeritakse mĂ€lus? Ja kuidas töötab prewhere lĂ”ik sellise andmete korraldusega?
See seadistus mÔjutab andmefragmentide salvestamist, kuid nende formaat ei muutu.
Vaadakem lÀhemalt.
Andmete salvestamine RAM-is on vĂ”imalik. KĂ”ik, mis kettale seadistatakse, on selle tee. Loote tmpfs partitsiooni, mis on monteeritud mĂ”nesse teatud kohta failisĂŒsteemis. MÀÀrate selle tee kuumade andmete salvestamise teena, kuhu hakkavad voolama ja kirjutama andmeplokid, kĂ”ik on korras.
Aga ma ei soovita seda teha madala usaldusvÀÀrsuse tĂ”ttu, kuigi kui teil on vĂ€hemalt kolm koopiat erinevates andmekeskustes, siis tasub. Kui midagi juhtub, siis andmed taastatakse. Kujutame ette, et server lĂŒlitati Ă€kki vĂ€lja ja tagasi sisse. Partitsioon monteeriti uuesti, kuid seal on tĂŒhjus. ClickHouse server kĂ€ivitamisel nĂ€eb, et tal on need plokid puudu, kuigi vastavalt ZooKeeperi metaandmetele peaksid nad olemas olema. Ta vaatab, millistel koopiatel nad on, kĂŒsib neid ja laadib alla. Nii taastatakse andmed.
Selles mĂ”ttes ei erine andmete salvestamine mĂ€lus pĂ”himĂ”tteliselt nende salvestamisest kettale, sest andmete salvestamisel kettale satuvad need esmalt page cache'i ja salvestatakse fĂŒĂŒsiliselt edasi lĂŒkatult. See sĂ”ltub failisĂŒsteemi montaaĆŸivariandist. Kuid igaks juhuks ĂŒtlen, et ClickHouse ei tee fsync'i sisestamisel.
Sellegipoolest salvestatakse mÀlus olevad andmed tÀpselt samas vormingus nagu kettal. Select-pÀring valib tÀpselt samamoodi osad, mida on vaja lugeda, valib osades vajalikud andmevahemikud ja loeb neid. Ja prewhere töötab tÀiesti samamoodi, olenemata sellest, kas andmed olid mÀlus vÔi kettal.
Kui palju unikaalseid vÀÀrtusi on Low Cardinality efektiivne?
Low Cardinality on nutikalt ĂŒles ehitatud. See loob andmesĂ”nastikke, kuid need on kohalikud. Esiteks, igal osal on omad sĂ”nastikud ja teiseks, isegi ĂŒhe osa sees vĂ”ivad need iga vahemiku jaoks olla erinevad. Kui unikaalsete vÀÀrtuste arv jĂ”uab kĂŒnniseni - minu arvates on see miljon - siis sĂ”nastik lihtsalt lĂŒkatakse edasi ja luuakse uus.
KokkuvĂ”tteks: iga lokaalse vahemiku jaoks â nĂ€iteks iga pĂ€eva puhul â on madala kardinaalsuse efektiivne kuni miljon unikaalset vÀÀrtust. PĂ€rast seda on lihtsalt tagasiviske variant, kus kasutatakse erinevaid sĂ”nastikke, mitte ĂŒhte. See töötab umbes nagu tavaline stringi tĂŒĂŒbiga veerg, vĂ”ib-olla veidi vĂ€hem efektiivselt, kuid tĂ”siseid jĂ”udluslangusi ei teki.
Millised on parimad praktikad tÀisteksti otsimise jaoks tabelis, kus on viis miljardit rida?
On erinevaid vastuse variante. Esimene â öelda, et ClickHouse ei ole sĂŒsteem tĂ€isteksti otsimiseks. Selle jaoks on olemas eraldi sĂŒsteemid, nĂ€iteks ja . Siiski kohtan ĂŒha enam inimesi, kes ĂŒtlevad, et nad lĂ€hevad Elasticsearchilt ClickHousele ĂŒle.
Mis see sĂŒĂŒdistus on? Nad selgitavad seda sellega, et Elasticsearch lĂ”petab teatud mahtudega koormuse talumise, alustades indeksite loomisega. Indeksid muutuvad liiga mahukaks ja kui andmed lihtsalt ClickHouse'i ĂŒle viia, selgub, et need salvestatakse mitu korda efektiivsemalt. Samal ajal ei olnud otsingupĂ€ringud sageli sellised, et leida mingit fraasi kogu andmemahu hulgast morfoloogiat arvesse vĂ”ttes, vaid hoopis teistsugused. NĂ€iteks leida mĂ”ne viimase tunni jooksul logidest mingi baitide alase jĂ€rjendi.
Sel juhul loote ClickHouse'is indeksi, mille esimene vĂ€li on kuupĂ€ev koos ajaga. Andmete suurim piirang on just kuupĂ€evade vahe. Valitud kuupĂ€evade vahemikus on pĂ€rast seda tavaliselt vĂ”imalik teha tĂ€isteksti otsingut isegi bruteforce-meetodil like abil. Like operaator ClickHouse'is on kĂ”ige tĂ”husam like operaator, mille leiate. Kui leiate parema â öelge mulle.
Kuid siiski on like â see on tĂ€ielik skaneerimine. Ja tĂ€ielik skaneerimine vĂ”ib olla aeglane mitte ainult CPU, vaid ka ketaste osas. Kui teil on nĂ€iteks ĂŒks terabait andmeid pĂ€evas ja otsite ĂŒhe pĂ€eva jooksul mingit sĂ”na, tuleb teil skaneerida terabait. Ja see on tĂ”enĂ€oliselt tavalistel kĂ”vaketastel, mis tĂ€hendab, et need tĂ”stavad koormust nii palju, et te ei pÀÀse sellele serverile SSH kaudu.
Selles olukorras olen valmis pakkuma veel ĂŒhte vĂ€ikest trikki. See on katsetusmudel â see vĂ”ib töötada vĂ”i vĂ”ib ka mitte töötada. ClickHouse'is on tĂ€istekstitĂŒĂŒpi indeksid trigrammsete Bloom-filtide kujul. Meie kolleegid ettevĂ”ttest Arenadata on juba proovinud neid indekseid ja sageli töötavad nad just nii, nagu ette nĂ€htud.
Et neid Ôigesti kasutada, tuleks hÀsti aru saada, kuidas need tÀpselt toimivad: mis on trigrammne Bloom-filter ja kuidas valida selle suurus. VÔin öelda, et need aitavad haruldaste fraaside, alalÔikude pÀringute korral, mis esinevad andmetes harva. Sellisel juhul valitakse indeksite pÔhjal alamvahemikud ja loetakse vÀhem andmeid.
Hiljuti lisandus ClickHouse'i veelgi arenenumaid funktsioone tĂ€isteksti otsinguks. Esiteks, on nĂŒĂŒd vĂ”imalik korraga otsida mitmeid alamsĂ”nu ĂŒhe lĂ€bimisega, sealhulgas arvestades suur- ja vĂ€iketĂ€hti, ilma suur- ja vĂ€iketĂ€hti arvestamata, UTF-8 toe vĂ”i ainult ASCII puhul. Valige kĂ”ige efektiivsem variant, mis teile sobib.
Samuti on nĂŒĂŒd olemas vĂ”ime otsida mitu regulaarset vĂ€ljendit ĂŒhe korraga. Te ei pea kirjutama X like ĂŒks alamsĂ”na or X like teine alamsĂ”na. Kirjutage kohe ja kĂ”ik toimub maksimaalselt efektiivselt.
Kolmandaks â nĂŒĂŒd on olemas lĂ€hendus regulaarsete vĂ€ljendite otsingule ja lĂ€hendatud alamsĂ”nade otsingule. Kui keegi on kirjutanud sĂ”na vale kirjaga, otsitakse seda maksimaalse vaste alusel.
Kuidas korraldada ClickHouse'i juurdepÀÀs suurte kasutajate hulkade jaoks?
RÀÀkige, kuidas paremini korraldada ligipÀÀsu suurtele tarbijatele ja analĂŒĂŒtikutele. Kuidas luua jĂ€rjekord, prioriseerida pĂ€ringud max concurent queries ja milliste tööriistade abil?
Kui klaster on piisavalt suur, on mĂ”istlikuks lahenduseks tĂ”sta veel kaks serverit, mis toimivad analĂŒĂŒtikute sisenemise punktidena. See tĂ€hendab, et analĂŒĂŒtikuid ei lasta konkreetsetesse klastrite shardidesse, vaid luuakse lihtsalt kaks tĂŒhja serverit, ilma andmeteta, ja neile seadistatakse juurdepÀÀsuĂ”igused. Samal ajal edastatakse kasutajate seadistused hajutatud pĂ€ringute puhul kaugserveritele. See tĂ€hendab, et te seadistate kĂ”ik neis kahes serveris ning seadistused mĂ”juvad kogu klastris.
Need serverid on pÔhimÔtteliselt andmeteta, kuid nende mÀlu maht on pÀringute tÀitmiseks vÀga oluline. Ketast saab kasutada ka ajutiste andmete jaoks, kui vÀline agregatsioon vÔi vÀline sorteerimine on lubatud.
On oluline vaadata seadistusi, mis on seotud kĂ”ikide vĂ”imalike limiitidega. Kui ma nĂŒĂŒd sisenen "Yandex.Metrika" klastrisse kui analĂŒĂŒtik ja esitan pĂ€ringu select count from hits, siis antakse mulle kohe vĂ€lja erand, et ma ei saa pĂ€ringut tĂ€ita. Maximaalne ridade arv, mida mul on lubatud skaneerida, on sada miljardit, kuid klastris on kokku viiskĂŒmmend triljonit ĂŒhes tabelis. See on esimene piirang.
Oletame, et ma eemaldan ridade arvu piirangu ja sooritan pĂ€ringu uuesti. Siis nĂ€en jĂ€rgmist erandit â seadistus on lubatud. kaudne indekseerimine kuupĂ€eva jĂ€rgi. Ma ei saa pĂ€ringut sooritada, kui ma ei ole mÀÀranud kuupĂ€evavahemikku. Ei tasu loota, et analĂŒĂŒtikud mÀÀravad selle kĂ€sitsi. TĂŒĂŒpiline olukord on, et kuupĂ€evavahemikud on mÀÀratud, kus ĂŒrituse kuupĂ€ev on vahemikus nĂ€dal. Ja siis on lihtsalt vale sulg, ning and ja asemel on or â vĂ”i URL-i vastavus. Kui piiranguid ei ole, lĂ€heb see skaneerima URL-i veergu ja kulutab lihtsalt tohutult ressursse.
Lisaks on ClickHouse'is kaks prioriteeti seadistust. Kahjuks on need vĂ€ga primitiivsed. Ăks neist on lihtsalt nimetatud prioriteet. Kui prioriteet â 0 ja pĂ€ringud on teatud prioriteediga, kuid samal ajal toimub pĂ€ring prioriteediga, mille vÀÀrtus on madalam, mis tĂ€hendab kĂ”rgemat prioriteeti, siis pĂ€ring, mille prioriteedi vÀÀrtus on suurem, mis tĂ€histab madalamat prioriteeti, lihtsalt peatatakse ja ei tööta selle aja jooksul kindlasti.
See on vĂ€ga jĂ€ik seadistus, mis ei sobi juhul, kui klastril on pidev koormus. Kui aga teil on lĂŒhikesed ja kiireloomulised pĂ€ringud, mis on olulised, ja enamasti klaster seisab, siis selline seadistus sobib hĂ€sti.
JĂ€rgmine prioriteetide seadistus on OS thread priority. See mÀÀrab kĂ”igile pĂ€ringute tĂ€itmise lĂ”imedele Linuxi ajakava jaoks nice vÀÀrtuse. See töötab enam-vĂ€hem, kuid ikkagi toimib. Kui seada kĂ”ige madalam nice vÀÀrtus â mis on kĂ”ige suurem, seega kĂ”ige madalam prioriteet â ja kĂ”rge prioriteediga pĂ€ringute puhul seada -19, siis CPU tarbib madala prioriteediga pĂ€ringute töötlemiseks umbes neli korda vĂ€hem ressursse kui kĂ”rge prioriteediga pĂ€ringute jaoks.
Samuti on vaja seadistada maksimaalne pĂ€ringu tĂ€itmise aeg â ĂŒtleme viis minutit. Minimaalne pĂ€ringu tĂ€itmise kiirus â see on kĂ”ige olulisem. See seadistus on juba olemas olnud ja see on vajalik, et mitte lihtsalt vĂ€ita, et ClickHouse ei aeglusta, vaid et seda ka sundida.
Kujutage ette, et seadistate: kui mĂ”ni pĂ€ring töötleb vĂ€hem kui miljonit rida sekundis â nii ei tohi teha. See hĂ€bistab meie head nime, meie head andmebaasi. Geuda see lihtsalt keelata. Seal on tegelikult kaks seadistust. Ăks nimetatakse min execution speed â ridade kaupa sekundis, ja teine nimetatakse timeout before checking min execution speed â vaikimisi viisteist sekundit. See tĂ€hendab, et viisteist sekundit on lubatud, ja siis, kui see on aeglane, visatakse lihtsalt erand â pĂ€ring katkestatakse.
Kuid peate seadistama ka kvoodid. ClickHouse'is on sisseehitatud kvoodi vĂ”imalus, mis jĂ€lgib ressursside tarbimist. Kahjuks ei ole see rauaresursside, nagu CPU ja kettad, vaid loogiliste â töödeldud pĂ€ringute arvu, ridade ja loetud baitide suurus. Ja saate seada nĂ€iteks maksimaalselt sada pĂ€ringut viie minuti jooksul ja tuhat pĂ€ringut tunni jooksul.
Miks see oluline on? Sest osa analĂŒĂŒsikĂŒsimusi kĂ€itatakse kĂ€sitsi otse ClickHouse'i kliendist. Ja kĂ”ik lĂ€heb hĂ€sti. Kuid kui teie ettevĂ”ttes on edasijĂ”udnud analĂŒĂŒtikud, kirjutavad nad skripti, ja skripti sees vĂ”ib olla viga. Ja see viga pĂ”hjustab selle, et pĂ€ring toimub lĂ”pmatus tsĂŒklis. Sellest tuleb kaitse alla vĂ”tta.
Kas on vĂ”imalik anda ĂŒhe pĂ€ringu tulemused kĂŒmnele kliendile?
Meil on mitmeid kasutajaid, kes armastavad tulla vĂ€ga suurte pĂ€ringutega samal ajal. PĂ€ring on suur, see kĂ€ivitub pĂ”himĂ”tteliselt kiiresti, kuid kuna selliseid pĂ€ringuid on korraga palju, muutub see vĂ€ga valusaks. Kas on vĂ”imalik sama pĂ€ring, mis saabus kĂŒmme korda jĂ€rjest, teha ainult ĂŒks kord ning andmed edasi anda kĂŒmnele kliendile?
Probleem on selles, et meil pole tulemuste vahemĂ€lu ega vaheandmete vahemĂ€lu. On olemas operatsioonisĂŒsteemi lehe vahemĂ€lu, mis vĂ”imaldab andmeid kettalt uuesti mitte lugeda, kuid kahjuks peavad andmed ikkagi dekompressioonima, deserialiseerima ja uuesti töötlema.
Soovitaksime leida viise selle vĂ€ltimiseks, kas vaheandmete vahemĂ€luga vĂ”i korraldades sarnased pĂ€ringud mingisse jĂ€rjekorda ja lisades tulemuste vahemĂ€lu. Praegu on meil arenduses ĂŒks pull request, mis lisab pĂ€ringute vahemĂ€lu, kuid ainult alampĂ€ringutele sektsioonides in ja join â seega pole lahendus tĂ€iuslik.
Kuid meil tekib ka selline olukord. Eriti tĂŒĂŒpiline nĂ€ide on pĂ€ringud lehekestega. On aruanne, milles on mitu lehte, ja pĂ€ring kĂ€ib limit 10. Siis sama asja, kuid limit 10,10. SeejĂ€rel tuleb jĂ€rgmine lehekĂŒlg. Ja tekib kĂŒsimus, miks me iga kord seda kĂ”ik arvutame? Kuid praegu pole lahendust ja seda ei saa vĂ€ltida.
On alternatiivne lahendus, mis paigaldatakse ClickHouse'i kĂ”rvale â .
Kirill Shvakov: ClickHouse Proxy's on sisseehitatud kiiruspiiraja ja tulemuste vahemÀlu. Seal on palju seadeid, kuna lahendati sarnane probleem. Proxy vÔimaldab piirata pÀringuid, korraldades need jÀrjekorda, ning seadistada, kui kaua pÀringute vahemÀlu kehtib. Kui pÀringud olid tÔeliselt sama, annab Proxy need mitu korda, kuid ClickHouse'i poole pöördub vaid kord.
Nginx'il on tasuta versioonis ka cache, ja see töötab samuti. Nginx'il on isegi seaded, mis vĂ”imaldavad, kui pĂ€ringud saabusid samal ajal, aeglustada teisi, kuni ĂŒks neist on tĂ€ielikult tĂ€idetud. Kuid ClickHouse Proxy seadistus on tehtud tunduvalt paremini. See on loodud spetsiaalselt ClickHouse'ile, et toetada just selliseid pĂ€ringuid, mistĂ”ttu sobib see paremini. Ja selle seadistamine on lihtne.
Kuidas kĂ€ituda asĂŒnkroonsete toimingute ja materialiseeritud vaadete puhul?
On olemas probleem, et toimingud replikeerimise mootori puhul on asĂŒnkroonsed â esmalt salvestatakse andmed, seejĂ€rel toimub nende kokkuliitmine. Kui tabeli all elab materialiseeritud tabel koos mĂ”nede agregaatidega, siis nendele kirjutatakse dubleeritud andmed. Ja kui puudub keeruline loogika, siis andmed dubleeritakse. Mis selle probleemiga teha saab?
On ilmne lahendus â rakendada esmase funktsiooni aktiveerimise kĂ€igus triggereid teatud tĂŒĂŒpi matviews'ide jaoks asĂŒnkroonsete kokkuliitmiste korral. Kas on mingeid "kuldpalle", plaane selliste funktsionaalsuste rakendamiseks?
Tasub uurida, kuidas deduplikatsioon töötab. See, millest ma praegu rÀÀgin, ei puutu kĂŒsimusega kokku, aga igaks juhuks tasub seda meeles pidada.
Replitseeritud tabelisse sisestamisel toimub tĂ€ielikult sisestatud plokkide dedupeerimine. Kui olete uuesti sisestanud sama ploki, mis sisaldab sama arvu samu ridu samas jĂ€rjestuses, dedupeeritakse andmed. Te saate sisestusele âOkâ vastuse, kuid tegelikult salvestatakse vaid ĂŒks andmepartii ning see ei kordustu.
See on vajalik selguse jaoks. Kui sisestamise ajal saite âOkâ, tĂ€hendab see, et teie andmed on sisestatud. Kui saite ClickHouse'ilt vea, tĂ€hendab see, et nad ei ole sisestatud ja sisestamist tuleb korrata. Kuid kui sisestamise ajal kadus ĂŒhendus, ei tea te, kas andmed on sisestatud vĂ”i mitte. Ainuke vĂ”imalus on sisestamist uuesti korrata. Kui andmed tegelikult olid sisestatud ja te sisestate need uuesti, toimub plokkide dedupeerimine. See on vajalik duplikaatide vĂ€ltimiseks.
Ja on oluline ka see, kuidas see töötab materialiseeritud vaadete jaoks. Kui andmed on sisestamisel peamisele tabelile dedupeeritud, siis materialiseeritud vaates nad ei liigu.
NĂŒĂŒd seoses kĂŒsimusega. Teie olukord on keerulisem, kuna salvestate ainulaadsete ridade koopiaid. See tĂ€hendab, et mitte kogu rida ei ole duplikeeritud, vaid konkreetsed read, ja need kokkukuuluvad taustal. TĂ”epoolest, andmed koonduvad pĂ”h tabelisse, samas kui materialiseeritud vaates lĂ€hevad need mittekoonduvad ja liitmise korral ei juhtu materialiseeritud vaadetega midagi. Sest materialiseeritud vaade on mitte midagi muud kui insert-trigger. Muude toimingute ajal ei toimu selle suhtes midagi tĂ€iendavat.
Ja ma ei saa siin midagi head öelda. Tuleb ainult otsida konkreetset lahendust sellele juhtumile. NÀiteks, kas on vÔimalik ka materialiseeritud vaates teha asendust, ja vÔib-olla dedupikatsiooni meetod töötab samuti. Kuid kahjuks ei toimi see alati. Kui see on koondav, siis ei Ônnestu.
Kirill Shvakov: Meil oli ka omal ajal sisuliselt nagu köitmine. Oli probleem, et reklaamieelarved eksisteerivad, ja on mĂ”ned andmed, mida saame reaalajas nĂ€idata â need on lihtsalt nĂ€itamine. Need harva korduvad, kuid kui see juhtub, siis me ikkagi sulgeme need hiljem. Ja olid asjad, mida ei saanud dubleerida â klikkide ja kogu selle looga. Kuid neid oleks tahtnud peaaegu kohe nĂ€idata.
Kuidas loodi materialiseeritud vaated? Oli vaated, kuhu kirjutatakse otse â andmed kirjutatakse tooredata, ja kirjutatakse vaateisse. Seal mingi hetk andmed ei ole vĂ€ga Ă”iged, need dubleeritakse jne. Ja on teine osa tabelist, kus need nĂ€evad tĂ€pselt samad vĂ€lja nagu materialiseeritud vaated, s.t. struktuurilt on nad tĂ€iesti ĂŒhesugused. Aeg-ajalt me ĂŒmber arvestame andmed, arvutame andmed ilma dubleeringuteta ja kirjutame need tabelitesse.
KĂ€isime API kaudu â ClickHouse'iga kĂ€sitsi seda teha ei saa. API jĂ€lgib: kui mul on tabelis viimane lisamise kuupĂ€ev, kus andmed on tĂ€psed ja arvutatud, siis teeb ta pĂ€ringu ĂŒhest tabelist teise. Ăhest valib ta kindla ajani, ja teisest lisab, mis veel arvutamata on. Ja see töötab, aga mitte ĂŒhegi ClickHouse'i vahendiga.
Kui teil on mingi API â analĂŒĂŒtikute jaoks, kasutajate jaoks â siis pĂ”himĂ”tteliselt on see variant. Te alati arvutate, alati uuesti kokku. Seda vĂ”ib teha kord pĂ€evas vĂ”i mingil muul ajal. Te valite ise enda jaoks perioodi, mis teile ei ole vajalik ega kriitiline.
ClickHouse'is on palju logisid. Kuidas ma saan nÀha kÔike, mis serveriga toimub, hetkel?
ClickHouse'is on vĂ€ga suur hulk erinevaid logisid ning see hulk kasvab. Uutes versioonides on mĂ”ned neist isegi vaikimisi sisse lĂŒlitatud, vanemates versioonides tuleb neid uuendamisel sisse lĂŒlitada. Sellegipoolest on neid jĂ€rjest rohkem. Sooviksin lĂ”ppkokkuvĂ”ttes nĂ€ha, mis minu serveriga praegu toimub, vĂ”ib-olla mĂ”nel kokkuvĂ”tvad armatuurlaual.
Kas teil vÔi teie sÔprade meeskonnas on ClickHouse'i spetsialiste, kes toetavad valmis dashboards'e, mis kuvavad logsid juba valmis tootena? LÔppkokkuvÔttes on logsid ClickHouse'is vaatamine tore. Kuid oleks tÔeliselt Àge, kui need oleksid juba dashboard'ina valmis. See tooks suuri rÔÔme.
Dashboards'id on olemas, kuid need ei ole standardiseeritud. Meie ettevÔttes kasutab ClickHouse'i umbes 60 meeskonda, ja mis kÔige kummalisem, paljudel neist on omaenda tehtud dashboards'id, mis on veidi erinevad. MÔned meeskonnad kasutavad Yandexi pilveteenuse sisemist installatsiooni. Seal on mÔned valmis raportid, kuigi mitte kÔik vajalikud. Teistel on omad.
Minu kolleegidel âMetristâ on oma dashboard Grafanas, ja mul on oma nende klastriga. Seal jĂ€lgin asju nagu cache hit kihi jĂ€lgimiseks. Ja asi on isegi keerulisem, kuna kasutame erinevaid tööriistu. Olin loonud oma dashboard'i vĂ€ga vana tööriistaga nimega Graphite-web. See on tĂ€iesti kole. Ja ma kasutan seda endiselt, kuigi Grafana oleks kindlasti mugavam ja ilusam.
Dashboardide pĂ”hielement on sama. Need on sĂŒsteemilised mÔÔdikud klastrite kohta: CPU, mĂ€lu, ketas, vĂ”rk. Teised - samaaegsete pĂ€ringute arv, samaaegsete ĂŒhinemiste arv, pĂ€ringute arv sekundis, maksimaalne osade arv MergeTree tabelite partitsioonide jaoks, replikatsiooni viivitus, replikatsiooni jĂ€rjekorra suurus, sekundi kohta sisestatud ridade arv, sekundi kohta sisestatud plokkide arv. See on kĂ”ik, mis tuleb mitte logidest, vaid mÔÔdikutest.
Vladimir Kolobaev: Aleksei, ma tahaksin veidi tÀpsustada. On olemas Grafana. Grafanal on andmeallikas, milleks on ClickHouse. See tÀhendab, et ma saan Grafanast pÀringuid otse ClickHouse'i teha. ClickHouse'is on logide tabel, mis on kÔigil sama. Ma tahan, et Grafanas viidatakse sellele logide tabelile ja nÀeksin neid pÀringuid, mida minu server esitab. Oleks suurepÀrane omada sellist dashboard'i.
Ma tegin selle ise. Aga mul tekib kĂŒsimus - kui see on kĂ”ik standardiseeritud ja Grafanat kasutavad kĂ”ik, miks ei ole 'Yandexis' sellist ametlikku dashboard'i?
Kirill Shvakov: Tegelikult toetab ClickHouse'i andmeallikat praegu Altinity. Ja ma tahan lihtsalt anda suunise, kuhu kaevata ja keda lĂŒkata. Neilt vĂ”ib kĂŒsida, kuna Yandex tegeleb siiski ClickHouse'iga, mitte selle ĂŒmber olevate asjadega. Altinity on peamine ettevĂ”te, mis praegu ClickHouse'i edendab. Nad ei jĂ€ta seda tĂ€helepanuta, vaid jĂ€tkavad toetust. Sest pĂ”himĂ”tteliselt, et laadida paneel Grafana veebisaidile, peab lihtsalt registreeruma ja selle ĂŒles laadima - erilisi probleeme ei ole.
Alexei Milovidov: Viimase aasta jooksul on ClickHouse'i lisatud palju vÔimalusi pÀringute profileerimiseks. Igal pÀringul on ressursikasutuse metoodikud. Just hiljuti lisati veel madalama taseme pÀringu profilaator, et nÀha, kus pÀring kulutab iga millisekundi. Kuid selle funktsionaalsuse kasutamiseks pean avama konsooli klienti ja sisestama pÀringu, mille ma pidevalt unustan. Olen selle kuhugi salvestanud ja unustan pidevalt, kuhu tÀpselt.
Soovin, et oleks tööriist, kus lihtsalt on öeldud - siin on teie rasked pĂ€ringud, rĂŒhmitatud pĂ€ringute klasside jĂ€rgi. KlĂ”psasin mĂ”nel ja mulle öeldakse, et see on sellepĂ€rast keeruline. Praegu sellist lahendust pole. TĂ”eliselt kummaline on, et kui inimesed mind kĂŒsivad: âKas on olemas mĂ”ni valmis armatuurpaneel Grafana jaoks?â, ĂŒtlen ma: âMinge Grafana saidile, sinna on kogukonna 'Armatuurpaneelid', seal on Dima armatuurpaneel, on Kostja armatuurpaneel. Mis need on, ei tea, ise pole kasutanud.â
Kuidas mĂ”jutada merdĆŸisid, et server ei kukuks OOM-i?
Mul on tabel, tabelis on vaid ĂŒks partitsioon, see on ReplacingMergeTree. Kirjutan sinna andmeid juba nelja aasta jooksul. Ma pidin sinna tegema alteri ja kustutama mĂ”ned andmed.
Tegin seda ja selle pĂ€ringu töötlemise kĂ€igus lĂ€ks kogu mĂ€lu kĂ”ikidesse klastriserveritesse ja kĂ”ik klastriserverid kukkusid ĂŒhiselt OOM-i. Siis nad kĂ”ik koos tĂ”usid, hakkasid tĂ€itma selle sama toimingu merdĆŸimist, selle andmeploki merdĆŸimist ja kukkusid jĂ€lle OOM-i. Siis nad tĂ”usid jĂ€lle ja kukkusid taas. See asi ei lĂ”ppenud.
Hiljem selgus, et tegu oli tegelikult veaga, mille nad parandasid. See on suurepĂ€rane, suur aitĂ€h. Aga tunne jĂ€i alles. Ja nĂŒĂŒd, kui mĂ”tlen, et tuleb teha mingisugune liitmine tabelis, tekib mul kĂŒsimus - miks ma ei saa kuidagi nende liitmistele mĂ”juda? NĂ€iteks, piirata neid vajaliku sĂŒsteemi mĂ€lu jĂ€rgi vĂ”i ĂŒldiselt nende arvu osas, mida see konkreetne tabel töödelda suudab.
Mul on tabel, mida nimetatakse "MÔÔdikud". Palun töötle seda kahe vooga. Ăra loo samal ajal kĂŒmmet vĂ”i viit liitmist, tee seda kahel. Ma arvan, et kahega mul piisab mĂ€lust, aga kĂŒmne töötlemiseks ei pruugi piisata. Miks hirm jÀÀb? Sest tabel kasvab ja kunagi satun ma olukorda, kus mitte enam vea tĂ”ttu, vaid sellepĂ€rast, et andmed muutuvad nii suurel hulgal, et mul lihtsalt ei jĂ€tku serveris mĂ€lu. Ja siis kukub server OOM-i liitmise kĂ€igus. Muidugi saan ma mutatsiooni tagasi vĂ”tta, aga liitmisi ei saa.
Teate, server ei kuku OOM-i, kuna merge'i kĂ€igus kasutatakse mĂ€lu vaid ĂŒhe vĂ€ikese andmevahemiku jaoks. Nii et kĂ”ik lĂ€heb hĂ€sti, olenemata andmete mahust.
Vladimir Kolobaev: Hea. Siin on selline moment, et pÀrast vea parendamist tÔmbasin endale uue versiooni ja teises, vÀiksemas tabelis, kus on palju partitioone, tegin sarnase toimingu. Merge'i kÀigus pÔletati serveris umbes 100 GB mÀlu. Mul oli 150 kasutuses, 100 kasutas Àra ja jÀi 50 GB vaba, seega ma ei kukkunud OOM-i.
Mis mind praegu OOM-i langemise eest kaitseb, kui see tÔesti tarvitab 100 GB mÀlu? Kuidas kÀituda olukorras, kui merge'i kÀigus mÀlu jÀrsku otsa lÔppeb?
Alexei Milovidov: On sel probleem, et mÀlu kasutamine merge'ide puhul ei piirdub ainult sellega. Teine probleem on see, et kui mingi merge on mÀÀratud, tuleb see ka tÀita, kuna see on logitute replikaatoris. Replikaatori logi on need toimingud, mis on vajalikud, et tuua replika jÀrjepidevasse seisundisse. Kui ei tehta kÀsitsi toiminguid, mis see replikaatorite logi tagasi kerib, tuleb merge mingil juhul tÀita.
Loomulikult oleks kasulik omada mĂ€lu piirangut, mis "igaks juhuks" kaitseb OOM-i vastu. See ei aita merge'il toimuda, see algab uuesti, jĂ”uab mingisse punkti, viskab erandi ja siis algab taas â midagi head ei tule sellest. Kuid pĂ”himĂ”tteliselt oleks see piirang kasulik kehtestada.
Kuidas toimub Golangi draiveri arendamine ClickHouse'i jaoks?
Golang draiver, mille on kirjutanud Kirill Shvakov, nĂ€ib nĂŒĂŒd olema ametlikult toetatud ClickHouse'i meeskonna poolt. Ta , ta on nĂŒĂŒd suur ja tĂ”eline.
VĂ€ike mĂ€rk. On olemas suurepĂ€rane ja kĂ”igile armastusvÀÀrne normaalsete lĂ”pmatute jĂ€rjestuste hoidla â Vertica. Neil on ka oma ametlik Python-draiver, mida toetavad Vertica arendajad. On olnud kordi, kui hoidla ja draiveri versioonid erinevad ĂŒksteisest oluliselt ning draiver lakkab mingil hetkel töötamast. Teine asi. Selle ametliku draiveri tugi, nagu mulle tundub, pĂ”hineb sĂŒsteemil "nipel" â kirjutad neile probleemist, ja see jÀÀb igaveseks ootele.
Mul on kaks kĂŒsimust. Praegu on Kirilli Golang-draiver peaaegu vaikimisi viis kommunikatsiooniks Golangi ja ClickHouse'i vahel. Olgu, et keegi suhtleb endiselt HTTP liidese kaudu, kuna talle see sobib. Kuidas toimub selle draiveri arendamine? Kas see sĂŒnkroniseeritakse hoidlas toimuvate breaking changes'idega? Ja kuidas toimub probleemide arutamine?
Kirill Shvakov: Esimene on see, kuidas kĂ”ik on bĂŒrokraatlikult korraldatud. Seda teemat ei arutatud, seega pole mul sellele vastata.
KĂŒsimusele vastamiseks on vajalik vĂ€ike lugu draiverist. Töötasin ettevĂ”ttes, kus oli palju andmeid. See oli reklaamitootmine, kus oli tohutult sĂŒndmusi, mida tuli kuskil salvestada. Ja mingil hetkel tuli ClickHouse. Valasime sinna andmed ja esialgu lĂ€ks kĂ”ik hĂ€sti, aga hiljem ClickHouse kukkus kokku. Sel hetkel otsustasime, et see pole meile vajalik.
Aasta pĂ€rast naasime mĂ”tte juurde kasutada ClickHouse'i ning meil tuli kuidagi andmeid seal kirjutada. Sissejuhatus oli selline â riistvara oli vĂ€ga nĂ”rk, ressursse oli vĂ€he. Aga me oleme alati nii töötanud, seega vaatasime kohalikku protokolli poole.
Kuna me töötasime Go keeles, oli selge, et vajame Go draiverit. Teisin seda praktiliselt tĂ€iskohaga â see oli minu tĂ¶Ă¶ĂŒlesanne. Kuni mingisuguse hetkeni viimistlesime seda, ja pĂ”himĂ”tteliselt ei eeldanud keegi, et keegi peale meie seda kasutama hakkab. Siis tuli CloudFlare sama probleemiga ning mingil hetkel töötasime nendega vĂ€ga ĂŒhte moodi, sest neil olid samad ĂŒlesanded. Tegime seda nii ClickHouse'is kui ka draiveris.
MÔnel hetkel lihtsalt lÔpetasin sellega tegelemise, sest minu tegevus ClickHouse'i osas ja töö on natuke muutunud. SeetÔttu jÀÀvad probleemid lahendamata. Aeg-ajalt teevad inimesed meie hoidlasse commit'e, kellel on ka midagi tarvis. Siis vaatan pull request'e ja mÔnikord isegi parandan midagi ise, kuid see juhtub harva.
Tahaksin draiveriga tagasi pöörduda. MĂ”ni aasta tagasi, kui kĂ”ik see algas, oli ClickHouse ka teine ja selle vĂ”imalused olid teised. Praegu on aga aru saadud, kuidas draiverit ĂŒmber teha, et see toimiks hĂ€sti. Kui see juhtub, siis versioon 2 on igal juhul ĂŒhilduv, kuna vanad lahendused on kogunenud.
Kuidas seda korraldada, ei tea ma. Mul endal ei ole palju aega. Kui mÔned inimesed hakkavad draiverit edasi arendama, saan neid aidata ja selgitada, mida teha. Kuid just aktiivne «Yandexi» osalemine projekti arengus ei ole veel arutlusele tulnud.
Alexei Milovidov: Praegu ei ole nende draiverite osas mingeid bĂŒrokraatiaid. Ainult see, et need on ametlikule organisatsioonile ĂŒle antud, mis tĂ€hendab, et see draiver on Go jaoks ametlikuks vaikimisi lahenduseks tunnustatud. On olemas muid draivereid, kuid need on eraldi.
Meil ei ole nende draiverite jaoks mingit arendust. KĂŒsimus on selles, kas suudame palgata eraldi inimese, mitte just selle draiveri jaoks, vaid kĂ”igi kogukonna draiverite arendamiseks, vĂ”i suudame leida kedagi vĂ€ljastpoolt.
VĂ€line sĂ”nastik ei tĂ”use pĂ€rast taaskĂ€ivitamist, kui lazy_load seade on sisse lĂŒlitatud. Mis peaks siis tegema?
Meil on sisse lĂŒlitatud lazy_load seade, ja pĂ€rast serveri taaskĂ€ivitamist ei tĂ”use sĂ”nastik automaatselt. See tĂ”useb ainult siis, kui kasutaja sellele sĂ”nastikule pöördub. Ja esmarakendamisel annab see veateate. Kas on vĂ”imalik kuidagi automaatselt ClickHouse'i abiga sĂ”nastikke laadida, vĂ”i peame alati nende valmisolekut ise jĂ€lgima, et kasutajad ei saaks vigu?
VÔib-olla on meil ClickHouse'i vana versioon, mistÔttu sÔnastik ei laaditud automaatselt. Kas see vÔib olla?
Esiteks on vĂ”imalik sĂ”nastikke sundida laadima, kasutades pĂ€ringut. sĂŒsteemi sĂ”nastike uuendamine. Teiseks, mis puudutab viga â kui sĂ”nastik on juba laaditud, siis pĂ€ringud töötavad laaditud andmete jĂ€rgi. Kui sĂ”nastik pole veel laaditud, laaditakse see pĂ€ringu hetkel.
Raskete sĂ”nastike puhul pole see eriti mugav. NĂ€iteks tuleb MySQL-st laadida miljon rida. Keegi teeb lihtsa select-i, kuid see select ootab miljonit rida. Siin on kaks lahendust. Esimene on vĂ€lja lĂŒlitada lazy_load. Teine on see, et kui server kĂ€ivitub, siis enne koormuse peale panemist teha sĂŒsteemi sĂ”nastiku uuendamine vĂ”i lihtsalt tĂ€ita pĂ€ring, mis kasutab sĂ”nastikku. Siis laaditakse sĂ”nastik. Peame ise kontrollima sĂ”nastike kĂ€ttesaadavust, kui lazy_load on sisse lĂŒlitatud, sest ClickHouse ei tĂ”mba neid automaatselt.
Viimasele kĂŒsimusele vastus â kas versioon on vana vĂ”i tuleb seda tĂ”rkeotsinguga seadistada.
Kuidas toimida, kui sĂŒsteemi sĂ”naraamatute uuendamine ei laadi ĂŒhtegi olemasolevat sĂ”naraamatut, kui vĂ€hemalt ĂŒks neist ebaĂ”nnestub?
Kas teil on veel kĂŒsimusi system reload dictionaries kohta? Meil on kaks sĂ”nastikku â ĂŒks ei laadi, teine laaditakse. System reload dictionaries ei laadi sel juhul ĂŒhtegi sĂ”nastikku, mistĂ”ttu tuleb konkreetsed sĂ”nastikud uuesti laadida nende nimede kaudu system reload dictionary abil. Kas see on samuti seotud ClickHouse'i versiooniga?
Tahaksin teile head uudist. See kĂ€itumine on muutunud. Seega, kui te uuendate ClickHouse'i, siis see muutub ka. Kui teile praegune kĂ€itumine ei meeldi, sĂŒsteemi sĂ”nastike uuendamine, siis uuendage ja loodame, et see muutub paremaks.
Kas on vÔimalik seadistada andmeid ClickHouse'i konfigureerimises, ilma et neid vigade korral paljastada?
JĂ€rgmiseks kĂŒsimuseks on vead, mis on seotud sĂ”nastikuga, nimelt rekvisiidi. Oleme mÀÀranud ĂŒhenduse rekvisiidi ClickHouse'i konfiguratsioonis sĂ”nastiku jaoks ja veateate korral saame need rekvisiidid ja parooli vastuseks.
Oleme selle vea lahendanud, viies rekvisiidid ODBC draiveri konfiguratsiooni. Kas on mingeid vÔimalusi rekvisiitide seadistamiseks ClickHouse'i konfiguratsioonis, ilma et me neid vigu esitades nÀitaksime?
Siin on lahendus: need credentials tuleb mĂ€rkida odbc.ini failis, samas ClickHouse'is tuleb kasutada ainult ODBC Data Source Name'i. Muude andmeallikate puhul seda ei juhtu â ei MySQLi sĂ”nastiku ega muude puhul ei tohiks te nĂ€ha parooli veateate korral. ODBC osas vaatan ka â kui see on olemas, tuleb see lihtsalt eemaldada.
Boonus: taustad Zoomi koosolekute jaoks
Pildi klikkimisel avanevad kĂ”ige kangekaelsematele lugejatele boonuses foonid koos ĂŒhiselt veedetud hetkede teemadega. Tuleme koos tulekahjuga toime Avito tehnikate maskottide seltsis, arutame kolleegidega sĂŒsteemiadministraatori ruumis vĂ”i vanakoolilise arvutiklubi keskkonnas ning viibime igapĂ€evases koosolekus graffiti taustal silla all.
Allikas: habr.com
