{"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\/sv\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur f\u00f6rst\u00e5r en backend-utvecklare att en SQL-fr\u00e5ga kommer att fungera bra p\u00e5 \"prod\"? I stora eller snabbt v\u00e4xande f\u00f6retag har inte alla tillg\u00e5ng till \"prod\". Dessutom kan inte alla fr\u00e5gor testas sm\u00e4rtfritt med tillg\u00e5ng, och att skapa en databas\u00e5terkoppling kan ofta ta timmar. F\u00f6r att l\u00f6sa dessa problem har vi skapat en artificiell DBA - Joe. Han har redan framg\u00e5ngsrikt implementerats i flera f\u00f6retag och hj\u00e4lper ett tiotal utvecklare. <\/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-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hej alla! Jag heter Anatolij Stansler. Jag arbetar p\u00e5 f\u00f6retaget <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Vi fokuserar p\u00e5 att p\u00e5skynda utvecklingsprocessen genom att eliminera de f\u00f6rdr\u00f6jningar som utvecklare, DBA och QA upplever n\u00e4r de arbetar med Postgres.<\/p>\n<p><\/p>\n<p>Vi har fantastiska kunder, och idag kommer en del av presentationen att \u00e4gnas \u00e5t fallstudier som vi har st\u00f6tt p\u00e5 i v\u00e5rt arbete med dem. Jag kommer att ber\u00e4tta om hur vi hj\u00e4lpte dem att l\u00f6sa ganska allvarliga problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4r vi bedriver utveckling och genomf\u00f6r komplexa migreringar st\u00e4ller vi oss fr\u00e5gan: \"Kommer den h\u00e4r migreringen att lyckas?\" Vi anv\u00e4nder recensioner, vi utnyttjar kunskapen fr\u00e5n mer erfarna kollegor och DBA-experter. De kan s\u00e4ga om det kommer att lyckas eller inte. <\/p>\n<p><\/p>\n<p>Men kanske vore det b\u00e4ttre om vi sj\u00e4lva kunde testa detta p\u00e5 fullstora kopior. Och idag kommer vi just att diskutera de nuvarande metoderna f\u00f6r testning och hur detta kan g\u00f6ras b\u00e4ttre med hj\u00e4lp av vilka verktyg. Vi kommer ocks\u00e5 att diskutera vilka f\u00f6rdelar och nackdelar det finns med dessa metoder och vad vi kan f\u00f6rb\u00e4ttra h\u00e4r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Har n\u00e5gon n\u00e5gonsin gjort index eller n\u00e5gra andra \u00e4ndringar direkt p\u00e5 prod? M\u00e5nga har det. Och hos de som har gjort det ledde det till att data gick f\u00f6rlorade eller till driftstopp? D\u00e5 k\u00e4nner du till den sm\u00e4rtan. Tack och lov finns det backup. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den f\u00f6rsta metoden \u00e4r testning i prod. Eller n\u00e4r utvecklaren sitter med sin lokala maskin, har testdata, finns en begr\u00e4nsad urval. Och vi rullar ut p\u00e5 prod och f\u00e5r en s\u00e5dan situation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r sm\u00e4rtsamt, det \u00e4r dyrt. Kanske \u00e4r det b\u00e4ttre att inte g\u00f6ra s\u00e5. <\/p>\n<p><\/p>\n<p>Hur kan vi g\u00f6ra det b\u00e4ttre? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss ta staging och avs\u00e4tta en del av prod d\u00e4r. Eller i b\u00e4sta fall ta verklig prod, alla data. Och efter att vi har utvecklat lokalt, ska vi ocks\u00e5 kontrollera p\u00e5 staging. <\/p>\n<p><\/p>\n<p>Detta kommer att hj\u00e4lpa oss att eliminera vissa fel, d.v.s. f\u00f6rhindra dem p\u00e5 prod. <\/p>\n<p><\/p>\n<p>Vilka problem finns det? <\/p>\n<p><\/p>\n<ul>\n<li>Problemet \u00e4r att vi delar denna staging med kollegor. Och det h\u00e4nder ofta att man g\u00f6r n\u00e5gon \u00e4ndring, boom \u2013 och inga data finns kvar, allt arbete f\u00f6rg\u00e4ves. Staging var flera terabyte stort. Och man m\u00e5ste v\u00e4nta l\u00e4nge innan det \u00e4r uppe igen. Vi beslutar oss f\u00f6r att g\u00f6ra detta imorgon. Nu har vi stopp i utvecklingen. <\/li>\n<li>Och sj\u00e4lvklart har vi m\u00e5nga kollegor som arbetar d\u00e4r, m\u00e5nga team. Och det m\u00e5ste godk\u00e4nnas manuellt. Det \u00e4r mycket opraktiskt. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och det \u00e4r v\u00e4rt att n\u00e4mna att vi endast har ett f\u00f6rs\u00f6k, en chans, om vi vill g\u00f6ra n\u00e5gra \u00e4ndringar i databasen, r\u00f6ra vid datan, \u00e4ndra strukturen. Och om n\u00e5got g\u00e5r fel, om det uppst\u00e5r ett fel i migreringen, s\u00e5 kan vi inte snabbt g\u00e5 tillbaka. <\/p>\n<p><\/p>\n<p>Detta \u00e4r b\u00e4ttre \u00e4n det f\u00f6reg\u00e5ende tillv\u00e4gag\u00e5ngss\u00e4ttet, men det finns fortfarande en stor risk att n\u00e5got fel g\u00e5r till produktion.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad hindrar oss fr\u00e5n att ge varje utvecklare en testmilj\u00f6, en fullst\u00e4ndig kopia? Jag tror att det \u00e4r tydligt vad som hindrar oss. <\/p>\n<p><\/p>\n<p>Vem har en databas som \u00e4r st\u00f6rre \u00e4n en terabyte? Mer \u00e4n h\u00e4lften av salen. <\/p>\n<p><\/p>\n<p>Och det \u00e4r uppenbart att h\u00e5lla maskiner f\u00f6r varje utvecklare, n\u00e4r produktionen \u00e4r s\u00e5 stor, \u00e4r mycket dyrt, och dessutom tar det l\u00e5ng tid. <\/p>\n<p><\/p>\n<p>Vi har kunder som har insett att det \u00e4r mycket viktigt att testa alla \u00e4ndringar p\u00e5 fullst\u00e4ndiga kopior, men de har databaser som \u00e4r mindre \u00e4n en terabyte, och de har inte resurser f\u00f6r att h\u00e5lla en testmilj\u00f6 f\u00f6r varje utvecklare. D\u00e4rf\u00f6r tvingas de ladda ner dumpfiler lokalt p\u00e5 sin maskin och testa p\u00e5 det s\u00e4ttet. Det tar massor av tid. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c4ven om du g\u00f6r detta inom infrastrukturen, att ladda ner en terabyte data p\u00e5 en timme \u2013 det \u00e4r redan v\u00e4ldigt bra. Men de anv\u00e4nder logiska dumpfiler, de laddar ner lokalt fr\u00e5n molnet. F\u00f6r dem \u00e4r hastigheten omkring 200 gigabyte i timmen. Och man beh\u00f6ver ocks\u00e5 tid f\u00f6r att \u00e5terst\u00e4lla fr\u00e5n den logiska dumpen, applicera index, osv.<\/p>\n<p><\/p>\n<p>Men de anv\u00e4nder detta tillv\u00e4gag\u00e5ngss\u00e4tt eftersom det g\u00f6r att de kan h\u00e5lla produktionen p\u00e5litlig. <\/p>\n<p><\/p>\n<p>Vad kan vi g\u00f6ra h\u00e4r? L\u00e5t oss se till att testmilj\u00f6erna \u00e4r billiga och ge varje utvecklare sin egen testmilj\u00f6.<\/p>\n<p><\/p>\n<p>Och det \u00e4r m\u00f6jligt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och i detta tillv\u00e4gag\u00e5ngss\u00e4tt, n\u00e4r vi skapar tunna kloner f\u00f6r varje utvecklare, kan vi dela detta p\u00e5 en maskin. Till exempel, om du har en fyra terabyte stor databas och vill ge den till 10 utvecklare, beh\u00f6ver du inte ha 10 x fyraterabyte databaser. Det r\u00e4cker med en maskin f\u00f6r att g\u00f6ra tunna isolerade kopior f\u00f6r varje utvecklare, med hj\u00e4lp av en maskin. Jag kommer att ber\u00e4tta hur det fungerar lite senare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett verkligt exempel:<\/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 oberoende kopior p\u00e5 30 sekunder. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Du beh\u00f6ver inte v\u00e4nta p\u00e5 en testmilj\u00f6 och vara beroende av hur stor den \u00e4r. Du kan f\u00e5 den p\u00e5 sekunder. Det kommer att vara helt isolerade milj\u00f6er, men som delar data mellan varandra. <\/p>\n<p><\/p>\n<p>Det \u00e4r riktigt h\u00e4ftigt. H\u00e4r pratar vi om magi och parallella universum. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I v\u00e5rt fall fungerar detta med hj\u00e4lp av systemet OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS \u00e4r ett copy-on-write filsystem som fr\u00e5n b\u00f6rjan st\u00f6djer snapshots och kloner. Det \u00e4r p\u00e5litligt och skalbart. Det \u00e4r mycket enkelt att hantera. Du kan bokstavligt talat st\u00e4lla in det med tv\u00e5 kommandon. <\/p>\n<p><\/p>\n<p>Det finns andra alternativ:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>SAN (till exempel Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, som jag pratar om, \u00e4r modul\u00e4rt. Det kan implementeras med s\u00e5dana alternativ. Men hittills har vi fokuserat p\u00e5 OpenZFS eftersom vi specifikt har haft problem med LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur fungerar detta? Ist\u00e4llet f\u00f6r att skriva om data varje g\u00e5ng vi \u00e4ndrar dem, sparar vi dem helt enkelt, och markerar att dessa nya data tillh\u00f6r en ny tidspunkt, en ny snapshot. <\/p>\n<p><\/p>\n<p>Och senare, n\u00e4r vi vill \u00e5terg\u00e5 eller skapa en ny klon fr\u00e5n en \u00e4ldre version, s\u00e4ger vi bara: \"Okej, ge oss dessa datablokkar som \u00e4r markerade p\u00e5 det h\u00e4r s\u00e4ttet.\" <\/p>\n<p><\/p>\n<p>Och den h\u00e4r anv\u00e4ndaren kommer att arbeta med detta dataset. Han kommer gradvis att \u00e4ndra dem och g\u00f6ra sina snapshots. <\/p>\n<p><\/p>\n<p>Och vi kommer att f\u00e5 f\u00f6rgrening. Varje utvecklare kommer i v\u00e5rt fall att ha m\u00f6jlighet att ha sin egen klon som han redigerar, medan de gemensamma data kommer att delas mellan alla. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r att st\u00e4lla in ett s\u00e5dant system p\u00e5 din egen sida m\u00e5ste du l\u00f6sa tv\u00e5 problem: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Det f\u00f6rsta \u00e4r datak\u00e4llan d\u00e4rifr\u00e5n du kommer att h\u00e4mta dem. Du kan st\u00e4lla in replikering fr\u00e5n produktion. Du kan anv\u00e4nda redan befintliga s\u00e4kerhetskopior som du har st\u00e4llt in, hoppas jag. WAL-E, WAL-G eller Barman. Och \u00e4ven om du anv\u00e4nder n\u00e5gon form av molnl\u00f6sning, som RDS eller Cloud SQL, kan du anv\u00e4nda logiska dumpningar. Men vi rekommenderar fortfarande att du anv\u00e4nder s\u00e4kerhetskopior, eftersom denna metod ocks\u00e5 bevarar den fysiska filstrukturen, vilket g\u00f6r att du kommer \u00e4nnu n\u00e4rmare de m\u00e5tt som du skulle se i produktion f\u00f6r att f\u00e5nga de problem som finns. <\/p>\n<p>\n<\/li>\n<li>\n<p>Det andra \u00e4r platsen d\u00e4r du vill hosta Database Lab. Det kan vara i molnet, det kan vara p\u00e5 plats. H\u00e4r \u00e4r det viktigt att n\u00e4mna att ZFS st\u00f6der datakomprimering. Och det g\u00f6r det ganska bra. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>T\u00e4nk dig att varje s\u00e5dan klon, beroende p\u00e5 de operationer vi g\u00f6r med databasen, kommer att \u00f6ka i storlek. F\u00f6r den utvecklingen beh\u00f6vs ocks\u00e5 plats. Men eftersom vi har tagit en databas p\u00e5 4,5 terabyte, kommer ZFS att komprimera den till 3,5 terabyte. Beroende p\u00e5 inst\u00e4llningarna kan detta varieras. Och vi f\u00e5r fortfarande plats f\u00f6r utvecklingen. <\/p>\n<p><\/p>\n<p>Ett s\u00e5dant system kan anv\u00e4ndas f\u00f6r olika fall. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Det h\u00e4r \u00e4r utvecklare, DBA f\u00f6r att kontrollera fr\u00e5gor och f\u00f6r optimering. <\/p>\n<p>\n<\/li>\n<li>\n<p>Detta kan anv\u00e4ndas i QA-testning f\u00f6r att kontrollera en specifik migrering innan vi rullar ut den i produktion. Vi kan ocks\u00e5 skapa speciella milj\u00f6er f\u00f6r QA med verkliga data, d\u00e4r de kan testa ny funktionalitet. Och detta kommer att ta sekunder ist\u00e4llet f\u00f6r att v\u00e4nta timmar, kanske till och med dagar i vissa andra fall d\u00e4r tunna kopior inte anv\u00e4nds. <\/p>\n<p>\n<\/li>\n<li>\n<p>Och \u00e4nnu ett separat fall. Om f\u00f6retaget inte har ett analyssystem kan vi avs\u00e4tta en tunn klon av produktdatabasen f\u00f6r l\u00e5nga fr\u00e5gor eller f\u00f6r speciella index som kan anv\u00e4ndas i analys.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Med detta tillv\u00e4gag\u00e5ngss\u00e4tt:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>L\u00e5g sannolikhet f\u00f6r fel i \"produktionen\", eftersom vi har testat alla \u00e4ndringar p\u00e5 fullstora data. <\/p>\n<p>\n<\/li>\n<li>\n<p>Vi f\u00e5r en testningskultur, eftersom vi nu inte beh\u00f6ver v\u00e4nta i timmar p\u00e5 att f\u00e5 egen milj\u00f6. <\/p>\n<p>\n<\/li>\n<li>\n<p>Och det finns inga hinder, ingen v\u00e4ntan mellan tester. Du kan verkligen g\u00e5 och kontrollera. Och det kommer bli b\u00e4ttre, eftersom vi p\u00e5skyndar utvecklingen. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Det kommer att bli mindre refaktorering. F\u00e4rre buggar kommer att hamna i produktion. Vi kommer att refaktorisera dem mindre senare. <\/p>\n<p>\n<\/li>\n<li>\n<p>Vi kan hantera o\u00e5terkalleliga f\u00f6r\u00e4ndringar. Detta finns inte i standardmetoder. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>Detta \u00e4r f\u00f6rdelaktigt eftersom vi delar resurserna f\u00f6r testmilj\u00f6er. <\/li>\n<\/ol>\n<p><\/p>\n<p>Det \u00e4r redan bra, men vad mer kan vi snabba upp?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tack vare ett s\u00e5dant system kan vi kraftigt s\u00e4nka tr\u00f6skeln f\u00f6r att komma in i denna typ av testning. <\/p>\n<p><\/p>\n<p>Det finns idag en ond cirkel d\u00e4r utvecklaren m\u00e5ste bli expert f\u00f6r att f\u00e5 tillg\u00e5ng till verklig fullstor data. De m\u00e5ste f\u00e5 f\u00f6rtroende f\u00f6r denna \u00e5tkomst. <\/p>\n<p><\/p>\n<p>Men hur kan vi v\u00e4xa om det inte finns? Och vad h\u00e4nder om du bara har tillg\u00e5ng till en mycket liten upps\u00e4ttning testdata? D\u00e5 f\u00e5r du ingen verklig erfarenhet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur tar vi oss ur denna cirkel? Som f\u00f6rsta gr\u00e4nssnitt, bekv\u00e4mt f\u00f6r utvecklare p\u00e5 alla niv\u00e5er, har vi valt en Slack-bot. Men det kan vara vilket annat gr\u00e4nssnitt som helst. <\/p>\n<p><\/p>\n<p>Vad till\u00e5ter det oss att g\u00f6ra? Man kan ta en specifik f\u00f6rfr\u00e5gan och skicka den till en speciell kanal f\u00f6r databasen. Vi kommer automatiskt att p\u00e5 n\u00e5gra sekunder st\u00e4lla upp en tunn klon. K\u00f6ra denna f\u00f6rfr\u00e5gan. Samla in m\u00e4tv\u00e4rden och rekommendationer. Visa visualisering. Och denna klon kommer att finnas kvar s\u00e5 att denna f\u00f6rfr\u00e5gan kan optimeras, l\u00e4gga till index, etc. <\/p>\n<p><\/p>\n<p>Och dessutom ger Slack oss m\u00f6jligheter f\u00f6r samarbeten direkt ur l\u00e5dan. Eftersom det bara \u00e4r en kanal kan man direkt d\u00e4r i tr\u00e5den f\u00f6r den f\u00f6rfr\u00e5gan b\u00f6rja diskutera den, pingar sina kollegor, DBA:er som finns inom f\u00f6retaget. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men det finns f\u00f6rst\u00e5s \u00e4ven problem. Eftersom detta \u00e4r den verkliga v\u00e4rlden, och vi anv\u00e4nder en server d\u00e4r vi hostar m\u00e5nga kloner, m\u00e5ste vi komprimera m\u00e4ngden minne och processorkraft som klonerna har tillg\u00e5ng till. <\/p>\n<p><\/p>\n<p>Men f\u00f6r att dessa tester ska vara trov\u00e4rdiga, m\u00e5ste vi p\u00e5 n\u00e5got s\u00e4tt l\u00f6sa detta problem. <\/p>\n<p><\/p>\n<p>Det \u00e4r klart att en viktig aspekt \u00e4r att ha samma data. Men det har vi redan. Och vi vill uppn\u00e5 en enhetlig konfiguration. Och vi kan ge en praktiskt taget identisk konfiguration. <\/p>\n<p><\/p>\n<p>Det skulle vara fantastiskt att ha samma h\u00e5rdvara som i produktion, men den kan skilja sig. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss komma ih\u00e5g hur Postgres arbetar med minne. Vi har tv\u00e5 cacheminnen. Ett fr\u00e5n filsystemet och ett fr\u00e5n Postgres, det vill s\u00e4ga Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Det \u00e4r viktigt att notera att Shared Buffer Cache allokeras vid starten av Postgres beroende p\u00e5 den storlek du anger i konfigurationen. <\/p>\n<p><\/p>\n<p>Och den andra cachen anv\u00e4nder allt tillg\u00e4ngligt utrymme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och n\u00e4r vi g\u00f6r flera kloner p\u00e5 en och samma maskin, visar det sig att vi gradvis fyller minnet. Och i b\u00e4sta fall \u00e4r Shared Buffer Cache 25 % av den totala m\u00e4ngden minne som finns tillg\u00e4ngligt p\u00e5 maskinen. <\/p>\n<p><\/p>\n<p>Och det visar sig att om vi inte \u00e4ndrar den h\u00e4r parametern kan vi bara k\u00f6ra 4 instanser p\u00e5 en maskin, dvs. totalt 4 s\u00e5dana tunna kloner. Och det \u00e4r f\u00f6rst\u00e5s d\u00e5ligt, eftersom vi vill ha betydligt fler. <\/p>\n<p><\/p>\n<p>Men \u00e5 andra sidan anv\u00e4nds Buffer Cache f\u00f6r att utf\u00f6ra f\u00f6rfr\u00e5gningar, f\u00f6r index, dvs. planeringen beror p\u00e5 storleken p\u00e5 v\u00e5ra cacher. Och om vi bara tar och minskar den h\u00e4r parametern, kan v\u00e5ra planer f\u00f6r\u00e4ndras mycket.<\/p>\n<p><\/p>\n<p>Till exempel, om vi har en stor cache p\u00e5 prod, kommer Postgres att f\u00f6redra att anv\u00e4nda index. Men om inte, kommer det att bli SeqScan. Och vad skulle det finnas f\u00f6r mening i att v\u00e5ra planer inte matchade? <\/p>\n<p><\/p>\n<p>Men h\u00e4r kommer vi fram till den slutsatsen att planen i Postgres faktiskt inte beror p\u00e5 den specifika storleken p\u00e5 Shared Buffer som har angivits, utan p\u00e5 effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (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 \u00e4r den f\u00f6rv\u00e4ntade m\u00e4ngden cache som vi har tillg\u00e5ng till, dvs. summan av Buffer Cache och filsystemets cache. Detta anges i konfigurationen. Och det h\u00e4r minnet allokeras inte. <\/p>\n<p><\/p>\n<p>Och genom den h\u00e4r parametern kan vi lura Postgres och s\u00e4ga att vi faktiskt har mycket data tillg\u00e4nglig, \u00e4ven om vi inte har den datan. Och p\u00e5 s\u00e5 s\u00e4tt kommer planerna att helt \u00f6verensst\u00e4mma med produktionen. <\/p>\n<p><\/p>\n<p>Men det kan p\u00e5verka tidsaspekten. Och vi optimerar f\u00f6rfr\u00e5gningar efter tid, men det \u00e4r viktigt att tidsaspekten beror p\u00e5 m\u00e5nga faktorer: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Det beror p\u00e5 den belastning som just nu finns p\u00e5 prod. <\/p>\n<p>\n<\/li>\n<li>\n<p>Det beror p\u00e5 specifikationerna f\u00f6r sj\u00e4lva maskinen. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Och detta \u00e4r en indirekt parameter, men egentligen kan vi optimera precis efter m\u00e4ngden data som denna f\u00f6rfr\u00e5gan kommer att l\u00e4sa f\u00f6r att f\u00e5 resultat. <\/p>\n<p><\/p>\n<p>Och om vi vill att tidpunkten ska n\u00e4rma sig det vi ser i produktion, m\u00e5ste vi anv\u00e4nda s\u00e5 liknande h\u00e5rdvara som m\u00f6jligt och kanske till och med mer f\u00f6r att alla kloner ska f\u00e5 plats. Men det \u00e4r en kompromiss, dvs. du f\u00e5r samma planer, du kommer att se hur mycket data en specifik fr\u00e5ga l\u00e4ser och kan dra slutsatsen \u2013 \u00e4r denna fr\u00e5ga bra (eller migrering) eller d\u00e5lig, den beh\u00f6ver fortfarande optimeras. <\/p>\n<p><\/p>\n<p>L\u00e5t oss titta p\u00e5 hur optimeringen faktiskt sker med Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss ta en fr\u00e5ga fr\u00e5n ett verkligt system. I detta fall \u00e4r databasen 1 terabyte. Och vi vill r\u00e4kna antalet nya inl\u00e4gg som har f\u00e5tt mer \u00e4n 10 gillningar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi skriver ett meddelande i kanalen, en klon har skapats f\u00f6r oss. Och vi kommer att se att en s\u00e5dan fr\u00e5ga kommer att k\u00f6ras p\u00e5 2,5 minuter. Det \u00e4r det f\u00f6rsta vi kommer att m\u00e4rka.<\/p>\n<p><\/p>\n<p>B Joe kommer att visa automatiska rekommendationer baserade p\u00e5 planen och m\u00e4tv\u00e4rdena. <\/p>\n<p><\/p>\n<p>Vi kommer att se att fr\u00e5gan bearbetar f\u00f6r mycket data f\u00f6r att f\u00e5 ett relativt litet antal rader. Och vi beh\u00f6ver en speciell index, eftersom vi har m\u00e4rkt att det finns f\u00f6r m\u00e5nga filtrerade rader i fr\u00e5gan. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss titta n\u00e4rmare p\u00e5 vad som h\u00e4nde. Faktiskt ser vi att vi har l\u00e4st n\u00e4stan en och en halv gigabyte data fr\u00e5n filcachen eller till och med fr\u00e5n disken. Och det \u00e4r inte bra, eftersom vi bara fick 142 rader. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och, som det verkar, har vi h\u00e4r en indexskanning och det borde ha g\u00e5tt snabbt, men eftersom vi filtrerade bort f\u00f6r m\u00e5nga rader (vi var tvungna att r\u00e4kna dem), s\u00e5 gick fr\u00e5gan l\u00e5ngsamt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och detta h\u00e4nde i planen eftersom villkoren i fr\u00e5gan och villkoren i indexet delvis inte st\u00e4mmer \u00f6verens. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss f\u00f6rs\u00f6ka g\u00f6ra indexet mer exakt och se hur fr\u00e5gans k\u00f6rning f\u00f6r\u00e4ndras efter det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Att skapa indexet tog ganska l\u00e5ng tid, men nu kontrollerar vi fr\u00e5gan och ser att tiden ist\u00e4llet f\u00f6r 2,5 minuter nu bara \u00e4r 156 millisekunder, vilket \u00e4r riktigt bra. Och vi l\u00e4ser bara 6 megabyte data.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och nu anv\u00e4nder vi index only scan.<\/p>\n<p><\/p>\n<p>En annan viktig sak \u00e4r att vi vill presentera planen p\u00e5 ett mer f\u00f6rst\u00e5eligt s\u00e4tt. Vi har implementerat visualisering med hj\u00e4lp av Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r en annan fr\u00e5ga, mer komplex. Och vi bygger Flame Graphs baserat p\u00e5 tv\u00e5 parametrar: det \u00e4r m\u00e4ngden data som en specifik nod i planen har l\u00e4st och tidpunkten, dvs. n\u00f6dens utf\u00f6randetid. <\/p>\n<p><\/p>\n<p>H\u00e4r kan vi j\u00e4mf\u00f6ra specifikt noder med varandra. Det blir tydligt vilken som tar mer eller mindre utrymme, vilket ofta \u00e4r sv\u00e5rt att g\u00f6ra med andra visualiseringsmetoder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart k\u00e4nner alla till explain.depesz.com. En bra funktion med den h\u00e4r visualiseringen \u00e4r att vi sparar den textbaserade planen och ocks\u00e5 lyfter fram n\u00e5gra huvudparametrar i en tabell, s\u00e5 att de kan sorteras. <\/p>\n<p><\/p>\n<p>Och utvecklare som \u00e4nnu inte har dykt djupt ner i det h\u00e4r \u00e4mnet anv\u00e4nder ocks\u00e5 explain.depesz.com, eftersom det \u00e4r enklare f\u00f6r dem att f\u00f6rst\u00e5 vilka m\u00e4tv\u00e4rden som \u00e4r viktiga och vilka som inte \u00e4r det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns en ny metod f\u00f6r visualisering \u2013 explain.dalibo.com. De g\u00f6r en tr\u00e4dbaserad visualisering, men h\u00e4r \u00e4r det v\u00e4ldigt sv\u00e5rt att j\u00e4mf\u00f6ra noder med varandra. H\u00e4r kan man f\u00f6rst\u00e5 strukturen ganska bra, men om det \u00e4r en stor fr\u00e5ga m\u00e5ste man scrolla fram och tillbaka, men det \u00e4r ocks\u00e5 ett alternativ. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Samarbete<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och som jag redan har sagt ger Slack oss m\u00f6jlighet till samarbete. Till exempel, om vi st\u00f6ter p\u00e5 en komplicerad fr\u00e5ga som vi inte vet hur vi ska optimera, kan vi klarg\u00f6ra denna fr\u00e5ga i en tr\u00e5d i Slack med v\u00e5ra kollegor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-botten Joe. Anatolij Stan\u0163ler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi tycker att det \u00e4r viktigt att testa med fullstora data. F\u00f6r detta har vi skapat verktyget Update Database Lab, som \u00e4r tillg\u00e4ngligt som \u00f6ppen k\u00e4llkod. Du kan ocks\u00e5 anv\u00e4nda boten Joe. Du kan h\u00e4mta den just nu och implementera den. Alla guider finns tillg\u00e4ngliga. <\/p>\n<p><\/p>\n<p>Det \u00e4r ocks\u00e5 viktigt att notera att sj\u00e4lva l\u00f6sningen inte \u00e4r revolutionerande, eftersom det finns Delphix, men det \u00e4r en f\u00f6retagsl\u00f6sning. Den \u00e4r helt st\u00e4ngd och kostar mycket. Vi specialiserar oss p\u00e5 Postgres. Dessa \u00e4r alla produkter med \u00f6ppen k\u00e4llkod. Kom och joina oss! <\/p>\n<p><\/p>\n<p>Detta avslutar jag. Tack!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Fr\u00e5gor<\/h2>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r f\u00f6redraget! Mycket intressant, s\u00e4rskilt f\u00f6r mig, eftersom jag har l\u00f6st ett liknande problem f\u00f6r en tid sedan. D\u00e4rf\u00f6r har jag en rad fr\u00e5gor. Jag hoppas att jag f\u00e5r st\u00e4lla \u00e5tminstone n\u00e5gra av dem.<\/em><\/p>\n<p><\/p>\n<p><em>Det \u00e4r intressant, hur ber\u00e4knar ni utrymmet f\u00f6r denna milj\u00f6? Tekniken inneb\u00e4r att under vissa omst\u00e4ndigheter kan era kloner v\u00e4xa till maxstorlek. Grovt sagt, om ni har en tio terabyte stor databas och 10 kloner, kan man l\u00e4tt modellera en situation d\u00e4r varje klon kommer att ha 10 unika data. Hur ber\u00e4knar ni detta utrymme, det vill s\u00e4ga den delta som ni talade om, d\u00e4r dessa kloner kommer att finnas?<\/em><\/p>\n<p><\/p>\n<p>Bra fr\u00e5ga. H\u00e4r \u00e4r det viktigt att h\u00e5lla koll p\u00e5 de specifika klonerna. Om en klon genomg\u00e5r en f\u00f6r stor f\u00f6r\u00e4ndring och b\u00f6rjar v\u00e4xa, kan vi f\u00f6rst ge en varning till anv\u00e4ndaren om detta, eller direkt stoppa klonen f\u00f6r att undvika en fail-situation. <\/p>\n<p><\/p>\n<p><em>Ja, jag har en f\u00f6ljdfr\u00e5ga. Allts\u00e5, hur s\u00e4kerst\u00e4ller ni livscykeln f\u00f6r dessa moduler? Det \u00e4r ett problem f\u00f6r oss och en helt egen historia. Hur g\u00e5r det till?<\/em><\/p>\n<p><\/p>\n<p>Det finns en specifik ttl f\u00f6r varje klon. I praktiken har vi en fast ttl. <\/p>\n<p><\/p>\n<p><em>Vilken, om jag f\u00e5r fr\u00e5ga?<\/em><\/p>\n<p><\/p>\n<p>1 timme, dvs. inaktiv \u2013 1 timme. Om den inte anv\u00e4nds, tar vi bort den. Men h\u00e4r \u00e4r det inget att f\u00f6rv\u00e5na sig \u00f6ver, eftersom vi kan \u00e5terst\u00e4lla en klon p\u00e5 sekunder. Och om den beh\u00f6vs igen, s\u00e5 \u00e4r det bara att k\u00f6ra. <\/p>\n<p><\/p>\n<p><em>Jag \u00e4r ocks\u00e5 intresserad av valet av teknologier, eftersom vi till exempel parallellt anv\u00e4nder flera metoder av olika sk\u00e4l. Varf\u00f6r valde just ZFS? Varf\u00f6r anv\u00e4nde ni inte LVM? Du n\u00e4mnde att det fanns problem med LVM. Vilka problem var det? Enligt min \u00e5sikt \u00e4r den mest optimala l\u00f6sningen den med lagringssystem, ur prestandasynvinkel.<\/em> <\/p>\n<p><\/p>\n<p><em>Vad \u00e4r det st\u00f6rsta problemet med ZFS? Att du m\u00e5ste k\u00f6ra p\u00e5 en och samma v\u00e4rd, dvs. alla instanser kommer att leva inom samma operativsystem. I fallet med lagringssystem kan du ansluta olika h\u00e5rdvara. Den flaskhalsen \u00e4r endast de enheter som finns p\u00e5 lagringssystemet. Och fr\u00e5gan om valet av teknologier \u00e4r intressant. Varf\u00f6r inte LVM?<\/em><\/p>\n<p><\/p>\n<p>Vi kan diskutera LVM specifikt p\u00e5 meetuppen. Om lagringssystemet \u2013 det \u00e4r helt enkelt dyrt. ZFS-systemet kan vi implementera var som helst. Du kan rulla ut det p\u00e5 din egen maskin. Du kan helt enkelt ladda ner repositoryn och rulla ut det. ZFS kan installeras n\u00e4stan \u00f6verallt, om vi pratar om Linux. Det ger en mycket flexibel l\u00f6sning. Sj\u00e4lva ZFS erbjuder mycket direkt ur l\u00e5dan. Man kan lagra hur mycket data som helst d\u00e4r, koppla ett stort antal diskar, det finns snapshots. Och som jag redan n\u00e4mnt, \u00e4r det enkelt att administrera. Det verkar vara mycket trevligt att anv\u00e4nda. Det \u00e4r testat, har m\u00e5nga \u00e5r bakom sig. Det har en stor och v\u00e4xande community. ZFS \u00e4r en mycket p\u00e5litlig l\u00f6sning. <\/p>\n<p><\/p>\n<p>Nikolaj Samokhvalov: F\u00e5r jag kommentera? Jag heter Nikolaj, och jag arbetar tillsammans med Anatolij. Jag h\u00e5ller med om att lagringssystem \u00e4r fantastiskt. Och vissa av v\u00e5ra kunder har Pure Storage osv. <\/p>\n<p><\/p>\n<p>Anatolij p\u00e5pekade korrekt att vi siktar p\u00e5 modul\u00e4r design. I framtiden kan vi implementera ett enda gr\u00e4nssnitt \u2013 ta en snapshot, skapa en klon, radera klonen. Det \u00e4r allt l\u00e4tt. Och lagringssystemet \u00e4r fantastiskt, om det finns.<\/p>\n<p><\/p>\n<p>Men ZFS \u00e4r tillg\u00e4ngligt f\u00f6r alla. Det r\u00e4cker med DelPhix, de har 300 kunder. Av dem \u00e4r 50 i Fortune 100, det vill s\u00e4ga de siktar p\u00e5 NASA och s\u00e5 vidare. Det \u00e4r dags att g\u00f6ra denna teknik tillg\u00e4nglig f\u00f6r alla. D\u00e4rf\u00f6r har vi en \u00f6ppen k\u00e4llkods Core. Vi har en del av gr\u00e4nssnittet som inte \u00e4r \u00f6ppen k\u00e4llkod. Det \u00e4r plattformen som vi kommer att visa. Men vi vill att det ska vara tillg\u00e4ngligt f\u00f6r alla. Vi vill g\u00f6ra en revolution s\u00e5 att alla testare slutar gissa p\u00e5 b\u00e4rbara datorer. Vi m\u00e5ste skriva SELECT och direkt se att den \u00e4r l\u00e5ngsam. Det \u00e4r nog att v\u00e4nta p\u00e5 att DBA ska ber\u00e4tta om det. Det \u00e4r v\u00e5rt huvudm\u00e5l. Och jag tror att vi alla kommer att n\u00e5 dit. Och den h\u00e4r grejen g\u00f6r vi f\u00f6r att den ska vara tillg\u00e4nglig f\u00f6r alla. S\u00e5 ZFS, eftersom det kommer att vara tillg\u00e4ngligt \u00f6verallt. Tack till communityn f\u00f6r att ni l\u00f6ser problem och f\u00f6r att det finns en \u00f6ppen k\u00e4llkodlicens och s\u00e5 vidare. <\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r presentationen! Jag heter Maxim. Vi har l\u00f6st samma problem. Vi har l\u00f6st det h\u00e4r hemma. Hur delar ni resurser mellan dessa kloner? Varje klon kan alltid hantera sina egna: en testar en sak, en annan testar n\u00e5got annat, n\u00e5gon bygger index, n\u00e5gon har ett jobb som k\u00f6r tungt. Och om man kan dela upp CPU, hur delar ni upp IO?<\/em><\/p>\n<p><\/p>\n<p><em>Och den andra fr\u00e5gan handlar om olikheterna i milj\u00f6erna. Anta att jag h\u00e4r har ZFS och allt \u00e4r bra, men hos kunden p\u00e5 produktion finns det inte ZFS, utan ext4, till exempel. Hur hanterar ni det?<\/em><\/p>\n<p><\/p>\n<p>Fr\u00e5gorna \u00e4r mycket bra. Jag n\u00e4mnde lite det h\u00e4r problemet med hur vi delar resurser. L\u00f6sningen \u00e4r f\u00f6ljande. F\u00f6rest\u00e4ll er att ni testar p\u00e5 staging. Ni kan ocks\u00e5 ha en situation d\u00e4r n\u00e5gon ger en viss belastning, medan n\u00e5gon annan ger en annan. Och slutligen ser ni oklara metrikv\u00e4rden. \u00c4ven samma problem kan uppst\u00e5 p\u00e5 produktion. N\u00e4r ni vill kontrollera en viss fr\u00e5ga och ser att det \u00e4r problem med den \u2013 att den k\u00f6rs l\u00e5ngsamt, \u00e4r det egentligen inte fr\u00e5gan som \u00e4r problemet, utan det beror p\u00e5 att det finns en parallell belastning. <\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r \u00e4r det viktigt att fokusera p\u00e5 vilken plan vi kommer att anv\u00e4nda, vilka steg vi ska ta i planen och hur mycket data vi ska hantera. Det faktum att v\u00e5ra diskar, till exempel, kommer att belastas av n\u00e5got kommer att p\u00e5verka tidpunkten. Men vi kan uppskatta hur kr\u00e4vande denna beg\u00e4ran \u00e4r baserat p\u00e5 m\u00e4ngden data. Det \u00e4r inte s\u00e5 viktigt att det samtidigt p\u00e5g\u00e5r n\u00e5got annat genomf\u00f6rande. <\/p>\n<p><\/p>\n<p><em>Jag har tv\u00e5 fr\u00e5gor. Det h\u00e4r \u00e4r riktigt coolt. Har det funnits fall d\u00e4r data som \u00e4r kritiskt viktiga f\u00f6r produktion, som kreditkortsnummer? Finns det redan n\u00e5got f\u00e4rdigt eller \u00e4r det en separat uppgift? Och den andra fr\u00e5gan \u2013 finns det n\u00e5got liknande f\u00f6r MySQL?<\/em><\/p>\n<p><\/p>\n<p>N\u00e4r det g\u00e4ller data. Vi kommer att g\u00f6ra obfuskering, \u00e4n s\u00e5 l\u00e4nge g\u00f6r vi inte det. Men om du implementerar just Joe, och om du inte ger utvecklarna \u00e5tkomst, s\u00e5 finns det ingen \u00e5tkomst till data. Varf\u00f6r? F\u00f6r att Joe inte visar data. Han visar bara m\u00e4tv\u00e4rden, planer och s\u00e5 vidare. Det har gjorts medvetet eftersom det \u00e4r ett av v\u00e5ra kunders krav. De ville kunna optimera utan att ge alla tillg\u00e5ng. <\/p>\n<p><\/p>\n<p>N\u00e4r det g\u00e4ller MySQL. Detta system kan anv\u00e4ndas f\u00f6r vad som helst som lagrar tillst\u00e5nd p\u00e5 disken. Eftersom vi arbetar med Postgres, fokuserar vi just nu p\u00e5 att automatisera allt f\u00f6r Postgres. Vi vill automatisera data\u00e5terst\u00e4llning fr\u00e5n backup. Vi konfigurerar Postgres korrekt. Vi vet hur man f\u00e5r planerna att st\u00e4mma \u00f6verens och s\u00e5 vidare. <\/p>\n<p><\/p>\n<p>Men eftersom systemet \u00e4r utbyggbart kan det ocks\u00e5 anv\u00e4ndas f\u00f6r MySQL. Det finns liknande exempel. Det finns n\u00e5got liknande hos Yandex, men de publicerar det ingenstans. De anv\u00e4nder det internt i Yandex.Metrika. Och d\u00e4r handlar det om MySQL. Men teknologierna \u00e4r desamma, ZFS. <\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen! Jag har ocks\u00e5 ett par fr\u00e5gor. Du n\u00e4mnde att kloning kan anv\u00e4ndas f\u00f6r analys, till exempel f\u00f6r att bygga extra index. Kan du ber\u00e4tta lite mer om hur det fungerar?<\/em><\/p>\n<p><\/p>\n<p><em>Och jag st\u00e4ller genast den andra fr\u00e5gan ang\u00e5ende likheten mellan milj\u00f6erna, likheten i planerna. Planen beror delvis p\u00e5 statistiken som Postgres samlar. Hur l\u00f6ser ni det problemet?<\/em><\/p>\n<p><\/p>\n<p>Det finns ingen analys av specifika fall \u00e4nnu, eftersom vi inte har anv\u00e4nt det p\u00e5 det s\u00e4ttet, men det \u00e4r m\u00f6jligt. Om vi pratar om index, t\u00e4nk dig att en fr\u00e5ga k\u00f6rs p\u00e5 en tabell med hundratals miljoner poster och i en kolumn som vanligtvis inte \u00e4r indexerad i produktion. Och vi vill r\u00e4kna ut n\u00e5got d\u00e4r. Om denna fr\u00e5ga k\u00f6rs i produktion finns det risk f\u00f6r att det blir stillest\u00e5nd, eftersom fr\u00e5gan d\u00e4r kan ta en minut att bearbeta. <\/p>\n<p><\/p>\n<p>Okej, l\u00e5t oss skapa en tunn klon som vi inte \u00e4r r\u00e4dda f\u00f6r att pausa i n\u00e5gra minuter. F\u00f6r att enklare kunna r\u00e4kna ut analysen, l\u00e4gger vi till index p\u00e5 de kolumner d\u00e4r vi \u00e4r intresserade av data. <\/p>\n<p><\/p>\n<p><em>Kommer indexet att skapas varje g\u00e5ng?<\/em><\/p>\n<p><\/p>\n<p>Vi kan g\u00f6ra s\u00e5 att vi r\u00f6r vid datan, tar snapshots, och sedan \u00e5terst\u00e4ller vi oss fr\u00e5n denna snapshot och k\u00f6r nya fr\u00e5gor. Det vill s\u00e4ga, vi kan g\u00f6ra s\u00e5 att vi kan skapa nya kloner med redan angivna index.<\/p>\n<p><\/p>\n<p>N\u00e4r det g\u00e4ller fr\u00e5gan om statistik, om vi \u00e5terst\u00e4ller fr\u00e5n en s\u00e4kerhetskopia, om vi g\u00f6r replikation, s\u00e5 kommer v\u00e5r statistik att vara exakt densamma. F\u00f6r vi kommer att f\u00e5 med hela den fysiska dataskukturen, det vill s\u00e4ga vi tar med datan som den \u00e4r med alla statistiska m\u00e5tt. <\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett annat problem. Om ni anv\u00e4nder en molnl\u00f6sning, s\u00e5 finns det bara logiska dumpningar tillg\u00e4ngliga, eftersom Google och Amazon inte till\u00e5ter att ta en fysisk kopia. D\u00e4r uppst\u00e5r ett s\u00e5dant problem. <\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen. H\u00e4r st\u00e4lldes tv\u00e5 bra fr\u00e5gor om MySQL och om resursf\u00f6rdelning. Men i grunden handlar allt om att det \u00e4r ett \u00e4mne som inte r\u00f6r specifika DBMS utan snarare filsystemet i stort. Och d\u00e4rmed b\u00f6r fr\u00e5gorna om resursf\u00f6rdelning ocks\u00e5 l\u00f6sas d\u00e4rifr\u00e5n, inte i slut\u00e4ndan, att det handlar om Postgres, utan i filsystemet, i <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/dts-dronten\/\"   title=\"servern\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">servern<\/a>, i instansen.<\/em> <\/p>\n<p><\/p>\n<p><em>Min fr\u00e5ga handlar om n\u00e5got annat. Den \u00e4r mer inriktad p\u00e5 flerskiktstruktur av databasen, d\u00e4r det finns flera lager. Vi har till exempel st\u00e4llt in uppdateringar av en tioterrabytesbild, vi har replikation ig\u00e5ng. Och vi anv\u00e4nder denna l\u00f6sning specifikt f\u00f6r databaser. Replikationen p\u00e5g\u00e5r, datan uppdateras. H\u00e4r arbetar parallellt 100 anst\u00e4llda som st\u00e4ndigt k\u00f6r dessa olika snapshots. Vad ska vi g\u00f6ra? Hur g\u00f6r vi s\u00e5 att det inte uppst\u00e5r konflikter, att de k\u00f6r en sak och sedan byts filsystemet ut, och dessa snapshots blir trasiga?<\/em> <\/p>\n<p><\/p>\n<p>De kommer inte \u00e5ka eftersom det \u00e4r s\u00e5 ZFS fungerar. Vi kan h\u00e5lla f\u00f6r\u00e4ndringar av filsystemet separat i en str\u00f6m, som kommer tack vare replikation. Och vi kan beh\u00e5lla kloner av gamla data versioner, som utvecklarna anv\u00e4nder. Och det fungerar f\u00f6r oss, det \u00e4r inga problem med det.<\/p>\n<p><\/p>\n<p><em>S\u00e5 uppdateringen kommer att ske som ett extra lager, och alla nya snapshots kommer att baseras p\u00e5 det lagret, eller hur?<\/em> <\/p>\n<p><\/p>\n<p>Fr\u00e5n de f\u00f6reg\u00e5ende lagren, som kom fr\u00e5n tidigare replikationer. <\/p>\n<p><\/p>\n<p><em>De tidigare lagren kommer att sl\u00e4ppas, men de kommer att referera till det gamla lagret, och de nya bilderna kommer att tas fr\u00e5n det senaste lagret som fick under uppdateringen?<\/em><\/p>\n<p><\/p>\n<p>Rent allm\u00e4nt, ja. <\/p>\n<p><\/p>\n<p><em>D\u00e5 kommer vi, som en f\u00f6ljd, att ha massor av lager. Och \u00f6ver tid m\u00e5ste vi komprimera dem?<\/em><\/p>\n<p><\/p>\n<p>Ja, det st\u00e4mmer. Det finns ett f\u00f6nster f\u00f6r detta. Vi sparar veckovisa snapshots. Det beror p\u00e5 vilka resurser du har. Om du har m\u00f6jlighet att lagra mycket data kan du spara snapshots under en l\u00e5ng tid. De kommer inte att tas bort automatiskt. Det kommer inte att ske n\u00e5gon dataf\u00f6rlust. Om snapshots verkar vara f\u00f6r\u00e5ldrade, vilket beror p\u00e5 f\u00f6retagets policy, kan vi helt enkelt ta bort dem och frig\u00f6ra utrymme. <\/p>\n<p><\/p>\n<p><em>Hej, tack f\u00f6r presentationen! Ang\u00e5ende Jo fr\u00e5gan. Du sa att kunden inte ville ge allm\u00e4n tillg\u00e5ng till data. Rent tekniskt, om en person har resultatet av Explain Analyze, kan han se data.<\/em> <\/p>\n<p><\/p>\n<p>Det \u00e4r s\u00e5. Till exempel kan vi skriva: \"SELECT FROM WHERE email = n\u00e5got.\" Det vill s\u00e4ga, vi kommer inte att se sj\u00e4lva datan, men vi kan se vissa indirekta tecken. Det \u00e4r viktigt att f\u00f6rst\u00e5. Men \u00e5 andra sidan \u00e4r allt synligt. Vi har en logg \u00f6ver revisioner, och vi har kontroll \u00f6ver andra kollegor som ocks\u00e5 ser vad utvecklarna arbetar med. Och om n\u00e5gon f\u00f6rs\u00f6ker g\u00f6ra s\u00e5, kommer s\u00e4kerhetstj\u00e4nsten att bes\u00f6ka dem och ta itu med fr\u00e5gan. <\/p>\n<p><\/p>\n<p><em>God morgon! Tack f\u00f6r presentationen! Jag har en kort fr\u00e5ga. Om Slack inte anv\u00e4nds i f\u00f6retaget, finns det n\u00e5gon koppling till det nu eller kan man f\u00f6r utvecklarna s\u00e4tta upp instanser f\u00f6r att koppla testapplikationen till databaser?<\/em><\/p>\n<p><\/p>\n<p>Just nu finns det en koppling till Slack, dvs. det finns inga andra meddelandeappar, men vi skulle verkligen vilja st\u00f6dja andra meddelandeappar ocks\u00e5. Vad kan du g\u00f6ra? Du kan k\u00f6ra en DB Lab utan Joe, anv\u00e4nda REST API eller v\u00e5r plattform f\u00f6r att skapa kloner och ansluta med PSQL. Men det kan g\u00f6ras om du \u00e4r villig att ge dina utvecklare \u00e5tkomst till data, eftersom det inte kommer att finnas n\u00e5got gr\u00e4nssnitt h\u00e4r. <\/p>\n<p><\/p>\n<p><em>Jag beh\u00f6ver inte det lagret, utan jag beh\u00f6ver den m\u00f6jligheten.<\/em><\/p>\n<p><\/p>\n<p>D\u00e5 \u2013 ja, det kan g\u00f6ras.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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. Anatolij Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}