{"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\/pl\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak backend developer rozumie, \u017ce zapytanie SQL b\u0119dzie dobrze dzia\u0142a\u0107 na \u201eprodukcji\u201d? W du\u017cych lub szybko rozwijaj\u0105cych si\u0119 firmach dost\u0119p do \u201eprodukcji\u201d nie jest dost\u0119pny dla wszystkich. A nawet z dost\u0119pem nie wszystkie zapytania mo\u017cna bezbole\u015bnie sprawdzi\u0107, a stworzenie kopii bazy danych cz\u0119sto zajmuje godziny. Aby rozwi\u0105za\u0107 te problemy, stworzyli\u015bmy sztucznego DBA - Joe. Le\u017cy u podstaw jego wdro\u017cenia w kilku firmach i pomaga niejednemu dziesi\u0105tkowi programist\u00f3w. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Wideo:<\/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=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cze\u015b\u0107 wszystkim! Nazywam si\u0119 Anatolij Stanser. Pracuj\u0119 w firmie <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Zajmujemy si\u0119 tym, \u017ce przyspieszamy proces rozwoju, eliminuj\u0105c op\u00f3\u017anienia zwi\u0105zane z prac\u0105 Postgresa u programist\u00f3w, DBA i QA.<\/p>\n<p><\/p>\n<p>Mamy \u015bwietnych klient\u00f3w i dzisiaj cz\u0119\u015b\u0107 prezentacji b\u0119dzie po\u015bwi\u0119cona przypadkom, kt\u00f3re napotkali\u015bmy w pracy z nimi. Opowiem, jak pomogli\u015bmy im rozwi\u0105za\u0107 do\u015b\u0107 powa\u017cne problemy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiedy prowadzimy rozw\u00f3j i robimy z\u0142o\u017cone, obci\u0105\u017cone migracje, zadajemy sobie pytanie: \u201eCzy ta migracja si\u0119 powiedzie?\u201d. Korzystamy z recenzji, korzystamy z wiedzy bardziej do\u015bwiadczonych koleg\u00f3w, DBA-ekspert\u00f3w. I mog\u0105 oni powiedzie\u0107 \u2013 czy si\u0119 powiedzie, czy nie. <\/p>\n<p><\/p>\n<p>Ale by\u0107 mo\u017ce lepiej by\u0142oby, gdyby\u015bmy mogli sami przetestowa\u0107 to na pe\u0142nowymiarowych kopiach. Dzisiaj porozmawiamy o tym, jakie obecnie istniej\u0105 podej\u015bcia do testowania i jak mo\u017cna to lepiej robi\u0107 oraz z jakich narz\u0119dzi korzysta\u0107. Poruszymy tak\u017ce plusy i minusy takich podej\u015b\u0107 oraz co mo\u017cemy tu poprawi\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kto kiedykolwiek robi\u0142 indeksy lub wprowadza\u0142 jakie\u015b zmiany bezpo\u015brednio na produkcji? Ca\u0142kiem sporo. A komu to prowadzi\u0142o do utraty danych lub przestoj\u00f3w? Wtedy znasz ten b\u00f3l. Na szcz\u0119\u015bcie s\u0105 kopie zapasowe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwsze podej\u015bcie \u2013 testowanie na produkcji. Lub kiedy programista siedzi na lokalnej maszynie, ma testowe dane, jest jaka\u015b ograniczona pr\u00f3bka. Wdra\u017camy to na produkcj\u0119 i otrzymujemy tak\u0105 sytuacj\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To boli, to jest drogie. Pewnie lepiej tego nie robi\u0107. <\/p>\n<p><\/p>\n<p>A jak mo\u017cna to lepiej zrobi\u0107? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We\u017amy staging i wydzielmy tam jak\u0105\u015b cz\u0119\u015b\u0107 produkcji. Lub, w najlepszym przypadku, we\u017amy prawdziwe dane produkcyjne. A po tym, jak w lokalnym \u015brodowisku opracowali\u015bmy, b\u0119dziemy dodatkowo sprawdza\u0107 r\u00f3wnie\u017c na stagingu. <\/p>\n<p><\/p>\n<p>To pozwoli nam wyeliminowa\u0107 cz\u0119\u015b\u0107 b\u0142\u0119d\u00f3w, tzn. nie dopu\u015bci\u0107 ich do produkcji. <\/p>\n<p><\/p>\n<p>Jakie s\u0105 problemy? <\/p>\n<p><\/p>\n<ul>\n<li>Problem w tym, \u017ce ten staging dzielimy z kolegami. I bardzo cz\u0119sto zdarza si\u0119, \u017ce robisz jak\u0105\u015b zmian\u0119, bum - i nie ma \u017cadnych danych, praca na marne. Staging by\u0142 wieloteraabajtny. I trzeba d\u0142ugo czeka\u0107, a\u017c zn\u00f3w si\u0119 podniesie. I decydujemy si\u0119 poprawi\u0107 to jutro. Wszystko, mamy zatrzymanie w rozwoju. <\/li>\n<li>I oczywi\u015bcie, pracuje tam wielu koleg\u00f3w, wiele zespo\u0142\u00f3w. I trzeba to r\u0119cznie uzgadnia\u0107. A to jest niewygodne. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I trzeba powiedzie\u0107, \u017ce mamy tylko jedn\u0105 pr\u00f3b\u0119, jeden strza\u0142, je\u015bli chcemy wprowadzi\u0107 jakie\u015b zmiany w bazie danych, dotkn\u0105\u0107 danych, zmieni\u0107 struktur\u0119. I je\u015bli co\u015b posz\u0142o nie tak, je\u015bli w migracji by\u0142a pomy\u0142ka, to szybko ju\u017c nie wr\u00f3cimy. <\/p>\n<p><\/p>\n<p>To lepsze ni\u017c poprzednie podej\u015bcie, ale wci\u0105\u017c istnieje du\u017ce prawdopodobie\u0144stwo, \u017ce jaki\u015b b\u0142\u0105d trafi na produkcj\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co nas powstrzymuje przed daniem ka\u017cdemu programi\u015bcie testowego \u015brodowiska, pe\u0142nowymiarowej kopii? My\u015bl\u0119, \u017ce jasne, co to powstrzymuje. <\/p>\n<p><\/p>\n<p>Kto ma baz\u0119 danych wi\u0119ksz\u0105 ni\u017c terabajt? Wi\u0119cej ni\u017c po\u0142owa sali. <\/p>\n<p><\/p>\n<p>I jasne, \u017ce utrzymanie maszyn dla ka\u017cdego programisty, przy tak du\u017cej produkcji, jest bardzo drogie, a do tego jeszcze trwa\u0142e. <\/p>\n<p><\/p>\n<p>Mamy klient\u00f3w, kt\u00f3rzy zrozumieli, \u017ce bardzo wa\u017cne jest testowanie wszystkich zmian na pe\u0142nowymiarowych kopiach, ale maj\u0105 baz\u0119 poni\u017cej terabajta, a zasob\u00f3w, aby dla ka\u017cdego programisty utrzyma\u0107 testowe \u015brodowisko, nie maj\u0105. Dlatego musz\u0105 pobiera\u0107 zrzuty lokalnie na swoje maszyny i testowa\u0107 w ten spos\u00f3b. To zajmuje mn\u00f3stwo czasu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nawet je\u015bli robicie to wewn\u0105trz infrastruktury, pobranie jednego terabajta danych na godzin\u0119 - to ju\u017c bardzo dobrze. Ale oni u\u017cywaj\u0105 logicznych zrzut\u00f3w, \u015bci\u0105gaj\u0105 lokalnie z chmury. Dla nich pr\u0119dko\u015b\u0107 wynosi oko\u0142o 200 gigabajt\u00f3w na godzin\u0119. A jeszcze potrzeba czasu, aby z logicznego zrzutu si\u0119 rozwin\u0105\u0107, za\u0142adowa\u0107 indeksy itd.<\/p>\n<p><\/p>\n<p>Ale oni u\u017cywaj\u0105 tego podej\u015bcia, poniewa\u017c pozwala to utrzyma\u0107 produkcj\u0119 niezawodn\u0105. <\/p>\n<p><\/p>\n<p>Co mo\u017cemy tutaj zrobi\u0107? Zr\u00f3bmy tak, aby testowe \u015brodowiska by\u0142y tanie i dawajmy ka\u017cdemu programi\u015bcie w\u0142asne testowe \u015brodowisko.<\/p>\n<p><\/p>\n<p>I to jest mo\u017cliwe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tym podej\u015bciu, gdy tworzymy cienkie kopie dla ka\u017cdego dewelopera, mo\u017cemy je wsp\u00f3\u0142dzieli\u0107 na jednej maszynie. Na przyk\u0142ad, je\u015bli masz baz\u0119 danych o pojemno\u015bci czterech terabajt\u00f3w i chcesz udost\u0119pni\u0107 j\u0105 10 deweloperom, nie musisz mie\u0107 10 maszyn czteroteraowych. Wystarczy jedna maszyna, na kt\u00f3rej b\u0119dziesz tworzy\u0107 cienkie, izolowane kopie dla ka\u017cdego dewelopera. Jak to dzia\u0142a, wyja\u015bni\u0119 p\u00f3\u017aniej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prawdziwy przyk\u0142ad:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Baza danych \u2013 4,5 terabajta. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017cemy uzyska\u0107 niezale\u017cne kopie w 30 sekund. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Nie musisz czeka\u0107 na \u015brodowisko testowe i polega\u0107 na jego rozmiarze. Mo\u017cesz je uzyska\u0107 w kilka sekund. Otrzymasz ca\u0142kowicie izolowane \u015brodowiska, kt\u00f3re jednak b\u0119d\u0105 dzieli\u0107 dane mi\u0119dzy sob\u0105. <\/p>\n<p><\/p>\n<p>To jest niesamowite. Tutaj m\u00f3wimy o magii i r\u00f3wnoleg\u0142ym wszech\u015bwiecie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W naszym przypadku dzia\u0142a to za pomoc\u0105 systemu OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS to system plik\u00f3w typu copy-on-write, kt\u00f3ry od razu wspiera migawek i klon\u00f3w. Jest niezawodny i skalowalny. W jego zarz\u0105dzanie jest bardzo proste. Mo\u017cna go uruchomi\u0107 dos\u0142ownie w dw\u00f3ch komendach. <\/p>\n<p><\/p>\n<p>S\u0105 inne opcje:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>macierze dyskowe (na przyk\u0142ad Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, o kt\u00f3rym opowiadam, jest modu\u0142owy. Mo\u017cna go wdro\u017cy\u0107 przy u\u017cyciu takich opcji. Ale na razie skupili\u015bmy si\u0119 na OpenZFS, poniewa\u017c mieli\u015bmy problemy z LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak to dzia\u0142a? Zamiast zapisywa\u0107 dane za ka\u017cdym razem, gdy je zmieniamy, zachowujemy je, po prostu oznaczaj\u0105c, \u017ce te nowe dane odnosz\u0105 si\u0119 do nowego momentu czasowego, do nowej migawki. <\/p>\n<p><\/p>\n<p>A kiedy p\u00f3\u017aniej chcemy cofn\u0105\u0107 si\u0119 lub stworzy\u0107 nowy klon z jakiej\u015b starszej wersji, po prostu m\u00f3wimy: \u201eOk, dajcie nam te bloki danych, kt\u00f3re s\u0105 tak oznaczone\u201d. <\/p>\n<p><\/p>\n<p>Ten u\u017cytkownik b\u0119dzie pracowa\u0142 z takim zestawem danych. B\u0119dzie je stopniowo zmienia\u0107, tworzy\u0107 w\u0142asne migawki. <\/p>\n<p><\/p>\n<p>I b\u0119dziemy mie\u0107 rozga\u0142\u0119zienie. Ka\u017cdy deweloper w naszym przypadku b\u0119dzie mia\u0142 mo\u017cliwo\u015b\u0107 posiadania swojego w\u0142asnego klonu, kt\u00f3ry edytuje, a te wsp\u00f3lne dane b\u0119d\u0105 dzielone mi\u0119dzy wszystkimi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby uruchomi\u0107 taki system, trzeba rozwi\u0105za\u0107 dwie problemy: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Pierwszym elementem jest \u017ar\u00f3d\u0142o danych, z kt\u00f3rego b\u0119dziesz je pobiera\u0107. Mo\u017cesz skonfigurowa\u0107 replikacj\u0119 z produkcji. Mo\u017cna r\u00f3wnie\u017c wykorzysta\u0107 ju\u017c skonfigurowane kopie zapasowe, mam nadziej\u0119. WAL-E, WAL-G czy Barman. A nawet, je\u015bli korzystasz z rozwi\u0105zania w chmurze, na przyk\u0142ad RDS lub Cloud SQL, mo\u017cesz u\u017cy\u0107 logicznych zrzut\u00f3w. Niemniej jednak, zalecamy korzystanie z kopii zapasowych, poniewa\u017c dzi\u0119ki temu zachowasz fizyczn\u0105 struktur\u0119 plik\u00f3w, co pozwoli ci by\u0107 jeszcze bli\u017cej metryk, kt\u00f3re widzia\u0142by\u015b w produkcji, aby wy\u0142apywa\u0107 istniej\u0105ce problemy. <\/p>\n<p>\n<\/li>\n<li>\n<p>Drugim elementem jest miejsce, w kt\u00f3rym chcesz hostowa\u0107 Database Lab. Mo\u017ce to by\u0107 chmura lub lokalny serwer. Wa\u017cne jest, aby wspomnie\u0107, \u017ce ZFS wspiera kompresj\u0119 danych. I robi to ca\u0142kiem dobrze. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Wyobra\u017a sobie, \u017ce dla ka\u017cdego takiego klona, w zale\u017cno\u015bci od operacji, kt\u00f3re wykonujemy na bazie, b\u0119dzie narasta\u0107 jaki\u015b dev. Do tego r\u00f3wnie\u017c b\u0119dzie potrzebne miejsce. Jednak ze wzgl\u0119du na to, \u017ce mamy baz\u0119 o pojemno\u015bci 4,5 terabajta, ZFS skompresuje j\u0105 do 3,5 terabajta. W zale\u017cno\u015bci od ustawie\u0144 mo\u017cna to modyfikowa\u0107. I wci\u0105\u017c pozostanie miejsce na dev. <\/p>\n<p><\/p>\n<p>Taki system mo\u017cna wykorzysta\u0107 do r\u00f3\u017cnych zastosowa\u0144. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>To s\u0105 deweloperzy, DBA do testowania zapyta\u0144, do optymalizacji. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017cna to wykorzysta\u0107 w testach QA do sprawdzenia konkretnej migracji przed wypuszczeniem na produkcj\u0119. Mo\u017cemy r\u00f3wnie\u017c uruchamia\u0107 specjalne \u015brodowiska QA z rzeczywistymi danymi, gdzie mog\u0105 przetestowa\u0107 now\u0105 funkcjonalno\u015b\u0107. I zajmie to sekundy, zamiast czeka\u0107 godziny, a by\u0107 mo\u017ce i dni w innych przypadkach, gdzie nie s\u0105 u\u017cywane cienkie kopie. <\/p>\n<p>\n<\/li>\n<li>\n<p>I jeszcze jeden przypadek. Je\u015bli w firmie nie jest skonfigurowany system analityczny, mo\u017cemy wydzieli\u0107 cienk\u0105 kopi\u0119 bazy produktowej i wykorzysta\u0107 j\u0105 do d\u0142ugich zapyta\u0144 lub pod specjalne indeksy, kt\u00f3re mog\u0105 by\u0107 u\u017cywane w analizie.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z takim podej\u015bciem:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Niska prawdopodobie\u0144stwo b\u0142\u0119d\u00f3w na \u00abprodukcji\u00bb, poniewa\u017c wszystkie zmiany testowali\u015bmy na pe\u0142nowymiarowych danych. <\/p>\n<p>\n<\/li>\n<li>\n<p>Pojawia si\u0119 kultura testowania, poniewa\u017c teraz nie trzeba czeka\u0107 godzinami na w\u0142asne \u015brodowisko. <\/p>\n<p>\n<\/li>\n<li>\n<p>Nie ma przeszk\u00f3d, nie ma oczekiwania mi\u0119dzy testami. Mo\u017cesz naprawd\u0119 p\u00f3j\u015b\u0107 i sprawdzi\u0107. A to b\u0119dzie lepsze, poniewa\u017c przyspieszymy rozw\u00f3j. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>B\u0119dzie mniej refaktoryzacji. Mniej b\u0142\u0119d\u00f3w trafi do produkcji. Refaktoryzujemy ich mniej p\u00f3\u017aniej. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017cemy odwraca\u0107 nieodwracalne zmiany. Tego nie ma w standardowych podej\u015bciach. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>To op\u0142acalne, poniewa\u017c dzielimy zasoby \u015brodowisk testowych. <\/li>\n<\/ol>\n<p><\/p>\n<p>Ju\u017c jest dobrze, a co jeszcze mogliby\u015bmy przyspieszy\u0107?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dzi\u0119ki takiemu systemowi mo\u017cemy znacznie obni\u017cy\u0107 pr\u00f3g wej\u015bcia do tego rodzaju testowania. <\/p>\n<p><\/p>\n<p>Obecnie mamy b\u0142\u0119dne ko\u0142o, gdzie deweloper, aby uzyska\u0107 dost\u0119p do prawdziwych, pe\u0142nowymiarowych danych, musi sta\u0107 si\u0119 ekspertem. Musi mu zosta\u0107 powierzony taki dost\u0119p. <\/p>\n<p><\/p>\n<p>Ale jak rosn\u0105\u0107, je\u015bli go nie ma? A co, je\u015bli masz dost\u0119p tylko do bardzo ma\u0142ego zestawu danych testowych? Wtedy nie zdob\u0119dziesz realnego do\u015bwiadczenia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak wyj\u015b\u0107 z tego kr\u0119gu? Jako pierwsze, wygodne dla deweloper\u00f3w na ka\u017cdym poziomie, wybrali\u015bmy bota Slack. Ale mo\u017ce to by\u0107 dowolny inny interfejs. <\/p>\n<p><\/p>\n<p>Co on pozwala robi\u0107? Mo\u017cna wzi\u0105\u0107 konkretne zapytanie i wys\u0142a\u0107 je do specjalnego kana\u0142u dla bazy danych. Automatycznie w ci\u0105gu sekund uruchomimy cienkiego klona. Wykonamy to zapytanie. Zbieramy metryki i rekomendacje. Poka\u017cemy wizualizacj\u0119. A nast\u0119pnie ten klon pozostanie, aby to zapytanie mo\u017cna by\u0142o w jaki\u015b spos\u00f3b zoptymalizowa\u0107, doda\u0107 indeksy itd. <\/p>\n<p><\/p>\n<p>Slack daje nam r\u00f3wnie\u017c mo\u017cliwo\u015bci wsp\u00f3\u0142pracy z pude\u0142ka. Poniewa\u017c to po prostu kana\u0142, mo\u017cna tam rozpocz\u0105\u0107 dyskusj\u0119 na temat tego zapytania, pingowa\u0107 swoich koleg\u00f3w, DBA, kt\u00f3rzy s\u0105 w firmie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednak s\u0105 te\u017c problemy. Poniewa\u017c to prawdziwy \u015bwiat i u\u017cywamy serwera, na kt\u00f3rym hostujemy od razu wiele klon\u00f3w, musimy ograniczy\u0107 ilo\u015b\u0107 pami\u0119ci i procesora, kt\u00f3re s\u0105 dost\u0119pne dla klon\u00f3w. <\/p>\n<p><\/p>\n<p>Aby te testy by\u0142y wiarygodne, musimy jako\u015b rozwi\u0105za\u0107 ten problem. <\/p>\n<p><\/p>\n<p>Oczywi\u015bcie wa\u017cnym punktem s\u0105 jednorodne dane. Ale to ju\u017c mamy. Chcemy uzyska\u0107 jednorodn\u0105 konfiguracj\u0119. I praktycznie tak\u0105 sam\u0105 konfiguracj\u0119 mo\u017cemy zaoferowa\u0107. <\/p>\n<p><\/p>\n<p>By\u0142oby fajnie mie\u0107 taki sam sprz\u0119t jak w produkcji, ale mo\u017ce si\u0119 on r\u00f3\u017cni\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przypomnijmy sobie, jak Postgres dzia\u0142a z pami\u0119ci\u0105. Mamy dwa buforowe pami\u0119ci. Jeden od systemu plik\u00f3w i jeden w\u0142asny Postgres, czyli Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Warto zauwa\u017cy\u0107, \u017ce Shared Buffer Cache jest alokowane podczas uruchamiania Postgresa w zale\u017cno\u015bci od tego, jaki rozmiar ustawisz w konfiguracji. <\/p>\n<p><\/p>\n<p>A druga pami\u0119\u0107 podr\u0119czna wykorzystywana jest w ca\u0142ej dost\u0119pnej przestrzeni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiedy robimy kilka klon\u00f3w na tej samej maszynie, stopniowo zape\u0142niamy pami\u0119\u0107. Odpowiednio, Shared Buffer Cache powinno stanowi\u0107 25% ca\u0142kowitej pami\u0119ci dost\u0119pnej na maszynie. <\/p>\n<p><\/p>\n<p>W rezultacie, je\u015bli nie zmienimy tego parametru, b\u0119dziemy w stanie uruchomi\u0107 na jednej maszynie tylko 4 instancje, tzn. tylko 4 takie cienkie klony. To oczywi\u015bcie nie jest dobre, poniewa\u017c chcieliby\u015bmy mie\u0107 ich o wiele wi\u0119cej. <\/p>\n<p><\/p>\n<p>Z drugiej strony, Buffer Cache jest u\u017cywane do wykonywania zapyta\u0144, do indeks\u00f3w, tzn. plan zale\u017cy od tego, jakiego rozmiaru mamy pami\u0119ci podr\u0119czne. Je\u015bli po prostu zmniejszymy ten parametr, to nasze plany mog\u0105 si\u0119 drastycznie zmieni\u0107.<\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, je\u015bli na prod mamy du\u017c\u0105 pami\u0119\u0107 podr\u0119czn\u0105, Postgres b\u0119dzie preferowa\u0142 korzystanie z indeksu. A je\u015bli nie, to wtedy nast\u0105pi SeqScan. I jaki by\u0142by sens, je\u015bli nasze plany nie by\u0142yby zgodne? <\/p>\n<p><\/p>\n<p>Dochodzi do tego, \u017ce w rzeczywisto\u015bci plan w Postgresie nie zale\u017cy od konkretnego rozmiaru ustawionego w Shared Buffer, lecz od effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (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 to zak\u0142adana wielko\u015b\u0107 pami\u0119ci podr\u0119cznej, kt\u00f3ra jest nam dost\u0119pna, tzn. suma Buffer Cache i pami\u0119ci podr\u0119cznej systemu plik\u00f3w. Jest to okre\u015blone w konfiguracji. I ta pami\u0119\u0107 nie jest alokowana. <\/p>\n<p><\/p>\n<p>Dzi\u0119ki temu parametrowi mo\u017cemy w pewien spos\u00f3b oszuka\u0107 Postgresa, m\u00f3wi\u0105c, \u017ce tak naprawd\u0119 mamy dost\u0119p do wielu danych, nawet je\u015bli tych danych nie posiadamy. W ten spos\u00f3b plany b\u0119d\u0105 ca\u0142kowicie zgodne z produkcj\u0105. <\/p>\n<p><\/p>\n<p>Jednak to mo\u017ce wp\u0142yn\u0105\u0107 na czas dzia\u0142ania. Optimzujemy zapytania pod k\u0105tem czasu, ale wa\u017cne jest, \u017ce czas dzia\u0142\u0105nia zale\u017cy od wielu czynnik\u00f3w: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Zale\u017cy od obci\u0105\u017cenia, kt\u00f3re aktualnie wyst\u0119puje na prod. <\/p>\n<p>\n<\/li>\n<li>\n<p>Zale\u017cy od specyfikacji samej maszyny. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Jest to wska\u017anik po\u015bredni, ale naprawd\u0119 mo\u017cemy optymalizowa\u0107 na podstawie ilo\u015bci danych, kt\u00f3re to zapytanie odczyta, aby uzyska\u0107 wynik. <\/p>\n<p><\/p>\n<p>Je\u015bli chcesz, aby czas reakcji by\u0142 zbli\u017cony do tego, co zobaczymy w prod, musimy wzi\u0105\u0107 jak najbardziej podobny sprz\u0119t, a by\u0107 mo\u017ce nawet wi\u0119cej, aby zmie\u015bci\u0107 wszystkie klony. Ale to jest kompromis, tj. otrzymasz te same plany, zobaczysz, ile danych przeczyta\u0142o konkretne zapytanie i b\u0119dziesz m\u00f3g\u0142 oceni\u0107 \u2013 to zapytanie jest dobre (lub migracja) czy z\u0142e, musi by\u0107 jeszcze zoptymalizowane. <\/p>\n<p><\/p>\n<p>Zobaczmy, jak dok\u0142adnie odbywa si\u0119 optymalizacja z Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We\u017amiemy zapytanie z rzeczywistego systemu. W tym przypadku baza danych ma 1 terabajt. I chcemy obliczy\u0107 liczb\u0119 \u015bwie\u017cych post\u00f3w, kt\u00f3re mia\u0142y wi\u0119cej ni\u017c 10 polubie\u0144. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wysy\u0142amy wiadomo\u015b\u0107 na kana\u0142, uruchomi\u0142 si\u0119 dla nas klon. I zobaczymy, \u017ce takie zapytanie b\u0119dzie dzia\u0142a\u0107 przez 2,5 minuty. To pierwsza rzecz, kt\u00f3r\u0105 zauwa\u017cymy.<\/p>\n<p><\/p>\n<p>Joe poka\u017ce automatyczne rekomendacje oparte na planie i metrykach. <\/p>\n<p><\/p>\n<p>Zobaczymy, \u017ce zapytanie przetwarza zbyt wiele danych, aby uzyska\u0107 wzgl\u0119dnie niewielk\u0105 liczb\u0119 wierszy. I potrzebny jest jaki\u015b specjalistyczny indeks, poniewa\u017c zauwa\u017cyli\u015bmy, \u017ce w zapytaniu jest zbyt wiele odfiltrowanych wierszy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przyjrzyjmy si\u0119 bli\u017cej, co si\u0119 wydarzy\u0142o. Rzeczywi\u015bcie, widzimy, \u017ce przeczytali\u015bmy prawie p\u00f3\u0142tora gigabajta danych z pami\u0119ci podr\u0119cznej dysku lub nawet z dysku. I to nie jest dobree, poniewa\u017c uzyskali\u015bmy tylko 142 wiersze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I wydawa\u0142oby si\u0119, \u017ce mamy tutaj skanowanie indeksu i powinno to dzia\u0142a\u0107 szybko, ale poniewa\u017c odfiltrowali\u015bmy zbyt wiele wierszy (musieli\u015bmy je policzy\u0107), wi\u0119c zapytanie dzia\u0142a\u0142o wolno. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I to si\u0119 zdarzy\u0142o w planie, poniewa\u017c warunki zapytania i warunki w indeksie cz\u0119\u015bciowo nie pasuj\u0105. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Spr\u00f3bujmy zrobi\u0107 indeks dok\u0142adniejszym i zobaczmy, jak zmieni si\u0119 wydajno\u015b\u0107 zapytania po tym. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tworzenie indeksu zaj\u0119\u0142o sporo czasu, ale teraz sprawdzamy zapytanie i widzimy, \u017ce czas zamiast 2,5 minuty wynosi tylko 156 milisekund, co jest ca\u0142kiem dobre. I czytamy tylko 6 megabajt\u00f3w danych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I teraz u\u017cywamy skanowania tylko indeksu.<\/p>\n<p><\/p>\n<p>Inn\u0105 wa\u017cn\u0105 kwesti\u0105 jest to, \u017ce chcemy przedstawi\u0107 plan w bardziej zrozumia\u0142y spos\u00f3b. Wprowadzili\u015bmy wizualizacj\u0119 za pomoc\u0105 Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To inne zapytanie, bardziej z\u0142o\u017cone. Flame Graphs tworzymy na podstawie dw\u00f3ch parametr\u00f3w: ilo\u015bci danych, kt\u00f3re konkretna w\u0119ze\u0142 w planie przeczyta\u0142a oraz czasu, tzn. czasu wykonania w\u0119z\u0142a. <\/p>\n<p><\/p>\n<p>Tutaj mo\u017cemy por\u00f3wnywa\u0107 konkretne w\u0119z\u0142y ze sob\u0105. B\u0119dzie jasne, kt\u00f3ry z nich zajmuje wi\u0119cej lub mniej miejsca, co zazwyczaj jest trudne do zrobienia w innych metodach wizualizacji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oczywi\u015bcie wszyscy znaj\u0105 explain.depesz.com. Dobrym atutem tej wizualizacji jest to, \u017ce zachowujemy tekstowy plan i r\u00f3wnie\u017c wyci\u0105gamy jakie\u015b g\u0142\u00f3wne parametry do tabeli, aby m\u00f3c je sortowa\u0107. <\/p>\n<p><\/p>\n<p>I programi\u015bci, kt\u00f3rzy jeszcze nie zag\u0142\u0119biali si\u0119 w ten temat, r\u00f3wnie\u017c korzystaj\u0105 z explain.depesz.com, poniewa\u017c dla nich \u0142atwiej zrozumie\u0107, jakie metryki s\u0105 wa\u017cne, a kt\u00f3re nie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jest nowe podej\u015bcie do wizualizacji - to explain.dalibo.com. Tworz\u0105 wizualizacj\u0119 drzewiast\u0105, ale tutaj bardzo trudno jest por\u00f3wnywa\u0107 w\u0119z\u0142y mi\u0119dzy sob\u0105. Mo\u017cna dobrze zrozumie\u0107 struktur\u0119, ale je\u015bli zapytanie jest du\u017ce, to trzeba b\u0119dzie przewija\u0107 tam i z powrotem, ale to te\u017c opcja. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Wsp\u00f3\u0142praca<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I, jak ju\u017c powiedzia\u0142em, Slack daje nam mo\u017cliwo\u015b\u0107 wsp\u00f3\u0142pracy. Na przyk\u0142ad, je\u015bli napotkali\u015bmy skomplikowane zapytanie, kt\u00f3re trudno zoptymalizowa\u0107, mo\u017cemy wyja\u015bni\u0107 ten problem w w\u0105tku na Slacku z naszymi kolegami. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatolij Stanisler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uwa\u017camy, \u017ce wa\u017cne jest testowanie na pe\u0142nowymiarowych danych. W tym celu stworzyli\u015bmy narz\u0119dzie Update Database Lab, kt\u00f3re jest dost\u0119pne w open source. Mo\u017cesz r\u00f3wnie\u017c u\u017cywa\u0107 bota Joe. Mo\u017cesz go wzi\u0105\u0107 ju\u017c teraz i zaimplementowa\u0107 u siebie. Wszystkie przewodniki s\u0105 tam dost\u0119pne. <\/p>\n<p><\/p>\n<p>Warto r\u00f3wnie\u017c zauwa\u017cy\u0107, \u017ce samo rozwi\u0105zanie nie jest rewolucyjne, poniewa\u017c istnieje Delphix, ale to jest rozwi\u0105zanie dla przedsi\u0119biorstw. Jest ca\u0142kowicie zamkni\u0119te i kosztuje bardzo du\u017co. My specjalizujemy si\u0119 w Postgres. To wszystko produkty open source. Do\u0142\u0105cz do nas! <\/p>\n<p><\/p>\n<p>Na tym ko\u0144cz\u0119. Dzi\u0119kuj\u0119!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Pytania<\/h2>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Dzi\u0119kuj\u0119 za prezentacj\u0119! Bardzo interesuj\u0105ce, szczeg\u00f3lnie dla mnie, poniewa\u017c rozwi\u0105zuj\u0119 podobne zadanie od pewnego czasu. Mam zatem szereg pyta\u0144. Mam nadziej\u0119, \u017ce przynajmniej cz\u0119\u015b\u0107 z nich zadam.<\/em><\/p>\n<p><\/p>\n<p><em>Ciekawe, jak obliczacie miejsce dla tego \u015brodowiska? Technologia zak\u0142ada, \u017ce przy okre\u015blonych okoliczno\u015bciach wasze klony mog\u0105 urosn\u0105\u0107 do maksymalnego rozmiaru. M\u00f3wi\u0105c wprost, je\u015bli macie dziesi\u0119cio-terabajtow\u0105 baz\u0119 danych i 10 klon\u00f3w, to \u0142atwo mo\u017cna sobie wyobrazi\u0107 sytuacj\u0119, w kt\u00f3rej ka\u017cdy klon b\u0119dzie zawiera\u0142 10 unikalnych danych. Jak obliczacie to miejsce, to znaczy t\u0119 delt\u0119, o kt\u00f3rej m\u00f3wili\u015bcie, w kt\u00f3rej b\u0119d\u0105 \u017cy\u0142y te klony?<\/em><\/p>\n<p><\/p>\n<p>Dobre pytanie. Wa\u017cne jest, aby \u015bledzi\u0107 konkretne klony. Je\u015bli klon wymaga zbyt du\u017cych zmian i zaczyna rosn\u0105\u0107, mo\u017cemy najpierw poinformowa\u0107 u\u017cytkownika o tym, albo natychmiast zatrzyma\u0107 ten klon, aby unikn\u0105\u0107 sytuacji awaryjnej. <\/p>\n<p><\/p>\n<p><em>Tak, mam dodatkowe pytanie. Jak zapewniacie cykl \u017cycia tych modu\u0142\u00f3w? Mamy z tym problem i to ca\u0142a osobna historia. Jak to dzia\u0142a?<\/em><\/p>\n<p><\/p>\n<p>Ka\u017cdy klon ma okre\u015blony ttl. Zasadniczo mamy sta\u0142y ttl. <\/p>\n<p><\/p>\n<p><em>Jaki, je\u015bli mo\u017cna zapyta\u0107?<\/em><\/p>\n<p><\/p>\n<p>1 godzina, czyli idle \u2013 1 godzina. Je\u015bli nie jest u\u017cywany, to go usuwamy. Ale tutaj nie ma nic dziwnego, poniewa\u017c mo\u017cemy uruchamia\u0107 klon w ci\u0105gu sekund. Je\u015bli b\u0119dzie znowu potrzebny, to \u2013 prosz\u0119 bardzo. <\/p>\n<p><\/p>\n<p><em>Ciekawi mnie r\u00f3wnie\u017c wyb\u00f3r technologii, poniewa\u017c my na przyk\u0142ad r\u00f3wnolegle wykorzystujemy kilka r\u00f3\u017cnych metod z r\u00f3\u017cnych powod\u00f3w. Dlaczego akurat ZFS? Dlaczego nie u\u017cyli\u015bcie LVM? Wspomnia\u0142e\u015b, \u017ce by\u0142y problemy z LVM. Jakie to by\u0142y problemy? Moim zdaniem, najbardziej optymalnym rozwi\u0105zaniem jest u\u017cycie macierzy dyskowej z punktu widzenia wydajno\u015bci.<\/em> <\/p>\n<p><\/p>\n<p><em>Jaka jest g\u0142\u00f3wna wada ZFS? To, \u017ce musisz uruchamia\u0107 j\u0105 na jednym ho\u015bcie, tzn. wszystkie instancje b\u0119d\u0105 dzia\u0142a\u0107 w ramach jednego systemu operacyjnego. W przypadku macierzy dyskowej mo\u017cesz pod\u0142\u0105cza\u0107 r\u00f3\u017cne urz\u0105dzenia. I w\u0105skim gard\u0142em s\u0105 tylko te blokady, kt\u00f3re znajduj\u0105 si\u0119 na macierzy. Interesuj\u0105ce jest pytanie dotycz\u0105ce wyboru technologii. Dlaczego nie LVM?<\/em><\/p>\n<p><\/p>\n<p>Mo\u017cemy om\u00f3wi\u0107 LVM na meetupie. Co do macierzy \u2013 to po prostu kosztowne. System ZFS mo\u017cemy wdro\u017cy\u0107 wsz\u0119dzie. Mo\u017cesz go uruchomi\u0107 na swoim komputerze. Mo\u017cesz po prostu pobra\u0107 repozytorium i zainstalowa\u0107. ZFS dzia\u0142a praktycznie wsz\u0119dzie, je\u015bli m\u00f3wimy o Linuksie. Oznacza to, \u017ce otrzymujemy bardzo elastyczne rozwi\u0105zanie. ZFS z pude\u0142ka oferuje wiele. Mo\u017cesz przechowywa\u0107 nieograniczon\u0105 ilo\u015b\u0107 danych, pod\u0142\u0105cza\u0107 du\u017c\u0105 liczb\u0119 dysk\u00f3w, s\u0105 zrzuty snapshota. I jak ju\u017c m\u00f3wi\u0142em, administracja jest bardzo prosta. To rozwi\u0105zanie wydaje si\u0119 bardzo przyjemne w u\u017cytkowaniu. Jest sprawdzone, ma wiele lat. Ma ogromne spo\u0142eczno\u015b\u0107, kt\u00f3ra si\u0119 rozwija. ZFS to bardzo niezawodne rozwi\u0105zanie. <\/p>\n<p><\/p>\n<p>Nikolaj Samochwa\u0142ow: Czy mog\u0119 jeszcze skomentowa\u0107? Nazywam si\u0119 Nikolaj, pracuj\u0119 razem z Anatolijem. Zgadzam si\u0119, \u017ce macierz to \u015bwietne rozwi\u0105zanie. I niekt\u00f3rzy z naszych klient\u00f3w maj\u0105 Pure Storage itd. <\/p>\n<p><\/p>\n<p>Anatolij s\u0142usznie zauwa\u017cy\u0142, \u017ce d\u0105\u017cymy do modularno\u015bci. W przysz\u0142o\u015bci mo\u017cemy zrealizowa\u0107 jeden interfejs \u2013 wykonaj zrzut, zr\u00f3b klon, zniszcz klon. To wszystko jest \u0142atwe. A macierz dyskowa jest \u015bwietna, je\u015bli jest dost\u0119pna.<\/p>\n<p><\/p>\n<p>Ale ZFS jest dost\u0119pny dla wszystkich. Ju\u017c wystarczy DelPhix, maj\u0105 300 klient\u00f3w. Z nich w Fortune 100 - 50 klient\u00f3w, tj. koncentruj\u0105 si\u0119 na NASA itd. Czas, aby ta technologia by\u0142a dost\u0119pna dla wszystkich. Dlatego mamy open source Core. Mamy cz\u0119\u015b\u0107 interfejsow\u0105, kt\u00f3ra nie jest open source. To jest platforma, kt\u00f3r\u0105 poka\u017cemy. Ale chcemy, aby by\u0142a dost\u0119pna dla ka\u017cdego. Chcemy zrewolucjonizowa\u0107, aby wszyscy testerzy przestali zgadywa\u0107 na laptopach. Musimy pisa\u0107 SELECT i od razu widzie\u0107, \u017ce jest wolny. Do\u015b\u0107 czekania, a\u017c DBA o tym powie. To jest nasz g\u0142\u00f3wny cel. I my\u015bl\u0119, \u017ce wszyscy do tego dojdziemy. I ten element robimy, aby by\u0142 dost\u0119pny dla wszystkich. Dlatego ZFS, poniewa\u017c b\u0119dzie dost\u0119pny wsz\u0119dzie. Dzi\u0119kuj\u0119 spo\u0142eczno\u015bci za rozwi\u0105zywanie problem\u00f3w i za to, \u017ce maj\u0105 licencj\u0119 open source itd. <\/p>\n<p><\/p>\n<p><em>Witaj! Dzi\u0119kuj\u0119 za prezentacj\u0119! Nazywam si\u0119 Maksym. Mieli\u015bmy podobne problemy. U siebie je rozwi\u0105zali\u015bmy. Jak dzielicie zasoby mi\u0119dzy tymi klonami? Ka\u017cdy klon w ka\u017cdej chwili mo\u017ce robi\u0107 swoje: jeden testuje co\u015b innego, inny co\u015b innego, kto\u015b buduje indeks, kto\u015b inny ma ci\u0119\u017ck\u0105 prac\u0119. I je\u015bli mo\u017cna podzieli\u0107 po CPU, to jak dzielicie po IO? To jest pierwsze pytanie.<\/em><\/p>\n<p><\/p>\n<p><em>A drugie pytanie dotyczy r\u00f3\u017cnorodno\u015bci \u015brodowisk. Za\u0142\u00f3\u017cmy, \u017ce tu mam ZFS i wszystko jest \u015bwietnie, a klient na produkcji nie ma ZFS, tylko ext4, na przyk\u0142ad. Jak w takim przypadku?<\/em><\/p>\n<p><\/p>\n<p>Bardzo dobre pytania. Troch\u0119 wspomnia\u0142em o tym problemie z dzieleniem zasob\u00f3w. Rozwi\u0105zanie jest nast\u0119puj\u0105ce. Wyobra\u017a sobie, \u017ce testujesz na staging. Mo\u017ce si\u0119 zdarzy\u0107, \u017ce kto\u015b obci\u0105\u017ca jeden zas\u00f3b, a kto\u015b inny inny. I w rezultacie widzisz nieczytelne metryki. Taki sam problem mo\u017ce wyst\u0105pi\u0107 na produkcji. Kiedy chcesz sprawdzi\u0107 zapytanie i widzisz, \u017ce jest z nim jaki\u015b problem \u2013 dzia\u0142a wolno, to w rzeczywisto\u015bci problem nie by\u0142 w zapytaniu, a w tym, \u017ce jest jakie\u015b r\u00f3wnoleg\u0142e obci\u0105\u017cenie. <\/p>\n<p><\/p>\n<p>Dlatego wa\u017cne jest, aby skupi\u0107 si\u0119 na tym, jaki b\u0119dzie plan, jakie kroki podejmiemy w ramach planu i ile danych b\u0119dziemy musieli przetworzy\u0107. To, \u017ce nasze dyski b\u0119d\u0105 obci\u0105\u017cone, wp\u0142ynie na harmonogram. Mo\u017cemy jednak oceni\u0107 stopie\u0144 obci\u0105\u017cenia zapytania po ilo\u015bci danych. Nie ma znaczenia, co jeszcze b\u0119dzie wykonywane jednocze\u015bnie. <\/p>\n<p><\/p>\n<p><em>Mam dwa pytania. To naprawd\u0119 \u015bwietna rzecz. Czy by\u0142y przypadki, gdy dane produkcyjne by\u0142y krytycznie wa\u017cne, na przyk\u0142ad numery kart kredytowych? Czy jest ju\u017c co\u015b gotowego, czy to osobne zadanie? I drugie pytanie \u2013 czy jest co\u015b takiego dla MySQL?<\/em><\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o dane. B\u0119dziemy stosowa\u0107 obfuskacj\u0119, dop\u00f3ki tego nie zrobimy. Ale je\u015bli wdra\u017casz Joe i nie udost\u0119pniasz dost\u0119pu programistom, nie ma dost\u0119pu do danych. Dlaczego? Poniewa\u017c Joe nie pokazuje danych. Pokazuje tylko metryki, plany i tyle. Zosta\u0142o to specjalnie zaprojektowane, poniewa\u017c jest to jedno z wymaga\u0144 naszego klienta. Chcieli mie\u0107 mo\u017cliwo\u015b\u0107 optymalizacji, ale nie udost\u0119pnia\u0107 dost\u0119pu wszystkim. <\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o MySQL. Ten system mo\u017cna wykorzysta\u0107 do dowolnych cel\u00f3w, kt\u00f3re przechowuj\u0105 stan na dysku. Poniewa\u017c zajmujemy si\u0119 Postgres, w pierwszej kolejno\u015bci automatyzujemy wszystko dla Postgres. Chcemy zautomatyzowa\u0107 pozyskiwanie danych z kopii zapasowej. Prawid\u0142owo konfiguruje Postgres. Wiemy, jak dopasowa\u0107 plany itd. <\/p>\n<p><\/p>\n<p>Jednak poniewa\u017c system jest rozszerzalny, b\u0119dzie mo\u017cna go r\u00f3wnie\u017c wykorzysta\u0107 dla MySQL. S\u0105 takie przyk\u0142ady. Podobne rozwi\u0105zanie ma Yandex, ale nie publikuje go nigdzie. U\u017cywaj\u0105 go wewn\u0119trznie w Yandex.Metryce. I to jest w\u0142a\u015bnie historia zwi\u0105zana z MySQL. Ale technologie s\u0105 takie same, ZFS. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za wyk\u0142ad! Mam r\u00f3wnie\u017c kilka pyta\u0144. Wspomnia\u0142e\u015b, \u017ce klonowanie mo\u017cna wykorzysta\u0107 do analityki, na przyk\u0142ad do budowania dodatkowych indeks\u00f3w. Czy mo\u017cesz nieco bardziej szczeg\u00f3\u0142owo opowiedzie\u0107, jak to dzia\u0142a?<\/em><\/p>\n<p><\/p>\n<p><em>I od razu zadam drugie pytanie dotycz\u0105ce jednorodno\u015bci stanowisk i plan\u00f3w. Plan zale\u017cy cz\u0119\u015bciowo od statystyk zbieranych przez Postgres. Jak rozwi\u0105zujecie ten problem?<\/em><\/p>\n<p><\/p>\n<p>Nie ma analizy konkretnych przypadk\u00f3w, poniewa\u017c jeszcze tak nie korzystali\u015bmy, ale taka mo\u017cliwo\u015b\u0107 istnieje. Je\u015bli m\u00f3wimy o indeksach, wyobra\u017acie sobie, \u017ce zapytanie jest wykonywane na tabeli z setkami milion\u00f3w rekord\u00f3w i w kolumnie, kt\u00f3ra zwykle nie jest indeksowana w prod. A my chcemy obliczy\u0107 jakie\u015b dane. Je\u015bli to zapytanie zostanie wykonane w prod, istnieje mo\u017cliwo\u015b\u0107, \u017ce w prod wyst\u0105pi przest\u00f3j, poniewa\u017c zapytanie b\u0119dzie si\u0119 tam wykonywa\u0107 przez minut\u0119. <\/p>\n<p><\/p>\n<p>Ok, zr\u00f3bmy cienk\u0105 kopi\u0119, kt\u00f3rej nie b\u0119dzie strasznie zatrzyma\u0107 na kilka minut. A aby \u0142atwiej by\u0142o liczy\u0107 analityk\u0119, dodamy indeksy do tych kolumn, kt\u00f3re nas interesuj\u0105. <\/p>\n<p><\/p>\n<p><em>Czy indeks b\u0119dzie tworzony za ka\u017cdym razem?<\/em><\/p>\n<p><\/p>\n<p>Mo\u017cna to zrobi\u0107 tak, \u017ce dotkniemy danych, zrobimy zrzuty, a potem z tego zrzutu b\u0119dziemy si\u0119 odbudowywa\u0107 i wykonywa\u0107 nowe zapytania. Tzn. mo\u017cna zrobi\u0107 tak, \u017ce uda si\u0119 podnie\u015b\u0107 nowe klony z ju\u017c ustawionymi indeksami.<\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o kwesti\u0119 statystyki, to je\u015bli odbudowujemy si\u0119 z kopii zapasowej, je\u015bli robimy replikacj\u0119, to nasza statystyka b\u0119dzie dok\u0142adnie taka sama. Poniewa\u017c mamy ca\u0142kowit\u0105 fizyczn\u0105 struktur\u0119 danych, tzn. przyniesiemy dane, jakie s\u0105, ze wszystkimi metrykami statystyk r\u00f3wnie\u017c. <\/p>\n<p><\/p>\n<p>Tutaj jest inny problem. Je\u015bli u\u017cywane jest rozwi\u0105zanie w chmurze, to dost\u0119pne s\u0105 tylko zrzuty logiczne, poniewa\u017c Google, Amazon nie pozwala na wzi\u0119cie fizycznej kopii. Tam pojawi si\u0119 taki problem. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119. Pojawi\u0142y si\u0119 dwa dobre pytania dotycz\u0105ce MySQL i podzia\u0142u zasob\u00f3w. Ale w zasadzie wszystko sprowadza si\u0119 do tego, \u017ce to jest temat nie konkretnych DBMS, ale w og\u00f3le systemu plik\u00f3w. I odpowiednio pytania dotycz\u0105ce podzia\u0142u zasob\u00f3w r\u00f3wnie\u017c powinny by\u0107 rozwi\u0105zywane stamt\u0105d, nie na ko\u0144cu, \u017ce to Postgres, ale w systemie plik\u00f3w, w <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/dts-dronten\/\"   title=\"serwerze\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">serwerze<\/a>, w instancji.<\/em> <\/p>\n<p><\/p>\n<p><em>Moje pytanie dotyczy nieco innej kwestii. Jest bardziej zwi\u0105zane z wielowarstwowo\u015bci\u0105 bazy danych, w kt\u00f3rej jest kilka warstw. Na przyk\u0142ad skonfigurowali\u015bmy aktualizacj\u0119 dziesi\u0119cio terabajtowego obrazu, mamy replikacj\u0119. I konkretne rozwi\u0105zanie wykorzystujemy dla baz danych. Trwa replikacja, odbywa si\u0119 aktualizacja danych. R\u00f3wnocze\u015bnie pracuje 100 pracownik\u00f3w, kt\u00f3rzy ci\u0105gle uruchamiaj\u0105 te r\u00f3\u017cne zrzuty. Co robi\u0107? Jak zrobi\u0107, aby nie by\u0142o konfliktu, \u017ce uruchomili to jedno, a potem system plik\u00f3w si\u0119 zmieni\u0142, i te zrzuty si\u0119 zepsu\u0142y?<\/em> <\/p>\n<p><\/p>\n<p>Nie b\u0119d\u0105 je\u017adzi\u0107, poniewa\u017c tak dzia\u0142a ZFS. Mo\u017cemy osobno przechowywa\u0107 w jednym strumieniu zmiany systemu plik\u00f3w, kt\u00f3re przychodz\u0105 dzi\u0119ki replikacji. I na starszych wersjach danych trzyma\u0107 klony, kt\u00f3re u\u017cywaj\u0105 programi\u015bci. I to u nas dzia\u0142a, wszystko w porz\u0105dku.<\/p>\n<p><\/p>\n<p><em>Wygl\u0105da na to, \u017ce aktualizacja b\u0119dzie zachodzi\u0107 jako dodatkowa warstwa, a wszystkie nowe migawki b\u0119d\u0105 pochodzi\u0107 ju\u017c z tej warstwy, prawda?<\/em> <\/p>\n<p><\/p>\n<p>Z wcze\u015bniejszych warstw, kt\u00f3re pochodzi\u0142y z poprzednich replikacji. <\/p>\n<p><\/p>\n<p><em>Poprzednie warstwy odpadn\u0105, ale b\u0119d\u0105 odwo\u0142ywa\u0107 si\u0119 do starej warstwy, a nowe obrazy b\u0119d\u0105 pobierane z ostatniej warstwy, kt\u00f3ra zosta\u0142a uzyskana w aktualizacji?<\/em><\/p>\n<p><\/p>\n<p>Generalnie tak. <\/p>\n<p><\/p>\n<p><em>W takim razie, jako skutek, b\u0119dziemy mieli mn\u00f3stwo warstw. I z czasem trzeba je b\u0119dzie kompresowa\u0107?<\/em><\/p>\n<p><\/p>\n<p>Tak, dok\u0142adnie. Istnieje pewne okno. Zachowujemy tygodniowe migawki. To zale\u017cy od tego, jakie masz zasoby. Je\u015bli masz mo\u017cliwo\u015b\u0107 przechowywania du\u017cych ilo\u015bci danych, mo\u017cna d\u0142ugo przechowywa\u0107 migawki. One same si\u0119 nie usun\u0105. Nie b\u0119dzie \u017cadnej utraty danych. Je\u015bli migawki si\u0119 zestarzej\u0105, jak nam si\u0119 wydaje, tzn. to zale\u017cy od polityki w firmie, to po prostu mo\u017cemy je usun\u0105\u0107 i zwolni\u0107 miejsce. <\/p>\n<p><\/p>\n<p><em>Dzie\u0144 dobry, dzi\u0119kuj\u0119 za prezentacj\u0119! Co do pytania Joe. Powiedzia\u0142e\u015b, \u017ce klient nie chcia\u0142 dawa\u0107 wszystkim dost\u0119pu do danych. \u015acis\u0142e m\u00f3wi\u0105c, je\u015bli kto\u015b ma wynik Explain Analyze, to mo\u017ce podgl\u0105da\u0107 dane.<\/em> <\/p>\n<p><\/p>\n<p>Tak, dok\u0142adnie. Na przyk\u0142ad, mo\u017cemy napisa\u0107: \u201eSELECT FROM WHERE email = co\u015b tam\u201d. Tzn. nie zobaczymy samych danych, ale mo\u017cemy zobaczy\u0107 jakie\u015b po\u015brednie wska\u017aniki. To trzeba rozumie\u0107. Z drugiej strony wszystko to jest widoczne. Mamy audyt log\u00f3w, mamy kontrol\u0119 innych koleg\u00f3w, kt\u00f3rzy r\u00f3wnie\u017c widz\u0105, co robi\u0105 programi\u015bci. I je\u015bli kto\u015b spr\u00f3buje tak zrobi\u0107, to do nich przyjdzie s\u0142u\u017cba bezpiecze\u0144stwa i zajmie si\u0119 tym problemem. <\/p>\n<p><\/p>\n<p><em>Dzie\u0144 dobry! Dzi\u0119kuj\u0119 za prezentacj\u0119! Mam kr\u00f3tkie pytanie. Je\u015bli w firmie nie u\u017cywa si\u0119 Slacka, to czy teraz jest do niego jakie\u015b powi\u0105zanie, czy mo\u017cna dla programist\u00f3w uruchomi\u0107 instancje, aby pod\u0142\u0105czy\u0107 do baz testow\u0105 aplikacj\u0119?<\/em><\/p>\n<p><\/p>\n<p>Obecnie istnieje integracja z Slackiem, tzn. nie ma \u017cadnego innego komunikatora, ale bardzo chcia\u0142bym wprowadzi\u0107 wsparcie dla innych komunikator\u00f3w. Co mo\u017cesz zrobi\u0107? Mo\u017cesz uruchomi\u0107 u siebie DB Lab bez Joe, korzystaj\u0105c z REST API lub naszej platformy, tworzy\u0107 klony i pod\u0142\u0105cza\u0107 si\u0119 do PSQL. Tak mo\u017cna to zrobi\u0107, je\u015bli jeste\u015b got\u00f3w da\u0107 swoim programistom dost\u0119p do danych, poniewa\u017c ju\u017c nie b\u0119dzie tutaj ekranu. <\/p>\n<p><\/p>\n<p><em>Nie potrzebuj\u0119 tej warstwy, ale potrzebna mi taka mo\u017cliwo\u015b\u0107.<\/em><\/p>\n<p><\/p>\n<p>W takim razie \u2013 tak, to mo\u017cna zrobi\u0107.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47 DBA-bot Joe. Anatolij Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}