{"id":97939,"date":"2020-10-23T08:42:49","date_gmt":"2020-10-23T06:42:49","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai"},"modified":"2020-10-23T08:42:49","modified_gmt":"2020-10-23T06:42:49","slug":"dba-bot-joe-anatolij-stansler-postgres-ai","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"DBA-bot Joe. Anatoly Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan forst\u00e5r en backend-udvikler, at en SQL-foresp\u00f8rgsel vil fungere godt p\u00e5 'prod'? I store eller hurtigt voksende virksomheder har ikke alle adgang til 'prod'. Og selv med adgang kan ikke alle foresp\u00f8rgsler kontrolleres uden problemer, og at oprette en kopi af databasen tager ofte timer. For at l\u00f8se disse problemer har vi skabt en kunstig DBA \u2013 Joe. Han er allerede succesfuldt implementeret i flere virksomheder og hj\u00e6lper ikke blot en h\u00e5ndfuld udviklere. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f913081905dc4e15aeed783\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hej alle! Jeg hedder Anatoliy Stansler. Jeg arbejder i virksomheden <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Vi arbejder med at fremskynde udviklingsprocessen ved at fjerne forsinkelser forbundet med arbejdet med Postgres, for udviklere, DBAer og QA.<\/p>\n<p><\/p>\n<p>Vi har fantastiske kunder, og i dag vil en del af pr\u00e6sentationen handle om casestudier, vi har m\u00f8dt i arbejdet med dem. Jeg vil fort\u00e6lle, hvordan vi har hjulpet dem med at l\u00f8se ret alvorlige problemer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e5r vi udf\u00f8rer udvikling og laver komplekse belastede migrationer, stiller vi os selv sp\u00f8rgsm\u00e5let: 'Vil denne migration g\u00e5 igennem?'. Vi bruger review, vi tr\u00e6kker p\u00e5 viden fra mere erfarne kolleger, DBA-eksperter. Og de kan sige \u2013 ja, det vil fungere eller nej, det vil ikke fungere. <\/p>\n<p><\/p>\n<p>Men m\u00e5ske ville det v\u00e6re bedre, hvis vi selv kunne teste dette p\u00e5 fulde kopier. Og i dag vil vi netop tale om, hvilke tilgange der findes til testning, hvordan man g\u00f8r det bedst muligt, og hvilke v\u00e6rkt\u00f8jer der kan anvendes. Vi vil ogs\u00e5 diskutere fordele og ulemper ved disse tilgange, samt hvad vi kan forbedre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvem har nogensinde direkte lavet indekser eller foretaget \u00e6ndringer p\u00e5 prod? Ret mange. Og hos hvem har det f\u00f8rt til datatab eller nedetid? S\u00e5 kender du denne smerte. Heldigvis findes der backups. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den f\u00f8rste tilgang \u2013 er testning i prod. Eller n\u00e5r en udvikler sidder med sin lokale maskine, har testdata, og der er et begr\u00e6nset udvalg. Og vi ruller det ud p\u00e5 prod, og vi f\u00e5r s\u00e5dan en situation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det er smertefuldt, det er dyrt. Det er nok bedre ikke at g\u00f8re s\u00e5dan. <\/p>\n<p><\/p>\n<p>Hvordan kan vi s\u00e5 g\u00f8re det bedre? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os tage staging og tildele en del af prod der. Eller i bedste fald tage rigtig prod, alle data. Og efter at have udviklet lokalt, vil vi ogs\u00e5 kontrollere p\u00e5 staging. <\/p>\n<p><\/p>\n<p>Det vil g\u00f8re det muligt for os at fjerne nogen fejl, dvs. undg\u00e5 at de kommer p\u00e5 prod. <\/p>\n<p><\/p>\n<p>Hvilke problemer findes der? <\/p>\n<p><\/p>\n<ul>\n<li>Problemet er, at vi deler denne staging med kollegaer. Og det sker meget ofte, at du laver en \u00e6ndring, bam \u2013 og der er ingen data, arbejdet er spildt. Stagingen var mange terabyte. Og det tager lang tid at f\u00e5 den op igen. Og vi beslutter at arbejde videre med det i morgen. Det er slut, vores udvikling er stoppet. <\/li>\n<li>Og selvf\u00f8lgelig arbejder der mange kollegaer der, mange teams. Og det skal koordineres manuelt. Og det er ubehageligt. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og det skal siges, at vi kun har \u00e9t fors\u00f8g, \u00e9t skud, hvis vi vil lave nogen \u00e6ndringer i databasen, r\u00f8re ved dataene, \u00e6ndre strukturen. Og hvis noget g\u00e5r galt, hvis der var en fejl i migrationen, s\u00e5 kan vi ikke hurtigt tilbage. <\/p>\n<p><\/p>\n<p>Det er bedre end den tidligere tilgang, men der er stadig stor sandsynlighed for, at en eller anden fejl g\u00e5r videre til produktionen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad forhindrer os i at give hver udvikler en teststand, en fuld st\u00f8rrelse kopi? Jeg tror, det er tydeligt, hvad der forhindrer. <\/p>\n<p><\/p>\n<p>Hvem har en database st\u00f8rre end en terabyte? Mere end halvdelen af salen. <\/p>\n<p><\/p>\n<p>Og det er klart, at det koster meget at holde maskiner til hver udvikler, n\u00e5r produktionsmilj\u00f8et er s\u00e5 stort, og det tager ogs\u00e5 tid. <\/p>\n<p><\/p>\n<p>Vi har kunder, der har forst\u00e5et, at det er meget vigtigt at teste alle \u00e6ndringer p\u00e5 fulde kopier, men de har en database, der er mindre end en terabyte, og ressourcer til at holde en teststand for hver udvikler finnes ikke. Derfor m\u00e5 de downloade dumps til deres lokale maskine og teste p\u00e5 den m\u00e5de. Det tager en masse tid. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selv hvis du g\u00f8r det inden for infrastrukturen, s\u00e5 er det allerede rigtig godt at downloade \u00e9n terabyte data p\u00e5 en time. Men de bruger logiske dumps, de downloader lokalt fra cloud. For dem er hastigheden omkring 200 gigabyte i timen. Og det tager ogs\u00e5 tid at gendanne fra den logiske dump, anvende indekser osv.<\/p>\n<p><\/p>\n<p>Men de bruger denne tilgang, fordi det g\u00f8r det muligt at holde produktionen p\u00e5lidelig. <\/p>\n<p><\/p>\n<p>Hvad kan vi g\u00f8re her? Lad os g\u00f8re det s\u00e5dan, at teststandene er billige, og vi giver hver udvikler sin egen teststand.<\/p>\n<p><\/p>\n<p>Og det er muligt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og i denne tilgang, n\u00e5r vi laver tynde kloner for hver udvikler, kan vi dele dette p\u00e5 \u00e9n maskine. For eksempel, hvis du har en fire-terabyte database og \u00f8nsker at give den til 10 udviklere, beh\u00f8ver du ikke at have 10 x fire-terabyte databaser. Du har kun brug for \u00e9n maskine til at lave tynde isolerede kopier for hver udvikler ved hj\u00e6lp af \u00e9n maskine. Hvordan det fungerer, vil jeg fort\u00e6lle lidt senere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et reelt eksempel:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>DB \u2013 4,5 terabyte. <\/p>\n<p>\n<\/li>\n<li>\n<p>Vi kan f\u00e5 uafh\u00e6ngige kopier p\u00e5 30 sekunder. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Du beh\u00f8ver ikke at vente p\u00e5 et testmilj\u00f8 og v\u00e6re afh\u00e6ngig af, hvor stort det er. Du kan f\u00e5 det p\u00e5 sekunder. Det vil v\u00e6re helt isolerede milj\u00f8er, men som deler data imellem sig. <\/p>\n<p><\/p>\n<p>Det er fantastisk. Her taler vi om magi og parallelle universer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I vores tilf\u00e6lde fungerer det med systemet OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS er et copy-on-write filsystem, der fra starten underst\u00f8tter snapshots og kloner. Det er p\u00e5lideligt og skalerbart. Det er meget nemt at administrere. Det kan bogstaveligt talt deployes med to kommandoer. <\/p>\n<p><\/p>\n<p>Der er andre muligheder:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>SAN (for eksempel, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, som jeg taler om, er modul\u00e6rt. Det kan implementeres ved hj\u00e6lp af s\u00e5danne muligheder. Men indtil videre har vi fokuseret p\u00e5 OpenZFS, fordi der konkret har v\u00e6ret problemer med LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan fungerer det? I stedet for at overskrive data hver gang vi \u00e6ndrer dem, gemmer vi dem, blot ved at markere, at disse nye data tilh\u00f8rer et nyt tidspunkt, et nyt snapshot. <\/p>\n<p><\/p>\n<p>Og senere, n\u00e5r vi \u00f8nsker at rulle tilbage, eller vi \u00f8nsker at lave en ny klon fra en \u00e6ldre version, siger vi simpelthen: \"Okay, giv os de data blokke, der er markeret p\u00e5 denne m\u00e5de.\" <\/p>\n<p><\/p>\n<p>Og denne bruger vil arbejde med dette datas\u00e6t. Han vil gradvist \u00e6ndre dem og lave sine snapshots. <\/p>\n<p><\/p>\n<p>Og vi f\u00e5r forgreninger. Hver udvikler vil have mulighed for at have sin egen klon, som han redigerer, mens de data, der er f\u00e6lles, vil blive delt mellem alle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For at implementere et s\u00e5dant system, skal du l\u00f8se to problemer: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Det f\u00f8rste er datakilden, hvorfra du vil hente dem. Du kan indstille replikation fra produktionen. Du kan bruge de backups, som du har konfigureret, det h\u00e5ber jeg. WAL-E, WAL-G eller Barman. Og selv hvis du bruger en cloud-l\u00f8sning som RDS eller Cloud SQL, kan du bruge logiske dumps. Men vi anbefaler stadig at bruge backups, fordi med denne tilgang kan du ogs\u00e5 bevare den fysiske filstruktur, hvilket giver dig mulighed for at v\u00e6re endnu t\u00e6ttere p\u00e5 de metrikker, du ville se i produktionen, for at fange de problemer, der er. <\/p>\n<p>\n<\/li>\n<li>\n<p>Det andet er stedet, hvor du \u00f8nsker at hoste Database Lab. Dette kan v\u00e6re i skyen eller on-premise. Her er det vigtigt at n\u00e6vne, at ZFS underst\u00f8tter datakomprimering. Og det g\u00f8r det ganske godt. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Forestil dig, at hver s\u00e5dan klon, afh\u00e6ngigt af de operationer, vi udf\u00f8rer med databasen, vil have en vis dev-v\u00e6kst. Denne dev vil ogs\u00e5 kr\u00e6ve plads. Men fordi vi har taget en database p\u00e5 4,5 terabyte, komprimerer ZFS den til 3,5 terabyte. Afh\u00e6ngigt af indstillingerne kan dette varieres. Og vi f\u00e5r ogs\u00e5 plads til dev. <\/p>\n<p><\/p>\n<p>S\u00e5dan et system kan bruges til forskellige sager. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Det er udviklere, DBA'er til at teste foresp\u00f8rgsler og til optimering. <\/p>\n<p>\n<\/li>\n<li>\n<p>Det kan bruges i QA-testning til at kontrollere en specifik migration, f\u00f8r vi ruller det ud i produktionen. Og vi kan ogs\u00e5 oprette specielle milj\u00f8er til QA med rigtige data, hvor de kan teste nye funktioner. Og det vil tage sekunder i stedet for at vente timer eller m\u00e5ske endda dage i andre tilf\u00e6lde, hvor tynde kopier ikke bruges. <\/p>\n<p>\n<\/li>\n<li>\n<p>Og endnu en separat sag. Hvis virksomheden ikke har et analytisk system oprettet, kan vi lave en tynd klon af produktbasen og give den til lange foresp\u00f8rgsler eller til specifikke indekser, der kan bruges i analysen.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Med denne tilgang:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Der er lav sandsynlighed for fejl i produktionen, fordi vi har testet alle \u00e6ndringer p\u00e5 fuldst\u00f8rrelsesdata. <\/p>\n<p>\n<\/li>\n<li>\n<p>Vi f\u00e5r en testkultur, da man ikke l\u00e6ngere skal vente i timevis p\u00e5 sin egen stand. <\/p>\n<p>\n<\/li>\n<li>\n<p>Og der er ingen barrierer, ingen ventetid mellem testene. Du kan virkelig g\u00e5 og tjekke. Og det vil v\u00e6re bedre, da vi fremskynder udviklingen. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Der vil v\u00e6re mindre refaktorering. F\u00e6rre fejl vil finde vej til produktionen. Vi vil refaktorere dem mindre senere. <\/p>\n<p>\n<\/li>\n<li>\n<p>Vi kan lave irreversible \u00e6ndringer. Dette findes ikke i standardmetoder. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>Det er fordelagtigt, fordi vi deler ressourcerne fra testmilj\u00f8erne. <\/li>\n<\/ol>\n<p><\/p>\n<p>Det er allerede godt, men hvad mere kan vi accelerere?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takket v\u00e6re et s\u00e5dant system kan vi markant s\u00e6nke t\u00e6rsklen for at komme ind i denne form for testning. <\/p>\n<p><\/p>\n<p>Der er i \u00f8jeblikket en ond cirkel, hvor udvikleren skal blive ekspert for at f\u00e5 adgang til virkelige, fuldskala data. De skal have tillid til akses til disse data. <\/p>\n<p><\/p>\n<p>Men hvordan skal man vokse, hvis der ikke er adgang? Hvad nu hvis du kun har adgang til en meget lille m\u00e6ngde testdata? S\u00e5 vil det ikke v\u00e6re muligt at f\u00e5 reel erfaring. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan kan vi komme ud af denne cirkel? Som et f\u00f8rste interface, der er bekvemt for udviklere p\u00e5 alle niveauer, har vi valgt en Slack-bot. Men det kan v\u00e6re enhver anden interface. <\/p>\n<p><\/p>\n<p>Hvad tillader det? Du kan tage en specifik foresp\u00f8rgsel og sende den til et s\u00e6rligt kanal for databasen. Vi vil automatisk implementere en tynd klon p\u00e5 sekunder. Vi k\u00f8rer denne foresp\u00f8rgsel. Samler metrics og anbefalinger. Viser visualisering. Og derefter vil denne klon forblive til at optimere foresp\u00f8rgslen, tilf\u00f8je indekser osv. <\/p>\n<p><\/p>\n<p>Og Slack giver os ogs\u00e5 muligheder for samarbejde fra starten. Da det blot er et kanal, kan du direkte i tr\u00e5den diskutere denne foresp\u00f8rgsel, pinge dine kolleger og DBA\u2019er, der er i virksomheden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men der er selvf\u00f8lgelig ogs\u00e5 problemer. Da det er den virkelige verden, og vi bruger en server, hvor mange kloner hostes, er vi n\u00f8dt til at begr\u00e6nse m\u00e6ngden af hukommelse og processorressourcer, som klonerne har adgang til. <\/p>\n<p><\/p>\n<p>Men for at disse tests skal v\u00e6re trov\u00e6rdige, er vi n\u00f8dt til at l\u00f8se dette problem p\u00e5 en eller anden m\u00e5de. <\/p>\n<p><\/p>\n<p>Det er tydeligt, at en vigtig faktor er ensartede data. Men det har vi allerede. Og vi \u00f8nsker at opn\u00e5 en ensartet konfiguration. Og vi kan tilbyde en praktisk talt ensartet konfiguration. <\/p>\n<p><\/p>\n<p>Det ville v\u00e6re fantastisk at have det samme hardware som i produktionen, men det kan afvige. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os huske, hvordan Postgres arbejder med hukommelse. Vi har to caches. En fra filsystemet og en fra Selve Postgres, det vil sige Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Det er vigtigt at bem\u00e6rke, at Shared Buffer Cache allokeres ved opstart af Postgres afh\u00e6ngigt af hvilken st\u00f8rrelse, du angiver i konfigurationen. <\/p>\n<p><\/p>\n<p>Og den anden cache bruger al tilg\u00e6ngelig plads. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e5r vi laver flere kloner p\u00e5 \u00e9n maskine, fylder vi gradvist hukommelsen op. Rent faktisk b\u00f8r Shared Buffer Cache v\u00e6re 25 % af den samlede m\u00e6ngde hukommelse, der er tilg\u00e6ngelig p\u00e5 maskinen. <\/p>\n<p><\/p>\n<p>S\u00e5 hvis vi ikke \u00e6ndrer denne parameter, kan vi kun k\u00f8re 4 instanser p\u00e5 \u00e9n maskine, dvs. kun 4 af s\u00e5danne tynde kloner. Og det er selvf\u00f8lgelig d\u00e5rligt, fordi vi \u00f8nsker at have mange flere. <\/p>\n<p><\/p>\n<p>Men p\u00e5 den anden side bruges Buffer Cache til at udf\u00f8re foresp\u00f8rgsler, til indekser, dvs. planen afh\u00e6nger af st\u00f8rrelsen p\u00e5 vores caches. Hvis vi bare reducerer denne parameter uden videre, kan vores planer \u00e6ndre sig betydeligt.<\/p>\n<p><\/p>\n<p>For eksempel, hvis vi har en stor cache p\u00e5 prod, vil Postgres foretr\u00e6kke at bruge indeks. Hvis ikke, s\u00e5 vil det v\u00e6re SeqScan. Hvad ville s\u00e5 v\u00e6re meningen, hvis vores planer ikke stemte overens? <\/p>\n<p><\/p>\n<p>Men her n\u00e5r vi til den konklusion, at planen i Postgres faktisk ikke afh\u00e6nger af den specifikke st\u00f8rrelse, der er angivet i Shared Buffer, men derimod af effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/1457fd7b65c342f64733b952130125cf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Effective_cache_size er den forventede m\u00e6ngde cache, som vi har til r\u00e5dighed, dvs. summen af Buffer Cache og cache fra filsystemet. Dette angives i konfigurationen. Og denne hukommelse allokeres ikke. <\/p>\n<p><\/p>\n<p>Med denne parameter kan vi p\u00e5 en m\u00e5de narre Postgres ved at sige, at vi faktisk har adgang til mange data, selvom vi ikke har disse data. P\u00e5 denne m\u00e5de vil planerne v\u00e6re helt i overensstemmelse med produktionen. <\/p>\n<p><\/p>\n<p>Men det kan p\u00e5virke timingen. Vi optimerer foresp\u00f8rgsler efter timing, men det er vigtigt, at timingen afh\u00e6nger af mange faktorer: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Den afh\u00e6nger af den nuv\u00e6rende belastning p\u00e5 prod. <\/p>\n<p>\n<\/li>\n<li>\n<p>Den afh\u00e6nger af maskinens specifikationer. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Og dette er en indirekte parameter, men vi kan faktisk optimere pr\u00e6cist efter m\u00e6ngden af data, som denne foresp\u00f8rgsel skal l\u00e6se for at f\u00e5 resultatet. <\/p>\n<p><\/p>\n<p>Og hvis vi \u00f8nsker, at timingen skal v\u00e6re t\u00e6t p\u00e5 det, vi vil se i prod, s\u00e5 skal vi tage noget s\u00e5 lignende hardware som muligt, og m\u00e5ske endda mere, s\u00e5 alle klonerne kan passe ind. Men det er et kompromis, dvs. du f\u00e5r de samme planer, du vil se, hvor mange data en specifik foresp\u00f8rgsel l\u00e6ser, og du kan konkludere \u2013 denne foresp\u00f8rgsel er god (eller migration) eller d\u00e5rlig, den skal optimeres yderligere. <\/p>\n<p><\/p>\n<p>Lad os se n\u00e6rmere p\u00e5, hvordan optimeringen foreg\u00e5r med Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os tage en foresp\u00f8rgsel fra et rigtigt system. I dette tilf\u00e6lde er databasen 1 terabyte. Og vi \u00f8nsker at t\u00e6lle antallet af friske indl\u00e6g, der har f\u00e5et mere end 10 likes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi skriver en besked i kanalen, og en klon er blevet startet op for os. Og vi vil se, at en s\u00e5dan foresp\u00f8rgsel vil k\u00f8re p\u00e5 2,5 minutter. Det er det f\u00f8rste, vi bem\u00e6rker.<\/p>\n<p><\/p>\n<p>B Joe vil vise automatiske anbefalinger baseret p\u00e5 planen og metrics. <\/p>\n<p><\/p>\n<p>Vi vil se, at foresp\u00f8rgslen behandler for mange data for at f\u00e5 et relativt lille antal r\u00e6kker. Og der er brug for en specialiseret indeks, da vi har bem\u00e6rket, at foresp\u00f8rgslen har for mange filtrerede r\u00e6kker. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os se n\u00e6rmere p\u00e5, hvad der skete. Faktisk ser vi, at vi har l\u00e6st n\u00e6sten en og en halv gigabyte data fra filcachet eller endda fra disken. Og det er ikke godt, da vi kun fik 142 r\u00e6kker. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og tilsyneladende skulle vi have haft en index scan, og det burde have k\u00f8rt hurtigt, men da vi har filtreret for mange r\u00e6kker (vi m\u00e5tte t\u00e6lle dem), s\u00e5 k\u00f8rte foresp\u00f8rgslen langsomt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og dette skete i planen, fordi betingelserne i foresp\u00f8rgslen og betingelserne i indekset delvist ikke stemmer overens. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os pr\u00f8ve at g\u00f8re indekset mere pr\u00e6cist og se, hvordan udf\u00f8relsen af foresp\u00f8rgslen \u00e6ndrer sig efter dette. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oprettelsen af indekset tog ret lang tid, men nu kontrollerer vi foresp\u00f8rgslen og ser, at tiden i stedet for 2,5 minutter nu er kun 156 millisekunder, hvilket er ganske godt. Og vi l\u00e6ser kun 6 megabyte data.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og nu bruger vi en index only scan.<\/p>\n<p><\/p>\n<p>En anden vigtig ting er, at vi \u00f8nsker at pr\u00e6sentere planen p\u00e5 en mere forst\u00e5elig m\u00e5de. Vi har implementeret visualisering ved hj\u00e6lp af Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dette er en anden foresp\u00f8rgsel, mere kompleks. Og vi bygger Flame Graphs baseret p\u00e5 to parametre: m\u00e6ngden af data, som en specifik node i planen l\u00e6ste, og timingen, dvs. node's udf\u00f8relsestid. <\/p>\n<p><\/p>\n<p>Her kan vi sammenligne noder direkte med hinanden. Det bliver tydeligt, hvilken der optager mere eller mindre plads, hvilket ofte kan v\u00e6re sv\u00e6rt at g\u00f8re med andre visualiseringsmetoder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selvf\u00f8lgelig kender alle explain.depesz.com. En god funktion ved denne visualisering er, at vi gemmer den tekstuelle plan og ogs\u00e5 pr\u00e6senterer nogle n\u00f8gleparametre i en tabel, s\u00e5 det bliver muligt at sortere. <\/p>\n<p><\/p>\n<p>Og udviklere, der endnu ikke har dykket ned i dette emne, bruger ogs\u00e5 explain.depesz.com, fordi det g\u00f8r det lettere for dem at forst\u00e5, hvilke m\u00e5linger der er vigtige, og hvilke der ikke er. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der er en ny tilgang til visualisering \u2013 explain.dalibo.com. De laver en tr\u00e6strukturvisualisering, men her er det meget sv\u00e6rt at sammenligne noderne med hinanden. Her kan man godt forst\u00e5 strukturen, selvom man, hvis der er en stor foresp\u00f8rgsel, skal scrolle frem og tilbage, men det er ogs\u00e5 en mulighed. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Samarbejde<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Som jeg allerede har n\u00e6vnt, giver Slack os mulighed for samarbejde. For eksempel, hvis vi st\u00f8der p\u00e5 en kompleks foresp\u00f8rgsel, som vi ikke ved, hvordan vi skal optimere, kan vi afklare denne sag i en tr\u00e5d i Slack med vores kolleger. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi mener, det er vigtigt at teste p\u00e5 fuld st\u00f8rrelse data. Derfor har vi lavet v\u00e6rkt\u00f8jet Update Database Lab, som er tilg\u00e6ngeligt i open source. Du kan ogs\u00e5 bruge botten Joe. Du kan tage det lige nu og implementere det hos dig selv. Alle guides er tilg\u00e6ngelige der. <\/p>\n<p><\/p>\n<p>Det er ogs\u00e5 vigtigt at bem\u00e6rke, at selve l\u00f8sningen ikke er noget revolutionerende, fordi der er Delphix, men det er en enterprise-l\u00f8sning. Den er helt lukket, koster meget. Vi specialiserer os specifikt i Postgres. Alle vores produkter er open source. Kom og v\u00e6r med! <\/p>\n<p><\/p>\n<p>Det var alt fra mig. Tak!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Sp\u00f8rgsm\u00e5l<\/h2>\n<p><\/p>\n<p><em>Hej! Tak for pr\u00e6sentationen! Meget interessant, is\u00e6r for mig, fordi jeg har arbejdet med en lignende opgave for noget tid siden. Derfor har jeg en r\u00e6kke sp\u00f8rgsm\u00e5l. Jeg h\u00e5ber, at jeg kan stille i det mindste nogle af dem.<\/em><\/p>\n<p><\/p>\n<p><em>Det er interessant, hvordan I beregner plads til dette milj\u00f8? Teknologien indeb\u00e6rer, at under visse omst\u00e6ndigheder kan jeres kloner vokse til maksimal st\u00f8rrelse. Kort sagt, hvis I har en ti terabyte database og 10 kloner, kan I nemt simulere en situation, hvor hver klon indeholder 10 unikke data. Hvordan beregner I denne plads, dvs. den forskel, I n\u00e6vnte, i hvilken disse kloner vil leve?<\/em><\/p>\n<p><\/p>\n<p>Godt sp\u00f8rgsm\u00e5l. Her er det vigtigt at holde \u00f8je med de specifikke kloner. Og hvis der sker en for stor \u00e6ndring i en klon, s\u00e5 begynder den at vokse, kan vi f\u00f8rst give brugeren en advarsel om dette, eller straks stoppe den klon, s\u00e5 vi undg\u00e5r en fejl-situation. <\/p>\n<p><\/p>\n<p><em>Ja, jeg har et opf\u00f8lgende sp\u00f8rgsm\u00e5l. Alts\u00e5 hvordan sikrer I livscyklussen for disse moduler? Vi har det som et problem og en hel anden historie. Hvordan foreg\u00e5r det?<\/em><\/p>\n<p><\/p>\n<p>Hver klon har en slags ttl. I princippet har vi en fast ttl. <\/p>\n<p><\/p>\n<p><em>Hvilken, hvis jeg m\u00e5 sp\u00f8rge?<\/em><\/p>\n<p><\/p>\n<p>1 time, alts\u00e5 idle \u2013 1 time. Hvis den ikke bruges, s\u00e5 sletter vi den. Men der er intet overraskende i det, da vi kan genstarte klonen p\u00e5 sekunder. Og hvis den er n\u00f8dvendig igen, s\u00e5 er det bare at g\u00f8re det. <\/p>\n<p><\/p>\n<p><em>Jeg er ogs\u00e5 nysgerrig omkring valget af teknologier, fordi vi for eksempel bruger flere metoder parallelt af forskellige grunde. Hvorfor ZFS? Hvorfor brugte I ikke LVM? I n\u00e6vnte, at der var problemer med LVM. Hvilke problemer var det? Efter min mening er l\u00f8sningen med SAN den mest optimale, n\u00e5r det g\u00e6lder ydeevne.<\/em> <\/p>\n<p><\/p>\n<p><em>Hvad er det st\u00f8rste problem med ZFS? At du skal k\u00f8re det p\u00e5 \u00e9n v\u00e6rt, alts\u00e5 at alle instanser vil leve inden for det samme operativsystem. I tilf\u00e6lde af SAN kan du tilslutte forskellige hardwarekomponenter. Og flaskehalsen er kun de enheder, der er p\u00e5 SAN. Og interessen ligger netop i valget af teknologier. Hvorfor ikke LVM?<\/em><\/p>\n<p><\/p>\n<p>Vi kan specifikt diskutere LVM ved meetup. Om SAN \u2013 det er simpelthen dyrt. Vi kan implementere ZFS hvor som helst. Du kan implementere det p\u00e5 din egen maskine. Du kan bare downloade depotet og ops\u00e6tte det. ZFS kan installeres stort set overalt, hvis vi taler om Linux. Det vil sige, at vi f\u00e5r en meget fleksibel l\u00f8sning. Og selve ZFS giver meget ud af boksen. Du kan indl\u00e6se ubegr\u00e6nsede data, tilslutte et stort antal diske, der er snapshots. Og som jeg allerede har sagt, er det let at administrere. Det virker meget behageligt at bruge. Det er gennempr\u00f8vet, det har eksisteret i mange \u00e5r. Det har et meget stort community, der vokser. ZFS er en meget p\u00e5lidelig l\u00f8sning. <\/p>\n<p><\/p>\n<p>Nikolai Samokhvalov: M\u00e5 jeg kommentere yderligere? Jeg hedder Nikolai, og jeg arbejder sammen med Anatolij. Jeg er enig i, at SAN er fantastisk. Og nogle af vores kunder har Pure Storage osv. <\/p>\n<p><\/p>\n<p>Anatoliy har korrekt bem\u00e6rket, at vi sigter mod modulopbygning. I fremtiden kan vi realisere et enkelt interface \u2013 lav et snapshot, lav en klon, slet klonen. Det er alt sammen nemt. Og lagerrum er fantastisk, hvis det findes.<\/p>\n<p><\/p>\n<p>Men ZFS er tilg\u00e6ngeligt for alle. DelPhix har allerede nok kunder, de har 300 kunder. Af dem er 50 i Fortune 100, dvs. de sigter mod NASA osv. Det er tid til at give denne teknologi til alle. Derfor har vi open source Core. Vi har en del af interfacet, som ikke er open source. Det er en platform, vi vil vise. Men vi \u00f8nsker, at det skal v\u00e6re tilg\u00e6ngeligt for enhver. Vi vil lave en revolution, s\u00e5 alle testere stopper med at g\u00e6tte p\u00e5 laptops. Vi skal kunne skrive SELECT og straks se, at det er langsomt. Det er nok at vente p\u00e5, at DBA fort\u00e6ller om det. Det er det, der er hovedm\u00e5let. Og jeg tror, at vi alle vil n\u00e5 dertil. Og vi laver denne ting, s\u00e5 alle kan f\u00e5 den. Derfor ZFS, fordi det vil v\u00e6re tilg\u00e6ngeligt overalt. Tak til f\u00e6llesskabet for at l\u00f8se problemer og for den open source licens osv. <\/p>\n<p><\/p>\n<p><em>Hej! Tak for pr\u00e6sentationen! Jeg hedder Maxim. Vi har arbejdet med de samme problemer. Vi har l\u00f8st dem internt. Hvordan deler I ressourcerne mellem disse kloner? Hver klon kan i hvert \u00f8jeblik h\u00e5ndtere sin egen opgave: den ene tester noget, den anden tester noget andet, en har m\u00e5ske bygning af indeks, mens en anden k\u00f8rer et tungt job. Og hvis CPU'er kan deles, hvordan deler I s\u00e5 IO?<\/em><\/p>\n<p><\/p>\n<p><em>Mit andet sp\u00f8rgsm\u00e5l handler om uensartede milj\u00f8er. Antag at jeg har ZFS her, og alt er fint, men kunden har ikke ZFS i produktion, men ext4 for eksempel. Hvordan h\u00e5ndterer I det?<\/em><\/p>\n<p><\/p>\n<p>Rigtig gode sp\u00f8rgsm\u00e5l. Jeg n\u00e6vnte lidt problemet med at dele ressourcer. L\u00f8sningen er som f\u00f8lger. Forestil dig, at du tester p\u00e5 staging. Der kan ogs\u00e5 v\u00e6re en situation, hvor \u00e9n giver en bestemt belastning, mens en anden giver en anden. Og i sidste ende ser du m\u00e6rkelige m\u00e5linger. Selv det kan v\u00e6re et problem i produktion. N\u00e5r du vil kontrollere en bestemt foresp\u00f8rgsel og ser, at der er et problem med den \u2013 den k\u00f8rer langsomt \u2013 s\u00e5 er problemet ikke n\u00f8dvendigvis foresp\u00f8rgslen, men at der er en parallel belastning. <\/p>\n<p><\/p>\n<p>Derfor er det vigtigt at fokusere p\u00e5, hvilken plan vi skal f\u00f8lge, hvilke skridt der vil v\u00e6re i planen, og hvor mange data vi skal indsamle til dette. Det, at vores diske for eksempel vil v\u00e6re belastede af noget, p\u00e5virker specifikt timingen. Men vi kan vurdere, hvor belastet denne anmodning er, ud fra m\u00e6ngden af data. Det er ikke s\u00e5 vigtigt, at der samtidig vil v\u00e6re en anden udf\u00f8relse. <\/p>\n<p><\/p>\n<p><em>Jeg har to sp\u00f8rgsm\u00e5l. Det er en virkelig fed ting. Har der v\u00e6ret tilf\u00e6lde, hvor data i produktion er kritisk vigtige, for eksempel kreditkortnumre? Er der allerede noget klart eller er det en separat opgave? Og det andet sp\u00f8rgsm\u00e5l \u2013 er der noget lignende til MySQL?<\/em><\/p>\n<p><\/p>\n<p>Med hensyn til data. Vi vil lave obfuskering, indtil vi g\u00f8r det. Men hvis du specifikt implementerer Joe, og ikke giver udviklerne adgang, er der ingen adgang til data. Hvorfor? Fordi Joe ikke viser data. Han viser kun metrics, planer og alt det. Det blev gjort p\u00e5 den m\u00e5de, fordi det er et af vores klients krav. De \u00f8nskede at have mulighed for at optimere, men ikke give alle adgang. <\/p>\n<p><\/p>\n<p>Ang\u00e5ende MySQL. Dette system kan bruges til hvad som helst, der gemmer state p\u00e5 disken. Og da vi arbejder med Postgres, laver vi lige nu f\u00f8rst og fremmest fuld automatisering for Postgres. Vi \u00f8nsker at automatisere hentningen af data fra backup. Vi konfigurerer Postgres korrekt. Vi ved, hvordan man f\u00e5r planerne til at matche, osv. <\/p>\n<p><\/p>\n<p>Men da systemet er udvideligt, vil det ogs\u00e5 kunne bruges til MySQL. Der er ogs\u00e5 s\u00e5danne eksempler. En lignende l\u00f8sning findes hos Yandex, men de offentligg\u00f8r den ikke noget sted. De bruger den internt i Yandex.Metrica. Og her handler det netop om MySQL. Men teknologierne er de samme, ZFS. <\/p>\n<p><\/p>\n<p><em>Tak for opl\u00e6gget! Jeg har ogs\u00e5 et par sp\u00f8rgsm\u00e5l. Du n\u00e6vnte, at kloning kan bruges til analyse, for eksempel til at bygge yderligere indekser. Kan du fort\u00e6lle lidt mere om, hvordan det fungerer?<\/em><\/p>\n<p><\/p>\n<p><em>Og jeg vil stille det andet sp\u00f8rgsm\u00e5l om ensartetheden af systemerne, ensartetheden af planerne. Planen afh\u00e6nger blandt andet af statistikken indsamlet af Postgres. Hvordan l\u00f8ser I dette problem?<\/em><\/p>\n<p><\/p>\n<p>Der er ingen analyse af specifikke sager, fordi vi ikke har brugt det s\u00e5dan endnu, men der er en mulighed for det. Hvis vi taler om indekser, s\u00e5 forestil dig, at der k\u00f8rer en foresp\u00f8rgsel p\u00e5 en tabel med hundrede millioner poster og i en kolonne, som normalt ikke er indekseret i produktionen. Og vi \u00f8nsker at beregne nogle data. Hvis denne foresp\u00f8rgsel k\u00f8res i produktionen, er der en risiko for, at der opst\u00e5r nedetid, fordi foresp\u00f8rgslen vil tage et minut at udf\u00f8re. <\/p>\n<p><\/p>\n<p>Okay, lad os lave en tynd klon, som det ikke er skr\u00e6mmende at stoppe i et par minutter. Og for at g\u00f8re det mere bekvemt at beregne analysen, tilf\u00f8jer vi indekser p\u00e5 de kolonner, hvor vi er interesseret i at f\u00e5 data. <\/p>\n<p><\/p>\n<p><em>Bliver indekset oprettet hver gang?<\/em><\/p>\n<p><\/p>\n<p>Det kan g\u00f8res s\u00e5dan, at vi r\u00f8rer ved dataene, tager snapshots, og derefter gendanner vi fra dette snapshot og k\u00f8rer nye foresp\u00f8rgsler. Det vil sige, vi kan g\u00f8re det p\u00e5 en m\u00e5de, s\u00e5 vi kan oprette nye kloner med allerede oprettede indekser.<\/p>\n<p><\/p>\n<p>Hvad ang\u00e5r sp\u00f8rgsm\u00e5let om statistikken, s\u00e5 hvis vi gendanner fra en backup, hvis vi laver replikering, s\u00e5 vil vores statistik v\u00e6re pr\u00e6cis den samme. Fordi vi har den fysiske datastruktur i sin helhed, s\u00e5 vi vil ogs\u00e5 bringe dataene som de er med alle statistiske metrikker. <\/p>\n<p><\/p>\n<p>Her er et andet problem. Hvis du bruger en cloud-l\u00f8sning, s\u00e5 er der kun logiske dumps tilg\u00e6ngelige, fordi Google, Amazon ikke tillader at tage en fysisk kopi. Det vil v\u00e6re et problem her. <\/p>\n<p><\/p>\n<p><em>Tak for pr\u00e6sentationen. Der blev rejst to gode sp\u00f8rgsm\u00e5l om MySQL og om ressourceopdeling. Men i essensen handler det ikke om specifikke DBMS'er, men generelt om filsystemet. Og derfor skal sp\u00f8rgsm\u00e5lene om ressourceopdeling ogs\u00e5 l\u00f8ses derfra, ikke til sidst, at det er Postgres, men i filsystemet, i <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/da\/server\/dts-dronten\/\"   title=\"serveren\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">serveren<\/a>, i instansen.<\/em> <\/p>\n<p><\/p>\n<p><em>Mit sp\u00f8rgsm\u00e5l handler om noget andet. Det er mere relateret til lagdelingen i databasen, hvor der er flere lag. For eksempel har vi indstillet opdatering af et ti terabytes billede, vi har replikation k\u00f8rende. Og vi bruger specifikt denne l\u00f8sning til databaser. Replikationen k\u00f8rer, og dataene opdateres. Her arbejder 100 medarbejdere parallelt, som konstant k\u00f8rer disse forskellige snapshots. Hvad skal der g\u00f8res? Hvordan kan vi undg\u00e5 konflikter, hvis de k\u00f8rer en ting, men derefter er filsystemet blevet \u00e6ndret, og disse snapshots bliver fejlbeh\u00e6ftede?<\/em> <\/p>\n<p><\/p>\n<p>De vil ikke tage af sted, fordi ZFS fungerer s\u00e5dan. Vi kan holde \u00e6ndringerne af filsystemet adskilt i \u00e9n str\u00f8m, som kommer igennem replikationen. Og holde kloner af de gamle data, som udviklerne bruger. Det fungerer for os, vi har styr p\u00e5 det.<\/p>\n<p><\/p>\n<p><em>S\u00e5 det vil sige, at opdateringen vil ske som et ekstra lag, og alle nye snapshots vil blive baseret p\u00e5 dette lag, ikke?<\/em> <\/p>\n<p><\/p>\n<p>Fra de tidligere lag, der kom fra tidligere replikationer. <\/p>\n<p><\/p>\n<p><em>De tidligere lag vil falde bort, men de vil referere til det gamle lag, og de nye billeder vil tage udgangspunkt i det seneste lag, der blev opdateret?<\/em><\/p>\n<p><\/p>\n<p>Generelt ja. <\/p>\n<p><\/p>\n<p><em>S\u00e5 som konsekvens vil vi have mange lag. Skal de komprimeres med tiden?<\/em><\/p>\n<p><\/p>\n<p>Ja, det er korrekt. Der er et bestemt vindue. Vi gemmer uge-snapshots. Det afh\u00e6nger af, hvilket ressourcer du har. Hvis du har kapacitet til at opbevare mange data, kan du gemme snapshots i lang tid. De sletter sig selv ikke. Der vil ikke v\u00e6re nogen datakorruption. Hvis snapshots er for\u00e6ldede, som vi ser det, det vil sige, det afh\u00e6nger af politikken i firmaet, s\u00e5 kan vi bare slette dem og frigive plads. <\/p>\n<p><\/p>\n<p><em>Goddag, tak for pr\u00e6sentationen! Ang\u00e5ende sp\u00f8rgsm\u00e5let fra Joe. Du sagde, at kunden ikke \u00f8nskede at give alle adgang til dataene. Strengt taget, hvis en person har resultatet af Explain Analyze, kan han se dataene.<\/em> <\/p>\n<p><\/p>\n<p>Det er korrekt. For eksempel, kan vi skrive: \"SELECT FROM WHERE email = dette\u201c. Det vil sige, vi ser ikke selve dataene, men nogle indirekte tegn kan vi kigge p\u00e5. Det skal man forst\u00e5. Men p\u00e5 den anden side, er alt dette synligt. Vi har logaudit, vi har kontrol fra andre kolleger, som ogs\u00e5 ser, hvad udviklerne laver. Og hvis nogen fors\u00f8ger at g\u00f8re s\u00e5dan, vil sikkerhedstjenesten komme til dem og arbejde p\u00e5 dette sp\u00f8rgsm\u00e5l. <\/p>\n<p><\/p>\n<p><em>God dag! Tak for pr\u00e6sentationen! Jeg har et kort sp\u00f8rgsm\u00e5l. Hvis Slack ikke bruges i firmaet, er der s\u00e5 en eller anden bindning til det nu, eller kan udviklerne ops\u00e6tte instanser for at tilslutte en testapplikation til databaserne?<\/em><\/p>\n<p><\/p>\n<p>I \u00f8jeblikket er der kun en tilknytning til Slack, hvilket betyder, at der ikke er nogen anden messenger, men vi vil meget gerne tilf\u00f8je st\u00f8tte til andre messengere ogs\u00e5. Hvad kan du g\u00f8re? Du kan ops\u00e6tte DB Lab uden Joe, bruge REST API eller vores platform til at oprette kloner og tilslutte med PSQL. Men dette kan kun lade sig g\u00f8re, hvis du er villig til at give dine udviklere adgang til dataene, da der ikke vil v\u00e6re nogen sk\u00e6rm her. <\/p>\n<p><\/p>\n<p><em>Jeg har ikke brug for det lag, men har brug for den mulighed.<\/em><\/p>\n<p><\/p>\n<p>S\u00e5 ja, det kan lade sig g\u00f8re.<\/p>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524542\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u00ab\u043f\u0440\u043e\u0434\u0435\u00bb? \u0412 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0438\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u00ab\u043f\u0440\u043e\u0434\u0443\u00bb \u0435\u0441\u0442\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445. \u0414\u0430 \u0438 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0430\u0441\u044b. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e DBA \u2014 Joe. \u041e\u043d \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97940,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97939","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47DBA-\u0431\u043e\u0442 Joe. \u0410\u043d\u0430\u0442\u043e\u043b\u0438\u0439 \u0421\u0442\u0430\u043d\u0441\u043b\u0435\u0440 (Postgres.ai) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47DBA-bot Joe. Anatoliy Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47DBA-\u0431\u043e\u0442 Joe. \u0410\u043d\u0430\u0442\u043e\u043b\u0438\u0439 \u0421\u0442\u0430\u043d\u0441\u043b\u0435\u0440 (Postgres.ai) | ProHoster","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-23T06:42:49+00:00","article:modified_time":"2020-10-23T06:42:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97939","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:09:26","updated":"2026-02-09 21:38:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}