ClickHouse for advanced users in questions and answers

Aprillis kavatsevad Avito insenerid osaleda veebikohtumisel ClickHouse peaarendaja Aleksei Milovidovi ja Integrosest pĂ€rit Golang-arendaja Kirill Shvakoviga. RÀÀgime, kuidas me kasutame andmebaasi haldussĂŒsteemi ja millised probleemid meil tekivad.

Kohtumise pĂ”hjal koostasime artikli, kus eksperdid vastavad meie ja vaatajatel esitatud kĂŒsimustele varukoopiate, andmete resharde, vĂ€listes sĂ”nastikes, Golang-draiverite ja ClickHouse versioonide uuendamise kohta. See vĂ”ib olla kasulik arendajatele, kes juba aktiivselt töötavad Yandexi DB-ga ja huvituvad selle olevikust ja tulevikust. Aleksei Milovidovi vastused on vaikimisi, kui ei ole mĂ€rgitud teisiti.

Ole ettevaatlik, kuna allpool on palju teksti. Loodame, et kĂŒsimuste sisu aitab teil orientiire leida.

ClickHouse for advanced users in questions and answers

Sisukord

Kui te ei soovi teksti lugeda, vÔite vaadata koosolekute salvestust meie YouTube'i kanalis. Ajakoodid on video esimese kommentaari all.

ClickHouse uuendab end pidevalt, kuid meie andmed ei uuene. Mida selleks teha?

ClickHouse uuendab end pidevalt, kuid meie andmed, mis olid optimize final töödeldud, ei uuene ja jÀÀvad varukoopia alla.

Oletame, et meil on tekkinud mingi probleem ja andmed on kadunud. Otsustasime taastuda, ja selgus, et vanad partiid, mis on serverites varundamiseks, erinevad vÀga palju praegu kasutusel olevast ClickHouse versioonist. Mida sellises olukorras teha ja kas see on vÔimalik?

Olukord, kus te taastate varukoopiast andmed vanas formaadis, kuid uuemas versioonis nad ei sobi, ei ole vĂ”imalik. Me jĂ€lgime, et ClickHouse andmeformaat oleks alati tagasiĂŒhilduv. See on palju olulisem kui tagasipööratavus funktsionaalsuse osas, kui mĂ”ne harva kasutatava funktsiooni kĂ€itumine on muutunud. Andmed, mis on salvestatud kettale, peaks uus ClickHouse versioon alati olema suuteline lugema. See on seadus.

Millised on praegu parimad praktikud ClickHouse andmete varundamiseks?

Kuidas teha varukoopiaid, arvestades, et meil on optimize final operatsioonid, tohutud andmebaasid terabaitides ja andmed, mis uuenevad, oletame, viimase kolme pÀeva jooksul, ning edasi nendega mingit protseduuri ei toimu?

Me vÔime kasvatada oma lahendust ja bashis kirjutada: korralda niimoodi ja niimoodi need varukoopiad. VÔib-olla ei ole vajagi midagi kasvatada, ja jalgratas on juba ammu vÀlja mÔeldud?

Alustuseks parimate praktikate kohta. Minu kolleegid soovitavad alati kĂŒsimustele varukoopiate kohta vastates meenutada teenust 'Yandex.Cloud', kus see ĂŒlesanne on juba lahendatud. Nii et kasutage seda, kui on selline vĂ”imalus.

TĂ€ielikku lahendust, mis oleks100% integreeritud ClickHouse'iga, varukoopiate jaoks ei ole. On olemas mĂ”ned malli, mida saab kasutada. TĂ€ieliku lahenduse saamiseks tuleb kas veidi kĂ€sitsi vaeva nĂ€ha vĂ”i teha skripti kujul ĂŒmbriseid.

Alustan kÔige lihtsamatest lahendustest ja lÔpetan kÔige keerukamatega olenevalt andmete mahust ja klastrite suurusest. Mida suurem on klaster, seda keerulisemaks lahendus muutub.

Kui andmetabel hÔivab ainult paar gigabaiti, saab varukoopia teha nii:

  1. Salvesta tabelite mÀÀratlemine, st metaandmed — show create table.
  2. Tee dump ClickHouse kliendi abil — select * from table faili. Vaikimisi saad faili TabSeparated formaadis. Kui soovid tĂ”husamalt, saad formaadis Native.

Kui andmete maht on suurem, siis varukoopia vÔtab rohkem aega ja palju ruumi. Seda nimetatakse loogiliseks varukoopiateks, see ei ole seotud ClickHouse andmeformaadiga. Kui see on olemas, saad hÀdaolukorras varukoopia vÔtta ja taastada MySQL-s.

Rohkemate edasijĂ”udnute juhtumite jaoks on ClickHouse'is sisseehitatud vĂ”imalus luua partitsioonide snapshots kohalikus failisĂŒsteemis. See vĂ”imalus on saadaval pĂ€ringuna alter table freeze partition. VĂ”i lihtsalt alter table freeze — see on kogu tabeli snapshot.

Snapshot luuakse ĂŒhtlaselt ĂŒhe tabeli kohta ĂŒhes shardis, seega ei ole vĂ”imalik luua ĂŒhtlast snapshot'i kogu klastrist. Kuid enamike ĂŒlesannete jaoks ei ole seda vajalik, ja piisab, kui igas shardis teha pĂ€ring ja saada ĂŒhtlane snapshot. See luuakse kĂ”vadest linkidest ja seetĂ”ttu ei vĂ”ta see lisaruumi. Edasi kopeerid selle snapshot'i varukoopia serverisse vĂ”i hoidlatesse, mida kasutad varukoopiate jaoks.

Sellise varukoopia taastamine on piisavalt lihtne. Esimene — lood tabelid vastavalt olemasolevatele tabelite mÀÀratlemistele. Edasi kopeerid salvestatud partitsioonide snapshot'id Directory-Detached antud tabelite jaoks ja tĂ€idad pĂ€ringu attach partition. Selline lahendus sobib tĂ€iesti suurte andmemahtude jaoks.

MĂ”nikord on vaja midagi veel Ă€gedamat – olukordades, kus teil on igas serveris kĂŒmneid vĂ”i isegi sadu terabajte ja sadu servereid. Siin on lahendus, mille ma mĂ€rkasin kolleegidelt "Yandex.Metrica". Ma ei soovitaks seda igaleĂŒhele – lugege ise ja otsustage, kas see sobib vĂ”i mitte.

Esialgu on vaja luua mitu serverit suurte kettalahendustega. SeejĂ€rel tĂ”statage nendele serveritele mitu ClickHouse serverit ja seadistage need nii, et need töötaksid nagu veel ĂŒks koopiate replikatsioon samadele shard'idele. Edasi kasutage nende serverite failisĂŒsteemi vĂ”i mingit tööriista, mis vĂ”imaldab luua snapshot'e. Siin on kaks vĂ”imalust. Esimene variant – LVM snapshot'id, teine variant – ZFS Linuxil.

PĂ€rast seda tuleb igapĂ€evaselt luua snapshot, mis jÀÀb alles ja vĂ”tab mingi ruumi. Loomulikult, kui andmed muutuvad, siis aja jooksul suureneb ruum. Seda snapshot'i saab igal ajal vĂ€lja vĂ”tta ja andmeid taastada, selline kummaline lahendus. Pluss peab veel piirama neid replikaid konfiguratsioonis, et nad ei pĂŒĂŒaks saada liidriteks.

Kas saab korraldada reprod kontrollitud hilinemisega?

Sel aastal plaanite teha valusid ClickHouse'is. Kas oleks vÔimalik organiseerida neis kontrollitud replikate mahajÀÀmus? Sooviksime selle abil end negatiivsete stsenaariumide eest kaitsta, sealhulgas altrite ja muude muudatuste eest.

Kas on vÔimalik teha mÔningaid tagasikÀike altritele? NÀiteks vÔtta olemasolevast valust ja öelda, et kuni selle hetkeni rakenda muudatused, aga sellest hetkest alates lÔpetage muudatuste rakendamine?

Kui meie klastrisse tuleb kĂ€sk ja rikub selle, siis meil on tinglik replik, mille mahajÀÀmus on tund, kus me saame öelda, et kasutame just seda praegu, aga viimasest kĂŒmnest minutist tehtud muudatusi me rakendada ei soovi?

Esialgu kontrollitud replikate mahajÀÀmusest. Kasutajate seas oli selline soov, ja me lĂ”ime GitHubis kĂŒsimuse: "Kui kellelegi see vajalik on, pange meeldimisi, pange sĂŒdameid". Keegi ei pannud ja kĂŒsimus suleti. Siiski, juba praegu on vĂ”imalik saada selline vĂ”imalus, seadistades ClickHouse’i. TĂ”eletruult, alates versioonist 20.3.

ClickHouse tegevalt taustal andmete liitmist — merge. Kui merge on tehtud, asendatakse teatud andmeplokkide kogum suurema plokiga. Samal ajal jÀÀvad varem olnud andmeplokid kettale teatud ajaks.

Esiteks, nad 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 ajapiirang — vanad andmeplokid jÀÀvad kettale kaheks minutiks. Need kaheksa minutit on seadistatavad ja neid saab muuta isegi ĂŒheks pĂ€evaks. See maksab kettaruumi: sĂ”ltuvalt andmete voogust vĂ”ib juhtuda, et viimase pĂ€eva andmeid mitte ainult ei kahekordistata, vaid need vĂ”ivad olla viis korda suuremad. Kuid tĂ”siste probleemide korral saate ClickHouse serveri peatada ja kĂ”ik korda teha.

NĂŒĂŒd tekib kĂŒsimus, kuidas see kaitseb alterite vastu. Siin tasub sĂŒgavamale vaadata, sest ClickHouse vanemates versioonides töötas alter niimoodi, et vahetas lihtsalt plokid. On andmeplokk, kus on mingid failid, ja me teeme nĂ€iteks alter drop column. Siis see veerg fĂŒĂŒsiliselt eemaldatakse kĂ”igist plokkidest.

Aga alates versioonist 20.3 on alterite mehhanism tĂ€ielikult muudetud ja nĂŒĂŒd on andmeplokid alati immutatiivsed. Need ei muutu ĂŒldse — alterid töötavad nĂŒĂŒd umbes sama moodi nagu merge'id. Selle asemel, et plokk koha peal muuta, loome uue. Uues plokis, kus failid ei ole muutunud, muutuvad need kĂ”vade linkideks, ja kui me oleme mĂ”ne veeru eemaldanud, siis seda ei ole lihtsalt uues plokis. Vana plokk eemaldatakse vaikimisi kaheksa minuti pĂ€rast, ja siin saab reguleerida seadistusi, millest ĂŒlalpool rÀÀgiti.

Sama kehtib ka alterite kohta, mis on seotud mutatsioonidega. Kui teete alter delete vÔi alter update, siis see ei muuda plokki, vaid loob uue. Ja siis eemaldab vana.

Mida teha, kui tabeli struktuur on muutunud?

Kuidas taastada varukoopia, mis tehti vana skeemi alusel? Ja teine kĂŒsimus on seoses snapshot'ide ja failisĂŒsteemide vahenditega. Kas Btrfs sobib siin ZFS asemel Linux LVM-is?

Kui teete attach partition Kui partitsioonid on teistsuguse struktuuriga, siis ClickHouse ĂŒtleb teile, et nii ei saa. Lahendus on jĂ€rgmine. Esiteks, looge ajutine MergeTree tĂŒĂŒpi tabel vanema struktuuriga, lisage sinna andmed attach abil, seejĂ€rel tehke alter pĂ€ring. Siis saate kas kopeerida vĂ”i liigutada need andmed ning teha attach uuesti, vĂ”i kasutada pĂ€ringut. alter table move partition.

NĂŒĂŒd teine kĂŒsimus – kas Btrfs-i kasutada on vĂ”imalik. Esiteks, kui teil on LVM, siis piisab LVM snapshot'idest, failisĂŒsteem vĂ”ib olla ka ext4, see ei oma tĂ€htsust. Btrfs-i puhul sĂ”ltub kĂ”ik teie kogemusest selle kasutamisel. See on kĂŒps failisĂŒsteem, kuid siiski on tekkinud mĂ”ningaid kahtlusi selle osas, kuidas kĂ”ik praktikas toimib konkreetse stsenaariumi puhul. Ma ei soovitaks seda kasutada, kui teil ei ole Btrfs-i tootmisreĆŸiimis.

Millised on ĂŒldiselt parimad praktikud andmete resharde osas?

Pereshardimise kĂŒsimus on keeruline ja mitmekesine. Siin saab kohe reageerida mitmeti. Üks vĂ”imalus on öelda, et ClickHouse'is ei ole sisse ehitatud vĂ”imalust pereshardimiseks. Kuid kardan, et see vastus ei rahulda kedagi. SeetĂ”ttu vĂ”ib teise nurga alt öelda, et ClickHouse'is on palju viise andmete pereshardimiseks.

Kui klastris on koht otsas vĂ”i see ei saa koormusega hakkama, lisate uusi servereid. Kuid need serverid on vaikimisi tĂŒhjad – andmeid neis ei ole, koormust ei toimu. Teil on vaja andmeid ĂŒmber paigutada, et need oleksid uues, suurendatud klastris ĂŒhtlaselt jaotatud.

Esimene viis, kuidas seda teha, on kopeerida osa partitsioonidest uutele serveritele pĂ€ringu abil. alter table fetch partition. NĂ€iteks, kui teil olid partitsioonid kuude kaupa, vĂ”tate esimese kuu 2017. aastast ja kopeerite selle uuele serverile, siis – kolmanda kuu kopeerite mĂ”nele muule uuele serverile. Ja nii teete, kuni see on enam-vĂ€hem ĂŒhtlaselt jaotatud.

Ümberpaigutamine on vĂ”imalik ainult nende partitsioonide puhul, mis kirjutamise ajal ei muutu. Uute partitsioonide jaoks tuleb kirjutamine vĂ€lja lĂŒlitada, sest nende ĂŒmberpaigutamine ei ole atomaarne. Vastasel juhul saate duplikaate vĂ”i andmete vahelejÀÀke. Sellegipoolest on see viis praktiline ja töötab piisavalt tĂ”husalt. VĂ”rgus edastatakse juba valmis, kompresseeritud partitsioonid, see tĂ€hendab, et andmeid ei dekompressita ega rekodeerita.

Selle meetodi ĂŒks puudus seisneb selles, et see sĂ”ltub shardimise skeemist, mille olete ĂŒles ehitanud, ja milliseks shardimise vĂ”tme olete valinud. Teie nĂ€ites olenevad metrikate korral shardimise vĂ”ti – see on tee hash. Kui teete select Distributed tabelisse, suunatakse see kohe kĂ”ikidele klastri shardi ja sealt saadakse andmed.

See tĂ€hendab, et tegelikult ei oma teile tĂ€htsust, millised andmed millises shardis asuvad. Peamine on see, et andmed ĂŒhes ja samas teekonnas asuvad ĂŒhes shardis, kuid millises, ei ole oluline. Sellisel juhul sobib valmisteeritud partiide edasiviimine suurepĂ€raselt, kuna select pĂ€ringute puhul saate te – olenemata sellest, kas enne vĂ”i pĂ€rast shardingut, skeemi vÀÀrtused ei oma erilist tĂ€htsust – tĂ€ieliku ĂŒlevaate andmetest.

Aga on ka keerulisemaid juhtumeid. Kui rakenduse tasandil olete ĂŒles ehitanud spetsiaalse shardimise skeemi, et see klient asub mÀÀratud shardis ja pĂ€ring saab kohe sinna saata, mitte Distributed tabelisse. VĂ”i kasutate piisavalt uut versiooni ClickHouse'ist ja olete lĂŒlitanud sisse seade optimize skip unused shards. Sel juhul analĂŒĂŒsitakse select pĂ€ringu ajal where osas olevat vĂ€ljendit ning arvutatakse, millistele shardidele tuleb minna vastavalt shardimise skeemile. See toimib tingimusel, et andmed on paigutatud tĂ€pselt vastavalt sellele shardimise skeemile. Kui olete need kĂ€sitsi ĂŒmber paigutanud, vĂ”ib vastavus muutuda.

Nii et see on esimene meetod. Ootan teie vastust, kas see sobib, vÔi liigume edasi.

Vladimir Kolobaev, juhtiv sĂŒsteemiadministraator Avitos: Aleksei, see meetod, mida mainisite, ei sobi hĂ€sti, kui tuleb jaotada koormust, sealhulgas ka lugemisel. Saame vĂ”tta kuu partiid ja saame eelmise kuu viia teisele sĂ”lmele, kuid kui tuleb pĂ€ring nende andmete jĂ€rele, koormame ainult selle. Sooviksime koormata kogu klastrit, sest vastasel juhul, mingil hetkel, kogu lugemiskoormus töödeldakse kahe shardi poolt.

Aleksei Milovidov: Siin on kummaline vastus - jah, halb, aga vÔib ka toimida. Selgitan, kuidas tÀpselt. Tuleb vaadata koormusskeemi, mis jÀrgneb teie andmetele. Kui need on jÀlgimisandmed, siis on peaaegu kindel, et enamik pÀringutest lÀheb vÀrskete andmete jÀrele.

Sa panid pĂŒsti uued serverid, viisid vanad partitioonid ĂŒle, kuid muutsid ka seda, kuidas salvestatakse vĂ€rskeid andmeid. Ja vĂ€rsked andmed hakkavad olema laiali kĂ”ikjal klastris. Nii et juba viie minutiga koormavad viimase viie minuti pĂ€ringud ĂŒhtlaselt klastrit, pĂ€eva jooksul pĂ€ringud 24 tunni kohta koormavad samuti klastrit ĂŒhtlaselt. Kahjuks lĂ€hevad eelneva kuu pĂ€ringud ainult osa klastriserveritest.

Kuid sageli pole teil pĂ€ringuid just 2019. aasta veebruari kohta. TĂ”enĂ€oliselt, kui pĂ€ringud on 2019. aastasse, siis need on kogu 2019. aasta kohta - suure ajaintervali kohta, mitte mingisuguse vĂ€ikese vahemiku kohta. Ja sellised pĂ€ringud suudavad samuti klastrit ĂŒhtlaselt koormata. Ent kokkuvĂ”ttes on teie tĂ€helepanek tĂ€iesti Ă”ige, et see on selline ad hoc lahendus, mis ei hajuta andmeid tĂ€iesti ĂŒhtlaselt.

Mul on veel mĂ”ned punktid vastamiseks kĂŒsimusele. Üks neist on, kuidas algselt luua sharimisinfo skeem selliselt, et ĂŒmberjaotamisest oleks vĂ€hem vaeva. See ei pruugi alati olla vĂ”imalik.

NÀiteks, teil on jÀlgimisandmed. JÀlgimisandmed kasvavad kolmel pÔhjusel. Esimene - ajalooliste andmete kogumine. Teine - liikluse kasv. Ja kolmas - jÀlgimise alla kuuluvaid asjade arvu suurenemine. Tekivad uued mikroteenused ja mÔÔdikud, mida tuleb salvestada.

VÔimalik, et neist on kÔige suurem kasv seotud just kolmanda pÔhjusega - see on jÀlgimise kasutamise suurenemine. Ja antud juhul tasub vaadata koormuse iseloomu, millisest pÀringute valikust peaks lÀhtuma. PÔhilised pÀringud valiku osas tulevad tÔenÀoliselt mÔnest alamkogumist mÔÔdikutest.

NĂ€iteks CPU kasutamine mingitel serveritel mingis teenuses. Tulemuseks on see, et on olemas teatud alamhulk vĂ”tmeid, mille alusel te need andmed vĂ€lja tĂ”ite. Ja andmete pĂ€ring ise on tĂ”enĂ€oliselt piisavalt lihtne ja toimub kĂŒmnete millisekundite jooksul. Kasutatakse jĂ€lgimisteenustes, armatuurlaudadel. Loodan, et mĂ”istan seda Ă”igesti.

Vladimir Kolobaev: KĂŒsimus on selles, et me sageli tugineme ajaloolistele andmetele, kuna me reaalajas vĂ”rdleme praegust seisu ajaloolistega. Meile on oluline, et kiire juurdepÀÀs suurele andmemahtudele oleks olemas, ja ClickHouse toimetab sellega suurepĂ€raselt.

Te olete tĂ€iesti Ă”igustatud, enamik lugemisotsuseid on meil viimase pĂ€eva jooksul, nagu igasugustes jĂ€lgimisteenustes. Kuid ajaloolistele andmetele on koormus samuti piisavalt suur. See tuleb peamiselt hĂ€irete sĂŒsteemist, mis iga kolmekĂŒmne sekundi tagant kĂŒsib ClickHouse'ilt: "Anna mulle andmed viimase kuue nĂ€dala jooksul. NĂŒĂŒd ehita mulle nende pĂ”hjal mingi libisev keskmine ja vĂ”rrelge praegust vÀÀrtust ajaloolisega."

Tahaksin öelda, et meil on selliste vĂ€ga vĂ€rskete pĂ€ringute jaoks olemas veel ĂŒks vĂ€ike tabel, millel hoiame ainult kahe pĂ€eva andmeid, ja peamised pĂ€ringud suunduvad just sinna. Suure sharded tabelisse saadame ainult suuremad ajaloolised pĂ€ringud.

Aleksei Milovidov: Kahjuks ei sobi see teie stsenaariumi jaoks hÀsti, kuid rÀÀgin kahest halvast ja keerulisest sharding scheemist, mida ei tohiks kasutada, kuid mida mu sÔprade teenuses kasutatakse.

On peamine klaster "Yandex.Metrica" sĂŒndmustega. SĂŒndmused on lehevaated, klĂ”psud ja ĂŒleminekud. Enamik pĂ€ringud kĂ€ivad konkreetse veebisaidi suunas. Te avate teenuse "Yandex.Metrica", teil on veebisait - avito.ru, sisenete aruandesse ja pĂ€ring lĂ€heb teie veebisaidile.

Kuid on ka teisi pĂ€ringuid - analĂŒĂŒtilisi ja globaalseid, mida teevad siseanalĂŒĂŒtikud. Huvi pĂ€rast mĂ€rgin, et siseanalĂŒĂŒtikud teevad pĂ€ringuid ainult "Yandexi" teenuste kohta. Siiski, isegi "Yandexi" teenused hĂ”ivavad mĂ€rkimisvÀÀrse osa kĂ”igist andmetest. Need pĂ€ringud ei ole suunatud konkreetsetele mÔÔdikutele, vaid laiemale filtreerimisele.

Kuidas andmeid korraldada nii, et kĂ”ik töötaks tĂ”husalt nii ĂŒhe mÔÔdiku kaudu kui ka globaalsete pĂ€ringute puhul? Probleemiks on ka see, et ClickHouse'i pĂ€ringute hulk klastris "Metriik" on mitu tuhat sekundis. Samas ei suuda ĂŒks ClickHouse'i server töödelda mitme tuhande mitte triviaalset pĂ€ringut sekundis.

Klastri suurus on ĂŒle kuue saja serveri. Kui selle klastriga lihtsalt tahame kasutada jaotatud tabelit ning saata sinna mitu tuhat pĂ€ringut, siis lĂ€heb asi hullemaks kui nende saatmine ĂŒhte serverisse. Teiselt poolt, variant, kus andmed on ĂŒhtlaselt jaotatud ning me kĂŒsime kĂ”igilt serveritelt, jÀÀb kohe vĂ€lja.

On ka diametraalselt vastupidine variant. Kujutage ette, et me jagame andmeid veebisaitide kaupa ning ĂŒhe veebisaidi pĂ€ring lĂ€heb ĂŒhele shardile. NĂŒĂŒd suudab klaster tĂ”epoolest taluda kĂŒmmet tuhat pĂ€ringut sekundis, kuid ĂŒhel shardil töötav pĂ€ring vĂ”ib olla liiga aeglane. See ei suuda enam skaleeruda lĂ€bilaskevĂ”ime osas. Erinevalt avito.ru-st. Ma ei avalda saladust, kui ĂŒtlen, et Avito on ĂŒks enimmugeldatavaid saite Venemaa Internetis. Ja selle töötlemine ĂŒhel shardil oleks vale.

SeetĂ”ttu on sharding'u skeem koostatud keerukamal viisil. Kogu klaster on jagatud teatud arvu klastersĂŒsteemideks, mida nimetame kihtideks. Igas klustri sĂŒsteemis on kĂŒmne kuni mitme kĂŒmne shardiga. Kokku on selliseid klastrisĂŒsteeme kolmkĂŒmmend ĂŒheksa.

Kuidas see kĂ”ik skaleerub? Klastrite arv ei muutu - nagu see oli mitu aastat tagasi kolmkĂŒmmend ĂŒheksa, nii on see ka jÀÀnud. Kuid igaĂŒhes me jĂ€rk-jĂ€rgult suurendame shardide arvu andmete kogunedes. Ja sharding'u skeem on ĂŒldiselt selline - jagunemine nende klastrisĂŒsteemide kaupa toimub veebisaitide alusel, ja selleks, et mĂ”ista, milline sait on millises klastris, kasutatakse tegelikult eraldi metabaasi MySQL-is. Üks sait - ĂŒhes klastrisĂŒsteemis. Ja selle sees toimub sharding kĂŒlastajate identifikaatorite kaupa.

Kandidaatide registreerimisel jagame neid kĂŒlastaja identifikaatori jÀÀgi jĂ€rgi. Kuid uue shard'i lisamisel muutub shardimise skeem, me jĂ€tkame jagamist, kuid jÀÀk jagamisel on erinev. See tĂ€hendab, et ĂŒks kĂŒlastaja on tegelikult mitmel serveril ja sellele ei saa toetuda. See on tehtud ainult selleks, et andmed paremini kokku suruda. Kui aga teeme pĂ€ringuid, suundume me jaotatud tabelisse, mis vaatab klastrisse ja pöördub kĂŒmnete serverite poole. Nii toimib see kummaline skeem.

Aga minu jutt oleks puudulik, kui ma ei ĂŒtleks, et sellest skeemist oleme loobunud. Uues skeemis oleme kĂ”ik muutnud ja kĂ”ik andmed kopeeritud clickhouse-copier'i abil.

Uues skeemis jagunevad kĂ”ik saidid kaheks kategooriaks – suurteks ja vĂ€ikesteks. Ma ei tea, kuidas see kĂŒnnis valiti, kuid lĂ”pptulemusena kirjutatakse suured saidid ĂŒhe klastrisse, kus on 120 shard'i, kolm koopiat igas – see tĂ€hendab 360 serverit. Ja shardimise skeem on selline, et iga pĂ€ring lĂ€heb kohe kĂ”igile shard'idele. Kui avate praegu "Yandex.Metrica"-s mis tahes aruande lehe avito.ru jaoks, lĂ€heb pĂ€ring 120 serverile. Suuri saite on venekeelses Internetis vĂ€he. Ja pĂ€ringute hulk ei ulatu tuhande sekundi kohta, isegi vĂ€hem kui sada. KĂ”iki neid kĂ€sitleb rahulikult jaotatud tabel, mille igat neist töötleb 120 serverit.

Teine klaster – vĂ€ikestele saitidele. Siin on shardimise skeem saidi identifikaatori jĂ€rgi ja iga pĂ€ring lĂ€heb just ĂŒhe shard'i peale.

ClickHouse'is on utiliit clickhouse-copier. Kas saate sellest rÀÀkida?

Kohanen kohe, et see lahendus on mahukam ja veidi vĂ€hem tootlik. Eeliseks on see, et see levitab andmed tĂ€ielikult vastavalt sellele skeemile, mida te nĂ€itate. Kuid tĂ”ukeratta puuduseks on see, et see ei tee ĂŒmbershardimist. See kopeerib andmed ĂŒhe klastriskeemiga teise klastriskeemi.

See tĂ€hendab, et selle tööks peavad teil olema kaks klastrit. Need vĂ”ivad asuda samadel serveritel, kuid andmed ei hĂŒppa jĂ€rk-jĂ€rgult, vaid kopeeritakse.

NĂ€iteks, kui algselt oli neli serverit, siis nĂŒĂŒd on neid kaheksa. Te loote kĂ”igis serverites uue Distributed tabeli, uued lokaalsed tabelid ja kĂ€ivitate clickhouse-copier'i, mÀÀrates selle tööreĆŸiimi, et ta peab lugema sealt, vĂ”tma vastu uue sharding skeemi ja ĂŒle kandma andmed sinna. Vanadel serveritel on teil vaja ruumi poolteist korda rohkem, kui seda on praegu, sest vanad andmed peavad sinna jÀÀma ning nende peale tuleb pool vanadest andmetest. Kui te olete ette mĂ”elnud, et andmed tuleb ĂŒle shardida ja ruumi on piisavalt, siis see meetod sobib.

Kuidas clickhouse-copier sees töötab? Ta jagab kogu töö ĂŒlesanneteks, mis töötlevad ĂŒhe partitsiooni ĂŒhes tabelis ĂŒhel shardil. KĂ”iki neid ĂŒlesandeid saab kĂ€itada paralleelselt ja clickhouse-copier'i saab kĂ€ivitada erinevates masinates mitmes eksemplaris, kuid see, mida ta teeb ĂŒhe partitsiooni jaoks, on mitte midagi muud, kui insert select. Andmed loetakse, dekompressitakse, jaotatakse uuesti, seejĂ€rel kompressitakse uuesti, salvestatakse kuhugi, jĂ€rjestatakse ĂŒmber. See on keerulisem lahendus.

Teie oli pilootprojekt, mis kandis nime resharde. Mis selle on saanud?

Teil oli veel 2017. aastal katse, mis nimetati reshardinguks. Seal on isegi valik ClickHouse'is. Ma saan aru, et see ei Ônnestunud. Kas te saaksite rÀÀkida, miks nii juhtus? Tundub, et see oli isegi vÀga aktuaalne.

Kogu probleem seisneb selles, et andmete kohandatud shardimist nĂ”udva vajaduse korral on vajalik vĂ€ga keeruline sĂŒnkroniseerimine, et seda teha atomaarsemalt. Kui me hakkasime vaatama, kuidas see sĂŒnkroniseerimine on ĂŒles ehitatud, siis sai selgeks, et on fundamentaalsed probleemid. Ja need fundamentaalsed probleemid pole mitte ainult teoreetilised, vaid hakkasid kohe praktikas end nĂ€itama sellega, et vĂ”ib vĂ€ga lihtsalt selgitada — mitte midagi ei toimi.

Kas on vĂ”imalik koondada kĂ”ik andmeosad enne aeglastele kettale ĂŒleminekut?

KĂŒsimus TTL-de kohta koos valikuga move to slow disk seoses merge'idega. Kas on mingit vĂ”imalust, peale cron'i, liita kĂ”ik osad enne aeglastele diskidele ĂŒleviimist?

Vastus kĂŒsimusele, kas on kuidagi automaatselt vĂ”imalik kĂ”ik tĂŒkid ĂŒhte tĂ”mmata enne nende ĂŒleviimist — ei. Minu arvates pole selles vajadust. Ei pea kĂ”iki osi ĂŒhte liitma, vaid lihtsalt arvestama, et need liiguvad automaatselt aeglastele diskidele.

Meil on kaks kriteeriumi andmete ĂŒleviimise reeglite jaoks. Esiteks — tĂ€itmise taseme jĂ€rgi. Kui praeguses salvestusruumis on vĂ€hem kui teatud protsent vaba ruumi, valime ĂŒhe tĂŒki ja kanname selle ĂŒle aeglasemasse salvestusse. TĂ€psemalt mitte aeglasemasse, vaid jĂ€rgnevasse — kuidas olete seadistanud.

Teiseks kriteeriumiks on suuruse jĂ€rgi. See puudutab suurte tĂŒkkide ĂŒleviimist. Saate kohandada kĂŒnnist kiire diskiga vaba ruumi osas ja andmed kantakse automaatselt ĂŒle.

Kuidas liikuda uutele ClickHouse versioonidele, kui ei ole vĂ”imalik eelnevalt ĂŒhilduvust kontrollida?

Seda teemat arutatakse regulaarselt ClickHouse'i Telegrami vestluses , arvestades erinevaid versioone, ja kuidagi. Kui ohutu on uuendada versioonilt 19.11 versioonile 19.16 ja nĂ€iteks versioonilt 19.16 versioonile 20.3? Kuidas on parem uutele versioonidele ĂŒle minna, kui ei ole vĂ”imalik eelnevalt kontrollida ĂŒhilduvust liivakastis?

Siin on mitu «kuldset» reeglit. Esimene — looge changelog. See on suur, kuid seal on eraldi punktid tagasi ĂŒhilduvuse muutuste kohta. Ärge vaadake neid punkte kui punast lippu. Üldiselt on need vĂ€ikesed ĂŒhilduvuse probleemid, mis on seotud mĂ”ningate ÀÀrmuste funktsionaalsustega, mida teil tĂ”enĂ€oliselt ei ole.

Teine — kui ei ole vĂ”imalik kontrollida ĂŒhilduvust liivakastis ja soovite uuendada otse tootmises, on soovitus selline — Ă€rge tehke seda. Looge esmalt liivakast ja kontrollige. Kui testimiskeskkonda pole, siis tĂ”enĂ€oliselt ei ole teil vĂ€ga suurt ettevĂ”tet, seega on vĂ”imalik kopeerida osa andmeid oma sĂŒlearvutisse ja seal veenduda, et kĂ”ik toimib korrektselt. VĂ”ib isegi kĂ€ivitada mitu koopiat kohalikult oma masinas. VĂ”i saab kuskil lĂ€hedal tĂ”sta uue versiooni ja laadida sinna osa andmeid — st luua improviseeritud testimiskeskkond.

Veel ĂŒks reegel — Ă€rge uuendage esimesel nĂ€dalal pĂ€rast versiooni vĂ€ljaandmist, kuna tootmises leitakse vigu ja jĂ€rgnevad kiiret parandused. Vaatame ClickHouse'i versioonide nummerdamist, et mitte segadusse sattuda.

On versioon 20.3.4. Number 20 tĂ€histab vĂ€ljaandmise aastat — 2020. Sellel ei ole sisu poolest mingit tĂ€htsust, seega ei pea me sellele tĂ€helepanu pöörama. Edasi — 20.3. Teist numbrit — antud juhul 3 — suurendame iga kord, kui vĂ€lja anname versiooni koos mĂ”ne uue funktsiooniga. Kui soovime ClickHouse'i juurde lisada mingi vĂ”imaluse, peame seda arvu suurendama. See tĂ€hendab, et versioonis 20.4 töötab ClickHouse veelgi paremini. Kolmas number — 20.3.4. Siin 4 on patĆĄi vĂ€ljaandmiste arv, kus me ei ole uusi funktsioone lisanud, kuid oleme mĂ”ned vead fikseerinud. Ja 4 tĂ€hendab, et oleme seda neli korda teinud.

Ärge arvake, et see on midagi kohutavat. Tavaline kasutaja vĂ”ib tavaliselt installida kĂ”ige vĂ€rskema versiooni, ja see töötab probleemideta kuni aasta. Kuid kujutage ette, et mĂ”nes funktsioonis, mis puudutab bitmapide töötlemist ja mis on lisatud meie Hiina kolleegide poolt, kukub server alla vale argumentide edastamisel. Me peame selle parandama. Me anname vĂ€lja uue patĆĄi versiooni, ja ClickHouse muutub stabiilsemaks.

Kui teie ClickHouse töötab tootmises ja ilmub uus versioon ClickHouse'ist koos lisafunktsioonidega — nĂ€iteks 20.4.1 — siis Ă€rge kiirustage seda tootmisse paigaldama esimesel pĂ€eval. Miks see ĂŒldse vajalik on? Kui te veel ClickHouse'i ei kasuta, siis vĂ”ite selle installida ja tĂ”enĂ€oliselt lĂ€heb kĂ”ik hĂ€sti. Kuid kui ClickHouse töötab juba stabiilselt, siis jĂ€lgige patĆĄe ja uuendusi — milliseid probleeme me parandame.

Kirill Shvakov: Tahaksin lisada veidi testkeskkondade kohta. KĂ”ik kardavad testkeskkondi ja kuidagi arvavad, et kui teil on vĂ€ga suur ClickHouse'i klaster, siis peab ka testkeskkond olema vĂ€hemalt sama suur vĂ”i vĂ€hemalt kĂŒmne korra vĂ€iksem. See ei ole sugugi nii.

VĂ”in rÀÀkida oma kogemusest. Mul on projekt, kus on ClickHouse. Meie testkeskkond selle jaoks on vĂ€ike virtuaalmasin Hetzneris kahekĂŒmne euro eest, kus on kĂ”ik tĂ€ielikult ĂŒles seatud. Et seda teha, on meil tĂ€ielik automatiseerimine Ansible'is, seega ei ole pĂ”himĂ”tteliselt vahet, kas paigaldada metallserveritesse vĂ”i lihtsalt virtuaalmasinatesse.

Mida saab teha? Oleks kena, kui ClickHouse'i dokumentatsioonis oleks nĂ€ide, kuidas endale vĂ€ike klaster ĂŒles seada — Dockeris, LXC-s, vĂ”ib-olla luua Ansible playbook, kuna erinevatel inimestel on erinevad deploy'd. See lihtsustaks palju. Kui sa saad klastrit ĂŒles seada viie minutiga, on palju lihtsam proovida milleski selgusele jĂ”uda. See on palju mugavam, sest uuema versiooniga edasi liikumine, mida sa pole kontrollinud — see on teed tĂŒhjusesse. MĂ”nikord see töötab, aga mĂ”nikord mitte. Ja seepĂ€rast lootmine Ă”nnele — on halb.

Maksim Kotjakov, senior backend engineer Avito: TĂ€iendaksin natuke testkeskkondade kohta, mis on suurte ettevĂ”tete probleemide seerias. Meil on tĂ€isfunktsionaalne ClickHouse'i testklaster, mis on andmemudelite ja seadistuste poolest tĂ€pne koopia sellest, mis on produktsioonis. See klaster on ĂŒles seatud ĂŒsna vanade konteineritega, millel on minimaalsed ressursid. Me kirjutame sinna teatud protsendi produktsioonandmetest, Ă”nneks on vĂ”imalik voogu Kafkas replitseerida. Seal on kĂ”ik sĂŒnkroonitud ja skaleeritud — nii vĂ”imsuste kui voogude osas, ja teoorias peaks see, teiste asjaolude ĂŒhtluses, kĂ€ituma metrite jĂ€rgi nagu produktsioon. KĂ”ik potentsiaalselt plahvatusohtlik algul lĂ€heb sellele seismisele ja seal liguneb paar pĂ€eva kuni valmiduseni. Aga loomulikult on see lahendus kallis, raske ja mitte nullikuludega toe osas.

Aleksei Milovidov: RÀÀgin, mida kujutab endast meie sĂ”prade testkeskkond «Yandex.Metrica» juures. Üks klaster oli 600+ serveriga, teine 360 ja on veel kolmas ning mitu klastrit. Ühe jaoks on testkeskkond lihtsalt kaks shard'i, milles igas on kaks replikat. Miks kaks shard'i? Et ĂŒks ei oleks. Ja replikad on ka sellepĂ€rast, et neid oleks. Lihtsalt teatud minimaalne kogus, mida endale lubada saab.

See testkeskkond vÔimaldab kontrollida pÀringute töökorrasolekut ja ei ole suures plaanis midagi purustatud. Kuid tihti tekivad probleemid tÀiesti teistsuguse iseloomuga, kui kÔik töötab, kuid on mÔned vÀikesed muudatused koormuses.

Tooksin nĂ€iteks. Otsustasime installeerida uue ClickHouse'i versiooni. See on ĂŒles pandud testkeskkonda, automatiseeritud testid on lĂ€binud «Yandex.Metrica's», mis vĂ”rreldavad andmeid vana ja uue versiooni vahel, lĂ€bides kogu protsessi. Ja loomulikult ka meie CI rohelised testid. Muud juhul me ei olekski seda versiooni soovitanud.

KĂ”ik on suurepĂ€rane. Alustame tootmisse viimist. Saadan sĂ”numi, et graafikutel on koormus mitmekordistunud. TĂ”mbame versiooni tagasi. Vaatan graafikule ja nĂ€en: koormus on tĂ”epoolest mitmekordistunud versiooni vĂ€ljalaskmise ajal, ja vĂ€henes tagasi, kui versioon vĂ€ljatĂ”mmati. SeejĂ€rel hakkasime versiooni tagasi tĂ”mbama. Ja koormus kasvas samuti ja langes samuti tagasi. JĂ€reldus on selline — koormus suurenes seoses vĂ€ljalaskmisega, see ei ole ĂŒllatav.

Edasi oli raske veenda kolleege siiski uut versioon setamaa. Ma ĂŒtlen: "KĂ”ik on korras, vĂ€ljastage. Hoidke pöialt, kĂ”ik töötab. Praegu on graafikutel koormus tĂ”usnud, aga see on normaalne. Hoidke vastu." KokkuvĂ”ttes tegime nii, ja kĂ”ik — versioon viidi tootmisse. Kuid peaaegu iga vĂ€ljalaskmise puhul tekivad sarnased probleemid.

Kill query peab tapma pÀringuid, kuid see ei toimi. Miks?

Mulle tuli kasutaja, mingi analĂŒĂŒtik, ja esitas pĂ€ringu, mis pani minu ClickHouse klastrisse. Kas mĂ”ne sĂ”lme vĂ”i kogu klastrisse — sĂ”ltuvalt sellest, millisesse replikasse vĂ”i shard'i pĂ€ring sattus. NĂ€en, et kĂ”ik CPU ressursid sellel serveril on ummistunud, kĂ”ik on punane. Samas ClickHouse vastab pĂ€ringutele. Ja ma kirjutan: "Palun nĂ€ita mulle protsesside nimekirja, milline pĂ€ring tekitas selle hulluse."

Leian selle pÀringu ja kirjutan talle kill. Ja nÀen, et midagi ei juhtu. Minu server on ummistunud, ClickHouse jÀtkab mingi sisuga vastamist, nÀitab, et server on elus ja kÔik on korras. Kuid mul on degradatsioon kÔigis kasutaja pÀringutes, algab degradatsioon ka ClickHouse'is kirjutamisel, ja minu kill pÀring ei toimi. Miks? Arvasin, et kill pÀring peab pÀringud tapma, aga seda ei juhtu.

NĂŒĂŒd tuleb ĂŒsna kummaline vastus. Asi on selles, et kill pĂ€ring ei tapa pĂ€ringuid.

Kill pÀring seab vÀikese lipu nimega "ma tahan, et see pÀring tapetaks". Ja pÀring vaatab iga ploki töötlemise ajal sellele lipule. Kui see on seadistatud, peatub pÀring töös. Tulemuseks on see, et keegi ei tapa pÀringut, see peab ise kÔik kontrollima ja peatuma. Ja see peab töötama kÔigis juhtudel, kui pÀring on andmeplokkide töötlemise seisundis. See töötleb jÀrgmise andmeploki, kontrollib lippu ja peatub.

See ei tööta juhtudel, kui pĂ€ring on blokeeritud mingisuguses operatsioonis. TĂ”enĂ€oliselt ei ole see teie juhtum, kuna teie sĂ”nade kohaselt kasutab see palju serveri ressursse. VĂ”ib-olla ei toimi see vĂ€lise sortimise korral ja veel mĂ”nedes detailides. Kuid ĂŒldiselt ei tohiks nii olla, see on tĂ”rge. Ja ainus soovitus, mida ma teile annan, on uuendada ClickHouse'i.

Kuidas arvutada vastuse aega lugemise koormuse korral?

On olemas tabel, kus hoitakse aggrekaate item'i kohta - erinevad loendurid. Ridade arv on umbes sada miljonit. Kas vÔib loota ettearvatavale vastuse ajale, kui suunata 1K RPS 1K item'ile?

Konteksti kohaselt on jutt lugemise koormusest, sest kirjutamisega ei ole probleeme - vÔite sisestada kas tuhande, sada tuhat vÔi isegi paar miljonit rida.

LugemisettevĂ”tted on vĂ€ga erinevad. Select 1 kĂ€ivitab ClickHouse'is umbes tosin tuhat pĂ€ringut sekundis, seega isegi ĂŒhe vĂ”tme pĂ€ringud nĂ”uavad juba mĂ”ningaid ressursse. Ja sellised punktipĂ€ringud on keerulisemad kui mingites key-value andmebaasides, sest iga lugemise jaoks tuleb lugeda andmeplokk indeksi kaudu. Meie indeks ei suuna iga kirje, vaid iga vahemiku poole. See tĂ€hendab, et tuleb lugeda kogu vahemik - see on vaikimisi 8192 rida. Ja tuleb dekomprimeerida 64 Kb andmeplokk 1 Mb-ks. Sellised punktipĂ€ringud vĂ”tavad tavaliselt mitu millisekundit. Kuid see on kĂ”ige lihtsam variant.

Proovime teha lihtsat aritmeetikat. Kui korrutada mitu millisekundit tuhandega, saadakse mitu sekundit. Justkui oleks mingil kombel vĂ”imatu hoida tuhande pĂ€ringut sekundis, aga tegelikult on see vĂ”imalik, kuna meil on mitu protsessorituuma. Nii et pĂ”himĂ”tteliselt suudab ClickHouse mĂ”nikord hoida 1000 RPS, kuid lĂŒhikeste, tĂ€psete pĂ€ringute korral.

Kui on vajalik suurendada ClickHouse'i klastri mahtu lihtsate pĂ€ringute kaudu, siis soovitan kĂ”ige lihtsamat - suurendada koopiate arvu ja suunata pĂ€ringud juhuslikule koopiale. Kui ĂŒks koopia suudab hoida viissada pĂ€ringut sekundis, mis on tĂ€iesti reaalsus, siis kolm koopiat hoiavad tuhat viissada.

MĂ”nikord on muidugi vĂ”imalik ClickHouse'i seadistada maksimaalse arvu punktipĂ€ringute jaoks. Mis selleks vajalik on? Esiteks tuleb vĂ€hendada indeksi granulaarsust. Samal ajal tuleb seda vĂ€hendada mitte ĂŒhte, vaid arvestades, et indeksi kirjeid on mitu miljonit vĂ”i kĂŒmneid milloneid serveris. Kui tabelis on sada miljonit rida, vĂ”ib granulaarsuseks seada 64.

Selle kompressitud ploki suurust saab vÀhendada. Selleks on olemas seadistused min compress block size, max compress block size. Neid saab vÀhendada, andmeid uuesti suunata ja siis punktipÀringud toimivad kiiremini. Kuid ClickHouse ei ole siiski key-value andmebaas. Suur hulk vÀikseid pÀringute tegemisi on koormuse antipattern.

Kirill Shvakov: Annan nÔu juhuks, kui seal on tavalised kontod. See on piisavalt tavaline olukord, kus ClickHouse'is sÀilitakse mingit arvestit. Mul on kasutaja, ta on mingist riigist, veel mingi kolmas vÀli ja tuleb inkrementaalselt midagi suurendada. VÔtate MySQL, loote unikaalse vÔtme - MySQL'is on see duplicate key, PostgreSQL'is konflikti - ja lisate plussiga. See töötab palju paremini.

Kui teil on vÀhe andmeid, pole ClickHouse'i kasutamisel eriti mÔtet. On tavalised andmebaasid ja need teevad sellega hÀsti toimetulekut.

Mida saaks ClickHouse'is hÀÀlestada, et rohkem andmeid oleks vahemÀlus?

Kujutame ette olukorda - serverites on 256 GB RAM-i, igapÀevaste toimingute korral kasutab ClickHouse umbes 60-80 GB, tipptasemel kuni 130. Mida saaks lubada ja hÀÀlestada, et rohkem andmeid oleks vahemÀlus ja seega vÀhem juurdepÀsse kettale?

Reeglina suudab operatsioonisĂŒsteemi lehe vahemĂ€lu selle ĂŒlesandega hĂ€sti toime tulla. Kui avate lihtsalt top ja vaatate seal cached vĂ”i free - seal on ka kirjas, kui palju on vahemĂ€llu salvestatud - siis vĂ”ib mĂ€rgata, et kogu vaba mĂ€lu on kasutatud vahemĂ€luks. Ja need andmed loetakse lugemise ajal mitte kettalt, vaid RAM-ist. Samuti vĂ”in öelda, et vahemĂ€lu on efektiivselt kasutatud, kuna talletatakse just kokku surutud andmeid.

Kuid kui soovite mĂ”ningaid lihtsaid pĂ€ringuid veelgi kiirendada, on vĂ”imalus sisse lĂŒlitada ClickHouse'is vahemĂ€lu dekompresseeritud andmete jaoks. Seda nimetatakse uncompressed cache. Konfiguratsioonifailis config.xml seadistate uncompressed cache size soovitud vÀÀrtuseks - soovitan mitte rohkem kui pool vaba mĂ€lu, sest ĂŒlejÀÀnu kasutatakse page cache'iks.

Lisaks on olemas kaks pĂ€ringutaseme seadet. Esimene seadistus - kasutada uncompressed cache — lubab selle kasutamist. Soovitatav on see lubada kĂ”ikide pĂ€ringute jaoks, vĂ€lja arvatud rasked, mis vĂ”ivad kĂ”ik andmed tĂ€ielikult lugeda ja selle vahemĂ€lu tĂŒhjendada. Ja teine seadistus - see on midagi nagu maksimaalne ridade arv vahemĂ€lu kasutamiseks. See piirab automaatselt suuri pĂ€ringuid, et need vahemĂ€lusse ei satuks.

Kuidas saab seadistada storage_configuration töötamise eesmÀrgil?

Uues ClickHouse dokumentatsioonis lugesin lÔiku, mis on seotud andmete salvestamisega. Kirjelduses on nÀide kiire SSD kohta.

Huvitav, kuidas sama seadistada volume hot memory'ga. Ja veel ĂŒks kĂŒsimus. Kuidas töötab select sellise andmete korraldusega, kas ta loeb kogu komplekti vĂ”i ainult selle, mis asub kettal, ja kas need andmed tihendatakse mĂ€lus? Ja kuidas töötab prewhere sektsioon sellise andmede korraldusega?

See seadistus mÔjutab andmefragmentide salvestamist, ja nende formaat ei muutu.
Vaatame lÀhemalt.

Andmete salvestamist mĂ€llu on vĂ”imalik seadistada. KĂ”ik, mis on konfigureeritud kettale, on selle tee. Loote tmpfs jagamise, mis on mountitud mingisse teed failisĂŒsteemis. MÀÀrate selle tee andmete salvestamise teena kĂ”ige kuumemale jagamisele, kuhu hakkavad sisse tulema ja kirjutama andmefragmentid, kĂ”ik on korras.

Aga ma ei soovita nii teha madala usaldusvÀÀrsuse tĂ”ttu, kuigi kui teil on vĂ€hemalt kolm koopiat erinevates andmekeskustes, siis vĂ”ib. Kui midagi juhtub, andmed taastatakse. Kujutage ette, et server lĂŒlitati Ă€kki vĂ€lja ja lĂŒlitati tagasi sisse. Jagamine on uuesti mountitud, kuid seal on tĂŒhjus. ClickHouse server kĂ€ivitamisel nĂ€eb, et need fragmentid puuduvad, kuigi vastavalt ZooKeeperi metanĂ”uetele peaksid nad olema. Ta vaatab, millistes koopiates nad on, kĂŒsib neid ja laadib alla. Seega andmed taastatakse.

Selles mĂ”ttes ei erine andmete salvestamine RAM-is pĂ”himĂ”tteliselt nende salvestamisest kettale, kuna andmete kirjutamisel kettale jĂ”uavad need esmalt page cache'i ja salvestatakse fĂŒĂŒsiliselt hiljem. See sĂ”ltub failisĂŒsteemi mountimise variandist. Aga igaks juhuks ĂŒtlen, et ClickHouse ei tee fsync'i insert'i ajal.

Samas salvestatakse andmed RAM-is tÀpselt samas formaadis, nagu need on kettal. Select pÀring valib samuti osad, mida on vaja lugeda, valib vajalikud andmevahemikud ja loeb need. Prewhere töötab absoluutselt sama moodi, sÔltumata sellest, kas andmed on RAM-is vÔi kettal.

Kuni millise unikaalsete vÀÀrtuste arvuni on Low Cardinality efektiivne?

Low Cardinality on nutikalt ĂŒles ehitatud. See loob andmesĂ”nastikke, kuid need on lokaalsed. Esiteks, igal tĂŒkkide jaoks on erinevad sĂ”nastikud, ja teiseks, isegi ĂŒhes tĂŒkis vĂ”ivad need olla erinevad iga vahemiku jaoks. Kui unikaalsete vÀÀrtuste arv saavutab kĂŒnnise - minu arvates on see miljon - siis sĂ”nastik lihtsalt lĂŒkatakse kĂ”rvale ja luuakse uus.

Üldine vastus: iga kohaliku vahemiku jaoks - ĂŒtleme, iga pĂ€eva puhul - on Low Cardinality efektiivne kuni miljoni unikaalse vÀÀrtuseni. Edasi tuleb lihtsalt fallback, kus kasutatakse palju erinevaid sĂ”nastikke, mitte ĂŒhte. See töötab umbes nagu tavaline string-tĂŒĂŒpi veerg, vĂ”ib-olla veidi vĂ€hem efektiivselt, kuid tĂ”sist jĂ”udluse langust ei juhtuks.

Millised on parimad praktikud tÀisteksti otsinguks tabelis, kus on viis miljardit rida?

On erinevaid vastuse variante. Esimene - öelda, et ClickHouse ei ole tĂ€iesti tekstiotsingu sĂŒsteem. Selleks on olemas spetsiaalsed sĂŒsteemid, nĂ€iteks Elasticsearch ja Sphinx. Siiski, ĂŒha enam kohtan inimesi, kes ĂŒtlevad, et nad ĂŒlevad Elasticsearch'ilt ClickHouse'ile.

Miks see nii on? Nad selgitavad seda sellega, et Elasticsearch ei suuda teatud mahtudega enam koormusega toime tulla, alustades indeksite koostamisest. Indeksid muutuvad liiga mahukateks ja kui lihtsalt andmed ClickHouse'i ĂŒle viia, selgub, et need salvestatakse mahult mitu korda efektiivsemalt. Samal ajal ei olnud otsingupĂ€ringud tihti sellised, et oleks vaja leida kogu andmemahtudes mingit fraasi morfoloogiat arvestades, vaid hoopis teistsugused. NĂ€iteks leida viimase paaritunni jooksul logidest mingi alajĂ€rjestus bite.

Selles olukorras loote ClickHouse'is indeksi, mille esimeseks feltiks on kuupÀev ajaga. Ja suurim andmete piirang on just kuupÀevade vahemiku pÔhjal. Valitud kuupÀevade vahemikus on tavaliselt vÔimalik teostada ka tÀisteksti otsingut isegi bruteforce-meetodil, kasutades like. Like operaator ClickHouse'is on kÔige tÔhusam like operaator, mida leiate. Kui leiate parema, andke mulle teada.

Kuid like on ikkagi full scan. Ja full scan vĂ”ib olla aeglane mitte ainult CPU, vaid ka ketas. Kui teil on ĂŒhe terabaiti andmeid pĂ€evas ja otsite ĂŒhte sĂ”na, siis peate skaneerima terabaiti. See on tĂ”enĂ€oliselt tavakĂ”vaketastel ja seetĂ”ttu nad on nii koormatud, et te ei pÀÀse sellele serverile SSH kaudu.

Selles olukorras olen valmis pakkuma veel ĂŒhte vĂ€ikest trikki. See on katsetuste seeriast — see vĂ”ib töötada, aga vĂ”ib ka mitte. ClickHouse'is on tĂ€isteksti indeksid trigrammi Bloom-filtrite kujul. Meie kolleegid ettevĂ”ttest Arenadata on neid indekseid juba proovinud ja sageli töötavad need just nii, nagu on ettenĂ€htud.

Nende Ôigeks kasutamiseks tuleb hÀsti mÔista, kuidas nad tegelikult töötavad: mis on trigrammi Bloom-filter ja kuidas valida selle suurus. VÔin öelda, et need aitavad haruldaste fraaside otsingutes, alaminfodes, mis esinevad harva andmetes. Sel juhul valitakse indeksite kaudu alamvahemikud ja loetakse vÀhem andmeid.

Hiljuti ilmus ClickHouse'is veelgi arenenumaid funktsioone tÀisteksti otsimiseks. Esiteks on see, et kÀhku otsitakse korraga mitmeid alaminfode variante, sh variante, mis arvestavad suurtÀhti, mitte arvestavad suurtÀhti, toetavad UTF-8 vÔi ainult ASCII. Valige kÔige tÔhusam, mida vajate.

NĂŒĂŒd on ka mitme regulaaravalduse otsimine ĂŒhe sammu jooksul. Te ei pea kirjutama X like ĂŒks alaminf vĂ”i X like teine alaminf. Kirjutage lihtsalt ja kĂ”ik tehakse maksimaalselt efektiivselt.

Kolmas asi — nĂŒĂŒd on olemas ligikaudne regulaatori otsing ja ligikaudne alaminfode otsing. Kui keegi on kirjutanud sĂ”na vale kirjutamisega, otsitakse seda maksimaalse vastavuse pĂ”hjal.

Kuidas korraldada ClickHouse'i juurdepÀÀsu suurele kasutajate arvule?

Kuidas korraldada juurdepÀÀsu suure hulga tarbijate ja analĂŒĂŒtikute jaoks? Kuidas moodustada jĂ€rjekord, prioriseerida pĂ€ringud ja milliseid tööriistu kasutada max concurrent queries?

Kui klaster on piisavalt suur, siis on hea lahendus tĂ”sta ĂŒles kaks lisaserverit, mis muutuvad analĂŒĂŒtikutele sisenemispunktiks. See tĂ€hendab, et analĂŒĂŒtikuid ei lasta konkreetsetele klastrite shardidele, vaid luuakse kaks tĂŒhja serverit, andmeteta, ja neil seadistatakse juurdepÀÀsuĂ”igused. Samas kantakse kasutajaseadistused jaotatud pĂ€ringute puhul ĂŒle kaugserveritele. Seega seadistate kĂ”ik nendele kahele serverile ja seadistused mĂ”javad kogu klastrit.

PĂ”himĂ”tteliselt on need serverid andmeteta, kuid nende mĂ€lu maht on pĂ€ringute tĂ€itmiseks vĂ€ga oluline. Disk vĂ”ib samuti kasutada ajutiste andmete jaoks, kui vĂ€limine agregatsioon vĂ”i vĂ€limine sortimine on sisse lĂŒlitatud.

Oluline on vaadata seadistusi, mis on seotud kĂ”ikide vĂ”imalike limiitidega. Kui ma sisenen klastrisse "Yandex.Metrica" analĂŒĂŒtikuna ja esitan pĂ€ringu select count from hits, siis antakse mulle kohe erand, et ma ei saa pĂ€ringut tĂ€ita. Maksimaalne ridade arv, mida mul on lubatud skaneerida, on sada miljardit, ja kogu klastris on neid viiskĂŒmmend triljonit ĂŒhes tabelis. See on esimene piirang.

Oletame, et ma eemaldan ridade arvu piirangu ja tĂ€idan pĂ€ringu uuesti. Siis nĂ€en jĂ€rgmist erandit - seadistus on sisse lĂŒlitatud force index by date. Ma ei saa pĂ€ringut tĂ€ita, kui ma ei ole mÀÀranud kuupĂ€evade vahemikku. Ei pea lootma, et analĂŒĂŒtikud mÀÀravad selle kĂ€sitsi. TĂŒĂŒpiline juhtum on, et on kirjutatud kuupĂ€evade vahemik where event date between nĂ€dal. Ja siis lihtsalt pandi sulud valesse kohta ning andis or — or URL match. Kui piiranguid pole, hakkan seda URL-i veergu skaneerima ja kulutan lihtsalt tohutult ressursse.

Lisaks on ClickHouse'is kaks prioriteediseadistust. Kahjuks on need vĂ€ga primitiivsed. Üks on lihtsalt nimetatud priority. Kui prioriteet ≠ 0 ja tehakse pĂ€ringute seadistusi teatud prioriteediga, kuid samal ajal tehakse pĂ€ring, mille prioriteet on madalam, mis tĂ€hendab kĂ”rgemat prioriteeti, siis pĂ€ring, mille prioriteedi vÀÀrtus on kĂ”rgem, mis tĂ€histab madalamat prioriteeti, lihtsalt peatatakse ja ei toimi selle aja jooksul.

See on vĂ€ga jĂ€me seadistus ja see ei sobi olukordadesse, kus klastri koormus on pidev. Kuid kui teil on lĂŒhikesed, impulsi pĂ€ringud, mis on tĂ€htsad, ning enamik klastri ajast on tĂŒhjas olekus, siis selline seadistus sobib.

JÀrgmine prioriteetide seadistus nimetatakse OS teema prioriteet. See mÀÀrab kÔigile pÀringute tÀitmise thread'idele Linuxi ajakava jaoks nice vÀÀrtuse. See töötab pigem keskpÀraselt, kuid siiski töötab. Kui mÀÀrate kÔige madalama nice vÀÀrtuse - see on kÔige suurem ja seega madalaim prioriteet - ning kÔrge prioriteediga pÀringutele mÀÀrate -19, siis CPU tarvitab madala prioriteediga pÀringud umbes neli korda vÀhem kui kÔrge prioriteediga pÀringud.

Samuti tuleb seadistada maksimaalne pĂ€ringu tĂ€itmise aeg - ĂŒtleme, et viis minutit. PĂ€ringu minimaalne tĂ€itmiskiirus - see on kĂ”ige olulisem. See seadistus on ammu olemas ja seda on vaja, et mitte lihtsalt vĂ€ita, et ClickHouse ei aeglusta, vaid et seda rakendada.

Kujutage ette, et seadistate: kui mĂ”ni pĂ€ring töötleb vĂ€hem kui miljon rida sekundis - seda ei tohi teha. See hĂ€bistab meie head nime, meie head andmebaasi. Lihtsalt keelame selle. Tegelikult on seal kaks seadistust. Üks nimetatakse min execution speed - ridade kaupa sekundis, ja teine nimetatakse timeout before checking min execution speed - vaikeolekus viisteist sekundit. See tĂ€hendab, et viisteist sekundit on lubatud, kuid seejĂ€rel, kui aeglaselt, visata lihtsalt erand - katkestada pĂ€ring.

Samuti tuleb seadistada kvoodid. ClickHouse'il on sisseehitatud kvoodivÔime, mis loendab ressursikasutust. Kuid kahjuks mitte riistvaraliste ressursside nagu CPU, kett, vaid loogiliste - töödeldud pÀringute, ridade ja lugenud baitide arv. NÀiteks saab seadistada maksimaalselt sada pÀringut viie minuti jooksul ja tuhat pÀringut tunni jooksul.

Miks see oluline on? Sest osa analĂŒĂŒsikĂŒsitlustest viiakse lĂ€bi otse ClickHouse kliendi kaudu kĂ€sitsi. Ja kĂ”ik lĂ€heb hĂ€sti. Kuid kui teie firmas on arenenud analĂŒĂŒtikud, kirjutavad nad skripti, ja skriptis vĂ”ib olla viga. See viga toob kaasa selle, et pĂ€ring tĂ€idetakse lĂ”pmatus tsĂŒklis. Sellest tuleb end kaitsta.

Kas on vĂ”imalik edastada ĂŒhe pĂ€ringu tulemused kĂŒmnele kliendile?

Meil on mitu kasutajat, kes armastavad tulla vĂ€ga suurte pĂ€ringutega samal ajal. PĂ€ring on suur, töötab pĂ”himĂ”tteliselt kiiresti, kuid kuna selliseid pĂ€ringuid on korraga palju, muutub see vĂ€ga vaevanĂ”udvaks. Kas saame sama pĂ€ringu, mis tuli kĂŒmme korda jĂ€rjest, tĂ€ita ainult kord, ja anda selle tulemuse kĂŒmnele kliendile?

Probleem on selles, et meil puuduvad vahedata korra vĂ”i tulemuste vahemĂ€lu. On olemas operatsioonisĂŒsteemi lehtede vahemĂ€lu, mis vĂ”imaldab andmeid uuesti kettalt mitte lugeda, kuid kahjuks peavad andmed siiski olema dekompressitud, deserialiseeritud ja uuesti töödeldud.

Sooviksime mingil viisil seda vĂ€ltida, kas vaheandmeid vahemĂ€lustades vĂ”i sarnased pĂ€ringud mingisse jĂ€rjekorda seades ja tulemuste vahemĂ€lu lisades. Hetkel on meil arenduses ĂŒks pull request, mis lisab pĂ€ringute vahemĂ€lu, kuid ainult alampĂ€ringute jaoks sektsioonis in ja join — see tĂ€hendab, et lahendus ei ole tĂ€ielik.

Kuid meil tekib ka selline olukord. Eriti kanoniline nĂ€ide - see on pĂ€ringud lehtede haldamisega. On raport, milles on mitu lehte, ja toimub pĂ€ring limit 10. Siis sama asi, kuid limit 10,10. Siis veel jĂ€rgmine leht. Ja kĂŒsitakse, miks me iga kord seda kĂ”ike arvutame? Kuid hetkel pole lahendust ja seda ei saa vĂ€ltida.

On alternatiivne lahendus, mis paigaldatakse ClickHouse'i kĂ”rvale — ClickHouse Proxy.

Kirill Shvakov: ClickHouse Proxy's on sisseehitatud kiiruselimit ja sisseehitatud tulemuste vahemĂ€lu. Seal on palju seadistusi, sest lahendati sarnane probleem. Proxy vĂ”imaldab pĂ€ringute piiramist, seades need jĂ€rjekorda, ja seadistada, kui kaua vahemĂ€lu pĂ€ringud kehtivad. Kui pĂ€ringud on tĂ”eliselt identsed, annab Proxy need mitu korda vĂ€lja, kuid kĂŒlastab ClickHouse'i vaid kord.

Nginxil on ka tasuta versioonis vahemĂ€lu ning see töötab samamoodi. Nginxil on isegi seaded, mis aeglustavad teisi pĂ€ringuid, kui pĂ€ringud tulevad samaaegselt, kuni ĂŒks neist tĂ€idetakse. Kuid ClickHouse Proxy seadistus on selles osas palju parem. See on loodud just ClickHouse'i jaoks, just nende pĂ€ringute jaoks, seega sobib see palju paremini. Ja paigaldamine on lihtne.

Kuidas olla asĂŒnkroonsete toimingute ja materialiseeritud vaadete puhul?

On olemas probleem, et replikatsiooni mootori toimingud on asĂŒnkroonsed - esiteks salvestatakse andmed ja seejĂ€rel toimub nende koondamine. Kui tabeli all elab materialiseeritud tabel mingite agregaatidega, siis kirjutatakse sinna dubleeringud. Ja kui mingit keerulist loogikat pole, siis andmed dubleeritakse. Mida saame selle probleemiga teha?

On ilmne lahendus - rakendada kĂ€ivituspunkt teatud tĂŒĂŒpi materialiseeritud vaadete jaoks asĂŒnkroonse koondamise toimingu ajal. Kas on mingeid 'hĂ”bedaseid kuule', plaane sarnase funktsionaalsuse rakendamiseks?

Tuleb vĂ€lja selgitada, kuidas deduplication töötab. See, millest ma praegu rÀÀgin, ei puuduta kĂŒsimust, kuid igaks juhuks tasub seda meeles pidada.

Replitseeritud tabelisse sisestamisel toimub deduplication kogu sisestatud plokkide ulatuses. Kui insertite taas ĂŒhe ja sama ploki, mis sisaldab sama arvu samu ridu samas jĂ€rjekorras, siis andmeid dedupplitakse. Te saate sisestamise kohta 'Ok' vastuseks, kuid tegelikult salvestatakse ainult ĂŒks andmeplokk ja see ei dubleeru.

See on vajalik selguse huvides. Kui sisestamise ajal saate 'Ok', tĂ€hendab see, et teie andmed on sisestatud. Kui saite ClickHouse'ilt tĂ”rke, siis need andmed ei ole sisestatud ja peate sisestamise kordama. Kuid kui sisestamise ajal katkevad ĂŒhendused, siis ei tea te, kas andmed on sisestatud vĂ”i mitte. Ainus vĂ”imalus on uuesti sisestada. Kui andmed tegelikult sisestati ja te sisestasite need uuesti, toimub plokkide deduplication. See on vajalik dubleeringute vĂ€ltimiseks.

Ja on oluline, kuidas see töötab materialiseeritud vaadete jaoks. Kui andmed on peamise tabeli sisestamisel dedupplitud, siis need ei lÀhe ka materialiseeritud vaatesse.

NĂŒĂŒd kĂŒsimuse juurde. Teie olukord on keerulisem, kuna salvestate ĂŒksikute ridade koopiaid. See tĂ€hendab, et mitte tervet pakki ei dubleeri, vaid konkreetsed read, ja need kokku langevad taustal. Tegelikult koondatakse andmed pĂ”hitaablis, kuid materialiseeritud vaatesse lĂ€hevad koondamata andmed, ja mergide puhul ei juhtu materialiseeritud vaadetega midagi. Sest materialiseeritud vaade on mitte enam kui sisestamise kĂ€ivitus. Teiste toimingute korral ei juhtu temaga midagi lisaks.

Ja ma ei saa siin ĂŒldse rÔÔmustada. Tuleb ainult otsida konkreetset lahendust sellele juhtumile. NĂ€iteks, kas saab materialiseeritud vaates samuti sellele mingit asendamist teha, ja vĂ”ib-olla töötab dedupikatsiooni meetod ka. Kuid kahjuks ei toimi see alati. Kui see on agregatiivne, siis ei Ă”nnestu.

Kirill Shvakov: Meil oli ka oma ajal omajagu hetki, kus pidime asja nagu troppide ĂŒlesehitamisega tegelema. Oli probleem, et olid reklaami nĂ€itamised, ja on mĂ”ned andmed, mida saame reaalajas kuvada — need on lihtsalt nĂ€itamised. Need harva dubleeritakse, aga kui see juhtub, koondame need ikkagi hiljem. Ja oli asju, mida ei saanud dubleerida - klikke ja kogu seda lugu. Aga neid soovisime nĂ€idata praktiliselt kohe.

Kuidas materialiseeritud vaateid tehti? Oli vaateid, kuhu kirjutatakse otse - andmed sisestatakse tooretesse andmetesse ja kirjutatakse vaateisse. Seal mingil hetkel ei olnud andmed vĂ€ga Ă”iged, need dubleerusid ja nii edasi. Ja on teine osa tabelist, kus need nĂ€evad vĂ€lja tĂ€pselt samasugused nagu materialiseeritud vaated, st struktuurilt on nad tĂ€iesti identsed. Korra mingi aja tagant arvutame andmed ĂŒmber, arvutame andmed ilma dubleeringuteta ja kirjutame nendesse tabelitesse.

KĂ€isime lĂ€bi API — ClickHouse'i kaudu ei toimi see kĂ€sitsi. Ja API vaatab: kui mul on tabelisse viimase lisamise kuupĂ€ev, kus on ĐłĐ°Ń€Đ°ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸ Ă”iged, arvutatud andmed, ja ta teeb pĂ€ringu ĂŒhte ja teise tabelisse. Ühelt valib ta vĂ€lja ĂŒhe kindla ajani, ja teisest tĂ€iendab seda, mis pole veel arvutatud. Ja see töötab, aga mitte ĂŒhe ClickHouse'i vahenditega.

Kui teil on API — analĂŒĂŒtikutele, kasutajatele — siis see on ĂŒks vĂ”imalus. Te alati loete, alati ĂŒmber arvutate. Seda saab teha kord pĂ€evas vĂ”i muul ajal. Te valite ise vahemiku, mis ei ole teile vajalik ja kriitiline.

ClickHouse'is on palju logisid. Kuidas ma saan nÀha kÔike, mis serveriga juhtub, reaalajas?

ClickHouse'is on vĂ€ga suur hulk erinevaid logisid, ja see hulk kasvab. Uutes versioonides on mĂ”ned neist isegi vaikimisi sisse lĂŒlitatud, vanemates versioonides tuleb need aktiivseks teha uuendamise kĂ€igus. Sellegipoolest nende arv kasvab. Tahaks nĂ€ha, mis mu serveriga praegu toimub, vĂ”ib-olla mingil kokkuvĂ”tval armatuurlaud.

Kas teil on ClickHouse meeskonnas vĂ”i teie sĂ”prade meeskondades, kes toetavad mingit funktsionaalsust valmis armatuurlaudade jaoks, mis kuvavad neid logisid juba valmis tootena? LĂ”ppkokkuvĂ”ttes on tore vaadata logisid ClickHouse'is — see on suurepĂ€rane. Aga oleks vĂ€ga Ă€ge, kui see oleks juba armatuurlaudade kujul. Sellest oleksin tĂ”eliselt vaimustatud.

Armatuurlaudu on, tÔsi, need ei ole standardiseeritud. Meie ettevÔttes kasutab ClickHouse'i umbes 60 meeskonda, ja kÔige kummalisem on see, et paljudel neist on armatuurlaud, mis nad ise on teinud, ja need on veidi erinevad. MÔned meeskonnad kasutavad Yandex.Cloud sisestust. Seal on mÔned valmis aruanded, kuigi mitte kÔik vajalikud. Teistel on oma.

Minu kolleegidel «Metrika» on oma armatuurlaud Grafanas, aga mul on oma nende klastril. Ma vaatan seal asju nagu cache hit vahekaartide jaoks. Ja isegi veel keerulisem on see, et me kasutame erinevaid tööriistu. Oma armatuurlauda lÔin vÀga vanal tööriistal, mida nimetatakse Graphite-web. See on tÀiesti kole. Ja ma kasutan seda endiselt, kuigi Grafana oleks tÔenÀoliselt mugavam ja ilusam.

Dashbordide pĂ”hivĂ€li on sama. Need on sĂŒsteemi meetrikad klastrile: CPU, mĂ€lu, kett, vĂ”rk. Teised on samaaegsete pĂ€ringute arv, samaaegsete liitmiste arv, pĂ€ringute arv sekundis, maksimaalne osade arv MergeTree tabelite partitsioonide jaoks, replikatsiooni viivitus, replikatsiooni jĂ€rjekorra suurus, sisestatud ridade arv sekundis, sisestatud plokkide arv sekundis. Need on kĂ”ik, mis ei tulene logidest, vaid meetrikatest.

Vladimir Kolobaev: Aleksei, ma tahaksin natuke 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 Grafana lĂ”petaks selle logide tabeliga ja nĂ€eks neid pĂ€ringuid, mida mu server esitab. Ol бы tore, kui meil oleks selline dashbord.

Ma tegelesin sellega ise. Kuid mul on kĂŒsimus – kui see kĂ”ik on standardiseeritud ja Grafanat kasutavad kĂ”ik omavahel, siis miks «Yandexis» ei ole sellist ametlikku dashbordi?

Kirill Shvakov: Tegelikult toetab ClickHouse'i andmeallikas praegu Altinity. Ja ma tahan lihtsalt anda suuna, kuhu kaevata ja keda tĂ”ukama. Saame neilt kĂŒsida, sest «Yandex» tegeleb siiski ClickHouse'iga, mitte selle ĂŒmber oleva looga. Altinity on peamine ettevĂ”te, kes praegu ClickHouse'i edendab. Nad ei jĂ€ta seda, vaid toetavad seda. Sest pĂ”himĂ”tteliselt, et laadida dashbord Grafana veebisaidile, peab lihtsalt registreeruma ja selle ĂŒles laadima – erilisi probleeme ei ole.

Aleksei Milovidov: Viimase aasta jooksul on ClickHouse'is lisandunud palju vÔimalusi pÀringute profileerimiseks. Iga pÀringu ressursikasutuse jaoks on saadaval mÔÔdikud. Ja koos just hiljuti on lisatud veel madalamal tasemel pÀringute profiler, et nÀha, kus pÀring veedab iga millisekundi. Kuid selle funktsionaalsuse kasutamiseks pean avama konsooli klienti ja sisestama pÀringu, mida ma pidevalt unustan. Olen selle kuhugi salvestanud ja pidevalt unustan, kuhu just.

Soovin, et oleks tööriist, kus lihtsalt öeldakse - siin on teie rasked pĂ€ringud, klasside kaupa rĂŒhmitatuna. Vajutage mĂ”nele ja mulle öeldakse, et see on pĂ”hjus, miks see on raske. Praegu sellist lahendust pole. Ja see on tĂ”esti ĂŒsna kummaline, et kui inimesed kĂŒsivad: „Kas teil on mingid valmiskujutised Grafana jaoks?” , siis ĂŒtlen: „Minge Grafana veebisaidile, seal on kogukond 'Dashboards', ja seal on Dima tahvel, on Kostjani tahvel. Mis see on, ma ei tea, ma ise ei ole kasutanud."

Kuidas mÔjutada mergemisi, et server ei jookseks OOM-i?

Mul on tabel, kus on ainult ĂŒks partitsioon, see on ReplacingMergeTree. Olen sinna kirja pannud andmeid nelja aasta jooksul. Pean sellel tegema alternatiivi ja eemaldama mĂ”ned andmed.

Tehtud, ja selle pÀringu töötlemise kÀigus tarvitas kogu mÀlumaht klastris, ja kÔik serverid klastris lÀksid sÔbralikult OOM-i. Siis nad kÔik koos tÔusid, hakkasid sama operatsiooni, selle andmeploki merge'ima ja langesid jÀlle OOM-i. Siis nad taas tÔusid ja jÀlle langesid. Ja see asjaolu ei lÔppenud.

Hiljem selgus, et see oli tegelikult bugi, mille nad Ă€ra fikseerisid. See on vĂ€ga tore, suured tĂ€nud. Kuid tunne jĂ€i. Ja nĂŒĂŒd, kui mĂ”tlen, et pean tegema mingit merge'i tabelis, kerkib mul kĂŒsimus - miks ma ei saa nendele merge'idele mingil moel mĂ”juda? NĂ€iteks piirata neid nĂ”utava mĂ€lu koguse jĂ€rgi vĂ”i ĂŒldiselt nende arvu jĂ€rgi, mis konkreetse tabeliga tegeleb.

Mul on tabel, mille nimi on 'Metrika', palun töötle seda kahes voos. Ära loo kĂŒmmet vĂ”i viit merge'i paralleelselt, tee kahes. Ma arvan, et kahes on mul mĂ€lu piisavalt, kuid kĂŒmne töötlemiseks ei pruugi piisata. Miks jÀÀb hirm? Sest tabel kasvab, ja ĂŒhel pĂ€eval sattun olukorda, kus mitte bugi tĂ”ttu, vaid sellepĂ€rast, et andmeid muutub nii palju, et mul lihtsalt ei ole serveris piisavalt mĂ€lu. Ja siis server jookseb OOM-i mergimise ajal. TĂ”epoolest, ma saan mutatsiooni tĂŒhistada, aga merge'e enam ei saa.

Te tead, et server ei kuku OOM-i, kui teeme merge, sest merge'i ajal kasutatakse ainult vÀikeses andmevahemikus mÀlu. Nii et kÔik lÀheb hÀsti, sÔltumata andmete mahust.

Vladimir Kolobaev: Hea. Siin on see moment, et pÀrast defekti parandamist laadisin endale uue versiooni ja tegin sarnase operatsiooni teises, vÀiksemas tabelis, kus on palju partitsioone. Ja merge'i kÀigus kulus serveris umbes 100 GB mÀlu. Mul oli 150 kasutuses, 100 kasutas ja jÀin 50 GB kogumÀlu peale, seega ma ei kukkunud OOM-i.

Mis kaitseb mind hetkel OOM-ist langemise eest, kui see tÔepoolest tarvitab 100 GB mÀlu? Kuidas kÀituda olukorras, kui merge'ide kÀigus mÀlu Àkki otsa saab?

Aleksei Milovidov: On selline probleem, et mÀlu kasutamine merge'ide jaoks ei piirdu ainult. Ja teine probleem on see, et kui mÔni merge on mÀÀratud, tuleb see kindlasti tÀita, sest see on registreeritud replikatsiooni logis. Replikatsiooni log on need toimingud, mis on vajalikud, et tuua replikatsioon jÀrjepidevasse seisundisse. Kui ei tehta kÀsitsi manipulatsioone, mis logi tagasi viivad, peab merge'i mingil juhul tÀitma.

Muidugi oleks kasulik rakendada mingit mĂ€lu piiri, mis „juhu” jaoks kaitseks OOM-i eest. See ei aita merge'il tĂ€ituda, see algab uuesti, jĂ”uab teatud piirini, viskab erandi ja algab uuesti - midagi head sellest ei tule. Kuid piiri seadmine oleks pĂ”himĂ”tteliselt kasulik.

Kuidas toimub Golang-i draiveri arendus ClickHouse jaoks?

Golang-i draiver, mille kirjutas Kirill Shvakov, nĂ€ib nĂŒĂŒd olevat ametlikult ClickHouse meeskonna poolt toetatud. See asub ClickHouse repozitooriumis, see on nĂŒĂŒd suures ja tĂ”elises vormis.

VĂ€ike mĂ€rkus. On olemas suurepĂ€rane ja kĂ”igile meeldiv lĂ”pmatute jĂ€rkjĂ€rguliste vormide ladustamine - see on Vertica. Nendel on ka oma ametlik Python draiver, mida toetavad Vertica arendajad. On olnud mitmeid kordi, kus ladustamise ja draiveri versioonid on tĂ”eliselt kaugele lĂ€inud ning draiver on mingi hetk lĂ”petanud töötamise. Ja teine asi. Selle ametliku draiveri tugi, tundub mulle, toimib sĂŒsteemiga "nippli" - sa kirjutad neile probleemist ja see jÀÀb igaveseks rippuma.

Mul on kaks kĂŒsimust. Praegu on Kirilli Golang draiver peaaegu vaikimisi viis, kuidas Golang suhelda ClickHouse'iga. Ainult, et keegi suhtleb endiselt http liidese kaudu, sest talle meeldib nii. Kuidas seda draiverit arendatakse? Kas see sĂŒnkroniseeritakse mĂ”nede ladustamise oluliste muudatustega? Ja milline on probleemide arutamise kord?

Kirill Shvakov: Esiteks - kuidas kĂ”ik bĂŒrokraatiliselt toimub. Seda teemat ei arutatud, seega ei ole mul sellele vastata.

Et vastata kĂŒsimusele probleemide kohta, on vajalik lĂŒhike draiveri ajalugu. Töötasin firmas, kus oli palju andmeid. See oli reklaamiring, kus oli tohutult sĂŒndmusi, mida tuli kusagil sĂ€ilitada. Ja mingil hetkel ilmus ClickHouse. Suunatud andmed sinna ja alguses oli kĂ”ik hĂ€sti, kuid siis ClickHouse kukkus kokku. Sellisel hetkel otsustasime, et see ei ole meile vajalik.

Aasta hiljem naasime idee juurde kasutada ClickHouse'i ja meil oli vaja kuidagi sinna andmeid kirjutada. Sissejuhatus oli selline - raud on vÀga nÔrk, ressursse on vÀhe. Kuid me oleme alati nii töötanud ja seetÔttu vaatlesime natiivprotokolli suunas.

Kuna me töötasime Go peal, oli selge, et vajame Go draiverit. Ma töötasin selle kallal praktiliselt tĂ€iskohaga - see oli minu tĂ¶Ă¶ĂŒlesanne. Kuni mingi hetk viisime selle lĂ”pule ja sisuliselt ei eeldanud keegi, et keegi peale meie seda kasutab. Siis tuli CloudFlare tĂ€pselt sama probleemiga ja mingil hetkel töötasime nendega vĂ€ga sujuvalt, kuna neil olid samad ĂŒlesanded. Ning me tegime seda nii ClickHouse'i enda ja ka draiveris.

Mingil on hetk, kus ma lihtsalt lÔpetasin nende tegemise, sest minu tegevus ClickHouse'i osas ja töö on natuke muutunud. SeetÔttu teemasid ei suleta. Vahel teevad inimesed reposse commit'e, kuna neil on midagi vaja. Siis vaatan pull request'i ja mÔnikord isegi parandan midagi ise, kuid see juhtub harva.

Soovin tagasi pöörduda draiveri juurde. MĂ”ned aastad tagasi, kui kĂ”ik see algas, oli ClickHouse ka teine ja erinevate vĂ”imalustega. Praegu on meil arusaam, kuidas draiverit ĂŒmber teha, et see oleks hea. Kui see juhtub, siis versioon 2 on igal juhul ĂŒhilduv, arvestades kogunenud 'kruve'.

Kuidas seda korraldada, ma ei tea. Mul endal ei ole nii palju aega. Kui mÔni inimene hakkab draiverit edasi arendama, suudan neid aidata ja rÀÀkida, mida teha. Kuid tÀpselt aktiivne osalemine "Yandexi" poolt projekti arendamisel ei ole seni arutatud.

Aleksei Milovidov: Tegelikult ei ole nende draiverite osas praegu mingit bĂŒrokraatiat. Ainult see, et nad on ametlikku organisatsiooni viidud, st see draiver on tunnustatud ametlikuks lahenduseks Go jaoks. On ka teised draiverid, kuid need on eraldi.

Meil ei ole nende draiverite jaoks seesugust arendust. KĂŒsimus on – kas suudame palgata eraldi inimese, mitte just selle draiveri jaoks, vaid kĂ”igi kogukonna draiverite arendamiseks, vĂ”i leiame kellegagi vĂ€ljastpoolt.

VĂ€line sĂ”nastik ei tĂ”use pĂ€rast taaskĂ€ivitust, kui lazy_load seadistus on sisse lĂŒlitatud. Mida teha?

Meil on lazy_load sisse lĂŒlitatud ja pĂ€rast serveri taaskĂ€ivitust sĂ”nastik ise ei tĂ”use. See tĂ”useb ainult siis, kui kasutaja pöördub selle sĂ”nastiku poole. Ja esimesel pöördumisel annab see vea. Kas ClickHouse'i kaudu on vĂ”imalik sĂ”nastikke automaatselt laadida, vĂ”i peame ise alati kontrollima nende valmisolekut, et kasutajad ei saaks vigu?

VÔib-olla on meil vana versioon ClickHouse'ist, seetÔttu sÔnastik ei laaditud automaatselt. Kas see vÔib olla?

Esiteks, sĂ”nastikke saab sundlaadida pĂ€ringu abil system reload dictionaries. Teiseks, seoses veaga – kui sĂ”nastik on juba laaditud, siis pĂ€ringud töötavad nende andmete pĂ”hjal, mis on laaditud. Kui sĂ”nastik ei ole veel laaditud, siis see laaditakse pĂ€ringu kĂ€igus.

Raskete sĂ”nastike jaoks ei ole see vĂ€ga mugav. NĂ€iteks, kui on vaja MySQL-ist tuua miljon rida. Keegi teeb lihtsa select'i, kuid see select ootab selle miljoni rida. Siin on kaks lahendust. Esimene - vĂ€ljalĂŒlitada lazy_load. Teine - enne serveri koormamist teha see, kui server tĂ”useb, sĂŒsteem laadib sĂ”nastikku uuesti vĂ”i lihtsalt teha pĂ€ring, mis kasutab sĂ”nastikku. Siis sĂ”nastik laaditakse. Peame ise jĂ€lgima sĂ”nastike kĂ€ttesaadavust, kui lazy_load seade on sisse lĂŒlitatud, sest ClickHouse ei tĂ”mba neid automaatselt.

Viimasele kĂŒsimusele vastus - kas versioon on vana vĂ”i tuleb seda debugida.

Kuidas olla olukorras, kus system reload dictionaries ei saada ĂŒhtegi mitmest sĂ”nastikust, kui vĂ€hemalt ĂŒks neist langeb veaga?

On veel kĂŒsimus sĂŒsteemi uuesti laadimisest sĂ”nastike kohta. Meil on kaks sĂ”nastikku - ĂŒks ei lae, teine laadib. Sellisel juhul ei laadi sĂŒsteem uuesti tĂ€hesĂ”nastikke, ja peame eraldi laadima konkreetse tema nime abil sĂŒsteemiga uuesti sĂ”nastikku. Kas see on samuti seotud ClickHouse'i versiooniga?

Soovin rÔÔmustada. See kÀitumine on muutunud. Kui uuendate ClickHouse'i, siis muudab see ka. Kui te ei ole rahul praeguse kÀitumisega system reload dictionaries, uuendage ja loodame, et see muutub paremaks.

Kas on vÔimalik ClickHouse konfiguratsioonis seadistada akreditiivid, kuid mitte nÀidata neid vigade korral?

JĂ€rgmine kĂŒsimus puudutab vigu, mis on seotud sĂ”nastikuga, nimelt rekordid. Oleme seadnud ĂŒhenduse rekordid ClickHouse'i konfiguratsioonis sĂ”nastikku ja veateate korral saame need rekordid ja parooli vastuses.

Lahendasime selle vea viies rekordid ODBC draiveri konfiguratsiooni. Kas on mingi viis seadistada rekordid ClickHouse'i konfiguratsioonis, kuid mitte paljastada neid vigu esitatud veateates?

Siin on lahendus tĂ”epoolest - mĂ€rkida need autentimisdokumendid failis odbc.ini ja ClickHouse'is mĂ€rkida ainult ODBC andmeallika nimi. Muude sĂ”nastike allikate puhul ei tohiks seda olla - ei MySQL-i sĂ”nastiku ega teiste puhul ei tohiks te parooli veateates nĂ€ha. Vaatan ka ODBC puhul — kui see on olemas, siis tuleb see lihtsalt eemaldada.

Boonus: taustad Zoomi koosolekute jaoks

Klikkides pildil avanevad kĂ”ige visama lugemise huvilistele boonusfondid kokkusaamistest. Kustutame koos Avito tehnoloogia maskottidega tulekahju, arutame oma kolleegidega sĂŒsteemiadministraatori toas vĂ”i vanakooli arvutiklubi ning viime lĂ€bi juhtimiskoosoleku sillal graffiti taustal.

ClickHouse for advanced users in questions and answers

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster