{"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\/hr\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"DBA bot Joe. Anatolij Stanmler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kako backend developer zna da \u0107e SQL upit dobro raditi na \"produkciji\"? U velikim ili brzo rastu\u0107im kompanijama pristup \"produkciji\" nije dostupan svima. \u010cak i s pristupom, nije mogu\u0107e svakog upita bezbolno testirati, a kreiranje kopije baze podataka \u010desto traje satima. Da bismo rije\u0161ili te probleme, stvorili smo umjetnog DBA - Joe. Ve\u0107 je uspje\u0161no implementiran u nekoliko kompanija i poma\u017ee brojnim developerima. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f913081905dc4e15aeed783\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pozdrav svima! Moje ime je Anatolij Stansler. Radim u kompaniji <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Bavimo se time da ubrzavamo proces razvoja, eliminiraju\u0107i ka\u0161njenja povezana s radom Postgres-a za developere, DBA i QA.<\/p>\n<p><\/p>\n<p>Imamo fantasti\u010dne klijente i danas \u0107e dio izlaganja biti posve\u0107en slu\u010dajevima s kojima smo se susreli u radu s njima. Ispri\u010dat \u0107u kako smo im pomogli u rje\u0161avanju prili\u010dno ozbiljnih problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kada radimo na razvoju i provodimo slo\u017eene migracije, postavljamo si pitanje: \"Ho\u0107e li ova migracija uspjeti?\". Koristimo revizije, oslanjamo se na znanje iskusnijih kolega, DBA stru\u010dnjaka. Oni mogu re\u0107i \u2013 ho\u0107e li uspjeti ili ne. <\/p>\n<p><\/p>\n<p>Ali, mo\u017eda bi bilo bolje da mo\u017eemo sami testirati to na punim kopijama. Danas \u0107emo govoriti o trenutnim pristupima testiranju i kako to bolje raditi te s kojim alatima. Tako\u0111er \u0107emo razgovarati o plusovima i minusima takvih pristupa te \u0161to mo\u017eemo ovdje pobolj\u0161ati. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tko je ikada pravio indekse ili unosio neke promjene direktno na produkciji? Prili\u010dno mnogo. A kod koga je to dovelo do gubitka podataka ili zastoja? Ako ste to do\u017eivjeli, poznajete tu bol. Hvala Bogu, imamo sigurnosne kopije. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prvi pristup je testiranje na produkciji. Ili kada developer sjedi s lokalnog ra\u010dunala, ima testne podatke, postoji neka ograni\u010dena uzorak. I postavljamo to na produkciju, i dobivamo takvu situaciju.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (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 je skupo. Vjerojatno je bolje da se to ne radi. <\/p>\n<p><\/p>\n<p>Kako to bolje uraditi? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hajde da uzmemo staging i dodijelimo joj dio produkcije. Ili u najboljem slu\u010daju, uzmimo pravi produkciju, sve podatke. Nakon \u0161to smo lokalno razvili, dodatno \u0107emo provjeravati i na stagingu. <\/p>\n<p><\/p>\n<p>To \u0107e nam omogu\u0107iti da eliminiramo neke gre\u0161ke, tj. da ih ne dopustimo na produkciji. <\/p>\n<p><\/p>\n<p>Koji su problemi? <\/p>\n<p><\/p>\n<ul>\n<li>Problem je u tome \u0161to ovaj staging dijelimo s kolegama. I vrlo \u010desto se dogodi da napravi\u0161 neku promjenu, bum \u2013 nema podataka, rad je uzaludan. Staging je bio vi\u0161eterabajtni. I potrebno je dugo \u010dekati da se ponovno podigne. I odlu\u010dujemo to doraditi sutra. Sve, razvoj nam je stao. <\/li>\n<li>I, naravno, imamo puno kolega koji rade, puno timova. I treba ru\u010dno usugla\u0161avati. A to nije prakti\u010dno. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I treba re\u0107i da imamo samo jedan poku\u0161aj, jedan hitac, ako \u017eelimo unijeti neke promjene u bazu podataka, dotaknuti podatke, promijeniti strukturu. I ako ne\u0161to krene po zlu, ako je bila gre\u0161ka u migraciji, brza povratka vi\u0161e nema. <\/p>\n<p><\/p>\n<p>To je bolje od prethodnog pristupa, ali jo\u0161 uvijek postoji velika vjerojatnost da \u0107e neka gre\u0161ka oti\u0107i na produkciju.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160to nas sprje\u010dava da svakom programeru damo testni stalak, punu kopiju? Mislim da je jasno \u0161to nas sprje\u010dava. <\/p>\n<p><\/p>\n<p>Tko ima bazu podataka ve\u0107u od terabajta? Vi\u0161e od polovice dvorane. <\/p>\n<p><\/p>\n<p>I jasno je da odr\u017eavati ma\u0161ine za svakog programera, kada postoji tako velika produkcija, jako je skupo, a osim toga i dugo. <\/p>\n<p><\/p>\n<p>Imamo klijente koji su shvatili da je jako va\u017eno sve promjene testirati na punim kopijama, ali imaju baze manje od terabajta, a resursa da za svakog programera dr\u017ee testni stalak nema. Stoga moraju preuzimati dumpove lokalno na svoje strojeve i testirati na taj na\u010din. To traje puno vremena. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010cak i ako to radite unutar infrastrukture, preuzeti jedan terabajt podataka po satu \u2013 to je ve\u0107 jako dobro. Ali oni koriste logi\u010dke dumpove, preuzimaju lokalno iz clouda. Za njih je brzina oko 200 gigabajta po satu. I treba jo\u0161 vremena da se iz logi\u010dkog dumpa obrade indeksi itd.<\/p>\n<p><\/p>\n<p>Ali koriste taj pristup jer omogu\u0107uje odr\u017eavanje prodajnog sustava pouzdanim. <\/p>\n<p><\/p>\n<p>\u0160to mo\u017eemo u\u010diniti ovdje? Hajde da u\u010dinimo da testni stalci budu jeftini i da svakom programeru damo svoj vlastiti testni stalak.<\/p>\n<p><\/p>\n<p>I to je mogu\u0107e. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U ovom pristupu, kada pravimo tanke klonove za svakog programera, mo\u017eemo to podijeliti na jednoj ma\u0161ini. Na primjer, ako imate bazu podataka od \u010detiri terabajta i \u017eelite je dati deset programera, ne trebate imati deset puta po \u010detiri terabajta. Dovoljna vam je jedna ma\u0161ina za stvaranje tankih izoliranih kopija za svakog programera, koriste\u0107i samo jednu ma\u0161inu. Kako to funkcionira, objasnit \u0107u malo kasnije. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stvarni primjer:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Baza podataka \u2013 4,5 terabajta. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017eemo dobiti neovisne kopije u 30 sekundi. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Nema potrebe \u010dekati testno okru\u017eenje ili ovisiti o tome kakvih je veli\u010dina. Mo\u017eete ga dobiti za nekoliko sekundi. To \u0107e biti potpuno izolirana okru\u017eenja, ali koja dijele podatke me\u0111usobno. <\/p>\n<p><\/p>\n<p>To je sjajno. Ovdje govorimo o magiji i paralelnom svemiru. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U na\u0161em slu\u010daju to funkcionira pomo\u0107u sustava OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS je copy-on-write datote\u010dni sustav koji iz kutije podr\u017eava snapshote i klonove. Pouzdan je i skalabilan. Vrlo je lako njime upravljati. Mo\u017ee se postaviti doslovno s dvije naredbe. <\/p>\n<p><\/p>\n<p>Postoje druge opcije:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Sustavi pohrane podataka (npr. Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab o kojem govorim je modularan. Mo\u017ee se implementirati kori\u0161tenjem takvih opcija. No, trenutno smo se fokusirali na OpenZFS jer su konkretno s LVM bilo problema. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kako to funkcionira? Umjesto da prepisujemo podatke svaki put kada ih mijenjamo, zadr\u017eavamo ih samo ozna\u010davaju\u0107i da su ti novi podaci povezani s novim trenutkom vremena, s novim snapshotom. <\/p>\n<p><\/p>\n<p>I kada \u017eelimo vratiti ili kada \u017eelimo napraviti novi klon s nekom starijom verzijom, jednostavno ka\u017eemo: \"U redu, dajte nam te blokove podataka koji su tako ozna\u010deni.\" <\/p>\n<p><\/p>\n<p>I taj korisnik \u0107e raditi s tim skupom podataka. Postupno \u0107e ih mijenjati, izra\u0111ivati svoje snapshote. <\/p>\n<p><\/p>\n<p>I imat \u0107emo grananje. Svaki programer u na\u0161em slu\u010daju \u0107e imati mogu\u0107nost imati svoj vlastiti klon koji ure\u0111uje, a zajedni\u010dki podaci \u0107e se dijeliti me\u0111u svima. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da biste postavili takav sustav kod sebe, potrebno je rije\u0161iti dva problema: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Prvi je izvor podataka s kojeg \u0107ete ih uzimati. Mo\u017eete postaviti replikaciju s produkcijom. Mo\u017eete koristiti ve\u0107 postoje\u0107e sigurnosne kopije koje ste postavili, nadam se. WAL-E, WAL-G ili Barman. \u010cak i ako koristite neko Cloud rje\u0161enje, poput RDS-a ili Cloud SQL-a, mo\u017eete koristiti logi\u010dke isje\u010dke. No, ipak vam savjetujemo da koristite sigurnosne kopije, jer \u0107ete ovakvim pristupom zadr\u017eati i fizi\u010dku strukturu datoteka, \u0161to \u0107e omogu\u0107iti bli\u017ee pra\u0107enje metrika koje biste vidjeli na produkciji, kako biste otkrili probleme koji postoje. <\/p>\n<p>\n<\/li>\n<li>\n<p>Drugo je mjesto gdje \u017eelite hostati Database Lab. To mo\u017ee biti Cloud, mo\u017ee biti On-premise. Va\u017eno je napomenuti da ZFS podr\u017eava kompresiju podataka. I to radi prili\u010dno dobro. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Zamislite da \u0107e svaki od tih klonova, ovisno o operacijama koje provodimo s bazom, pove\u0107ati neki dev prostor. Za taj dev tako\u0111er \u0107e biti potrebno mjesta. No, budu\u0107i da smo uzeli bazu od 4,5 terabajta, ZFS \u0107e je komprimirati na 3,5 terabajta. Ovisno o postavkama, to se mo\u017ee varirati. I jo\u0161 uvijek \u0107emo imati mjesta za dev. <\/p>\n<p><\/p>\n<p>Takav sustav se mo\u017ee koristiti za razli\u010dite slu\u010dajeve. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Ovo su programeri, DBA za testiranje upita, za optimizaciju. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017ee se koristiti u QA testiranju za provjeru konkretne migracije prije nego \u0161to to postavimo u prod. Tako\u0111er mo\u017eemo podi\u0107i posebna okru\u017eenja za QA s pravim podacima, gdje mogu testirati nove funkcionalnosti. I to \u0107e trajati sekunde umjesto da \u010dekate sate, a mo\u017eda i dane u nekim drugim slu\u010dajevima gdje se ne koriste tanke kopije. <\/p>\n<p>\n<\/li>\n<li>\n<p>I jo\u0161 jedan poseban slu\u010daj. Ako u kompaniji nije postavljen analiti\u010dki sustav, mo\u017eemo odvojiti tanki klon proizvodne baze i dodati ga za du\u017ee upite ili specijalne indekse koji se mogu koristiti u analitici.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S ovakvim pristupom:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Niska vjerojatnost gre\u0161aka na \u2018produkciji\u2019, jer smo sve promjene testirali na punim podacima. <\/p>\n<p>\n<\/li>\n<li>\n<p>Pojavljuje nam se kultura testiranja, jer vi\u0161e nije potrebno satima \u010dekati svoj vlastiti stan. <\/p>\n<p>\n<\/li>\n<li>\n<p>I nema prepreka, nema \u010dekanja izme\u0111u testiranja. Stvarno mo\u017eete i\u0107i i provjeriti. I tako \u0107e biti bolje, jer \u0107emo ubrzati razvoj. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Bit \u0107e manje refaktoriranja. Manje gre\u0161aka \u0107e dospjeti u prod. Manje \u0107e ih biti potrebno refaktorirati kasnije. <\/p>\n<p>\n<\/li>\n<li>\n<p>Mo\u017eemo obavljati nepovratne promjene. To nije prisutno u standardnim pristupima. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>To je isplativo jer dijelimo resurse testnih okru\u017eenja. <\/li>\n<\/ol>\n<p><\/p>\n<p>Ve\u0107 je dobro, \u0161to jo\u0161 mo\u017eemo ubrzati?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zahvaljuju\u0107i takvom sustavu, mo\u017eemo znatno smanjiti prag ulaska u takvo testiranje. <\/p>\n<p><\/p>\n<p>Trenutno imamo za\u010darani krug gdje programer, kako bi dobio pristup stvarnim, punim podacima, mora postati stru\u010dnjak. Mogu mu povjeriti takav pristup. <\/p>\n<p><\/p>\n<p>Ali kako rasti, ako toga nema? A \u0161to ako ti je dostupan samo vrlo mali skup testnih podataka? Tada ne mo\u017ee\u0161 ste\u0107i stvarno iskustvo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kako iza\u0107i iz tog kruga? Kao prvi su\u010delje, prikladno za programere svih razina, odabrali smo Slack-bota. No, to mo\u017ee biti bilo koje drugo su\u010delje. <\/p>\n<p><\/p>\n<p>\u0160to omogu\u0107uje? Mo\u017ee\u0161 uzeti konkretan upit i poslati ga u poseban kanal za bazu podataka. Automatski \u0107emo u sekundi rasporediti tanu\u0161ni klon. Izvr\u0161it \u0107emo taj upit. Prikupit \u0107emo metrike i preporuke. Prikazat \u0107emo vizualizaciju. A dalje \u0107e taj klon ostati kako bi se taj upit mogao optimizirati, dodati indeksi itd. <\/p>\n<p><\/p>\n<p>I tako\u0111er, Slack nam pru\u017ea mogu\u0107nosti za suradnju iz kutije. Budu\u0107i da je to samo kanal, mo\u017ee\u0161 odmah tamo u threadu za taj upit zapo\u010deti raspravu o tom upitu, pingaju\u0107i svoje kolege, DBA-e koji su unutar tvrtke. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No, naravno, postoje i problemi. Budu\u0107i da je to stvarni svijet, i koristimo poslu\u017eitelj na kojem odmah hostamo mnogo klonova, moramo smanjiti koli\u010dinu memorije i procesorske snage koja je dostupna klonovima. <\/p>\n<p><\/p>\n<p>Ali kako bi ti testovi bili vjerodostojni, potrebno je nekako rije\u0161iti taj problem. <\/p>\n<p><\/p>\n<p>Jasno je da je va\u017ean moment imati jednake podatke. No, to ve\u0107 imamo. I \u017eelimo posti\u0107i jednake konfiguracije. I mo\u017eemo dati prakti\u010dki jednake konfiguracije. <\/p>\n<p><\/p>\n<p>Bilo bi super imati istu opremu kao na produkciji, ali ona se mo\u017ee razlikovati. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podsjetimo se kako Postgres radi s memorijom. Imamo dvije predmemorije. Jedna je od datote\u010dnog sustava, a druga je vlastita Postgres, tj. Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Va\u017eno je napomenuti da se Shared Buffer Cache alocira pri pokretanju Postgresa ovisno o veli\u010dini koju postavite u konfiguraciji. <\/p>\n<p><\/p>\n<p>A drugi ke\u0161 koristi sav dostupan prostor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kada pravimo vi\u0161e klonova na jednom stroju, postupno ispunjavamo memoriju. I idealno, Shared Buffer Cache trebao bi biti 25% od ukupne memorije dostupne na stroju. <\/p>\n<p><\/p>\n<p>Tako da, ako ne promijenimo ovaj parametar, mo\u017eemo pokrenuti samo 4 instance na jednom stroju, odnosno samo 4 takva jednostavna klona. To je, naravno, lo\u0161e jer \u017eelimo imati mnogo vi\u0161e. <\/p>\n<p><\/p>\n<p>S druge strane, Buffer Cache koristi se za izvr\u0161avanje upita, za indekse, tj. plan ovisi o veli\u010dini na\u0161ih ke\u0161eva. Ako samo smanjimo ovaj parametar, planovi se mogu zna\u010dajno promijeniti.<\/p>\n<p><\/p>\n<p>Na primjer, ako imamo veliki ke\u0161 na prodaji, Postgres \u0107e preferirati kori\u0161tenje indeksa. A ako ne, tada \u0107e do\u0107i do SeqScan-a. I kakav bi imalo smisao ako se na\u0161i planovi ne bi podudarali? <\/p>\n<p><\/p>\n<p>Ali dolazimo do rje\u0161enja da plan u Postgresu zapravo ne ovisi o konkretnoj veli\u010dini zadanog u Shared Buffer-u, nego o effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (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 je predvi\u0111eni volumen ke\u0161a koji nam je dostupan, tj. zbroj Buffer Cache-a i ke\u0161a datote\u010dnog sustava. To je zadano u konfiguraciji. I ta memorija se ne alocira. <\/p>\n<p><\/p>\n<p>Zahvaljuju\u0107i ovom parametru mo\u017eemo na neki na\u010din obmanuti Postgres, re\u0107i mu da nam je zapravo dostupno mnogo podataka, \u010dak i ako tih podataka nemamo. Tako \u0107e se planovi potpuno podudarati s produkcijom. <\/p>\n<p><\/p>\n<p>I to mo\u017ee utjecati na vrijeme izvr\u0161avanja. Optimiziramo upite prema vremenu, ali va\u017eno je da vrijeme ovisi o mnogim faktorima: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Ovisi o optere\u0107enju koje trenutno postoji na prodaji. <\/p>\n<p>\n<\/li>\n<li>\n<p>Ovisi o karakteristikama samog stroja. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>To je neizravni parametar, ali zapravo mo\u017eemo optimizirati prema koli\u010dini podataka koje ovaj upit pro\u010dita kako bi dobio rezultat. <\/p>\n<p><\/p>\n<p>A ako \u017eelite da tajming bude bli\u017ei onome \u0161to \u0107emo vidjeti u prodaji, moramo uzeti maksimalno sli\u010dan hardver i, mo\u017eda, \u010dak i vi\u0161e kako bismo svi klonovi stali. No, to je kompromis, tj. dobit \u0107ete iste planove, vidjet \u0107ete koliko podataka obradi odre\u0111eni upit i mo\u0107i \u0107ete donijeti zaklju\u010dak \u2013 je li taj upit dobar (ili migracija) ili lo\u0161, i treba ga dodatno optimizirati. <\/p>\n<p><\/p>\n<p>Pogledajmo kako konkretno ide optimizacija s Joe-om. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uzmimo upit iz stvarnog sustava. U ovom slu\u010daju, baza podataka ima 1 terabajt. I \u017eelimo izra\u010dunati broj svje\u017eih postova koji su imali vi\u0161e od 10 lajkova. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pi\u0161emo poruku u kanal, klon se otvorio za nas. I vidjet \u0107emo da \u0107e se takav upit obraditi za 2,5 minute. To je prvo \u0161to \u0107emo primijetiti.<\/p>\n<p><\/p>\n<p>Joe \u0107e pokazati automatske preporuke temeljene na planu i metrike. <\/p>\n<p><\/p>\n<p>Vidjet \u0107emo da upit obra\u0111uje previ\u0161e podataka kako bi dobio relativno mali broj redaka. I potreban je neki specijalizirani indeks, budu\u0107i da smo primijetili da je u upitu previ\u0161e filtriranih redaka. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pogledajmo detaljnije \u0161to se dogodilo. Doista, vidimo da smo pro\u010ditali skoro jedan i pol gigabajt podataka iz datote\u010dnog predmemoriranja ili \u010dak s diska. I to nije dobro, budu\u0107i da smo dobili samo 142 retka. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I, \u010dini se, imamo ovdje index scan i trebao se brzo obraditi, no, budu\u0107i da smo filtrirali previ\u0161e redaka (morali smo ih izra\u010dunati), upit se sporo obradio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I to se dogodilo u planu zbog djelomi\u010dne neuskla\u0111enosti uvjeta u upitu i uvjeta u indeksu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poku\u0161ajmo napraviti indeks preciznijim i vidimo kako \u0107e se izvr\u0161enje upita promijeniti nakon toga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kreiranje indeksa je potrajalo, ali sada provjeravamo upit i vidimo da je vrijeme umjesto 2,5 minute sada samo 156 milisekundi, \u0161to je dovoljno dobro. I \u010ditamo samo 6 megabajta podataka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I sada koristimo index only scan.<\/p>\n<p><\/p>\n<p>Druga va\u017ena pri\u010da je da \u017eelimo plan predstaviti na neki vi\u0161e razumljiv na\u010din. Mi smo implementirali vizualizaciju pomo\u0107u Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To je drugi upit, bogatiji. I Flame Graphs gradimo prema dva parametra: to su koli\u010dina podataka koje je odre\u0111ena nod u planu pro\u010ditala i tajming, tj. vrijeme izvr\u0161enja noda. <\/p>\n<p><\/p>\n<p>Ovdje mo\u017eemo usporediti konkretno \u010dvorove me\u0111usobno. Bit \u0107e jasno koji od njih zauzima vi\u0161e ili manje prostora, \u0161to obi\u010dno mo\u017ee biti te\u0161ko u\u010diniti s drugim na\u010dinima vizualizacije. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Naravno, svi znaju za explain.depesz.com. Dobra zna\u010dajka ove vizualizacije je to \u0161to zadr\u017eavamo tekstualni plan i tako\u0111er isti\u010demo neke osnovne parametre u tablici, kako bismo ih mogli sortirati. <\/p>\n<p><\/p>\n<p>I programeri koji se jo\u0161 nisu duboko zaronili u ovu temu tako\u0111er koriste explain.depesz.com, jer im je tako lak\u0161e shvatiti koje su metrike va\u017ene, a koje nisu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postoji novi pristup vizualizaciji \u2013 explain.dalibo.com. Oni rade hijerarhijsku vizualizaciju, ali ovdje je jako te\u0161ko usporediti \u010dvorove me\u0111usobno. Ovdje se mo\u017ee dobro razumjeti struktura, me\u0111utim, ako bude veliki upit, potrebno je skrolati naprijed-natrag, ali i to je opcija. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Suradnja<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I, kao \u0161to sam ve\u0107 rekao, Slack nam pru\u017ea mogu\u0107nost suradnje. Na primjer, ako nai\u0111emo na slo\u017een upit koji nije jasno kako optimizirati, mo\u017eemo u thread-u u Slacku razjasniti to pitanje s kolegama. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA bot Joe. Anatolij Stanmler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010cini nam se va\u017enim testirati na punim podacima. Za to smo napravili alat Update Database Lab, koji je dostupan kao open source. Tako\u0111er mo\u017eete koristiti bota Joe. Mo\u017eete ga uzeti odmah i implementirati kod sebe. Svi vodi\u010di su tamo dostupni. <\/p>\n<p><\/p>\n<p>Va\u017eno je i napomenuti da samo rje\u0161enje nije revolucionarno, jer postoji Delphix, ali to je enterprise rje\u0161enje. Potpuno je zatvoreno i izuzetno skupo. Mi se specijaliziramo za Postgres. Svi na\u0161i proizvodi su open source. Pridru\u017eite nam se! <\/p>\n<p><\/p>\n<p>Time zavr\u0161avam. Hvala!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Pitanja<\/h2>\n<p><\/p>\n<p><em>Pozdrav! Hvala na izlaganju! Jako zanimljivo, posebno za mene, jer sam otprilike istu takvu situaciju rje\u0161avao prije nekog vremena. Stoga imam cijeli niz pitanja. Nadam se da \u0107u barem neka postaviti.<\/em><\/p>\n<p><\/p>\n<p><em>Zanima me kako prora\u010dunavate prostor za ovo okru\u017eenje? Tehnologija podrazumijeva da, pod odre\u0111enim okolnostima, va\u0161i klonovi mogu narasti do maksimalne veli\u010dine. Pojednostavljeno, ako imate deset terabajtnu bazu i 10 klonova, lako mo\u017eete modelirati situaciju u kojoj bi svaki klon imao 10 jedinstvenih podataka. Kako prora\u010dunavate taj prostor, tj. onu razliku o kojoj ste govorili, u kojoj \u0107e \u017eivjeti ti klonovi?<\/em><\/p>\n<p><\/p>\n<p>Dobro pitanje. Ovdje je va\u017eno pratiti konkretne klonove. Ako se kod nekog klona dogodi prevelika promjena i on po\u010dne rasti, mo\u017eemo prvo upozoriti korisnika na to ili odmah zaustaviti taj klon kako bismo izbjegli situaciju neuspjeha. <\/p>\n<p><\/p>\n<p><em>Da, imam dodatno pitanje. Odnosno, kako osiguravate \u017eivotni ciklus ovih modula? To nam je problem i cijela posebna pri\u010da. Kako se to odvija?<\/em><\/p>\n<p><\/p>\n<p>Svaki klon ima neki TTL. U principu, imamo fiksni TTL. <\/p>\n<p><\/p>\n<p><em>Koji, ako nije tajna?<\/em><\/p>\n<p><\/p>\n<p>1 sat, odnosno neaktivno \u2013 1 sat. Ako se ne koristi, mi ga bri\u0161emo. No, ovdje nema nikakvog iznena\u0111enja, s obzirom da mo\u017eemo klon podi\u0107i za nekoliko sekundi. A ako ga opet zatrebamo, tu je. <\/p>\n<p><\/p>\n<p><em>Zanimaju me i tehnologije koje ste izabrali, jer mi, na primjer, paralelno koristimo nekoliko na\u010dina iz raznih razloga. Za\u0161to ba\u0161 ZFS? Za\u0161to niste koristili LVM? Spomenuli ste da ste imali problema s LVM-om. Koji su to problemi? Po mom mi\u0161ljenju, najoptimalnija opcija je ona sa SAN-om, s aspekta performansi.<\/em> <\/p>\n<p><\/p>\n<p><em>Koji je glavni problem sa ZFS-om? To je to \u0161to ga mora\u0161 pokretati na jednom hostu, odnosno svi instance \u0107e \u017eivjeti unutar jednog operacijskog sustava. Dok kod SAN-a mo\u017ee\u0161 povezivati razli\u010ditu opremu. Usko mjesto su samo oni blokovi koji su na SAN-u. I zanimljivo je pitanje izbora tehnologija. Za\u0161to ne LVM?<\/em><\/p>\n<p><\/p>\n<p>O LVM-u \u0107emo konkretno mo\u0107i razgovarati na meetupu. \u0160to se ti\u010de SAN-a \u2013 to je jednostavno skupo. Sustav ZFS mo\u017eemo implementirati bilo gdje. Mo\u017eete ga postaviti na svom ra\u010dunalu. Mo\u017eete jednostavno preuzeti repozitorij i postaviti ga. ZFS se instalira prakti\u010dki svugdje, kada govorimo o Linuxu. Odnosno, dobijamo vrlo fleksibilno rje\u0161enje. I sam ZFS iz kutije nudi puno. Mo\u017ee\u0161 tamo u\u010ditati koliko god podataka \u017eeli\u0161, povezati veliki broj diskova, postoje snimci. I, kao \u0161to sam ve\u0107 rekao, lako je administratorirati. Odnosno, \u010dini se vrlo ugodnim za kori\u0161tenje. Provjeren je, postoji ve\u0107 dugi niz godina. Ima vrlo veliku zajednicu koja raste. ZFS je vrlo pouzdano rje\u0161enje. <\/p>\n<p><\/p>\n<p>Nikolaj Samokhvalov: Mogu li jo\u0161 komentirati? Zovem se Nikolaj, radim zajedno s Anatolijem. Sla\u017eem se da je SAN odli\u010dan. I neki na\u0161i klijenti imaju Pure Storage itd. <\/p>\n<p><\/p>\n<p>Anatolij je ispravno primijetio da nastojimo na modularnosti. U budu\u0107nosti bi se mogao realizirati jedan su\u010delje - napravi snimku, napravi klon, uni\u0161ti klon. Sve je to jednostavno. A SAN je odli\u010dan, ako ga imate.<\/p>\n<p><\/p>\n<p>Ali ZFS je dostupan svima. Dosta je DelPhixa, imaju 300 klijenata. Od njih u Fortune 100 - 50 klijenata, tj. ciljaju NASA-u itd. Vrijeme je da ova tehnologija bude dostupna svima. Zato imamo open source Core. Imamo dio su\u010delja koje nije open source. To je platforma koju \u0107emo pokazati. No, \u017eelimo da to bude dostupno svima. \u017delimo napraviti revoluciju kako bi svi testeri prestali naga\u0111ati na prijenosnicima. Moramo pisati SELECT i odmah vidjeti ako je spor. Dosta je \u010dekanja da nam o tome ka\u017ee DBA. To je glavni cilj. I mislim da \u0107emo svi do\u0107i do toga. I ovu stvar radimo kako bi je imali svi. Zato ZFS, jer \u0107e biti dostupan svugdje. Hvala zajednici za rje\u0161avanje problema i za to \u0161to ima open source licencu itd. <\/p>\n<p><\/p>\n<p><em>Pozdrav! Hvala na izlaganju! Zovem se Maksim. Rije\u0161avali smo sli\u010dne probleme. U sebi smo ih rije\u0161ili. Kako ste podijelili resurse izme\u0111u tih klonova? Svaki klon mo\u017ee u svakom trenutku raditi svoje: jedan testira jedno, drugi drugo, nekom se gradi indeks, nekome te\u017ei job radi. I ako se CPU jo\u0161 mo\u017ee podijeliti, kako dijelite IO?<\/em><\/p>\n<p><\/p>\n<p><em>I drugo pitanje o neuskla\u0111enosti okru\u017eenja. Recimo, ovdje imam ZFS i sve je u redu, a klijent na produkciji nema ZFS, nego ext4, na primjer. \u0160to u tom slu\u010daju?<\/em><\/p>\n<p><\/p>\n<p>Pitanja su vrlo dobra. Spomenuo sam malo ovaj problem s dijeljenjem resursa. Rje\u0161enje je sljede\u0107e. Zamislite da testirate na stagingu. Mo\u017ee se dogoditi da netko daje jednu optere\u0107enje, dok netko drugi daje drugo. I na kraju vidite nejasne metrike. \u010cak i isti problem se mo\u017ee pojaviti na produkciji. Kada \u017eelite provjeriti neki upit i vidite da ima problem \u2013 sporo se izvr\u0161ava, zapravo problem nije bio u upitu, nego u tome \u0161to postoji neko paralelno optere\u0107enje. <\/p>\n<p><\/p>\n<p>I zato je va\u017eno fokusirati se na to kakav \u0107e biti plan, kroz koje korake \u0107emo i\u0107i u planu i koliko podataka \u0107emo prikupiti za to. To \u0161to \u0107emo imati diskove, recimo, optere\u0107ene ne\u010dim, konkretno \u0107e utjecati na vremenske okvire. Ali mo\u017eemo procijeniti broj podataka koliko je taj upit optere\u0107en. Nije toliko va\u017eno \u0161to \u0107e se istovremeno izvoditi jo\u0161 neka operacija. <\/p>\n<p><\/p>\n<p><em>Imam dva pitanja. Ovo je stvarno odli\u010dna stvar. Da li je bilo slu\u010dajeva kada su podaci na produkciji kriti\u010dno va\u017eni, primjerice brojevi kreditnih kartica? Ima li ve\u0107 ne\u0161to spremno ili je to odvojen zadatak? I drugo pitanje \u2013 postoji li ne\u0161to sli\u010dno za MySQL?<\/em><\/p>\n<p><\/p>\n<p>\u0160to se ti\u010de podataka. Mi \u0107emo vr\u0161iti obfuscaciju, dok to ne u\u010dinimo. Ali ako postavljate isklju\u010divo Joe-a, ako ne dajete pristup developerima, tada nema pristupa podacima. Za\u0161to? Jer Joe ne prikazuje podatke. On prikazuje samo metrike, planove i tako dalje. To je namjerno u\u010dinjeno jer \u2013 to je jedan od zahtjeva na\u0161eg klijenta. \u017deljeli su imati mogu\u0107nost optimizacije, ali ne dati svima pristup. <\/p>\n<p><\/p>\n<p>\u0160to se ti\u010de MySQL-a. Ovaj sustav se mo\u017ee koristiti za bilo \u0161to \u0161to pohranjuje stanje na disku. I po\u0161to se bavimo Postgresom, trenutno u prvom redu radimo potpunu automatizaciju za Postgres. \u017delimo automatizirati dobivanje podataka iz backupa. Pravilno konfiguriramo Postgres. Znamo kako osigurati da se planovi poklapaju i tako dalje. <\/p>\n<p><\/p>\n<p>Ali po\u0161to je sustav pro\u0161iriv, mo\u0107i \u0107e se koristiti i za MySQL. I postoje takvi primjeri. Sli\u010dna stvar postoji u Yandexu, ali je ne objavljuju nigdje. Koriste je unutar Yandex.Metrike. I tamo je zapravo pri\u010da o MySQL-u. Ali tehnologije su iste, ZFS. <\/p>\n<p><\/p>\n<p><em>Hvala na prezentaciji! Imam i ja nekoliko pitanja. Spomenuli ste da se kloniranje mo\u017ee koristiti za analitiku, na primjer, za izradu dodatnih indeksa. Mo\u017eete li malo detaljnije objasniti kako to funkcioni\u0161e?<\/em><\/p>\n<p><\/p>\n<p><em>I odmah \u0107u postaviti drugo pitanje u vezi uniformnosti postavki, uniformnosti planova. Plan zavisi izme\u0111u ostalog od statistike koju prikuplja Postgres. Kako rje\u0161avate ovaj problem?<\/em><\/p>\n<p><\/p>\n<p>Nema analize konkretnih slu\u010dajeva, jer to jo\u0161 nismo koristili, ali takva mogu\u0107nost postoji. Ako govorimo o indeksima, zamislite da se pokre\u0107e upit po tablici sa stotinama milijuna zapisa i po stupcu koji obi\u010dno nije indeksiran u produkciji. A mi \u017eelimo izra\u010dunati odre\u0111ene podatke. Ako taj upit pokrenemo u produkciji, postoji mogu\u0107nost da \u0107e do\u0107i do zastoja jer \u0107e upit trajati minutu. <\/p>\n<p><\/p>\n<p>U redu, napravimo tanak klon kojeg nije strah zaustaviti na nekoliko minuta. Kako bi nam bilo lak\u0161e analizirati podatke, dodajmo indekse na one stupce koji nas zanimaju. <\/p>\n<p><\/p>\n<p><em>Ho\u0107e li se indeks svaki put stvarati?<\/em><\/p>\n<p><\/p>\n<p>Mo\u017ee se napraviti tako da dodirnemo podatke, napravimo snimke, a zatim \u0107emo se obnavljati s te snimke i pokretati nove upite. To zna\u010di da mo\u017eemo pokretati nove klonove s ve\u0107 postavljenim indeksima.<\/p>\n<p><\/p>\n<p>\u0160to se ti\u010de pitanja vezanog za statistiku, ako se obnavljamo iz sigurnosne kopije, ako radimo replikaciju, tada \u0107e na\u0161a statistika biti identi\u010dna. Jer \u0107emo prenijeti cijelu fizi\u010dku strukturu podataka, tj. podatke u svom cjelovitom obliku sa svim metrima statistike. <\/p>\n<p><\/p>\n<p>Ovdje je drugi problem. Ako koristite cloud rje\u0161enje, tada su dostupne samo logi\u010dke izrade, jer Google, Amazon ne daju fizi\u010dke kopije. Tada \u0107e nastati takav problem. <\/p>\n<p><\/p>\n<p><em>Hvala na izlaganju. Postavila su se dva dobra pitanja o MySQL-u i o razdvajanju resursa. No, u su\u0161tini, sve se svodi na to da je ovo tema koja nije specifi\u010dna za pojedine DBMS-ove, ve\u0107 se odnosi na ukupni datote\u010dni sustav. Tako da se pitanja razdvajanja resursa tako\u0111er trebaju rje\u0161avati odatle, a ne na kraju da je to Postgres, nego u datote\u010dnom sustavu, u <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/hr\/server\/dts-dronten\/\"   title=\"serveru\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">serveru<\/a>, u instanci.<\/em> <\/p>\n<p><\/p>\n<p><em>Moje pitanje je malo druga\u010dije. Ono je vi\u0161e orijentirano na vi\u0161eslojnost baze podataka, gdje postoje nekoliko slojeva. Na primjer, postavili smo a\u017euriranje deset terabajtnog imid\u017ea, imamo replikaciju. Konkretno koristimo to rje\u0161enje za baze podataka. Idemo s replikacijom, dolazi do a\u017euriranja podataka. U isto vrijeme, 100 zaposlenika paralelno radi, stalno pokre\u0107u\u0107i te razli\u010dite snimke. \u0160to u\u010diniti? Kako osigurati da ne do\u0111e do sukoba, da su pokrenuli jedno, a zatim se datote\u010dni sustav promijenio, i da su te snimke svi pogre\u0161ne?<\/em> <\/p>\n<p><\/p>\n<p>Oni ne\u0107e putovati jer tako ZFS radi. Mo\u017eemo zadr\u017eati odvojeno u jednom tijeku promjene datote\u010dnog sustava, koje dolaze zahvaljuju\u0107i replikaciji. I \u010duvati klonove na starijim verzijama podataka koje programeri koriste. I to nam radi, s tim je sve u redu.<\/p>\n<p><\/p>\n<p><em>Ispada da \u0107e se a\u017euriranje doga\u0111ati kao dodatni sloj, a sve nove snimke \u0107e se bazirati na tom sloju, zar ne?<\/em> <\/p>\n<p><\/p>\n<p>Iz prethodnih slojeva koji su bili iz prethodnih replikacija. <\/p>\n<p><\/p>\n<p><em>Prethodni slojevi \u0107e otpasti, ali \u0107e se referencirati na stari sloj, a nove slike \u0107e se uzimati s posljednjeg sloja koji je izveden tijekom a\u017euriranja?<\/em><\/p>\n<p><\/p>\n<p>Uglavnom, da. <\/p>\n<p><\/p>\n<p><em>Dakle, kao posljedica, imat \u0107emo mnogo slojeva. I s vremenom \u0107e ih trebati smanjiti?<\/em><\/p>\n<p><\/p>\n<p>Da, to\u010dno. Postoji odre\u0111eni prozor. \u010cuvamo tjedne snimke. To ovisi o tome kakav resurs imate. Ako imate mogu\u0107nost \u010duvanja mnogo podataka, mo\u017eete \u010duvati snimke dulje vremena. One se same ne\u0107e obrisati. Nema korupcije podataka. Ako snimke postanu zastarjele, kako mislimo, tj. ovisno o politici u tvrtki, mo\u017eemo ih jednostavno obrisati i osloboditi prostor. <\/p>\n<p><\/p>\n<p><em>Dobar dan, hvala na izlaganju! \u0160to se ti\u010de pitanja Joea. Rekli ste da naru\u010ditelj nije \u017eelio dati pristup svim osobama podacima. Strogo govore\u0107i, ako netko ima rezultat Explain Analyze, mo\u017ee pregledavati podatke.<\/em> <\/p>\n<p><\/p>\n<p>Svejedno. Na primjer, mo\u017eemo napisati: \u201eSELECT FROM WHERE email = nekome\u201c. Tj. ne\u0107emo vidjeti same podatke, ali mo\u017eemo pogledati neke posredne oznake. To treba razumjeti. Ali, s druge strane, sve ovo je vidljivo. Imamo reviziju dnevnika, imamo kontrolu drugih kolega koji tako\u0111er vide \u010dime se programeri bave. I ako netko poku\u0161a to napraviti, slu\u017eba sigurnosti \u0107e do\u0107i do njih i rije\u0161iti taj problem. <\/p>\n<p><\/p>\n<p><em>Dobar dan! Hvala na izlaganju! Imam kratko pitanje. Ako se Slack ne koristi u tvrtki, postoji li ikakva povezanost s njim ili je mogu\u0107e za programere postaviti instance kako bi se povezali s testnim aplikacijama u bazi?<\/em><\/p>\n<p><\/p>\n<p>Trenutno postoji povezanost sa Slackom, tj. nema druge aplikacije za razmjenu poruka, ali \u017eelimo omogu\u0107iti i podr\u0161ku za druge aplikacije. \u0160to mo\u017eete u\u010diniti? Mo\u017eete pokrenuti DB Lab bez Joe-a, koristiti REST API ili na\u0161u platformu za izradu klonova i povezivanje s PSQL-om. No to mo\u017ee biti mogu\u0107e samo ako ste spremni dati svojim programerima pristup podacima, jer tu ve\u0107 ne\u0107e biti nikakvog su\u010delja. <\/p>\n<p><\/p>\n<p><em>Ova posredni\u010dka usluga nije mi potrebna, ve\u0107 mi je potrebna ta mogu\u0107nost.<\/em><\/p>\n<p><\/p>\n<p>U tom slu\u010daju \u2013 da, to se mo\u017ee u\u010diniti.<\/p>\n<p>Izvor: <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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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\/hr\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}