{"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\/ro\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"Botul DBA Joe. Anatoly Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum \u00ee\u0219i d\u0103 seama un dezvoltator backend c\u0103 o interogare SQL va func\u021biona bine \u00een produc\u021bie? \u00cen companiile mari sau \u00een cele \u00een cre\u0219tere rapid\u0103, accesul la produc\u021bie nu este disponibil pentru toat\u0103 lumea. \u0218i chiar \u0219i cu acces, nu toate interog\u0103rile pot fi verificate f\u0103r\u0103 probleme, iar crearea unei copii a bazei de date dureaz\u0103 uneori ore. Pentru a rezolva aceste probleme, am creat un DBA artificial - Joe. El a fost deja implementat cu succes \u00een mai multe companii \u0219i ajut\u0103 nu doar c\u00e2\u021biva zeci de dezvoltatori. <\/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=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Salutare tuturor! M\u0103 numesc Anatoliy Stansler. Lucrez pentru compania <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Ne ocup\u0103m de accelerarea procesului de dezvoltare, elimin\u00e2nd \u00eent\u00e2rzierile asociate cu utilizarea Postgres de c\u0103tre dezvoltatori, DBA \u0219i QA.<\/p>\n<p><\/p>\n<p>Avem clien\u021bi extraordinari \u0219i ast\u0103zi o parte din prezentare va fi dedicat\u0103 cazurilor pe care le-am \u00eent\u00e2lnit lucr\u00e2nd cu ei. Voi povesti despre cum i-am ajutat s\u0103 rezolve probleme destul de serioase.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u00e2nd facem dezvoltare \u0219i realiz\u0103m migra\u021bii complexe \u0219i solicitante, ne punem \u00eentrebarea: \u201eVa func\u021biona aceast\u0103 migra\u021bie?\u201d. Folosim review-uri, ne baz\u0103m pe cuno\u0219tin\u021bele colegilor mai experimenta\u021bi \u0219i pe exper\u021bii DBA. Iar ei ne pot spune - va func\u021biona sau nu. <\/p>\n<p><\/p>\n<p>Dar, poate ar fi fost mai bine dac\u0103 am fi putut testa singuri asta pe copii complete. Ast\u0103zi vom discuta despre ce abord\u0103ri exist\u0103 acum pentru testare \u0219i cum putem face acest lucru mai bine, precum \u0219i ce instrumente putem folosi. De asemenea, vom discuta despre avantajele \u0219i dezavantajele acestor abord\u0103ri \u0219i ce putem \u00eembun\u0103t\u0103\u021bi aici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cine a f\u0103cut vreodat\u0103 indec\u0219i sau a adus modific\u0103ri direct \u00een produc\u021bie? Destul de mult\u0103 lume. \u0218i c\u00e2\u021bi au \u00eent\u00e2mpinat probleme de pierdere a datelor sau timp de inactivitate? Atunci sunte\u021bi familiariza\u021bi cu aceast\u0103 durere. Slav\u0103 Domnului, avem backup-uri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prima abordare - este testarea \u00een produc\u021bie. Sau, c\u00e2nd dezvoltatorul lucreaz\u0103 de pe un calculator local, are date de testare, exist\u0103 un e\u0219antion limitat. \u0218i noi lans\u0103m \u00een produc\u021bie, iar situa\u021bia se prezint\u0103 astfel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este dureros, este costisitor. Probabil c\u0103 a\u0219a nu ar trebui s\u0103 facem. <\/p>\n<p><\/p>\n<p>Dar cum s\u0103 facem mai bine? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 lu\u0103m un staging \u0219i s\u0103 aloc\u0103m o parte din produc\u021bie acolo. Sau, \u00een cel mai bun caz, s\u0103 folosim produc\u021bia real\u0103, toate datele. Iar dup\u0103 ce am dezvoltat local, vom verifica \u0219i pe staging. <\/p>\n<p><\/p>\n<p>Aceasta ne va permite s\u0103 elimin\u0103m o parte din erori, adic\u0103 s\u0103 nu le permitem \u00een produc\u021bie. <\/p>\n<p><\/p>\n<p>Ce probleme exist\u0103? <\/p>\n<p><\/p>\n<ul>\n<li>Problema este c\u0103 acest staging \u00eel \u00eemp\u0103r\u021bim cu colegii. \u0218i foarte des se \u00eent\u00e2mpl\u0103 c\u0103 faci o modificare, bum \u2013 \u0219i nu mai ai date, munca este \u00een zadar. Staging-ul a fost de c\u00e2teva terabai\u021bi. \u0218i trebuie s\u0103 a\u0219tep\u021bi mult timp p\u00e2n\u0103 c\u00e2nd se ridic\u0103 din nou. \u0218i decidem s\u0103 lucr\u0103m la asta m\u00e2ine. Asta e, dezvoltarea s-a oprit. <\/li>\n<li>\u0218i, desigur, avem mul\u021bi colegi acolo, multe echipe. \u0218i trebuie s\u0103 ne coordon\u0103m manual. Asta este incomod. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i trebuie s\u0103 spunem c\u0103 avem doar o singur\u0103 \u00eencercare, un singur \u0219ut, dac\u0103 vrem s\u0103 facem vreo modificare \u00een baza de date, s\u0103 ne atingem datele, s\u0103 schimb\u0103m structura. \u0218i dac\u0103 ceva nu merge bine, dac\u0103 a fost o eroare \u00een migrare, atunci nu ne mai putem \u00eentoarce rapid. <\/p>\n<p><\/p>\n<p>Este mai bine dec\u00e2t abordarea anterioar\u0103, dar totu\u0219i exist\u0103 o mare probabilitate ca o eroare s\u0103 ajung\u0103 \u00een production.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce ne \u00eempiedic\u0103 s\u0103 d\u0103m fiec\u0103rui dezvoltator un mediu de testare, o copie de dimensiuni complete? Cred c\u0103 este clar ce ne opre\u0219te. <\/p>\n<p><\/p>\n<p>Cine are o baz\u0103 de date mai mare de un terabyte? Mai mult dec\u00e2t jum\u0103tate din sal\u0103. <\/p>\n<p><\/p>\n<p>\u0218i este clar c\u0103 a avea ma\u0219ini pentru fiecare dezvoltator, c\u00e2nd production-ul este at\u00e2t de mare, este foarte scump \u0219i, \u00een plus, dureaz\u0103 mult. <\/p>\n<p><\/p>\n<p>Avem clien\u021bi care au realizat c\u0103 este foarte important s\u0103 testeze toate modific\u0103rile pe copii de dimensiuni complete, dar baza lor este mai mic\u0103 de un terabyte, iar resursele pentru a avea un mediu de testare pentru fiecare dezvoltator nu exist\u0103. A\u0219adar, trebuie s\u0103 descarce dumpuri local pe ma\u0219ina lor \u0219i s\u0103 testeze \u00een acest mod. Asta dureaz\u0103 mult timp. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chiar \u0219i dac\u0103 faci asta \u00een cadrul infrastructurii, s\u0103 descarci un terabyte de date \u00eentr-o or\u0103 \u2013 este deja foarte bine. Dar ei folosesc dumpuri logice, descarc\u0103 local din cloud. Pentru ei, viteza este de aproximativ 200 de gigabytes pe or\u0103. \u0218i mai este nevoie de timp pentru a restaura din dumpul logic, a aplica indec\u0219ii etc.<\/p>\n<p><\/p>\n<p>Dar ei folosesc aceast\u0103 abordare pentru c\u0103 permite men\u021binerea prod-ului de \u00eencredere. <\/p>\n<p><\/p>\n<p>Ce putem face aici? Haide\u021bi s\u0103 facem astfel \u00eenc\u00e2t mediile de testare s\u0103 fie ieftine \u0219i s\u0103 oferim fiec\u0103rui dezvoltator propriul s\u0103u mediu de testare.<\/p>\n<p><\/p>\n<p>\u0218i asta este posibil. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i \u00een aceast\u0103 abordare, c\u00e2nd facem clone sub\u021biri pentru fiecare dezvoltator, putem partaja asta pe o singur\u0103 ma\u0219in\u0103. De exemplu, dac\u0103 ave\u021bi o baz\u0103 de date de patru terabytes \u0219i dori\u021bi s\u0103 o oferi\u021bi 10 dezvoltatori, nu trebuie s\u0103 ave\u021bi 10 x patru terabytes de baze de date. Este suficient s\u0103 ave\u021bi o singur\u0103 ma\u0219in\u0103 pentru a crea copii sub\u021biri izolate pentru fiecare dezvoltator, folosind o singur\u0103 ma\u0219in\u0103. Cum func\u021bioneaz\u0103, voi explica pu\u021bin mai t\u00e2rziu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un exemplu real:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Baza de date \u2013 4,5 terabytes. <\/p>\n<p>\n<\/li>\n<li>\n<p>Putem ob\u021bine copii independente \u00een 30 de secunde. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Nu trebuie s\u0103 a\u0219tepta\u021bi un mediu de testare \u0219i s\u0103 depinde\u021bi de dimensiunea acestuia. Pute\u021bi s\u0103-l ob\u021bine\u021bi \u00een c\u00e2teva secunde. Acesta va fi un mediu complet izolat, dar care \u00eemparte datele \u00eentre ele. <\/p>\n<p><\/p>\n<p>Este grozav. Aici vorbim despre magie \u0219i o univers paralel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen cazul nostru, acest lucru func\u021bioneaz\u0103 cu ajutorul sistemului OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS este un sistem de fi\u0219iere copy-on-write care suport\u0103 din cutie instantanee \u0219i clone. Este fiabil \u0219i scalabil. Este foarte u\u0219or de gestionat. Poate fi desf\u0103\u0219urat \u00een doar dou\u0103 comenzi. <\/p>\n<p><\/p>\n<p>Exist\u0103 \u0219i alte op\u021biuni:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Sisteme de stocare (de exemplu, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, despre care vorbesc, este modular. Poate fi implementat folosind astfel de op\u021biuni. Dar momentan ne-am concentrat pe OpenZFS, deoarece am avut probleme specifice cu LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum func\u021bioneaz\u0103? \u00cen loc s\u0103 rescriem datele de fiecare dat\u0103 c\u00e2nd le modific\u0103m, le stoc\u0103m, pur \u0219i simplu marc\u00e2nd c\u0103 aceste date noi se refer\u0103 la un nou moment \u00een timp, la o nou\u0103 instantanee. <\/p>\n<p><\/p>\n<p>\u0218i mai departe, c\u00e2nd dorim s\u0103 revenim sau s\u0103 facem o nou\u0103 clon\u0103 dintr-o versiune mai veche, spunem doar: 'Ok, da\u021bi-ne aceste blocuri de date, care sunt marcate astfel'. <\/p>\n<p><\/p>\n<p>\u0218i acest utilizator va lucra cu un astfel de set de date. Le va schimba treptat, f\u0103c\u00e2nd propriile sale instantanee. <\/p>\n<p><\/p>\n<p>\u0218i vom avea ramificare. Fiecare dezvoltator va avea \u00een cazul nostru posibilitatea de a avea propria clon\u0103 pe care o editeaz\u0103, iar datele care sunt comune vor fi partajate \u00eentre to\u021bi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru a desf\u0103\u0219ura un astfel de sistem, trebuie s\u0103 rezolva\u021bi dou\u0103 probleme: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Primul este sursa de date de unde le vei prelua. Po\u021bi configura replicarea cu produc\u021bia. Po\u021bi folosi deja backup-urile pe care le ai configurate, sper. WAL-E, WAL-G sau Barman. \u0218i chiar dac\u0103 folose\u0219ti o solu\u021bie Cloud, de exemplu, RDS sau Cloud SQL, po\u021bi folosi dump-uri logice. Totu\u0219i, \u00ee\u021bi recomand\u0103m s\u0103 folose\u0219ti backup-uri, deoarece prin aceast\u0103 abordare vei p\u0103stra \u0219i structura fizic\u0103 a fi\u0219ierelor, ceea ce va permite s\u0103 fii mai aproape de metricile pe care le-ai vedea \u00een produc\u021bie, pentru a identifica problemele existente. <\/p>\n<p>\n<\/li>\n<li>\n<p>Al doilea este locul unde dore\u0219ti s\u0103 g\u0103zduie\u0219ti Database Lab. Poate fi Cloud, poate fi On-premise. Aici este important s\u0103 men\u021bion\u0103m c\u0103 ZFS suport\u0103 comprimarea datelor. \u0218i o face destul de bine. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Imagineaz\u0103-\u021bi c\u0103 fiecare astfel de clon\u0103, \u00een func\u021bie de opera\u021biile pe care le facem cu baza, va cre\u0219te un anumit dev. Pentru acest dev va fi nevoie de spa\u021biu. Dar datorit\u0103 faptului c\u0103 am preluat o baz\u0103 de 4,5 terabyte, ZFS o va comprima la 3,5 terabyte. \u00cen func\u021bie de set\u0103ri, aceasta poate varia. \u0218i ne va r\u0103m\u00e2ne \u0219i spa\u021biu pentru dev. <\/p>\n<p><\/p>\n<p>Un astfel de sistem poate fi utilizat pentru diferite cazuri de utilizare. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Acesta este pentru dezvoltatori, DBA pentru verificarea interogarilor, pentru optimizare. <\/p>\n<p>\n<\/li>\n<li>\n<p>Acest lucru poate fi folosit \u00een testarea QA pentru a verifica o migra\u021bie specific\u0103 \u00eenainte de a o implementa \u00een produc\u021bie. De asemenea, putem crea medii speciale pentru QA cu date reale, unde pot testa noi func\u021bionalit\u0103\u021bi. \u0218i acest lucru va dura c\u00e2teva secunde \u00een loc s\u0103 a\u0219tep\u021bi ore, sau poate zile \u00een alte cazuri, unde nu sunt utilizate copii sub\u021biri. <\/p>\n<p>\n<\/li>\n<li>\n<p>\u0218i un alt caz distinct. Dac\u0103 compania nu are un sistem de analiz\u0103 configurat, putem crea un clon sub\u021bire al bazei de date a produsului \u0219i s\u0103 o aloc\u0103m pentru interog\u0103ri lungi sau pentru indec\u0219i speciali care pot fi utiliza\u021bi \u00een analiz\u0103.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cu aceast\u0103 abordare:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Probabilitate sc\u0103zut\u0103 de erori \u00een produc\u021bie, deoarece toate modific\u0103rile au fost testate pe date complete. <\/p>\n<p>\n<\/li>\n<li>\n<p>Apare o cultur\u0103 a test\u0103rii, deoarece acum nu mai trebuie s\u0103 a\u0219tep\u021bi ore \u00eentregi pentru propriul t\u0103u mediu. <\/p>\n<p>\n<\/li>\n<li>\n<p>\u0218i nu exist\u0103 obstacole, nu exist\u0103 a\u0219tept\u0103ri \u00eentre teste. Po\u021bi efectiv s\u0103 te duci \u0219i s\u0103 verifici. \u0218i va fi mai bine, deoarece vom accelera dezvoltarea. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Vor fi mai pu\u021bine refactoriz\u0103ri. Vor exista mai pu\u021bine erori care ajung \u00een prod. Le vom refactoriza mai pu\u021bin apoi. <\/p>\n<p>\n<\/li>\n<li>\n<p>Putem inversa modific\u0103rile ireversibile. Acest lucru nu exist\u0103 \u00een abord\u0103rile standard. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>Este avantajoso, deoarece \u00eemp\u0103r\u021bim resursele mediilor de testare. <\/li>\n<\/ol>\n<p><\/p>\n<p>E bine deja, dar ce altceva am putea accelera?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Datorit\u0103 acestui sistem, putem reduce semnificativ pragul de admitere \u00een acest tip de testare. <\/p>\n<p><\/p>\n<p>Acum exist\u0103 un cerc vicios, unde dezvoltatorul trebuie s\u0103 devin\u0103 expert pentru a avea acces la date reale de dimensiuni complete. Trebuie s\u0103 i se acorde \u00eencrederea pentru acest acces. <\/p>\n<p><\/p>\n<p>Dar cum po\u021bi cre\u0219te dac\u0103 nu exist\u0103. \u0218i ce se \u00eent\u00e2mpl\u0103 dac\u0103 ai acces doar la un set foarte mic de date de testare? Atunci nu vei putea ob\u021bine experien\u021b\u0103 real\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum putem ie\u0219i din acest cerc? Ca prim interfa\u021b\u0103, convenabil\u0103 pentru dezvoltatori de orice nivel, am ales un bot Slack. Dar aceasta poate fi orice alt\u0103 interfa\u021b\u0103. <\/p>\n<p><\/p>\n<p>Ce permite s\u0103 fac\u0103? Po\u021bi lua o interogare specific\u0103 \u0219i s\u0103 o trimi\u021bi \u00eentr-un canal special pentru baza de date. Vom desf\u0103\u0219ura automat \u00een c\u00e2teva secunde un clone sub\u021bire. Vom rula aceast\u0103 interogare. Vom colecta metrici \u0219i recomand\u0103ri. Vom ar\u0103ta vizualiz\u0103ri. Iar acest clone va r\u0103m\u00e2ne pentru ca interogarea s\u0103 poat\u0103 fi optimizat\u0103, ad\u0103ugat indec\u0219i etc. <\/p>\n<p><\/p>\n<p>De asemenea, Slack ne ofer\u0103 posibilit\u0103\u021bi de colaborare din cutie. Deoarece este pur \u0219i simplu un canal, po\u021bi \u00eencepe discu\u021bia despre aceast\u0103 interogare direct \u00een thread, s\u0103-\u021bi ping-uie\u0219ti colegii, DBA-ii care sunt \u00een companie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar, desigur, exist\u0103 \u0219i probleme. Deoarece acesta este lumea real\u0103 \u0219i folosim un server pe care g\u0103zduim multe clone, trebuie s\u0103 comprim\u0103m cantitatea de memorie \u0219i puterea de procesare disponibile clonelor. <\/p>\n<p><\/p>\n<p>Dar pentru ca aceste teste s\u0103 fie credibile, trebuie cumva s\u0103 rezolv\u0103m aceast\u0103 problem\u0103. <\/p>\n<p><\/p>\n<p>Este clar c\u0103 un aspect important sunt datele identice. Dar asta avem deja. \u0218i vrem s\u0103 ob\u021binem o configura\u021bie identic\u0103. \u0218i putem oferi o configura\u021bie aproape identic\u0103. <\/p>\n<p><\/p>\n<p>Ar fi grozav s\u0103 avem acela\u0219i hardware ca \u00een produc\u021bie, dar poate diferi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 ne aducem aminte cum func\u021bioneaz\u0103 Postgres cu memoria. Avem dou\u0103 cache-uri. Unul de la sistemul de fi\u0219iere \u0219i unul propriu Postgres, adic\u0103 Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Este important de men\u021bionat c\u0103 Shared Buffer Cache este alocat la pornirea Postgres \u00een func\u021bie de dimensiunea pe care o seta\u021bi \u00een configura\u021bie. <\/p>\n<p><\/p>\n<p>\u0218i al doilea cache folose\u0219te tot spa\u021biul disponibil. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i c\u00e2nd facem mai multe clone pe aceea\u0219i ma\u0219in\u0103, ajungem s\u0103 umplem treptat memoria. Din punct de vedere ideal, Shared Buffer Cache ar trebui s\u0103 fie 25% din \u00eentreaga memorie disponibil\u0103 pe ma\u0219in\u0103. <\/p>\n<p><\/p>\n<p>Astfel, dac\u0103 nu vom schimba acest parametru, vom putea rula doar 4 instan\u021be pe aceea\u0219i ma\u0219in\u0103, adic\u0103 4 astfel de clona sub\u021bire. \u0218i aceasta, desigur, este o problem\u0103, deoarece ne dorim s\u0103 avem mult mai multe. <\/p>\n<p><\/p>\n<p>Dar, pe de alt\u0103 parte, Buffer Cache este folosit pentru executarea interog\u0103rilor, pentru indici, adic\u0103 planul depinde de dimensiunea cache-urilor noastre. \u0218i dac\u0103 vom reduce acest parametru f\u0103r\u0103 o justificare, planurile noastre se pot schimba semnificativ.<\/p>\n<p><\/p>\n<p>De exemplu, dac\u0103 avem un cache mare \u00een productie, Postgres va prefera s\u0103 foloseasc\u0103 indicele. Dar dac\u0103 nu, atunci va utiliza SeqScan. \u0218i care ar fi sensul, dac\u0103 planurile noastre nu s-ar potrivi? <\/p>\n<p><\/p>\n<p>Dar ajungem la concluzia c\u0103 planul \u00een Postgres nu depinde de dimensiunea specific\u0103 setat\u0103 \u00een Shared Buffer, ci de effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/1457fd7b65c342f64733b952130125cf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Effective_cache_size reprezint\u0103 volumul estimat al cache-ului disponibil, adic\u0103 suma dintre Buffer Cache \u0219i cache-ul sistemului de fi\u0219iere. Acesta este setat prin configura\u021bie. \u0218i aceast\u0103 memorie nu este alocat\u0103. <\/p>\n<p><\/p>\n<p>\u0218i prin acest parametru putem, \u00eentr-un fel, \u00een\u0219ela Postgres, spun\u00e2ndu-i c\u0103 avem de fapt acces la multe date, chiar dac\u0103 nu avem acele date. Astfel, planurile vor coincide complet cu cele din produc\u021bie. <\/p>\n<p><\/p>\n<p>\u00cens\u0103, acest lucru poate afecta timpii. \u0218i optimiz\u0103m interog\u0103rile pe baza timpurilor, dar este important de men\u021bionat c\u0103 timpii depind de mul\u021bi factori: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Depinde de sarcina care exist\u0103 \u00een prezent pe mediu de produc\u021bie. <\/p>\n<p>\n<\/li>\n<li>\n<p>Depinde de caracteristicile ma\u0219inii \u00een sine. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0218i acest parametru este indirect, dar \u00een realitate putem optimiza \u00een func\u021bie de cantitatea de date pe care aceast\u0103 interogare le va citi pentru a ob\u021bine rezultatul. <\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 vrem ca temporizarea s\u0103 fie apropiat\u0103 de ceea ce vom vedea \u00een prod, atunci trebuie s\u0103 lu\u0103m hardware c\u00e2t mai asem\u0103n\u0103tor \u0219i, poate, chiar mai mult, pentru a putea g\u0103zdui toate clonele. Dar aceasta este un compromis, adic\u0103 ve\u021bi ob\u021bine acelea\u0219i planuri, ve\u021bi vedea c\u00e2t de multe date citeste un anumit query \u0219i ve\u021bi putea concluziona - acest query este bun (sau migrarea) sau este r\u0103u, trebuie optimizat mai departe. <\/p>\n<p><\/p>\n<p>S\u0103 discut\u0103m despre cum anume se desf\u0103\u0219oar\u0103 optimizarea cu Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 lu\u0103m o interogare dintr-un sistem real. \u00cen acest caz, baza de date este de 1 terabyte. \u0218i vrem s\u0103 calcul\u0103m num\u0103rul de post\u0103ri noi care au avut mai mult de 10 like-uri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trimi\u021b\u0103m un mesaj \u00een canal, s-a deschis pentru noi o clon\u0103. \u0218i vom vedea c\u0103 o astfel de interogare va rula \u00een 2,5 minute. Acesta este primul lucru pe care \u00eel vom observa.<\/p>\n<p><\/p>\n<p>Joe va ar\u0103ta recomand\u0103ri automate, bazate pe plan \u0219i metrici. <\/p>\n<p><\/p>\n<p>Vom observa c\u0103 interogarea proceseaz\u0103 prea multe date pentru a ob\u021bine un num\u0103r relativ mic de r\u00e2nduri. \u0218i este nevoie de un index specializat, deoarece am observat c\u0103 interogarea are prea multe r\u00e2nduri filtrate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 ne uit\u0103m mai \u00een detaliu la ce s-a \u00eent\u00e2mplat. De fapt, vedem c\u0103 am citit aproape un terabyte \u0219i jum\u0103tate de date din cache-ul de fi\u0219iere sau chiar de pe disc. \u0218i aceasta nu este bine, deoarece am ob\u021binut doar 142 de r\u00e2nduri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i, se p\u0103rea c\u0103 avem un index scan \u0219i ar fi trebuit s\u0103 func\u021bioneze rapid, dar, deoarece am filtrat prea multe r\u00e2nduri (a trebuit s\u0103 le num\u0103r\u0103m), interogarea a fost lent\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i aceasta s-a \u00eent\u00e2mplat \u00een plan din cauza faptului c\u0103 condi\u021biile din interogare \u0219i cele din index nu coincid par\u021bial. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 \u00eencerc\u0103m s\u0103 facem indexul mai precis \u0219i s\u0103 vedem cum se va schimba execu\u021bia interog\u0103rii dup\u0103 aceasta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Crearea indexului a durat destul de mult, dar acum verific\u0103m interogarea \u0219i vedem c\u0103 timpul, \u00een loc de 2,5 minute, a devenit doar 156 de milisecunde, ceea ce este foarte bine. \u0218i citim doar 6 megabyte de date.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i acum folosim index only scan.<\/p>\n<p><\/p>\n<p>O alt\u0103 poveste important\u0103 este c\u0103 vrem s\u0103 prezent\u0103m planul \u00eentr-un mod mai u\u0219or de \u00een\u021beles. Am implementat o vizualizare folosind Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceasta este o alt\u0103 interogare, mai complex\u0103. \u0218i construim Flame Graphs pe baza a dou\u0103 parametrii: cantitatea de date pe care un anumit nod din plan a citit-o \u0219i temporizarea, adic\u0103 timpul de execu\u021bie al nodului. <\/p>\n<p><\/p>\n<p>Aici putem compara nodurile \u00eentre ele. Va fi clar care dintre ele ocup\u0103 mai mult sau mai pu\u021bin, ceea ce este de obicei greu de f\u0103cut \u00een alte metode de vizualizare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Desigur, toat\u0103 lumea \u0219tie de explain.depesz.com. O caracteristic\u0103 bun\u0103 a acestei vizualiz\u0103ri este c\u0103 p\u0103str\u0103m planul text \u0219i de asemenea scoatem c\u00e2teva parametrii principali \u00een tabel, pentru a putea sorta. <\/p>\n<p><\/p>\n<p>\u0218i dezvoltatorii care nu s-au ad\u00e2ncit \u00eenc\u0103 \u00een acest subiect folosesc explain.depesz.com, pentru c\u0103 le este mai u\u0219or s\u0103 \u00een\u021beleag\u0103 ce metrici sunt importante \u0219i care nu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Exist\u0103 o nou\u0103 abordare pentru vizualizare \u2013 aceasta este explain.dalibo.com. Ei fac o vizualizare \u00een form\u0103 de arbore, dar aici este foarte greu de comparat nodurile \u00eentre ele. Aici po\u021bi s\u0103 \u00een\u021belegi bine structura, dar dac\u0103 va fi o cerere mare, va trebui s\u0103 derulezi \u00een sus \u0219i \u00een jos, dar este, de asemenea, o variant\u0103. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Colaborare<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i, a\u0219a cum am spus, Slack ne ofer\u0103 posibilitatea de colaborare. De exemplu, dac\u0103 \u00eent\u00e2lnim o cerere complex\u0103, pe care nu \u0219tim cum s\u0103 o optimiz\u0103m, putem clarifica aceast\u0103 \u00eentrebare \u00een thread-ul din Slack cu colegii no\u0219tri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Botul DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ni se pare c\u0103 este important s\u0103 test\u0103m pe date de dimensiuni reale. Pentru asta am creat instrumentul Update Database Lab, care este disponibil \u00een open source. Pute\u021bi folosi \u0219i botul Joe. \u00cel pute\u021bi lua chiar acum \u0219i implementa la voi. Toate ghidurile sunt disponibile acolo. <\/p>\n<p><\/p>\n<p>De asemenea, este important de men\u021bionat c\u0103 solu\u021bia \u00een sine nu este revolu\u021bionar\u0103, pentru c\u0103 exist\u0103 Delphix, dar aceasta este o solu\u021bie enterprise. Este complet \u00eenchis\u0103, cost\u0103 foarte mult. Noi ne specializ\u0103m pe Postgres. Toate acestea sunt produse open source. Al\u0103tura\u021bi-v\u0103 nou\u0103! <\/p>\n<p><\/p>\n<p>Aici \u00eenchei. V\u0103 mul\u021bumesc!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">\u00centreb\u0103ri<\/h2>\n<p><\/p>\n<p><em>Bun\u0103 ziua! V\u0103 mul\u021bumesc pentru prezentare! Foarte interesant, mai ales pentru mine, deoarece am rezolvat o problem\u0103 similar\u0103 acum ceva timp. A\u0219adar, am o serie \u00eentreag\u0103 de \u00eentreb\u0103ri. Sper c\u0103 voi reu\u0219i s\u0103 pun m\u0103car o parte dintre ele.<\/em><\/p>\n<p><\/p>\n<p><em>Este interesant cum calcula\u021bi spa\u021biul pentru acest mediu? Tehnologia presupune c\u0103, \u00een anumite circumstan\u021be, clonele dvs. pot cre\u0219te p\u00e2n\u0103 la dimensiunea maxim\u0103. Cu alte cuvinte, dac\u0103 ave\u021bi o baz\u0103 de date de zece terabytes \u0219i 10 clone, este u\u0219or s\u0103 simula\u021bi o astfel de situa\u021bie, \u00een care fiecare clon\u0103 va c\u00e2nt\u0103ri 10 date unice. Cum calcula\u021bi acest spa\u021biu, adic\u0103 acel delta despre care a\u021bi vorbit, \u00een care vor tr\u0103i aceste clone?<\/em><\/p>\n<p><\/p>\n<p>O \u00eentrebare bun\u0103. Aici este important s\u0103 monitoriz\u0103m clonele specifice. Dac\u0103 o clon\u0103 sufer\u0103 o modificare prea mare \u0219i \u00eencepe s\u0103 creasc\u0103, putem s\u0103-i d\u0103m ini\u021bial un avertisment utilizatorului despre aceasta sau s\u0103 o oprim imediat, pentru a evita o situa\u021bie de e\u0219ec. <\/p>\n<p><\/p>\n<p><em>Da, am o \u00eentrebare suplimentar\u0103. Adic\u0103, cum asigura\u021bi ciclul de via\u021b\u0103 al acestor module? Este o problem\u0103 pentru noi \u0219i o \u00eentreag\u0103 poveste separat\u0103. Cum se desf\u0103\u0219oar\u0103 acest proces?<\/em><\/p>\n<p><\/p>\n<p>Fiecare clon\u0103 are un ttl. \u00cen principiu, avem un ttl fixat. <\/p>\n<p><\/p>\n<p><em>Care este, dac\u0103 nu este un secret?<\/em><\/p>\n<p><\/p>\n<p>1 or\u0103, adic\u0103 idle \u2013 1 or\u0103. Dac\u0103 nu este folosit, \u00eel elimin\u0103m. Dar nu este nimic surprinz\u0103tor aici, deoarece putem ridica o clon\u0103 \u00een c\u00e2teva secunde. \u0218i dac\u0103 va fi din nou necesar\u0103, ei bine, s\u0103 fie. <\/p>\n<p><\/p>\n<p><em>Sunt interesat \u0219i de alegerea tehnologiilor, deoarece, de exemplu, utiliz\u0103m \u00een paralel mai multe metode din diverse motive. De ce anume ZFS? De ce nu a\u021bi folosit LVM? A\u021bi men\u021bionat c\u0103 au fost probleme cu LVM. Ce probleme au fost? Din punctul meu de vedere, op\u021biunea cu SCD este cea mai optim\u0103 din perspectiva performan\u021bei.<\/em> <\/p>\n<p><\/p>\n<p><em>Care este problema principal\u0103 cu ZFS? \u00centruc\u00e2t trebuie s\u0103 rulezi pe un singur host, adic\u0103 toate instan\u021bele vor tr\u0103i \u00een cadrul unui singur sistem de operare. \u00cen cazul SCD, po\u021bi conecta diverse echipamente. Iar punctul slab sunt doar acele blocuri care sunt pe SCD. \u0218i este interesant\u0103 \u00eentrebarea privind alegerea tehnologiilor. De ce nu LVM?<\/em><\/p>\n<p><\/p>\n<p>Despre LVM putem discuta la meetup. Despre SCD \u2013 este pur \u0219i simplu costisitor. Sistemul ZFS poate fi implementat oriunde. Po\u021bi s\u0103-l desf\u0103\u0219ori pe ma\u0219ina ta. Po\u021bi pur \u0219i simplu s\u0103 descarci repository-ul \u0219i s\u0103-l desf\u0103\u0219ori. ZFS se instaleaz\u0103 practic peste tot, dac\u0103 vorbim despre Linux. Adic\u0103, ob\u021binem o solu\u021bie foarte flexibil\u0103. \u0218i ZFS \u00een sine ofer\u0103 foarte multe din cutie. Po\u021bi s\u0103 \u00eencarci c\u00e2t mai multe date, s\u0103 conectezi un num\u0103r mare de disk-uri, exist\u0103 snapshot-uri. \u0218i, a\u0219a cum am spus anterior, este foarte simplu de administrat. Adic\u0103, pare foarte pl\u0103cut de utilizat. Este testat, are mul\u021bi ani. Are o comunitate foarte mare, care cre\u0219te. ZFS este o solu\u021bie foarte fiabil\u0103. <\/p>\n<p><\/p>\n<p>Nikolay Samokhvalov: Pot s\u0103 adaug \u0219i eu un comentariu? M\u0103 numesc Nikolay, lucr\u0103m \u00eempreun\u0103 cu Anatoly. Sunt de acord c\u0103 SCD este grozav. \u0218i unii dintre clien\u021bii no\u0219tri au Pure Storage etc. <\/p>\n<p><\/p>\n<p>Anatolie a remarcat corect c\u0103 ne concentr\u0103m pe modularitate. \u0218i \u00een viitor putem implementa o singur\u0103 interfa\u021b\u0103 \u2013 f\u0103 un snapshot, f\u0103 un clon, distruge clonul. Toate acestea sunt u\u0219or de realizat. Iar stocarea este excelent\u0103, dac\u0103 exist\u0103.<\/p>\n<p><\/p>\n<p>Dar ZFS este accesibil tuturor. Deja este suficient cu Delphix, au 300 de clien\u021bi. Dintre ace\u0219tia, \u00een Fortune 100 - 50 de clien\u021bi, adic\u0103 sunt concentra\u021bi pe NASA etc. Este timpul ca toat\u0103 lumea s\u0103 aib\u0103 acces la aceast\u0103 tehnologie. \u0218i de aceea avem Core open source. Avem o parte de interfa\u021b\u0103, care nu este open source. Aceasta este platforma pe care o vom prezenta. Dar vrem s\u0103 fie accesibil\u0103 tuturor. Vrem s\u0103 facem o revolu\u021bie, astfel \u00eenc\u00e2t to\u021bi testorii s\u0103 nu mai ghiceasc\u0103 pe laptop-uri. Trebuie s\u0103 scriem SELECT \u0219i s\u0103 vedem imediat c\u0103 este lent. S\u0103 nu mai a\u0219tept\u0103m ca DBA-ul s\u0103 ne spun\u0103 despre asta. Asta este principalul obiectiv. \u0218i cred c\u0103 vom ajunge acolo. \u0218i acest lucru \u00eel facem s\u0103 fie disponibil pentru to\u021bi. De aceea ZFS, pentru c\u0103 va fi disponibil peste tot. Mul\u021bumesc comunit\u0103\u021bii pentru solu\u021bionarea problemelor \u0219i pentru c\u0103 avem licen\u021b\u0103 open source etc. <\/p>\n<p><\/p>\n<p><em>Salut! Mul\u021bumesc pentru prezentare! M\u0103 numesc Maxim. Noi am rezolvat acelea\u0219i probleme. La noi le-am rezolvat. Cum \u00eemp\u0103r\u021bi\u021bi resursele \u00eentre aceste clone? Fiecare clon\u0103 poate \u00een fiecare moment s\u0103 se ocupe de propriile sarcini: unul testeaz\u0103 ceva, altul altceva, cineva \u00ee\u0219i construie\u0219te indexul, altcineva are un job greu de procesat. \u0218i dac\u0103 pentru CPU mai putem \u00eemp\u0103r\u021bi, cum face\u021bi cu IO? Aceasta este prima \u00eentrebare.<\/em><\/p>\n<p><\/p>\n<p><em>\u0218i a doua \u00eentrebare este despre diferen\u021bele dintre medii. S\u0103 presupunem c\u0103 aici am ZFS \u0219i totul este grozav, iar clientul meu \u00een produc\u021bie nu are ZFS, ci ext4, de exemplu. Ce se \u00eent\u00e2mpl\u0103 \u00een acest caz?<\/em><\/p>\n<p><\/p>\n<p>\u00centreb\u0103rile sunt foarte bune. Am men\u021bionat pu\u021bin aceast\u0103 problem\u0103 cu \u00eemp\u0103r\u021birea resurselor. Iar solu\u021bia const\u0103 \u00een urm\u0103toarele. Imagineaz\u0103-\u021bi c\u0103 testezi pe staging. Poate la tine s\u0103 fie aceea\u0219i situa\u021bie, c\u0103 cineva genereaz\u0103 o sarcin\u0103, altcineva o alt\u0103 sarcin\u0103. \u0218i \u00een cele din urm\u0103 vezi metrici confuze. Chiar o astfel de problem\u0103 poate ap\u0103rea \u0219i \u00een produc\u021bie. C\u00e2nd vrei s\u0103 verifici o anumit\u0103 interogare \u0219i vezi c\u0103 are o problem\u0103 \u2013 c\u0103 ruleaz\u0103 lent, de fapt problema nu era \u00een interogare, ci \u00een faptul c\u0103 exist\u0103 o sarcin\u0103 paralel\u0103. <\/p>\n<p><\/p>\n<p>A\u0219adar, este important s\u0103 ne concentr\u0103m asupra planului, pa\u0219ii pe care \u00eei vom urma \u0219i c\u00e2t de multe date vom aduna pentru asta. Faptul c\u0103 discurile noastre, de exemplu, vor fi \u00eenc\u0103rcate cu ceva, va afecta \u00een mod specific timpul. Dar putem evalua \u00eenc\u0103rc\u0103tura acestei cereri \u00een func\u021bie de cantitatea de date. Nu este at\u00e2t de important c\u0103, \u00een acela\u0219i timp, va avea loc o alt\u0103 execu\u021bie. <\/p>\n<p><\/p>\n<p><em>Am dou\u0103 \u00eentreb\u0103ri. Este o chestie foarte tare. Au existat cazuri \u00een care datele \u00een produc\u021bie au fost critice, de exemplu, numerele cardurilor de credit? Exist\u0103 deja ceva preg\u0103tit sau este o sarcin\u0103 separat\u0103? \u0218i a doua \u00eentrebare \u2013 exist\u0103 ceva similar pentru MySQL?<\/em><\/p>\n<p><\/p>\n<p>Referitor la date. Vom face obfuscare, deocamdat\u0103 nu facem asta. Dar dac\u0103 desf\u0103\u0219ura\u021bi tocmai Joe, dac\u0103 nu oferi\u021bi acces dezvoltatorilor, atunci nu exist\u0103 acces la date. De ce? Pentru c\u0103 Joe nu afi\u015feaz\u0103 datele. El arat\u0103 doar metricile, planurile \u0219i at\u00e2t. A fost f\u0103cut a\u0219a special, deoarece este una dintre cerin\u021bele clientului nostru. Au vrut s\u0103 aib\u0103 posibilitatea de a optimiza, dar f\u0103r\u0103 a oferi acces tuturor. <\/p>\n<p><\/p>\n<p>Despre MySQL. Acest sistem poate fi folosit pentru orice, ce stocheaz\u0103 starea pe disc. \u0218i cum ne ocup\u0103m de Postgres, \u00een acest moment facem prioritar \u00eentreaga automatizare pentru Postgres. Vrem s\u0103 automatiz\u0103m ob\u021binerea datelor din backup. Configur\u0103m corect Postgres. \u0218tim cum s\u0103 ne asigur\u0103m c\u0103 planurile coincid etc. <\/p>\n<p><\/p>\n<p>Dar, deoarece sistemul este extensibil, va putea fi folosit \u0219i pentru MySQL. \u0218i exist\u0103 exemple de acest tip. O solu\u021bie similar\u0103 exist\u0103 la Yandex, dar nu o public\u0103 nic\u0103ieri. O folosesc \u00een interiorul Yandex.Metrica. \u0218i acolo este vorba despre povestea MySQL. Dar tehnologia este aceea\u0219i, ZFS. <\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare! Am \u0219i eu c\u00e2teva \u00eentreb\u0103ri. A\u021bi men\u021bionat c\u0103 clonarea poate fi folosit\u0103 pentru analiz\u0103, de exemplu, pentru a construi indec\u0219i suplimentari. Pute\u021bi s\u0103 ne spune\u021bi mai multe despre cum func\u021bioneaz\u0103 asta?<\/em><\/p>\n<p><\/p>\n<p><em>\u0218i voi pune imediat a doua \u00eentrebare despre uniformitatea standurilor, uniformitatea planurilor. Planul depinde, de asemenea, de statistica adunat\u0103 de Postgres. Cum rezolva\u021bi aceast\u0103 problem\u0103?<\/em><\/p>\n<p><\/p>\n<p>Nu avem analize pentru cazuri specifice, deoarece nu le-am folosit \u00eenc\u0103 \u00een acest fel, dar exist\u0103 aceast\u0103 posibilitate. Dac\u0103 discut\u0103m despre indec\u0219i, imagina\u021bi-v\u0103 c\u0103 o interogare este executat\u0103 pe un tabel cu sute de milioane de \u00eenregistr\u0103ri \u0219i pe o coloan\u0103 care, \u00een mod obi\u0219nuit, nu este indexat\u0103 \u00een produc\u021bie. \u0218i vrem s\u0103 calcul\u0103m anumite date. Dac\u0103 acest\u0103 interogare este executat\u0103 \u00een produc\u021bie, exist\u0103 riscul ca \u00een produc\u021bie s\u0103 existe laten\u021b\u0103, deoarece interogarea va dura un minut pentru a se procesa. <\/p>\n<p><\/p>\n<p>Ok, haide\u021bi s\u0103 facem un clon sub\u021bire, care nu este periculos s\u0103 fie oprit c\u00e2teva minute. \u0218i pentru a ne facilita analiza, vom ad\u0103uga indec\u0219i pe coloanele care ne intereseaz\u0103. <\/p>\n<p><\/p>\n<p><em>Indexul va fi creat de fiecare dat\u0103?<\/em><\/p>\n<p><\/p>\n<p>Se poate face astfel \u00eenc\u00e2t s\u0103 manipul\u0103m datele, s\u0103 facem snapshot-uri, iar apoi s\u0103 ne restabilim din acel snapshot \u0219i s\u0103 execut\u0103m noi interog\u0103ri. Adic\u0103, se poate face astfel \u00eenc\u00e2t s\u0103 putem ridica noi clone cu indec\u0219ii deja seta\u021bi.<\/p>\n<p><\/p>\n<p>Referitor la \u00eentrebarea despre statistici, dac\u0103 ne restabilim dintr-un backup, dac\u0103 facem replicare, atunci statistica va fi exact aceea\u0219i. Deoarece vom aduce toat\u0103 structura fizic\u0103 a datelor, adic\u0103 datele a\u0219a cum sunt cu toate metricele statistice. <\/p>\n<p><\/p>\n<p>Aici este o alt\u0103 problem\u0103. Dac\u0103 utiliza\u021bi o solu\u021bie cloud, atunci numai dump-urile logice sunt disponibile, deoarece Google, Amazon nu permit ob\u021binerea unei copii fizice. Aceasta va fi o problem\u0103. <\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare. Aici au fost ridicate dou\u0103 \u00eentreb\u0103ri bune despre MySQL \u0219i despre separarea resurselor. Dar, \u00een esen\u021b\u0103, totul se reduce la faptul c\u0103 este o tem\u0103 legat\u0103 nu de SGBD-uri specifice, ci, \u00een general, de sistemele de fi\u0219iere. \u0218i, prin urmare, problemele de separare a resurselor trebuie s\u0103 fie rezolvate din acel punct de vedere, nu la final, c\u0103 este Postgres, ci \u00een sistemul de fi\u0219iere, \u00een <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/server\/dts-dronten\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">server<\/a>, \u00een instan\u021b\u0103.<\/em> <\/p>\n<p><\/p>\n<p><em>\u00centrebarea mea este despre altceva. Este mai apropiat\u0103 de multilayer-ul bazei de date, unde exist\u0103 mai multe straturi. De exemplu, am configurat actualizarea unei imagini de zece terabai\u021bi, avem replicare \u00een curs. \u0218i folosim specific aceast\u0103 solu\u021bie pentru baze de date. Replicarea se desf\u0103\u0219oar\u0103, se actualizeaz\u0103 datele. \u00centre timp, 100 de angaja\u021bi lucreaz\u0103 paralel, care ruleaz\u0103 constant aceste diferite snapshot-uri. Ce facem? Cum facem s\u0103 nu existe conflicte, ca ei s\u0103 fi \u00eenceput una, iar apoi sistemul de fi\u0219iere s\u0103 se schimbe \u0219i aceste snapshot-uri s\u0103 devin\u0103 incoerente?<\/em> <\/p>\n<p><\/p>\n<p>Ei nu vor merge, pentru c\u0103 a\u0219a func\u021bioneaz\u0103 ZFS. Putem p\u0103stra separat \u00eentr-un singur flux modific\u0103rile sistemului de fi\u0219iere, care vin prin replicare. \u0218i putem p\u0103stra clonele pe versiunile anterioare ale datelor, pe care le folosesc dezvoltatorii. \u0218i asta func\u021bioneaz\u0103 pentru noi, totul este \u00een regul\u0103.<\/p>\n<p><\/p>\n<p><em>Deci, actualizarea va avea loc ca un strat suplimentar, iar toate noi instantanee vor fi bazate pe acest strat, nu-i a\u0219a?<\/em> <\/p>\n<p><\/p>\n<p>Din straturile anterioare, care au fost din replic\u0103rile anterioare. <\/p>\n<p><\/p>\n<p><em>Straturile anterioare se vor pierde, dar ele vor face referire la stratul vechi, iar noile imagini vor lua de la ultimul strat ob\u021binut \u00een actualizare?<\/em><\/p>\n<p><\/p>\n<p>\u00cen general, da. <\/p>\n<p><\/p>\n<p><em>Atunci, ca urmare, vom avea foarte multe straturi. \u0218i \u00een timp, va trebui s\u0103 le comprim\u0103m?<\/em><\/p>\n<p><\/p>\n<p>Da, exact. Exist\u0103 o anumit\u0103 fereastr\u0103. Salv\u0103m instantanee s\u0103pt\u0103m\u00e2nale. Acest lucru depinde de resursa pe care o ave\u021bi. Dac\u0103 ave\u021bi capacitate de stocare mare, pute\u021bi p\u0103stra instantanee pe o perioad\u0103 lung\u0103 de timp. Ele nu se vor \u0219terge singure. Nu va exista corup\u021bie a datelor. Dac\u0103 instantanele sunt dep\u0103\u0219ite, a\u0219a cum consider\u0103m noi, adic\u0103 depinde de politica companiei, atunci le putem \u0219terge pur \u0219i simplu \u0219i elibera spa\u021biu. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua, mul\u021bumesc pentru prezentare! \u00cen leg\u0103tur\u0103 cu \u00eentrebarea lui Joe. A\u021bi spus c\u0103 clientul nu dorea s\u0103 ofere acces la date tuturor. Strict vorbind, dac\u0103 cineva are rezultatul Explain Analyze, poate s\u0103 observe datele.<\/em> <\/p>\n<p><\/p>\n<p>Exact a\u0219a. De exemplu, putem scrie: \u201eSELECT FROM WHERE email = cuiva\u201d. Adic\u0103, nu vom vedea datele propriu-zise, dar putem observa anumite indicii indirecte. Trebuie s\u0103 \u00een\u021belegem asta. Dar, pe de alt\u0103 parte, totul este vizibil. Avem audit de jurnale, avem controlul altor colegi care vizioneaz\u0103 de asemenea ce fac dezvoltatorii. \u0218i dac\u0103 cineva \u00eencearc\u0103 s\u0103 fac\u0103 asta, atunci serviciul de securitate va veni s\u0103 se ocupe de aceast\u0103 problem\u0103. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! Mul\u021bumesc pentru prezentare! Am o \u00eentrebare scurt\u0103. Dac\u0103 \u00een companie nu se folose\u0219te Slack, exist\u0103 vreo leg\u0103tur\u0103 acum sau se poate desf\u0103\u0219ura instan\u021be pentru dezvoltatori pentru a conecta aplica\u021bia de testare la baze de date?<\/em><\/p>\n<p><\/p>\n<p>\u00cen prezent, exist\u0103 o integrare cu Slack, ceea ce \u00eenseamn\u0103 c\u0103 nu este disponibil niciun alt messenger, dar ne dorim foarte mult s\u0103 facem suport pentru alte mesaje. Ce pute\u021bi face? Pute\u021bi s\u0103 desf\u0103\u0219ura\u021bi DB Lab f\u0103r\u0103 Joe, s\u0103 folosi\u021bi REST API sau platforma noastr\u0103 pentru a crea clone \u0219i a v\u0103 conecta cu PSQL. Dar acest lucru se poate face doar dac\u0103 sunte\u021bi preg\u0103ti\u021bi s\u0103 oferi\u021bi dezvoltatorilor acces la date, deoarece aici nu va mai fi un ecran. <\/p>\n<p><\/p>\n<p><em>Nu am nevoie de acest strat, ci de o astfel de capacitate.<\/em><\/p>\n<p><\/p>\n<p>Atunci \u2013 da, se poate face.<\/p>\n<p>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Botul DBA Joe. Anatolie Stan\u021bler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}