HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

HighLoad++ Moskva 2018, kongresshallen. 9 november, 15:00

Sammanfattning och presentation: http://www.highload.ru/moscow/2018/abstracts/4066

Yuri Nasretdinov (VKontakte): rapporten kommer att tala om erfarenheten av att implementera ClickHouse i vÄrt företag - varför vi behöver det, hur mycket data vi lagrar, hur vi skriver det och sÄ vidare.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Ytterligare material: anvÀnder Clickhouse som ersÀttning för ELK, Big Query och TimescaleDB

Yuri Nasretdinov: - Hej alla! Jag heter Yuri Nasretdinov, eftersom jag redan har blivit introducerad. Jag jobbar pÄ VKontakte. Jag kommer att prata om hur vi infogar data i ClickHouse frÄn vÄr serverflotta (tiotusentals).

Vad Àr stockar och varför samla in dem?

Vad vi kommer att berÀtta för dig: vad vi gjorde, varför vi behövde "ClickHouse", respektive varför vi valde det, vilken typ av prestanda du ungefÀr kan fÄ utan att konfigurera nÄgot speciellt. Jag ska berÀtta mer om bufferttabeller, om problemen vi hade med dem och om vÄra lösningar som vi utvecklat frÄn öppen kÀllkod - KittenHouse och Lighthouse.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Varför behövde vi göra nÄgonting alls (allt Àr alltid bra pÄ VKontakte, eller hur?). Vi ville samla in felsökningsloggar (och det fanns hundratals terabyte data dÀr), kanske pÄ nÄgot sÀtt skulle det vara bekvÀmare att berÀkna statistik; och vi har en flotta pÄ tiotusentals servrar frÄn vilka allt detta mÄste göras.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Varför bestÀmde vi oss? Vi hade nog lösningar för att lagra stockar. HÀr - det finns en sÄdan offentlig "Backend VK". Jag rekommenderar starkt att du prenumererar pÄ den.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vad Àr loggar? Detta Àr en motor som returnerar tomma arrayer. Motorer i VK Àr vad andra kallar mikrotjÀnster. Och hÀr Àr ett leende klistermÀrke (ganska mÄnga likes). Hur sÄ? Tja, lyssna vidare!

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vad kan anvÀndas för att lagra loggar? Det Àr omöjligt att inte nÀmna Hadup. Sedan till exempel Rsyslog (lagring av dessa loggar i filer). LSD. Vem vet vad LSD Àr? Nej, inte denna LSD. Lagra filer ocksÄ. Tja, ClickHouse Àr ett konstigt alternativ.

Klickhus och konkurrenter: krav och möjligheter

Vad vill vi ha? Vi vill se till att vi inte behöver oroa oss för mycket om operationen, sĂ„ att den fungerar direkt, helst med minimal konfiguration. Vi vill skriva mycket, och skriva snabbt. Och vi vill behĂ„lla den i alla möjliga mĂ„nader, Ă„r, det vill sĂ€ga under lĂ„ng tid. Vi kanske vill förstĂ„ nĂ„got problem som de kom till oss med och sa, "NĂ„got fungerar inte hĂ€r," och det var 3 mĂ„nader sedan), och vi vill kunna se vad som hĂ€nde för 3 mĂ„nader sedan " Datakomprimering – det Ă€r uppenbart varför det skulle vara ett plus – eftersom det minskar mĂ€ngden utrymme det tar upp.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Och vi har ett sÄ intressant krav: vi skriver ibland utdata frÄn vissa kommandon (till exempel loggar), det kan vara mer Àn 4 kilobyte ganska enkelt. Och om den hÀr saken fungerar över UDP, behöver den inte spendera ... den kommer inte att ha nÄgra "overhead" för anslutningen, och för ett stort antal servrar kommer detta att vara ett plus.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

LÄt oss se vad öppen kÀllkod erbjuder oss. För det första har vi Logs Engine - det hÀr Àr vÄr motor; Han kan i princip allt, han kan till och med skriva lÄnga rader. Tja, det komprimerar inte data transparent - vi kan sjÀlva komprimera stora kolumner om vi vill... vi vill naturligtvis inte (om möjligt). Problemet Àr bara att han bara kan ge bort det som passar i hans minne; För att lÀsa resten mÄste du skaffa binloggen för denna motor och följaktligen tar det ganska lÄng tid.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vilka andra alternativ finns det? Till exempel "Hadup". Enkel att anvÀnda... Vem tycker att Hadup Àr lÀtt att sÀtta upp? SjÀlvklart Àr det inga problem med inspelningen. NÀr man lÀser uppstÄr ibland frÄgor. I princip skulle jag sÀga förmodligen inte, speciellt för stockar. LÄngtidslagring - naturligtvis, ja, datakomprimering - ja, lÄnga strÀngar - det Àr klart att du kan spela in. Men inspelning frÄn ett stort antal servrar... Du mÄste fortfarande göra nÄgot sjÀlv!

Rsyslog. Faktum Àr att vi anvÀnde det som ett backupalternativ sÄ att vi kunde lÀsa det utan att dumpa binloggen, men det kan inte skriva lÄnga rader, i princip kan det inte skriva mer Àn 4 kilobyte. Du mÄste göra datakomprimering pÄ samma sÀtt sjÀlv. LÀsning kommer frÄn filer.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Sedan finns det "badushka"-utvecklingen av LSD. I huvudsak samma som "Rsyslog": det stöder lÄnga strÀngar, men det kan inte fungera via UDP och faktiskt, pÄ grund av detta, mÄste tyvÀrr en hel del saker skrivas om dÀr. LSD behöver göras om för att kunna spela in frÄn tiotusentals servrar.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Och hÀr! Ett roligt alternativ Àr ElasticSearch. Hur sÀger man? Han Àr bra pÄ att lÀsa, det vill sÀga han lÀser snabbt, men inte sÀrskilt bra med att skriva. För det första, om den komprimerar data Àr den mycket svag. Troligtvis krÀver en fullstÀndig sökning större datastrukturer Àn den ursprungliga volymen. Det Àr svÄrt att operera och det uppstÄr ofta problem med det. Och, Äterigen, inspelning i Elastic - vi mÄste göra allt sjÀlva.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

HÀr Àr ClickHouse naturligtvis ett idealiskt alternativ. Det enda Àr att inspelning frÄn tiotusentals servrar Àr ett problem. Men det finns Ätminstone ett problem, vi kan försöka lösa det pÄ nÄgot sÀtt. Och resten av rapporten handlar om detta problem. Vilken typ av prestanda kan du förvÀnta dig av ClickHouse?

Hur ska vi sÀtta in den? MergeTree

Vem av er har inte hört eller kÀnner till "ClickHouse"? Jag mÄste berÀtta för dig, eller hur? VÀldigt snabbt. InsÀttningen dÀr - 1-2 gigabit per sekund, skurar pÄ upp till 10 gigabit per sekund kan faktiskt motstÄ denna konfiguration - det finns tvÄ 6-kÀrniga Xeoner (det vill sÀga inte ens de mest kraftfulla), 256 gigabyte RAM, 20 terabyte i RAID (ingen konfigurerad, standardinstÀllningar). Alexey Milovidov, ClickHouse-utvecklare, sitter förmodligen dÀr och grÄter för att vi inte har konfigurerat nÄgonting (allt fungerade sÄ för oss). Följaktligen kan en skanningshastighet pÄ, sÀg, cirka 6 miljarder linjer per sekund erhÄllas om data Àr vÀl komprimerad. Om du gillar % pÄ en textstrÀng - 100 miljoner rader per sekund, det vill sÀga det verkar ganska snabbt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Hur ska vi sÀtta in den? Tja, du vet att VK anvÀnder PHP. Vi kommer att infoga frÄn varje PHP-arbetare via HTTP i "ClickHouse", i MergeTree-tabellen för varje post. Vem ser ett problem med detta upplÀgg? Av nÄgon anledning rÀckte inte alla upp handen. LÄt mig berÀtta för dig.

För det första finns det mÄnga servrar - följaktligen kommer det att finnas mÄnga anslutningar (dÄliga). DÄ Àr det bÀttre att infoga data i MergeTree inte oftare Àn en gÄng per sekund. Och vem vet varför? Okej okej. Jag ska berÀtta lite mer om detta. En annan intressant frÄga Àr att vi inte gör analyser, vi behöver inte berika data, vi behöver inte mellanliggande servrar, vi vill infoga direkt i "ClickHouse" (helst - ju mer direkt, desto bÀttre).

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Följaktligen, hur görs infogning i MergeTree? Varför Àr det bÀttre att sÀtta in det inte oftare Àn en gÄng i sekunden eller mindre ofta? Faktum Àr att "ClickHouse" Àr en kolumnÀr databas och sorterar data i stigande ordning efter primÀrnyckeln, och nÀr du gör en infogning skapas ett antal filer som Àr minst lika med antalet kolumner dÀr data sorteras i stigande ordning för primÀrnyckeln (en separat katalog skapas, en uppsÀttning filer pÄ disken för varje infogning). Sedan kommer nÀsta insÀttning, och i bakgrunden kombineras de till större "partitioner". Eftersom datan Àr sorterad Àr det möjligt att "sammanfoga" tvÄ sorterade filer utan att förbruka mycket minne.

Men, som du kanske gissar, om du skriver 10 filer för varje infogning kommer ClickHouse (eller din server) snabbt att sluta, sÄ det rekommenderas att infoga i stora partier. DÀrför lanserade vi aldrig det första systemet i produktion. Vi lanserade omedelbart en, som hÀr nr 2 har:

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

FörestÀll dig hÀr att det finns ungefÀr tusen servrar som vi har lanserat pÄ, det finns bara PHP. Och pÄ varje server finns vÄr lokala agent, som vi kallade "Kittenhouse", som upprÀtthÄller en anslutning till "ClickHouse" och infogar data med nÄgra sekunders mellanrum. Infogar data inte i MergeTree, utan i en bufferttabell, som tjÀnar just till att undvika att infoga direkt i MergeTree direkt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Arbeta med bufferttabeller

Vad det Àr? Bufferttabeller Àr ett minne som Àr söndert (det vill sÀga att det kan infogas i det ofta). De bestÄr av flera bitar, och var och en av bitarna fungerar som en oberoende buffert, och de spolas oberoende (om du har mÄnga bitar i bufferten kommer det att bli mÄnga insatser per sekund). Det Àr möjligt att lÀsa frÄn dessa tabeller - dÄ lÀser du föreningen av innehÄllet i bufferten och förÀldratabellen, men för nÀrvarande Àr skrivningen blockerad, sÄ det Àr bÀttre att inte lÀsa dÀrifrÄn. Och bufferttabeller visar mycket bra QPS, det vill sÀga upp till 3 tusen QPS kommer du inte att ha nÄgra problem alls nÀr du infogar. Det Àr uppenbart att om servern tappar ström, sÄ kan data gÄ förlorade, eftersom de bara lagrades i minnet.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Samtidigt komplicerar schemat med en buffert ALTER, eftersom du först mÄste slÀppa den gamla bufferttabellen med det gamla schemat (data kommer inte att försvinna nÄgonstans, eftersom det kommer att tömmas innan tabellen raderas). Sedan "Àndrar" du tabellen du behöver och skapar bufferttabellen igen. Följaktligen, Àven om det inte finns nÄgon bufferttabell, kommer din data inte att flöda nÄgonstans, men du kan ha den pÄ disk Ätminstone lokalt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vad Àr Kittenhouse och hur fungerar det?

Vad Àr KittenHouse? Detta Àr en proxy. Gissa vilket sprÄk? Jag samlade de mest hypeÀmnena i min rapport - "Clickhouse", Go, jag kanske kommer ihÄg nÄgot annat. Ja, det hÀr Àr skrivet i Go, för jag vet inte riktigt hur man skriver i C, jag vill inte.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Följaktligen upprÀtthÄller den en anslutning med varje server och kan skriva till minnet. Till exempel, om vi skriver felloggar till Clickhouse, och om Clickhouse inte har tid att infoga data (trots allt, om det skrivs för mycket), sÄ svÀller vi inte minnet - vi slÀnger helt enkelt ut resten. För om vi skriver flera gigabitar per sekund av fel, dÄ kan vi förmodligen kasta ut nÄgra. Kittenhouse kan göra detta. Dessutom kan den utföra pÄlitlig leverans, det vill sÀga skriva till disk pÄ den lokala maskinen och en gÄng varje gÄng (dÀr, en gÄng varannan sekund) försöker den leverera data frÄn den hÀr filen. Och först anvÀnde vi det vanliga Values-formatet - inte nÄgot binÀrt format, ett textformat (som i vanlig SQL).

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Men sĂ„ hĂ€nde detta. Vi anvĂ€nde pĂ„litlig leverans, skrev loggar och bestĂ€mde oss sedan (det var ett villkorligt testkluster)... Det lades ut i flera timmar och togs upp igen, och en insĂ€ttning startade frĂ„n tusen servrar - det visade sig att Clickhouse fortfarande hade en "TrĂ„d vid anslutning" - följaktligen, i tusen anslutningar, leder en aktiv infogning till ett belastningsmedelvĂ€rde pĂ„ servern pĂ„ cirka ett och ett halvt tusen. Överraskande nog accepterade servern förfrĂ„gningar, men uppgifterna infogades fortfarande efter en tid; men det var vĂ€ldigt svĂ„rt för servern att servera det...

LĂ€gg till nginx

En sÄdan lösning för trÄden per anslutningsmodell Àr nginx. Vi installerade nginx framför Clickhouse, satte samtidigt upp balansering för tvÄ repliker (vÄr insÀttningshastighet ökade med 2 gÄnger, Àven om det inte Àr ett faktum att sÄ borde vara fallet) och begrÀnsade antalet anslutningar till Clickhouse, till uppströms och följaktligen fler Àn i 50 anslutningar verkar det inte vara nÄgon mening med att infoga.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Sedan insÄg vi att detta schema generellt har nackdelar, eftersom vi bara har en nginx hÀr. Följaktligen, om denna nginx kraschar, trots förekomsten av repliker, förlorar vi data eller, Ätminstone, inte skriver nÄgonstans. DÀrför gjorde vi vÄr egen lastbalansering. Vi insÄg ocksÄ att "Clickhouse" fortfarande Àr lÀmplig för loggar, och "demonen" började ocksÄ skriva sina loggar i "Clickhouse" - vÀldigt bekvÀmt, om jag ska vara Àrlig. Vi anvÀnder det fortfarande för andra "demoner".

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Sedan upptÀckte vi det hÀr intressanta problemet: om du anvÀnder en icke-standard metod för att infoga i SQL-lÀge, tvingar den fram en fullfjÀdrad AST-baserad SQL-parser, som Àr ganska lÄngsam. DÀrför har vi lagt till instÀllningar för att sÀkerstÀlla att detta aldrig hÀnder. Vi gjorde lastbalansering, hÀlsokontroller, sÄ att om en dör lÀmnar vi fortfarande data. Vi har nu ganska mÄnga bord som vi behöver för att ha olika Clickhouse-kluster. Och vi började ocksÄ tÀnka pÄ andra anvÀndningsomrÄden - till exempel ville vi skriva loggar frÄn nginx-moduler, men de vet inte hur de ska kommunicera med vÄr RPC. Tja, jag skulle vilja lÀra dem hur man skickar Ätminstone pÄ nÄgot sÀtt - till exempel att ta emot hÀndelser pÄ localhost via UDP och sedan vidarebefordra dem till Clickhouse.

Ett steg bort frÄn lösningen

Det slutliga schemat började se ut sÄ hÀr (den fjÀrde versionen av detta schema): pÄ varje server framför Clickhouse finns nginx (pÄ samma server) och det skickar helt enkelt förfrÄgningar till localhost med en grÀns pÄ antalet anslutningar pÄ 50 bitar. Och det hÀr schemat fungerade redan ganska bra, allt var ganska bra med det.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vi levde sÄ hÀr i ungefÀr en mÄnad. Alla var nöjda, de la till tabeller, de la till, de la till... Generellt visade det sig att sÀttet vi la till bufferttabeller inte var sÀrskilt optimalt (lÄt oss uttrycka det sÄ). Vi gjorde 16 stycken i varje bord och ett flashintervall pÄ ett par sekunder; vi hade 20 bord och varje bord fick 8 inlÀgg per sekund - och vid denna tidpunkt började "Clickhouse"... rekorden började sakta ner. De gick inte ens igenom... Nginx hade som standard en sÄ intressant sak att om anslutningar slutade uppströms, sÄ returnerade den helt enkelt "502" till alla nya förfrÄgningar.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Och hÀr har vi (jag tittade precis pÄ loggarna i sjÀlva Clickhouse) ungefÀr en halv procent av förfrÄgningarna misslyckades. Följaktligen var diskutnyttjandet högt, det fanns mÄnga sammanslagningar. Vad gjorde jag? Naturligtvis brydde jag mig inte om att ta reda pÄ varför exakt anslutningen och uppströms slutade.

ErsÀtter nginx med en omvÀnd proxy

Jag bestÀmde mig för att vi mÄste hantera detta sjÀlva, vi behöver inte lÀmna det till nginx - nginx vet inte vilka tabeller som finns i Clickhouse, och jag ersatte nginx med en omvÀnd proxy, som jag ocksÄ skrev sjÀlv.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vad gör han? Det fungerar baserat pĂ„ fasthttp-biblioteket "goshnoy", det vill sĂ€ga snabbt, nĂ€stan lika snabbt som nginx. FörlĂ„t, Igor, om du Ă€r nĂ€rvarande hĂ€r (notera: Igor Sysoev Ă€r en rysk programmerare som skapade nginx-webbservern). Den kan förstĂ„ vilken typ av frĂ„gor dessa Ă€r – INSERT eller SELECT – följaktligen har den olika anslutningspooler för olika typer av frĂ„gor.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Följaktligen, Àven om vi inte har tid att slutföra insÀttningsförfrÄgningarna, kommer "valen" att passera, och vice versa. Och den grupperar data i bufferttabeller - med en liten buffert: om det fanns nÄgra fel, syntaxfel och sÄ vidare - sÄ att de inte skulle pÄverka resten av datan i hög grad, för nÀr vi helt enkelt infogade i bufferttabeller, hade liten "bachi", och alla syntaxfel pÄverkade bara denna lilla bit; och hÀr kommer de redan att pÄverka en stor buffert. Liten Àr 1 megabyte, det vill sÀga inte sÄ liten.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Att infoga en synkronisering och i huvudsak ersÀtta nginx, gör i princip samma sak som nginx gjorde tidigare - du behöver inte Àndra det lokala "Kattungehuset" för detta. Och eftersom det anvÀnder fasthttp Àr det vÀldigt snabbt - du kan göra mer Àn 100 tusen förfrÄgningar per sekund för enstaka infogning via en omvÀnd proxy. Teoretiskt sett kan du infoga en rad Ät gÄngen i kittenhouse omvÀnd proxy, men det gör vi naturligtvis inte.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Schemat började se ut sÄ hÀr: "Kattungehus", den omvÀnda proxyn grupperar mÄnga förfrÄgningar i tabeller och i sin tur infogar bufferttabellerna dem i de viktigaste.

Killer Àr en tillfÀllig lösning, Kitten Àr permanent

Detta Ă€r ett intressant problem... Har nĂ„gon av er anvĂ€nt fasthttp? Vem anvĂ€nde fasthttp med POST-förfrĂ„gningar? Förmodligen borde detta verkligen inte ha gjorts, eftersom det buffrar förfrĂ„gningskroppen som standard, och vĂ„r buffertstorlek var instĂ€lld pĂ„ 16 megabyte. InsĂ€ttningen slutade att hĂ€nga med nĂ„gon gĂ„ng, och 16 megabyte bitar började anlĂ€nda frĂ„n alla tiotusentals servrar, och de buffrades alla i minnet innan de skickades till Clickhouse. Följaktligen tog minnet slut, Out-Of-Memory Killer kom och dödade den omvĂ€nda proxyn (eller "Clickhouse", som teoretiskt kunde "Ă€ta" mer Ă€n den omvĂ€nda proxyn). Cykeln upprepade sig. Inte ett sĂ€rskilt trevligt problem. Även om vi snubblade över detta först efter flera mĂ„naders drift.

Vad jag har gjort? Återigen, jag gillar inte riktigt att förstĂ„ vad som hĂ€nde exakt. Jag tycker att det Ă€r ganska sjĂ€lvklart att man inte ska buffra i minnet. Jag kunde inte patcha fasthttp, Ă€ven om jag försökte. Men jag hittade ett sĂ€tt att göra det sĂ„ att det inte behövdes patcha nĂ„got, och jag kom pĂ„ en egen metod i HTTP - jag kallade den KITTEN. Tja, det Ă€r logiskt - "VK", "Kattunge" ... Vad mer? ..

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Om en förfrÄgan kommer till servern med Kitten-metoden, bör servern svara "mjau" - logiskt. Om han svarar pÄ detta, sÄ anses det att han förstÄr detta protokoll, och dÄ avlyssnar jag anslutningen (fasthttp har en sÄdan metod), och anslutningen gÄr in i "rÄ"-lÀge. Varför behöver jag det? Jag vill kontrollera hur lÀsning frÄn TCP-anslutningar sker. TCP har en underbar egenskap: om ingen lÀser frÄn andra sidan, börjar skrivningen vÀnta, och minnet spenderas inte sÀrskilt pÄ detta.

Och sÄ lÀste jag frÄn ett 50-tal klienter Ät gÄngen (frÄn femtio eftersom femtio definitivt borde rÀcka, Àven om kursen kommer frÄn en annan DC)... Konsumtionen har minskat med detta tillvÀgagÄngssÀtt minst 20 gÄnger, men jag, för att vara Àrlig , Jag kunde inte mÀta exakt vilken tid, eftersom det redan Àr meningslöst (det har redan nÄtt felnivÄn). Protokollet Àr binÀrt, det vill sÀga det innehÄller tabellnamnet och data; det finns inga http-rubriker, sÄ jag anvÀnde inte en webbsocket (jag behöver inte kommunicera med webblÀsare - jag gjorde ett protokoll som passar vÄra behov). Och allt blev bra med honom.

Bufferttabellen Àr trist

Nyligen stötte vi pÄ en annan intressant egenskap hos bufferttabeller. Och detta problem Àr redan mycket mer smÀrtsamt Àn de andra. LÄt oss förestÀlla oss denna situation: du anvÀnder redan aktivt Clickhouse, du har dussintals Clickhouse-servrar och du har nÄgra förfrÄgningar som tar vÀldigt lÄng tid att lÀsa (lÄt oss sÀga mer Àn 60 sekunder); och du kommer och gör Alter i detta ögonblick... Under tiden kommer "selects" som började före "Alter" inte att inkluderas i den hÀr tabellen, "Alter" kommer inte att starta - förmodligen nÄgra funktioner i hur "Clickhouse" fungerar i denna plats. Kanske kan detta fixas? Eller Àr det omöjligt?

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Generellt sett Àr det klart att detta i verkligheten inte Àr ett sÄ stort problem, men med bufferttabeller blir det mer smÀrtsamt. För om, lÄt oss sÀga, dina "Alter" timeouts (och det kan timeout pÄ en annan vÀrd - inte pÄ din, utan pÄ en replik, till exempel), dÄ... Du tog bort bufferttabellen, din "Alter" ( eller nÄgon annan vÀrd) tog timeout. sedan har ett "Alter"-fel intrÀffat) - du mÄste fortfarande se till att data fortsÀtter att skrivas: du skapar bufferttabellerna tillbaka (enligt samma schema som den överordnade tabellen), sedan "Alter" gÄr igenom, slutar trots allt, och bufferten tabellen börjar skilja sig i schema frÄn förÀldern. Beroende pÄ vad "Alter" var, kan infogningen inte lÀngre gÄ till den hÀr bufferttabellen - detta Àr vÀldigt trÄkigt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Det finns ocksÄ ett sÄdant tecken (kanske nÄgon har mÀrkt det) - det kallas query_thread_log i nya versioner av Clickhouse. Som standard fanns det en i nÄgon version. HÀr har vi samlat pÄ oss 840 miljoner rekord pÄ ett par mÄnader (100 gigabyte). Detta beror pÄ det faktum att "inlÀgg" skrevs dÀr (kanske nu, förresten, de Àr inte skrivna). Som jag sa till dig Àr vÄra "inlÀgg" smÄ - vi hade mÄnga "inlÀgg" i bufferttabellerna. Det Àr tydligt att detta Àr inaktiverat - jag berÀttar bara vad jag sÄg pÄ vÄr server. Varför? Detta Àr ytterligare ett argument mot att anvÀnda bufferttabeller! Spotty Àr vÀldigt ledsen.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Vem visste att den hÀr killen hette Spotty? VK-anstÀllda rÀckte upp handen. OK.

Om planerna för "KitttenHouse"

Vanligtvis delas inte planer, eller hur? Plötsligt kommer du inte att uppfylla dem och kommer inte att se sÀrskilt bra ut i andras ögon. Men jag tar risken! Vi vill göra följande: bufferttabeller, verkar det som jag, fortfarande Àr en krycka och vi mÄste buffra insÀttningen sjÀlva. Men vi vill fortfarande inte buffra den pÄ disken, sÄ vi buffrar insÀttningen i minnet.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Följaktligen, nÀr en "insert" görs, kommer den inte lÀngre att vara synkron - den kommer redan att fungera som en bufferttabell, infogas i den överordnade tabellen (nÄja, nÄgon dag senare) och rapporterar via en separat kanal vilka inserts som har passerat och vilka har inte.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Varför kan jag inte lÀmna den synkrona insatsen? Det Àr mycket bekvÀmare. Faktum Àr att om du infogar frÄn 10 tusen vÀrdar, sÄ Àr allt bra - du kommer att fÄ lite frÄn varje vÀrd, du sÀtter in dÀr en gÄng i sekunden, allt Àr bra. Men jag skulle vilja att det hÀr schemat skulle fungera, till exempel frÄn tvÄ maskiner, sÄ att du kan ladda ner i hög hastighet - kanske inte fÄ ut maximalt av Clickhouse, men skriva minst 100 megabyte per sekund frÄn en maskin genom en omvÀnd proxy - detta mÄste schemat skalas till bÄde stora och smÄ kvantiteter, sÄ vi kan inte vÀnta en sekund för varje infogning, sÄ det mÄste vara asynkront. Och pÄ samma sÀtt bör asynkrona bekrÀftelser komma efter att insÀttningen Àr klar. Vi fÄr veta om det gick igenom eller inte.

Det viktigaste Àr att i detta schema vet vi sÀkert om insÀttningen Àgde rum eller inte. FörestÀll dig den hÀr situationen: du har en bufferttabell, du skrev nÄgot i den, och lÄt oss sÀga att tabellen gick in i skrivskyddat lÀge och försökte tömma bufferten. Vart ska uppgifterna ta vÀgen? De kommer att stanna kvar i bufferten. Men vi kan inte vara sÀkra pÄ detta - tÀnk om det finns nÄgot annat fel, pÄ grund av vilket data inte kommer att finnas kvar i bufferten... (Att tilltalar Alexey Milovidov, Yandex, ClickHouse-utvecklare) Eller kommer det att finnas kvar? Alltid? Alexey övertygar oss om att allt kommer att bli bra. Vi har ingen anledning att inte tro honom. Men ÀndÄ: om vi inte anvÀnder bufferttabeller kommer det inte att vara nÄgra problem med dem. Att skapa dubbelt sÄ mÄnga bord Àr ocksÄ obekvÀmt, Àven om det i princip inte Àr nÄgra stora problem. Det hÀr Àr planen.

LÄt oss prata om lÀsning

LÄt oss nu prata om lÀsning. Vi skrev ocksÄ vÄrt eget verktyg hÀr. Det verkar, ja, varför skriva ditt eget instrument hÀr? .. Och vem anvÀnde Tabix? PÄ nÄgot sÀtt rÀckte fÄ mÀnniskor upp handen... Och vem Àr nöjd med Tabix prestanda? Tja, vi Àr inte nöjda med det, och det Àr inte sÀrskilt bekvÀmt för att visa data. Det Àr bra för analyser, men bara för visning Àr det uppenbarligen inte optimerat. SÄ jag skrev mitt eget, mitt eget grÀnssnitt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Det Àr vÀldigt enkelt - det kan bara lÀsa data. Han vet inte hur man visar grafik, han vet inte hur man gör nÄgonting. Men det kan visa vad vi behöver: till exempel hur mÄnga rader som finns i tabellen, hur mycket utrymme den tar upp (utan att dela upp det i kolumner), det vill sÀga ett vÀldigt grundlÀggande grÀnssnitt Àr vad vi behöver.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Och det ser vÀldigt likt Sequel Pro, men bara gjort pÄ Twitters Bootstrap, och den andra versionen. Du frÄgar: "Yuri, varför pÄ den andra versionen?" Vilket Är? 2018? I allmÀnhet gjorde jag detta för ganska lÀnge sedan för "Muscle" (MySQL) och Àndrade bara ett par rader i frÄgorna dÀr, och det började fungera för "Clickhouse", vilket sÀrskilt tack! Eftersom parsern Àr vÀldigt lik "muskeln", och frÄgorna Àr vÀldigt lika - mycket bekvÀmt, sÀrskilt i början.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Tja, det kan filtrera tabeller, kan visa strukturen och innehÄllet i tabellen, lÄter dig sortera, filtrera efter kolumner, visar frÄgan som resulterade i resultatet, de berörda raderna (hur mÄnga som ett resultat), det vill sÀga grundlÀggande saker för att visa data. Ganska snabbt.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Det finns ocksÄ en redaktör. Jag försökte Àrligt talat stjÀla hela redaktören frÄn Tabix, men jag kunde inte. Men pÄ nÄgot sÀtt fungerar det. I princip Àr det allt.

"Clickhouse" Àr lÀmplig för hÄlor

Jag vill berÀtta att Clickhouse, trots alla beskrivna problem, lÀmpar sig vÀldigt bra för stockar. Viktigast av allt, det löser vÄrt problem - det Àr vÀldigt snabbt och lÄter dig filtrera loggar efter kolumner. I princip har bufferttabeller inte fungerat bra, men oftast vet ingen varför... Kanske vet du nu bÀttre var du kommer att fÄ problem.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

TCP? I allmĂ€nhet Ă€r det i VK vanligt att anvĂ€nda UDP. Och nĂ€r jag anvĂ€nde TCP... Naturligtvis var det ingen som sa till mig: ”Yuri, vad pratar du om! Du kan inte, du behöver UDP." Det visade sig att TCP inte Ă€r sĂ„ lĂ€skigt. Det enda Ă€r att om du har tiotusentals aktiva föreningar som du skriver mĂ„ste du förbereda det lite mer noggrant; men det Ă€r möjligt och ganska enkelt.

Jag lovade att lÀgga upp "Kattungehus" och "Lighthouse" pÄ HighLoad Siberia om alla prenumererade pÄ vÄr offentliga "VK backend"... Och du vet, alla prenumererade inte... Jag kommer naturligtvis inte krÀva att du prenumererar pÄ vÄr offentlig. Det Àr fortfarande för mÄnga av er, nÄgon kan till och med bli förolÀmpad, men ÀndÄ, prenumerera (och hÀr mÄste jag göra ögon som en katt). Det Àr lÀnk till den förresten. Tack sÄ mycket! Github Àr vÄr just hÀr. Med Clickhouse blir ditt hÄr mjukt och silkeslent.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Ledande: - VÀnner, nu till frÄgor. Direkt efter presenterar vi uppskattningsbeviset och din rapport om VHS.

Yuri Nasretdinov (nedan kallad YN): – Hur kunde du spela in min rapport pĂ„ VHS om den bara tog slut?

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

Ledande: – Du kan inte heller helt bestĂ€mma hur "Clickhouse" kommer att fungera eller inte! VĂ€nner, 5 minuter för frĂ„gor!

frÄgor

FrÄga frÄn publiken (nedan kallad Q): - God eftermiddag. Tack sÄ mycket för rapporten. Jag har tvÄ frÄgor. Jag börjar med nÄgot oseriöst: pÄverkar antalet bokstÀver t i namnet "Kattungehus" i diagrammen (3, 4, 7...) katternas tillfredsstÀllelse?

YN: - Kvantitet av vad?

З: – Bokstaven t. Det finns tre t, nĂ„gonstans runt tre t.

YN: - Fixade jag det inte? Jo, sjÀlvklart gör det det! Det hÀr Àr olika produkter - jag har bara lurat dig hela tiden. Okej, jag skojar - det spelar ingen roll. Ah, precis hÀr! Nej, det Àr samma sak, jag gjorde ett stavfel.

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

З: - Tack. Den andra frĂ„gan Ă€r allvarlig. SĂ„vitt jag förstĂ„r, i Clickhouse, lever bufferttabeller uteslutande i minnet, buffras inte till disk och Ă€r följaktligen inte persistenta.

YN: - Ja.

З: – Och samtidigt buffrar din klient till disk, vilket innebĂ€r en viss garanti för leverans av samma loggar. Men detta Ă€r pĂ„ inget sĂ€tt garanterat pĂ„ Clickhouse. Förklara hur garantin utförs, pĂ„ grund av vad?.. HĂ€r Ă€r denna mekanism mer detaljerat

YN: – Ja, teoretiskt sett finns det inga motsĂ€gelser hĂ€r, för nĂ€r Clickhouse faller kan man faktiskt upptĂ€cka det pĂ„ en miljon olika sĂ€tt. Om Clickhouse kraschar (om det slutar fel) kan du grovt sett spola tillbaka lite av din logg som du skrivit ner och börja frĂ„n det ögonblick dĂ„ allt var helt okej. LĂ„t oss sĂ€ga att du spolar tillbaka en minut, det vill sĂ€ga det anses att du har spolat allt pĂ„ en minut.

З: – Det vill sĂ€ga, "Kattungehus" hĂ„ller fönstret lĂ€ngre och kan, vid ett fall, kĂ€nna igen det och spola tillbaka det?

YN: – Men det hĂ€r Ă€r i teorin. I praktiken gör vi inte detta, och pĂ„litlig leverans Ă€r frĂ„n noll till oĂ€ndligt. Men i genomsnitt en. Vi Ă€r nöjda med att om Clickhouse kraschar av nĂ„gon anledning eller servrarna "startar om" sĂ„ tappar vi lite. I alla andra fall kommer ingenting att hĂ€nda.

З: - HallĂ„. Redan frĂ„n början verkade det för mig att du verkligen skulle anvĂ€nda UDP frĂ„n början av rapporten. Du har http, allt det dĂ€r... Och de flesta av problemen som du beskrev, som jag förstĂ„r det, orsakades av just den hĂ€r lösningen...

YN: – Vad anvĂ€nder vi TCP?

З: – I huvudsak ja.

YN: - Nej.

З: – Det var med fasthttp du hade problem, med anslutningen du hade problem. Om du bara hade anvĂ€nt UDP hade du sparat lite tid. Tja, det skulle vara problem med lĂ„nga meddelanden eller nĂ„got annat...

YN: - Med vad?

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

З: – Med lĂ„nga meddelanden, eftersom det kanske inte passar in i MTU:n, nĂ„got annat... Tja, det kan finnas egna problem. FrĂ„gan Ă€r: varför inte UDP?

YN: – Jag tror att författarna som utvecklade TCP/IP Ă€r mycket smartare Ă€n mig och vet bĂ€ttre Ă€n jag hur man serialiserar paket (sĂ„ att de gĂ„r), samtidigt justerar sĂ€ndningsfönstret, inte överbelastas nĂ€tverket, ger feedback om vad lĂ€ses inte, rĂ€knas inte pĂ„ andra sidan... Alla dessa problem skulle enligt min mening existera i UDP, bara jag skulle behöva skriva Ă€nnu mer kod Ă€n jag redan skrivit för att implementera samma sak sjĂ€lv och med största sannolikhet dĂ„ligt. Jag gillar inte ens att skriva i C, Ă€n mindre dĂ€r...

З: - Bara bekvĂ€mt! Skickades ok och vĂ€nta inte pĂ„ nĂ„gonting - det Ă€r helt asynkront. Ett meddelande kom tillbaka om att allt var bra - det betyder att det kom; Om det inte kommer betyder det att det Ă€r dĂ„ligt.

YN: – Jag behöver bĂ„da – Jag mĂ„ste kunna skicka bĂ„de med leveransgaranti och utan leveransgaranti. Det Ă€r tvĂ„ olika scenarier. Jag behöver inte förlora nĂ„gra loggar eller inte förlora dem inom rimliga grĂ€nser.

З: – Jag kommer inte att slösa tid. Detta mĂ„ste diskuteras mer. Tack.

Ledande: – Vem har frĂ„gor – hands to the sky!

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

З: - Hej, jag heter Sasha. NĂ„gonstans i mitten av rapporten infann sig en kĂ€nsla av att det förutom TCP gick att anvĂ€nda en fĂ€rdig lösning – nĂ„gon slags Kafka.

YN: – Tja... Jag sa till dig att jag inte vill anvĂ€nda mellanliggande servrar, för... i Kafka visar det sig att vi har tiotusen vĂ€rdar; i sjĂ€lva verket har vi fler - tiotusentals vĂ€rdar. Det kan ocksĂ„ vara smĂ€rtsamt att göra med Kafka utan nĂ„gra fullmakter. Dessutom, viktigast av allt, det ger fortfarande "latency", det ger extra vĂ€rdar som du behöver ha. Men jag vill inte ha dem - jag vill...

З: "Men till slut blev det sĂ„ Ă€ndĂ„."

YN: – Nej, det finns inga vĂ€rdar! Allt detta fungerar pĂ„ Clickhouse-vĂ€rdar.

З: - Tja, och "Kattungehuset", vilket Ă€r tvĂ€rtom - var bor han?

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

YN: – PĂ„ Clickhouse-vĂ€rden skriver den ingenting till disken.

З: - LĂ„t oss anta.

Ledande: - Är du nöjd? Kan vi ge dig lön?

З: - Jo det kan du. Faktum Ă€r att det finns mĂ„nga kryckor för att fĂ„ samma sak, och nu - det tidigare svaret pĂ„ Ă€mnet TCP motsĂ€ger, enligt min mening, denna situation. Det kĂ€nns bara som att allt kunde ha gjorts pĂ„ mina knĂ€n pĂ„ mycket kortare tid.

YN: – Och Ă€ven varför jag inte ville anvĂ€nda Kafka, för det fanns ganska mĂ„nga klagomĂ„l i Clickhouse Telegram-chatten om att till exempel meddelanden frĂ„n Kafka gick förlorade. Inte frĂ„n Kafka sjĂ€lv, utan i integrationen av Kafka och Clickhaus; eller nĂ„got hĂ€ngde inte ihop dĂ€r. Grovt sett skulle det vara nödvĂ€ndigt att skriva en klient till Kafka dĂ„. Jag tror inte att det kan finnas en enklare eller mer pĂ„litlig lösning.

З: – SĂ€g mig, varför provade du inte nĂ„gra köer eller nĂ„gon slags gemensam buss? Eftersom du sĂ€ger att man med asynkroni skulle kunna skicka sjĂ€lva loggarna genom kön och ta emot svaret asynkront genom kön?

HighLoad++, Yuri Nasretdinov (VKontakte): hur VK infogar data i ClickHouse frÄn tiotusentals servrar

YN: – VĂ€nligen föreslĂ„ vilka köer som kan anvĂ€ndas?

З: – Alla, Ă€ven utan garanti för att de Ă€r i ordning. NĂ„gon sorts Redis, RMQ...

YN: – Jag har en kĂ€nsla av att Redis med största sannolikhet inte kommer att kunna dra en sĂ„dan insĂ€ttningsvolym ens pĂ„ en vĂ€rd (i betydelsen flera servrar) som drar ut Clickhouse. Jag kan inte backa upp detta med nĂ„gra bevis (jag har inte benchmarkat det), men det verkar för mig att Redis inte Ă€r den bĂ€sta lösningen hĂ€r. I princip kan detta system betraktas som en improviserad meddelandekö, men som endast Ă€r skrĂ€ddarsydd för "Clickhouse"

Ledande: – Yuri, tack sĂ„ mycket. Jag föreslĂ„r att avsluta frĂ„gorna och svaren hĂ€r och sĂ€ga vem av dem som stĂ€llde frĂ„gan vi ska ge boken till.

YN: – Jag skulle vilja ge en bok till den första personen som stĂ€llde en frĂ„ga.

Ledande: - Underbar! Bra! Fantastisk! Tack sÄ mycket!

NĂ„gra annonser 🙂

Tack för att du stannar hos oss. Gillar du vĂ„ra artiklar? Vill du se mer intressant innehĂ„ll? Stöd oss ​​genom att lĂ€gga en bestĂ€llning eller rekommendera till vĂ€nner, moln VPS för utvecklare frĂ„n $4.99, en unik analog av ingĂ„ngsservrar, som uppfanns av oss för dig: Hela sanningen om VPS (KVM) E5-2697 v3 (6 kĂ€rnor) 10GB DDR4 480GB SSD 1Gbps frĂ„n $19 eller hur delar man en server? (tillgĂ€nglig med RAID1 och RAID10, upp till 24 kĂ€rnor och upp till 40 GB DDR4).

Dell R730xd 2 gÄnger billigare i Equinix Tier IV datacenter i Amsterdam? Bara hÀr 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV frÄn $199 i NederlÀnderna! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - frÄn $99! LÀs om Hur man bygger infrastructure corp. klass med anvÀndning av Dell R730xd E5-2650 v4-servrar vÀrda 9000 XNUMX euro för en slant?

KĂ€lla: will.com

LĂ€gg en kommentar