
Hur förstÄr en backend-utvecklare att en SQL-frÄga kommer att fungera bra pÄ "prod"? I stora eller snabbt vÀxande företag har inte alla tillgÄng till "prod". Dessutom kan inte alla frÄgor testas smÀrtfritt med tillgÄng, och att skapa en databasÄterkoppling kan ofta ta timmar. För att lösa dessa problem har vi skapat en artificiell DBA - Joe. Han har redan framgÄngsrikt implementerats i flera företag och hjÀlper ett tiotal utvecklare.
Video:

Hej alla! Jag heter Anatolij Stansler. Jag arbetar pÄ företaget . Vi fokuserar pÄ att pÄskynda utvecklingsprocessen genom att eliminera de fördröjningar som utvecklare, DBA och QA upplever nÀr de arbetar med Postgres.
Vi har fantastiska kunder, och idag kommer en del av presentationen att Àgnas Ät fallstudier som vi har stött pÄ i vÄrt arbete med dem. Jag kommer att berÀtta om hur vi hjÀlpte dem att lösa ganska allvarliga problem.

NÀr vi bedriver utveckling och genomför komplexa migreringar stÀller vi oss frÄgan: "Kommer den hÀr migreringen att lyckas?" Vi anvÀnder recensioner, vi utnyttjar kunskapen frÄn mer erfarna kollegor och DBA-experter. De kan sÀga om det kommer att lyckas eller inte.
Men kanske vore det bÀttre om vi sjÀlva kunde testa detta pÄ fullstora kopior. Och idag kommer vi just att diskutera de nuvarande metoderna för testning och hur detta kan göras bÀttre med hjÀlp av vilka verktyg. Vi kommer ocksÄ att diskutera vilka fördelar och nackdelar det finns med dessa metoder och vad vi kan förbÀttra hÀr.

Har nÄgon nÄgonsin gjort index eller nÄgra andra Àndringar direkt pÄ prod? MÄnga har det. Och hos de som har gjort det ledde det till att data gick förlorade eller till driftstopp? DÄ kÀnner du till den smÀrtan. Tack och lov finns det backup.

Den första metoden Àr testning i prod. Eller nÀr utvecklaren sitter med sin lokala maskin, har testdata, finns en begrÀnsad urval. Och vi rullar ut pÄ prod och fÄr en sÄdan situation.

Det Àr smÀrtsamt, det Àr dyrt. Kanske Àr det bÀttre att inte göra sÄ.
Hur kan vi göra det bÀttre?

LÄt oss ta staging och avsÀtta en del av prod dÀr. Eller i bÀsta fall ta verklig prod, alla data. Och efter att vi har utvecklat lokalt, ska vi ocksÄ kontrollera pÄ staging.
Detta kommer att hjÀlpa oss att eliminera vissa fel, d.v.s. förhindra dem pÄ prod.
Vilka problem finns det?
- Problemet Ă€r att vi delar denna staging med kollegor. Och det hĂ€nder ofta att man gör nĂ„gon Ă€ndring, boom â och inga data finns kvar, allt arbete förgĂ€ves. Staging var flera terabyte stort. Och man mĂ„ste vĂ€nta lĂ€nge innan det Ă€r uppe igen. Vi beslutar oss för att göra detta imorgon. Nu har vi stopp i utvecklingen.
- Och sjÀlvklart har vi mÄnga kollegor som arbetar dÀr, mÄnga team. Och det mÄste godkÀnnas manuellt. Det Àr mycket opraktiskt.

Och det Àr vÀrt att nÀmna att vi endast har ett försök, en chans, om vi vill göra nÄgra Àndringar i databasen, röra vid datan, Àndra strukturen. Och om nÄgot gÄr fel, om det uppstÄr ett fel i migreringen, sÄ kan vi inte snabbt gÄ tillbaka.
Detta Àr bÀttre Àn det föregÄende tillvÀgagÄngssÀttet, men det finns fortfarande en stor risk att nÄgot fel gÄr till produktion.

Vad hindrar oss frÄn att ge varje utvecklare en testmiljö, en fullstÀndig kopia? Jag tror att det Àr tydligt vad som hindrar oss.
Vem har en databas som Àr större Àn en terabyte? Mer Àn hÀlften av salen.
Och det Àr uppenbart att hÄlla maskiner för varje utvecklare, nÀr produktionen Àr sÄ stor, Àr mycket dyrt, och dessutom tar det lÄng tid.
Vi har kunder som har insett att det Àr mycket viktigt att testa alla Àndringar pÄ fullstÀndiga kopior, men de har databaser som Àr mindre Àn en terabyte, och de har inte resurser för att hÄlla en testmiljö för varje utvecklare. DÀrför tvingas de ladda ner dumpfiler lokalt pÄ sin maskin och testa pÄ det sÀttet. Det tar massor av tid.

Ăven om du gör detta inom infrastrukturen, att ladda ner en terabyte data pĂ„ en timme â det Ă€r redan vĂ€ldigt bra. Men de anvĂ€nder logiska dumpfiler, de laddar ner lokalt frĂ„n molnet. För dem Ă€r hastigheten omkring 200 gigabyte i timmen. Och man behöver ocksĂ„ tid för att Ă„terstĂ€lla frĂ„n den logiska dumpen, applicera index, osv.
Men de anvÀnder detta tillvÀgagÄngssÀtt eftersom det gör att de kan hÄlla produktionen pÄlitlig.
Vad kan vi göra hÀr? LÄt oss se till att testmiljöerna Àr billiga och ge varje utvecklare sin egen testmiljö.
Och det Àr möjligt.

Och i detta tillvÀgagÄngssÀtt, nÀr vi skapar tunna kloner för varje utvecklare, kan vi dela detta pÄ en maskin. Till exempel, om du har en fyra terabyte stor databas och vill ge den till 10 utvecklare, behöver du inte ha 10 x fyraterabyte databaser. Det rÀcker med en maskin för att göra tunna isolerade kopior för varje utvecklare, med hjÀlp av en maskin. Jag kommer att berÀtta hur det fungerar lite senare.

Ett verkligt exempel:
DB â 4,5 terabyte.
Vi kan fÄ oberoende kopior pÄ 30 sekunder.
Du behöver inte vÀnta pÄ en testmiljö och vara beroende av hur stor den Àr. Du kan fÄ den pÄ sekunder. Det kommer att vara helt isolerade miljöer, men som delar data mellan varandra.
Det Àr riktigt hÀftigt. HÀr pratar vi om magi och parallella universum.

I vÄrt fall fungerar detta med hjÀlp av systemet OpenZFS.

OpenZFS Àr ett copy-on-write filsystem som frÄn början stödjer snapshots och kloner. Det Àr pÄlitligt och skalbart. Det Àr mycket enkelt att hantera. Du kan bokstavligt talat stÀlla in det med tvÄ kommandon.
Det finns andra alternativ:
LVM,
SAN (till exempel Pure Storage).
Database Lab, som jag pratar om, Àr modulÀrt. Det kan implementeras med sÄdana alternativ. Men hittills har vi fokuserat pÄ OpenZFS eftersom vi specifikt har haft problem med LVM.

Hur fungerar detta? IstÀllet för att skriva om data varje gÄng vi Àndrar dem, sparar vi dem helt enkelt, och markerar att dessa nya data tillhör en ny tidspunkt, en ny snapshot.
Och senare, nÀr vi vill ÄtergÄ eller skapa en ny klon frÄn en Àldre version, sÀger vi bara: "Okej, ge oss dessa datablokkar som Àr markerade pÄ det hÀr sÀttet."
Och den hÀr anvÀndaren kommer att arbeta med detta dataset. Han kommer gradvis att Àndra dem och göra sina snapshots.
Och vi kommer att fÄ förgrening. Varje utvecklare kommer i vÄrt fall att ha möjlighet att ha sin egen klon som han redigerar, medan de gemensamma data kommer att delas mellan alla.

För att stÀlla in ett sÄdant system pÄ din egen sida mÄste du lösa tvÄ problem:
Det första Àr datakÀllan dÀrifrÄn du kommer att hÀmta dem. Du kan stÀlla in replikering frÄn produktion. Du kan anvÀnda redan befintliga sÀkerhetskopior som du har stÀllt in, hoppas jag. WAL-E, WAL-G eller Barman. Och Àven om du anvÀnder nÄgon form av molnlösning, som RDS eller Cloud SQL, kan du anvÀnda logiska dumpningar. Men vi rekommenderar fortfarande att du anvÀnder sÀkerhetskopior, eftersom denna metod ocksÄ bevarar den fysiska filstrukturen, vilket gör att du kommer Ànnu nÀrmare de mÄtt som du skulle se i produktion för att fÄnga de problem som finns.
Det andra Àr platsen dÀr du vill hosta Database Lab. Det kan vara i molnet, det kan vara pÄ plats. HÀr Àr det viktigt att nÀmna att ZFS stöder datakomprimering. Och det gör det ganska bra.
TÀnk dig att varje sÄdan klon, beroende pÄ de operationer vi gör med databasen, kommer att öka i storlek. För den utvecklingen behövs ocksÄ plats. Men eftersom vi har tagit en databas pÄ 4,5 terabyte, kommer ZFS att komprimera den till 3,5 terabyte. Beroende pÄ instÀllningarna kan detta varieras. Och vi fÄr fortfarande plats för utvecklingen.
Ett sÄdant system kan anvÀndas för olika fall.
Det hÀr Àr utvecklare, DBA för att kontrollera frÄgor och för optimering.
Detta kan anvÀndas i QA-testning för att kontrollera en specifik migrering innan vi rullar ut den i produktion. Vi kan ocksÄ skapa speciella miljöer för QA med verkliga data, dÀr de kan testa ny funktionalitet. Och detta kommer att ta sekunder istÀllet för att vÀnta timmar, kanske till och med dagar i vissa andra fall dÀr tunna kopior inte anvÀnds.
Och Ànnu ett separat fall. Om företaget inte har ett analyssystem kan vi avsÀtta en tunn klon av produktdatabasen för lÄnga frÄgor eller för speciella index som kan anvÀndas i analys.

Med detta tillvÀgagÄngssÀtt:
LÄg sannolikhet för fel i "produktionen", eftersom vi har testat alla Àndringar pÄ fullstora data.
Vi fÄr en testningskultur, eftersom vi nu inte behöver vÀnta i timmar pÄ att fÄ egen miljö.
Och det finns inga hinder, ingen vÀntan mellan tester. Du kan verkligen gÄ och kontrollera. Och det kommer bli bÀttre, eftersom vi pÄskyndar utvecklingen.
Det kommer att bli mindre refaktorering. FĂ€rre buggar kommer att hamna i produktion. Vi kommer att refaktorisera dem mindre senare.
Vi kan hantera oÄterkalleliga förÀndringar. Detta finns inte i standardmetoder.
- Detta Àr fördelaktigt eftersom vi delar resurserna för testmiljöer.
Det Àr redan bra, men vad mer kan vi snabba upp?

Tack vare ett sÄdant system kan vi kraftigt sÀnka tröskeln för att komma in i denna typ av testning.
Det finns idag en ond cirkel dÀr utvecklaren mÄste bli expert för att fÄ tillgÄng till verklig fullstor data. De mÄste fÄ förtroende för denna Ätkomst.
Men hur kan vi vÀxa om det inte finns? Och vad hÀnder om du bara har tillgÄng till en mycket liten uppsÀttning testdata? DÄ fÄr du ingen verklig erfarenhet.

Hur tar vi oss ur denna cirkel? Som första grÀnssnitt, bekvÀmt för utvecklare pÄ alla nivÄer, har vi valt en Slack-bot. Men det kan vara vilket annat grÀnssnitt som helst.
Vad tillÄter det oss att göra? Man kan ta en specifik förfrÄgan och skicka den till en speciell kanal för databasen. Vi kommer automatiskt att pÄ nÄgra sekunder stÀlla upp en tunn klon. Köra denna förfrÄgan. Samla in mÀtvÀrden och rekommendationer. Visa visualisering. Och denna klon kommer att finnas kvar sÄ att denna förfrÄgan kan optimeras, lÀgga till index, etc.
Och dessutom ger Slack oss möjligheter för samarbeten direkt ur lÄdan. Eftersom det bara Àr en kanal kan man direkt dÀr i trÄden för den förfrÄgan börja diskutera den, pingar sina kollegor, DBA:er som finns inom företaget.

Men det finns förstÄs Àven problem. Eftersom detta Àr den verkliga vÀrlden, och vi anvÀnder en server dÀr vi hostar mÄnga kloner, mÄste vi komprimera mÀngden minne och processorkraft som klonerna har tillgÄng till.
Men för att dessa tester ska vara trovÀrdiga, mÄste vi pÄ nÄgot sÀtt lösa detta problem.
Det Àr klart att en viktig aspekt Àr att ha samma data. Men det har vi redan. Och vi vill uppnÄ en enhetlig konfiguration. Och vi kan ge en praktiskt taget identisk konfiguration.
Det skulle vara fantastiskt att ha samma hÄrdvara som i produktion, men den kan skilja sig.

LÄt oss komma ihÄg hur Postgres arbetar med minne. Vi har tvÄ cacheminnen. Ett frÄn filsystemet och ett frÄn Postgres, det vill sÀga Shared Buffer Cache.
Det Àr viktigt att notera att Shared Buffer Cache allokeras vid starten av Postgres beroende pÄ den storlek du anger i konfigurationen.
Och den andra cachen anvÀnder allt tillgÀngligt utrymme.

Och nÀr vi gör flera kloner pÄ en och samma maskin, visar det sig att vi gradvis fyller minnet. Och i bÀsta fall Àr Shared Buffer Cache 25 % av den totala mÀngden minne som finns tillgÀngligt pÄ maskinen.
Och det visar sig att om vi inte Àndrar den hÀr parametern kan vi bara köra 4 instanser pÄ en maskin, dvs. totalt 4 sÄdana tunna kloner. Och det Àr förstÄs dÄligt, eftersom vi vill ha betydligt fler.
Men Ä andra sidan anvÀnds Buffer Cache för att utföra förfrÄgningar, för index, dvs. planeringen beror pÄ storleken pÄ vÄra cacher. Och om vi bara tar och minskar den hÀr parametern, kan vÄra planer förÀndras mycket.
Till exempel, om vi har en stor cache pÄ prod, kommer Postgres att föredra att anvÀnda index. Men om inte, kommer det att bli SeqScan. Och vad skulle det finnas för mening i att vÄra planer inte matchade?
Men hÀr kommer vi fram till den slutsatsen att planen i Postgres faktiskt inte beror pÄ den specifika storleken pÄ Shared Buffer som har angivits, utan pÄ effective_cache_size.

Effective_cache_size Àr den förvÀntade mÀngden cache som vi har tillgÄng till, dvs. summan av Buffer Cache och filsystemets cache. Detta anges i konfigurationen. Och det hÀr minnet allokeras inte.
Och genom den hÀr parametern kan vi lura Postgres och sÀga att vi faktiskt har mycket data tillgÀnglig, Àven om vi inte har den datan. Och pÄ sÄ sÀtt kommer planerna att helt överensstÀmma med produktionen.
Men det kan pÄverka tidsaspekten. Och vi optimerar förfrÄgningar efter tid, men det Àr viktigt att tidsaspekten beror pÄ mÄnga faktorer:
Det beror pÄ den belastning som just nu finns pÄ prod.
Det beror pÄ specifikationerna för sjÀlva maskinen.
Och detta Àr en indirekt parameter, men egentligen kan vi optimera precis efter mÀngden data som denna förfrÄgan kommer att lÀsa för att fÄ resultat.
Och om vi vill att tidpunkten ska nĂ€rma sig det vi ser i produktion, mĂ„ste vi anvĂ€nda sĂ„ liknande hĂ„rdvara som möjligt och kanske till och med mer för att alla kloner ska fĂ„ plats. Men det Ă€r en kompromiss, dvs. du fĂ„r samma planer, du kommer att se hur mycket data en specifik frĂ„ga lĂ€ser och kan dra slutsatsen â Ă€r denna frĂ„ga bra (eller migrering) eller dĂ„lig, den behöver fortfarande optimeras.
LÄt oss titta pÄ hur optimeringen faktiskt sker med Joe.

LÄt oss ta en frÄga frÄn ett verkligt system. I detta fall Àr databasen 1 terabyte. Och vi vill rÀkna antalet nya inlÀgg som har fÄtt mer Àn 10 gillningar.

Vi skriver ett meddelande i kanalen, en klon har skapats för oss. Och vi kommer att se att en sÄdan frÄga kommer att köras pÄ 2,5 minuter. Det Àr det första vi kommer att mÀrka.
B Joe kommer att visa automatiska rekommendationer baserade pÄ planen och mÀtvÀrdena.
Vi kommer att se att frÄgan bearbetar för mycket data för att fÄ ett relativt litet antal rader. Och vi behöver en speciell index, eftersom vi har mÀrkt att det finns för mÄnga filtrerade rader i frÄgan.

LÄt oss titta nÀrmare pÄ vad som hÀnde. Faktiskt ser vi att vi har lÀst nÀstan en och en halv gigabyte data frÄn filcachen eller till och med frÄn disken. Och det Àr inte bra, eftersom vi bara fick 142 rader.

Och, som det verkar, har vi hÀr en indexskanning och det borde ha gÄtt snabbt, men eftersom vi filtrerade bort för mÄnga rader (vi var tvungna att rÀkna dem), sÄ gick frÄgan lÄngsamt.

Och detta hÀnde i planen eftersom villkoren i frÄgan och villkoren i indexet delvis inte stÀmmer överens.

LÄt oss försöka göra indexet mer exakt och se hur frÄgans körning förÀndras efter det.

Att skapa indexet tog ganska lÄng tid, men nu kontrollerar vi frÄgan och ser att tiden istÀllet för 2,5 minuter nu bara Àr 156 millisekunder, vilket Àr riktigt bra. Och vi lÀser bara 6 megabyte data.

Och nu anvÀnder vi index only scan.
En annan viktig sak Àr att vi vill presentera planen pÄ ett mer förstÄeligt sÀtt. Vi har implementerat visualisering med hjÀlp av Flame Graphs.

Detta Àr en annan frÄga, mer komplex. Och vi bygger Flame Graphs baserat pÄ tvÄ parametrar: det Àr mÀngden data som en specifik nod i planen har lÀst och tidpunkten, dvs. nödens utförandetid.
HÀr kan vi jÀmföra specifikt noder med varandra. Det blir tydligt vilken som tar mer eller mindre utrymme, vilket ofta Àr svÄrt att göra med andra visualiseringsmetoder.

SjÀlvklart kÀnner alla till explain.depesz.com. En bra funktion med den hÀr visualiseringen Àr att vi sparar den textbaserade planen och ocksÄ lyfter fram nÄgra huvudparametrar i en tabell, sÄ att de kan sorteras.
Och utvecklare som Ànnu inte har dykt djupt ner i det hÀr Àmnet anvÀnder ocksÄ explain.depesz.com, eftersom det Àr enklare för dem att förstÄ vilka mÀtvÀrden som Àr viktiga och vilka som inte Àr det.

Det finns en ny metod för visualisering â explain.dalibo.com. De gör en trĂ€dbaserad visualisering, men hĂ€r Ă€r det vĂ€ldigt svĂ„rt att jĂ€mföra noder med varandra. HĂ€r kan man förstĂ„ strukturen ganska bra, men om det Ă€r en stor frĂ„ga mĂ„ste man scrolla fram och tillbaka, men det Ă€r ocksĂ„ ett alternativ.
Samarbete

Och som jag redan har sagt ger Slack oss möjlighet till samarbete. Till exempel, om vi stöter pÄ en komplicerad frÄga som vi inte vet hur vi ska optimera, kan vi klargöra denna frÄga i en trÄd i Slack med vÄra kollegor.

Vi tycker att det Àr viktigt att testa med fullstora data. För detta har vi skapat verktyget Update Database Lab, som Àr tillgÀngligt som öppen kÀllkod. Du kan ocksÄ anvÀnda boten Joe. Du kan hÀmta den just nu och implementera den. Alla guider finns tillgÀngliga.
Det Àr ocksÄ viktigt att notera att sjÀlva lösningen inte Àr revolutionerande, eftersom det finns Delphix, men det Àr en företagslösning. Den Àr helt stÀngd och kostar mycket. Vi specialiserar oss pÄ Postgres. Dessa Àr alla produkter med öppen kÀllkod. Kom och joina oss!
Detta avslutar jag. Tack!
FrÄgor
Hej! Tack för föredraget! Mycket intressant, sÀrskilt för mig, eftersom jag har löst ett liknande problem för en tid sedan. DÀrför har jag en rad frÄgor. Jag hoppas att jag fÄr stÀlla Ätminstone nÄgra av dem.
Det Àr intressant, hur berÀknar ni utrymmet för denna miljö? Tekniken innebÀr att under vissa omstÀndigheter kan era kloner vÀxa till maxstorlek. Grovt sagt, om ni har en tio terabyte stor databas och 10 kloner, kan man lÀtt modellera en situation dÀr varje klon kommer att ha 10 unika data. Hur berÀknar ni detta utrymme, det vill sÀga den delta som ni talade om, dÀr dessa kloner kommer att finnas?
Bra frÄga. HÀr Àr det viktigt att hÄlla koll pÄ de specifika klonerna. Om en klon genomgÄr en för stor förÀndring och börjar vÀxa, kan vi först ge en varning till anvÀndaren om detta, eller direkt stoppa klonen för att undvika en fail-situation.
Ja, jag har en följdfrÄga. AlltsÄ, hur sÀkerstÀller ni livscykeln för dessa moduler? Det Àr ett problem för oss och en helt egen historia. Hur gÄr det till?
Det finns en specifik ttl för varje klon. I praktiken har vi en fast ttl.
Vilken, om jag fÄr frÄga?
1 timme, dvs. inaktiv â 1 timme. Om den inte anvĂ€nds, tar vi bort den. Men hĂ€r Ă€r det inget att förvĂ„na sig över, eftersom vi kan Ă„terstĂ€lla en klon pĂ„ sekunder. Och om den behövs igen, sĂ„ Ă€r det bara att köra.
Jag Àr ocksÄ intresserad av valet av teknologier, eftersom vi till exempel parallellt anvÀnder flera metoder av olika skÀl. Varför valde just ZFS? Varför anvÀnde ni inte LVM? Du nÀmnde att det fanns problem med LVM. Vilka problem var det? Enligt min Äsikt Àr den mest optimala lösningen den med lagringssystem, ur prestandasynvinkel.
Vad Àr det största problemet med ZFS? Att du mÄste köra pÄ en och samma vÀrd, dvs. alla instanser kommer att leva inom samma operativsystem. I fallet med lagringssystem kan du ansluta olika hÄrdvara. Den flaskhalsen Àr endast de enheter som finns pÄ lagringssystemet. Och frÄgan om valet av teknologier Àr intressant. Varför inte LVM?
Vi kan diskutera LVM specifikt pĂ„ meetuppen. Om lagringssystemet â det Ă€r helt enkelt dyrt. ZFS-systemet kan vi implementera var som helst. Du kan rulla ut det pĂ„ din egen maskin. Du kan helt enkelt ladda ner repositoryn och rulla ut det. ZFS kan installeras nĂ€stan överallt, om vi pratar om Linux. Det ger en mycket flexibel lösning. SjĂ€lva ZFS erbjuder mycket direkt ur lĂ„dan. Man kan lagra hur mycket data som helst dĂ€r, koppla ett stort antal diskar, det finns snapshots. Och som jag redan nĂ€mnt, Ă€r det enkelt att administrera. Det verkar vara mycket trevligt att anvĂ€nda. Det Ă€r testat, har mĂ„nga Ă„r bakom sig. Det har en stor och vĂ€xande community. ZFS Ă€r en mycket pĂ„litlig lösning.
Nikolaj Samokhvalov: FÄr jag kommentera? Jag heter Nikolaj, och jag arbetar tillsammans med Anatolij. Jag hÄller med om att lagringssystem Àr fantastiskt. Och vissa av vÄra kunder har Pure Storage osv.
Anatolij pĂ„pekade korrekt att vi siktar pĂ„ modulĂ€r design. I framtiden kan vi implementera ett enda grĂ€nssnitt â ta en snapshot, skapa en klon, radera klonen. Det Ă€r allt lĂ€tt. Och lagringssystemet Ă€r fantastiskt, om det finns.
Men ZFS Àr tillgÀngligt för alla. Det rÀcker med DelPhix, de har 300 kunder. Av dem Àr 50 i Fortune 100, det vill sÀga de siktar pÄ NASA och sÄ vidare. Det Àr dags att göra denna teknik tillgÀnglig för alla. DÀrför har vi en öppen kÀllkods Core. Vi har en del av grÀnssnittet som inte Àr öppen kÀllkod. Det Àr plattformen som vi kommer att visa. Men vi vill att det ska vara tillgÀngligt för alla. Vi vill göra en revolution sÄ att alla testare slutar gissa pÄ bÀrbara datorer. Vi mÄste skriva SELECT och direkt se att den Àr lÄngsam. Det Àr nog att vÀnta pÄ att DBA ska berÀtta om det. Det Àr vÄrt huvudmÄl. Och jag tror att vi alla kommer att nÄ dit. Och den hÀr grejen gör vi för att den ska vara tillgÀnglig för alla. SÄ ZFS, eftersom det kommer att vara tillgÀngligt överallt. Tack till communityn för att ni löser problem och för att det finns en öppen kÀllkodlicens och sÄ vidare.
Hej! Tack för presentationen! Jag heter Maxim. Vi har löst samma problem. Vi har löst det hÀr hemma. Hur delar ni resurser mellan dessa kloner? Varje klon kan alltid hantera sina egna: en testar en sak, en annan testar nÄgot annat, nÄgon bygger index, nÄgon har ett jobb som kör tungt. Och om man kan dela upp CPU, hur delar ni upp IO?
Och den andra frÄgan handlar om olikheterna i miljöerna. Anta att jag hÀr har ZFS och allt Àr bra, men hos kunden pÄ produktion finns det inte ZFS, utan ext4, till exempel. Hur hanterar ni det?
FrĂ„gorna Ă€r mycket bra. Jag nĂ€mnde lite det hĂ€r problemet med hur vi delar resurser. Lösningen Ă€r följande. FörestĂ€ll er att ni testar pĂ„ staging. Ni kan ocksĂ„ ha en situation dĂ€r nĂ„gon ger en viss belastning, medan nĂ„gon annan ger en annan. Och slutligen ser ni oklara metrikvĂ€rden. Ăven samma problem kan uppstĂ„ pĂ„ produktion. NĂ€r ni vill kontrollera en viss frĂ„ga och ser att det Ă€r problem med den â att den körs lĂ„ngsamt, Ă€r det egentligen inte frĂ„gan som Ă€r problemet, utan det beror pĂ„ att det finns en parallell belastning.
DÀrför Àr det viktigt att fokusera pÄ vilken plan vi kommer att anvÀnda, vilka steg vi ska ta i planen och hur mycket data vi ska hantera. Det faktum att vÄra diskar, till exempel, kommer att belastas av nÄgot kommer att pÄverka tidpunkten. Men vi kan uppskatta hur krÀvande denna begÀran Àr baserat pÄ mÀngden data. Det Àr inte sÄ viktigt att det samtidigt pÄgÄr nÄgot annat genomförande.
Jag har tvĂ„ frĂ„gor. Det hĂ€r Ă€r riktigt coolt. Har det funnits fall dĂ€r data som Ă€r kritiskt viktiga för produktion, som kreditkortsnummer? Finns det redan nĂ„got fĂ€rdigt eller Ă€r det en separat uppgift? Och den andra frĂ„gan â finns det nĂ„got liknande för MySQL?
NÀr det gÀller data. Vi kommer att göra obfuskering, Àn sÄ lÀnge gör vi inte det. Men om du implementerar just Joe, och om du inte ger utvecklarna Ätkomst, sÄ finns det ingen Ätkomst till data. Varför? För att Joe inte visar data. Han visar bara mÀtvÀrden, planer och sÄ vidare. Det har gjorts medvetet eftersom det Àr ett av vÄra kunders krav. De ville kunna optimera utan att ge alla tillgÄng.
NÀr det gÀller MySQL. Detta system kan anvÀndas för vad som helst som lagrar tillstÄnd pÄ disken. Eftersom vi arbetar med Postgres, fokuserar vi just nu pÄ att automatisera allt för Postgres. Vi vill automatisera dataÄterstÀllning frÄn backup. Vi konfigurerar Postgres korrekt. Vi vet hur man fÄr planerna att stÀmma överens och sÄ vidare.
Men eftersom systemet Àr utbyggbart kan det ocksÄ anvÀndas för MySQL. Det finns liknande exempel. Det finns nÄgot liknande hos Yandex, men de publicerar det ingenstans. De anvÀnder det internt i Yandex.Metrika. Och dÀr handlar det om MySQL. Men teknologierna Àr desamma, ZFS.
Tack för presentationen! Jag har ocksÄ ett par frÄgor. Du nÀmnde att kloning kan anvÀndas för analys, till exempel för att bygga extra index. Kan du berÀtta lite mer om hur det fungerar?
Och jag stÀller genast den andra frÄgan angÄende likheten mellan miljöerna, likheten i planerna. Planen beror delvis pÄ statistiken som Postgres samlar. Hur löser ni det problemet?
Det finns ingen analys av specifika fall Ànnu, eftersom vi inte har anvÀnt det pÄ det sÀttet, men det Àr möjligt. Om vi pratar om index, tÀnk dig att en frÄga körs pÄ en tabell med hundratals miljoner poster och i en kolumn som vanligtvis inte Àr indexerad i produktion. Och vi vill rÀkna ut nÄgot dÀr. Om denna frÄga körs i produktion finns det risk för att det blir stillestÄnd, eftersom frÄgan dÀr kan ta en minut att bearbeta.
Okej, lÄt oss skapa en tunn klon som vi inte Àr rÀdda för att pausa i nÄgra minuter. För att enklare kunna rÀkna ut analysen, lÀgger vi till index pÄ de kolumner dÀr vi Àr intresserade av data.
Kommer indexet att skapas varje gÄng?
Vi kan göra sÄ att vi rör vid datan, tar snapshots, och sedan ÄterstÀller vi oss frÄn denna snapshot och kör nya frÄgor. Det vill sÀga, vi kan göra sÄ att vi kan skapa nya kloner med redan angivna index.
NÀr det gÀller frÄgan om statistik, om vi ÄterstÀller frÄn en sÀkerhetskopia, om vi gör replikation, sÄ kommer vÄr statistik att vara exakt densamma. För vi kommer att fÄ med hela den fysiska dataskukturen, det vill sÀga vi tar med datan som den Àr med alla statistiska mÄtt.
HÀr Àr ett annat problem. Om ni anvÀnder en molnlösning, sÄ finns det bara logiska dumpningar tillgÀngliga, eftersom Google och Amazon inte tillÄter att ta en fysisk kopia. DÀr uppstÄr ett sÄdant problem.
Tack för presentationen. HÀr stÀlldes tvÄ bra frÄgor om MySQL och om resursfördelning. Men i grunden handlar allt om att det Àr ett Àmne som inte rör specifika DBMS utan snarare filsystemet i stort. Och dÀrmed bör frÄgorna om resursfördelning ocksÄ lösas dÀrifrÄn, inte i slutÀndan, att det handlar om Postgres, utan i filsystemet, i servern, i instansen.
Min frÄga handlar om nÄgot annat. Den Àr mer inriktad pÄ flerskiktstruktur av databasen, dÀr det finns flera lager. Vi har till exempel stÀllt in uppdateringar av en tioterrabytesbild, vi har replikation igÄng. Och vi anvÀnder denna lösning specifikt för databaser. Replikationen pÄgÄr, datan uppdateras. HÀr arbetar parallellt 100 anstÀllda som stÀndigt kör dessa olika snapshots. Vad ska vi göra? Hur gör vi sÄ att det inte uppstÄr konflikter, att de kör en sak och sedan byts filsystemet ut, och dessa snapshots blir trasiga?
De kommer inte Äka eftersom det Àr sÄ ZFS fungerar. Vi kan hÄlla förÀndringar av filsystemet separat i en ström, som kommer tack vare replikation. Och vi kan behÄlla kloner av gamla data versioner, som utvecklarna anvÀnder. Och det fungerar för oss, det Àr inga problem med det.
SÄ uppdateringen kommer att ske som ett extra lager, och alla nya snapshots kommer att baseras pÄ det lagret, eller hur?
FrÄn de föregÄende lagren, som kom frÄn tidigare replikationer.
De tidigare lagren kommer att slÀppas, men de kommer att referera till det gamla lagret, och de nya bilderna kommer att tas frÄn det senaste lagret som fick under uppdateringen?
Rent allmÀnt, ja.
DÄ kommer vi, som en följd, att ha massor av lager. Och över tid mÄste vi komprimera dem?
Ja, det stÀmmer. Det finns ett fönster för detta. Vi sparar veckovisa snapshots. Det beror pÄ vilka resurser du har. Om du har möjlighet att lagra mycket data kan du spara snapshots under en lÄng tid. De kommer inte att tas bort automatiskt. Det kommer inte att ske nÄgon dataförlust. Om snapshots verkar vara förÄldrade, vilket beror pÄ företagets policy, kan vi helt enkelt ta bort dem och frigöra utrymme.
Hej, tack för presentationen! AngÄende Jo frÄgan. Du sa att kunden inte ville ge allmÀn tillgÄng till data. Rent tekniskt, om en person har resultatet av Explain Analyze, kan han se data.
Det Àr sÄ. Till exempel kan vi skriva: "SELECT FROM WHERE email = nÄgot." Det vill sÀga, vi kommer inte att se sjÀlva datan, men vi kan se vissa indirekta tecken. Det Àr viktigt att förstÄ. Men Ä andra sidan Àr allt synligt. Vi har en logg över revisioner, och vi har kontroll över andra kollegor som ocksÄ ser vad utvecklarna arbetar med. Och om nÄgon försöker göra sÄ, kommer sÀkerhetstjÀnsten att besöka dem och ta itu med frÄgan.
God morgon! Tack för presentationen! Jag har en kort frÄga. Om Slack inte anvÀnds i företaget, finns det nÄgon koppling till det nu eller kan man för utvecklarna sÀtta upp instanser för att koppla testapplikationen till databaser?
Just nu finns det en koppling till Slack, dvs. det finns inga andra meddelandeappar, men vi skulle verkligen vilja stödja andra meddelandeappar ocksÄ. Vad kan du göra? Du kan köra en DB Lab utan Joe, anvÀnda REST API eller vÄr plattform för att skapa kloner och ansluta med PSQL. Men det kan göras om du Àr villig att ge dina utvecklare Ätkomst till data, eftersom det inte kommer att finnas nÄgot grÀnssnitt hÀr.
Jag behöver inte det lagret, utan jag behöver den möjligheten.
DĂ„ â ja, det kan göras.
KĂ€lla: habr.com
