{"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\/it\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come fa un backend developer a capire se una query SQL funzioner\u00e0 bene in produzione? Nelle grandi o rapidamente crescenti aziende, l'accesso alla produzione non \u00e8 per tutti. E anche con l'accesso, non tutte le query possono essere testate senza rischi, e creare una copia del database richiede spesso ore. Per affrontare questi problemi, abbiamo creato un DBA artificiale - Joe. \u00c8 gi\u00e0 stato implementato con successo in diverse aziende e aiuta decine di sviluppatori. <\/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=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ciao a tutti! Mi chiamo Anatolij Stansler. Lavoro presso <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Ci occupiamo di accelerare il processo di sviluppo, eliminando i ritardi legati all'uso di Postgres per sviluppatori, DBA e QA.<\/p>\n<p><\/p>\n<p>Abbiamo clienti fantastici e oggi parte della presentazione sar\u00e0 dedicata ai casi studio che abbiamo incontrato lavorando con loro. Vi parler\u00f2 di come li abbiamo aiutati a risolvere problemi piuttosto seri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando conduciamo uno sviluppo e facciamo migrazioni complesse e caricate, ci poniamo la domanda: \"Questa migrazione andr\u00e0 a buon fine?\" Facciamo uso delle revisioni, affidandoci alle conoscenze di colleghi pi\u00f9 esperti, esperti DBA. E loro possono dirci se va a buon fine o meno. <\/p>\n<p><\/p>\n<p>Tuttavia, potrebbe essere meglio se potessimo testarlo noi stessi su copie a grandezza naturale. Oggi parleremo dei vari approcci ai test, di come possiamo farlo meglio e degli strumenti a disposizione. Discuteremo anche i pro e i contro di questi approcci e cosa possiamo migliorare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chi ha mai fatto modifiche direttamente in prod, come la creazione di indici? \u00c8 successo a molti. E a chi di voi \u00e8 capitato di perdere dati o avere periodi di inattivit\u00e0? Allora questa situazione vi sar\u00e0 familiare. Per fortuna ci sono i backup. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il primo approccio \u00e8 il test in prod. Oppure, quando lo sviluppatore lavora da una macchina locale con dati di test, ha un campione limitato. Lo implementiamo in prod e ci troviamo in questa situazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 frustrante e costoso. Probabilmente non \u00e8 la scelta migliore. <\/p>\n<p><\/p>\n<p>Come possiamo farlo meglio? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prendiamo in considerazione lo staging e dirotta una parte di prod. O, nella soluzione migliore, utilizziamo realmente prod con tutti i dati. Una volta sviluppato localmente, dobbiamo anche verificare ulteriormente su staging. <\/p>\n<p><\/p>\n<p>Questo ci permetter\u00e0 di eliminare alcune errori, ovvero di evitarli in prod. <\/p>\n<p><\/p>\n<p>Quali problemi ci sono? <\/p>\n<p><\/p>\n<ul>\n<li>Il problema \u00e8 che questo staging lo condividiamo con i colleghi. E molto spesso capita che tu faccia qualche modifica, bam \u2013 e non ci sono pi\u00f9 dati, tutto il lavoro sprecato. Lo staging era multi-terabyte. E ci vuole molto tempo affinch\u00e9 si riavvii. E decidiamo di lavorarci domani. Ormai, lo sviluppo si \u00e8 bloccato. <\/li>\n<li>E, ovviamente, ci sono molti colleghi che lavorano l\u00ec, molte squadre. E dobbiamo coordinare manualmente. Ed \u00e8 scomodo. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E va detto che abbiamo solo un tentativo, un colpo, se vogliamo fare delle modifiche al database, toccare i dati, cambiare la struttura. E se qualcosa va storto, se c\u2019\u00e8 stato un errore nella migrazione, non possiamo tornare indietro rapidamente. <\/p>\n<p><\/p>\n<p>\u00c8 meglio rispetto all'approccio precedente, ma c'\u00e8 comunque una grande probabilit\u00e0 che qualche errore finisca in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa ci impedisce di dare a ogni sviluppatore un ambiente di test, una copia a grandezza naturale? Penso sia chiaro cosa ci frena. <\/p>\n<p><\/p>\n<p>Chi ha un database pi\u00f9 grande di un terabyte? Pi\u00f9 della met\u00e0 della sala. <\/p>\n<p><\/p>\n<p>E chiaramente, mantenere macchine per ogni sviluppatore, quando c'\u00e8 una produzione cos\u00ec grande, \u00e8 molto costoso e, inoltre, richiede molto tempo. <\/p>\n<p><\/p>\n<p>Abbiamo clienti che hanno compreso l'importanza di testare tutte le modifiche su copie a grandezza naturale, ma hanno un database inferiore a un terabyte e non dispongono delle risorse per mantenere un ambiente di test per ogni sviluppatore. Pertanto, devono scaricare i dump localmente sul proprio computer e testare in questo modo. Questo richiede un sacco di tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Anche se lo fai all'interno dell'infrastruttura, scaricare un terabyte di dati all'ora \u00e8 gi\u00e0 un ottimo risultato. Ma utilizzano dump logici, scaricano localmente dal cloud. Per loro, la velocit\u00e0 \u00e8 di circa 200 gigabyte all'ora. E ci vuole anche tempo per ripristinare dai dump logici, applicare gli indici, ecc.<\/p>\n<p><\/p>\n<p>Ma usano questo approccio perch\u00e9 consente di mantenere il prod affidabile. <\/p>\n<p><\/p>\n<p>Cosa possiamo fare qui? Facciamo in modo che gli ambienti di test siano economici e diamo a ciascun sviluppatore il proprio ambiente di test.<\/p>\n<p><\/p>\n<p>\u00c8 possibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In this approach, where we create thin clones for each developer, we can share it on a single machine. For instance, if you have a four-terabyte database and you want to provide it to 10 developers, you don't need to have 10 times four terabytes of databases. One machine is sufficient to create thin isolated copies for each developer, using just one machine. I will explain how this works shortly. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A real example:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>DB \u2013 4.5 terabytes. <\/p>\n<p>\n<\/li>\n<li>\n<p>We can obtain independent copies in 30 seconds. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>You don't need to wait for a test environment or depend on its size. You can get it in seconds. These will be completely isolated environments, but they share data among themselves. <\/p>\n<p><\/p>\n<p>This is amazing. Here we're talking about magic and a parallel universe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In our case, it works with the OpenZFS system. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS is a copy-on-write file system that natively supports snapshots and clones out of the box. It's reliable and scalable. It's very easy to manage. You can literally deploy it with just two commands. <\/p>\n<p><\/p>\n<p>There are other options:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>SAN (for example, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Il Database Lab di cui parlo \u00e8 modulare. Pu\u00f2 essere implementato utilizzando diverse opzioni. Ma per il momento ci siamo concentrati su OpenZFS, poich\u00e9 abbiamo riscontrato problemi specifici con LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come funziona? Invece di riscrivere i dati ogni volta che li modifichiamo, li memorizziamo semplicemente, etichettando che questi nuovi dati appartengono a un nuovo punto nel tempo, a un nuovo snapshot. <\/p>\n<p><\/p>\n<p>E in seguito, quando vogliamo tornare indietro o creare un nuovo clone da una versione precedente, diciamo semplicemente: \u00abOk, fornisceteci questi blocchi di dati che sono contrassegnati in questo modo\u00bb. <\/p>\n<p><\/p>\n<p>E questo utente lavorer\u00e0 con un set di dati del genere. Lo modificher\u00e0 progressivamente creando i propri snapshot. <\/p>\n<p><\/p>\n<p>E avremo diramazioni. Ogni sviluppatore, nel nostro caso, avr\u00e0 la possibilit\u00e0 di avere il proprio clone da modificare, mentre i dati condivisi saranno accessibili a tutti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per implementare un sistema del genere, \u00e8 necessario affrontare due problemi: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>La prima \u00e8 la fonte dei dati da cui li preleverai. Puoi configurare la replica da production. Puoi utilizzare i backup gi\u00e0 configurati, spero. WAL-E, WAL-G o Barman. E anche se stai utilizzando una soluzione Cloud, come RDS o Cloud SQL, puoi usare dump logici. Tuttavia, ti consigliamo di utilizzare backup, perch\u00e9 in questo modo manterrai anche la struttura fisica dei file, il che ti permetter\u00e0 di essere ancora pi\u00f9 vicino alle metriche che vedresti in produzione, per rilevare i problemi esistenti. <\/p>\n<p>\n<\/li>\n<li>\n<p>La seconda \u00e8 il luogo in cui desideri ospitare Database Lab. Pu\u00f2 essere Cloud o On-premise. \u00c8 importante menzionare che ZFS supporta la compressione dei dati. E lo fa in modo abbastanza efficace. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Immagina che ognuno di questi cloni, a seconda delle operazioni che eseguiamo sul database, crescer\u00e0 in qualche modo. Anche per questo dev sar\u00e0 necessario spazio. Ma grazie al fatto che abbiamo preso una base di 4,5 terabyte, ZFS la comprimer\u00e0 a 3,5 terabyte. A seconda delle impostazioni, questo pu\u00f2 variare. E ci sar\u00e0 ancora spazio per dev. <\/p>\n<p><\/p>\n<p>Un tale sistema pu\u00f2 essere utilizzato per diversi casi d'uso. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Questi sono sviluppatori, DBA per la verifica delle query, per l'ottimizzazione. <\/p>\n<p>\n<\/li>\n<li>\n<p>Questo pu\u00f2 essere utilizzato nei test QA per verificare una migrazione specifica prima di implementarla in prod. Possiamo anche creare ambienti speciali per QA con dati reali, in cui possono testare nuove funzionalit\u00e0. E questo richieder\u00e0 secondi invece di ore, e forse anche giorni in altri casi, dove non vengono utilizzate copie sottili. <\/p>\n<p>\n<\/li>\n<li>\n<p>E un altro caso. Se l'azienda non ha un sistema di analisi configurato, possiamo estrarre una copia sottile del database di produzione e fornire a lungo termine per richieste specifiche o indici speciali che possono essere utilizzati nell'analisi.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con questo approccio:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Bassa probabilit\u00e0 di errori in produzione, poich\u00e9 tutte le modifiche sono state testate su dati di dimensioni complete. <\/p>\n<p>\n<\/li>\n<li>\n<p>Si instaura una cultura del testing, poich\u00e9 ora non \u00e8 necessario attendere ore il proprio stand. <\/p>\n<p>\n<\/li>\n<li>\n<p>E non ci sono ostacoli, non ci sono attese tra i test. Puoi davvero andare e verificare. E sar\u00e0 migliore, poich\u00e9 accelereremo lo sviluppo. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Ci sar\u00e0 meno refactoring. Ci saranno meno bug in produzione. Li rifattorizzeremo meno in seguito. <\/p>\n<p>\n<\/li>\n<li>\n<p>Possiamo annullare modifiche irreversibili. Questo non \u00e8 previsto negli approcci standard. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>\u00c8 vantaggioso, perch\u00e9 condividiamo le risorse degli ambienti di test. <\/li>\n<\/ol>\n<p><\/p>\n<p>\u00c8 gi\u00e0 un buon inizio, ma cosa si potrebbe accelerare ulteriormente?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Grazie a questo sistema possiamo abbattere notevolmente la barriera all'ingresso per tale tipo di test. <\/p>\n<p><\/p>\n<p>Attualmente c'\u00e8 un circolo vizioso, in cui lo sviluppatore, per accedere a dati reali su larga scala, deve diventare un esperto. Deve essere affidato un tale accesso. <\/p>\n<p><\/p>\n<p>Ma come crescere se questo accesso non c'\u00e8? E se puoi accedere solo a un insieme di dati di test molto ridotto? Allora non si riesce a ottenere una vera esperienza. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come uscire da questo circolo? Come primo interfaccia amichevole per sviluppatori di qualsiasi livello, abbiamo scelto un bot per Slack. Ma potrebbe essere qualsiasi altro tipo di interfaccia. <\/p>\n<p><\/p>\n<p>Cosa permette di fare? Puoi prendere una richiesta specifica e inviarla in un canale specializzato per il database. Creeremo automaticamente un clone leggero in pochi secondi. Eseguiremo questa richiesta. Raccoglieremo metriche e raccomandazioni. Mostreremo una visualizzazione. E quel clone rimarr\u00e0 per ottimizzare successivamente la richiesta, aggiungendo indici ecc. <\/p>\n<p><\/p>\n<p>Inoltre, Slack ci offre opportunit\u00e0 di collaborazione pronte all'uso. Poich\u00e9 \u00e8 semplicemente un canale, puoi iniziare a discutere quella richiesta direttamente l\u00ec nel thread, pingando i tuoi colleghi, i DBA all'interno dell'azienda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tuttavia, ci sono anche delle problematiche. Poich\u00e9 siamo nel mondo reale e utilizziamo un server che ospita molti cloni contemporaneamente, dobbiamo ridurre la quantit\u00e0 di memoria e potenza di elaborazione disponibili per i cloni. <\/p>\n<p><\/p>\n<p>Ma per garantire che questi test siano credibili, dobbiamo trovare una soluzione a questo problema. <\/p>\n<p><\/p>\n<p>\u00c8 chiaro che un aspetto importante sono i dati identici. Ma questo lo abbiamo gi\u00e0. Vogliamo ottenere una configurazione uniforme. E possiamo fornire una configurazione praticamente identica. <\/p>\n<p><\/p>\n<p>Sarebbe fantastico avere hardware identico a quello di produzione, ma potrebbe differire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ricordiamo come funziona Postgres con la memoria. Abbiamo due cache. Una \u00e8 quella del file system e l'altra \u00e8 la cache del buffer condiviso di Postgres. <\/p>\n<p><\/p>\n<p>\u00c8 importante notare che la cache del buffer condiviso viene allocata all'avvio di Postgres a seconda delle dimensioni impostate nella configurazione. <\/p>\n<p><\/p>\n<p>La seconda cache utilizza tutto lo spazio disponibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando creiamo pi\u00f9 cloni su una sola macchina, riempiamo gradualmente la memoria. Idealmente, la cache del buffer condiviso dovrebbe essere il 25% dell'intero volume di memoria disponibile sulla macchina. <\/p>\n<p><\/p>\n<p>Se non modifichiamo questo parametro, possiamo avviare solo 4 istanze sulla stessa macchina, ovvero solo 4 cloni leggeri. Questo \u00e8 un problema, poich\u00e9 vorremmo averne molti di pi\u00f9. <\/p>\n<p><\/p>\n<p>D'altro canto, la cache del buffer viene utilizzata per eseguire query e per gli indici, quindi il piano dipende dalle dimensioni delle nostre cache. Se riduciamo questo parametro all'improvviso, i nostri piani potrebbero cambiare notevolmente.<\/p>\n<p><\/p>\n<p>Ad esempio, se su prod abbiamo una cache grande, Postgres preferir\u00e0 utilizzare l'indice. Se non \u00e8 cos\u00ec, allora verr\u00e0 utilizzato SeqScan. E quale sarebbe il senso se questi piani non coincidessero? <\/p>\n<p><\/p>\n<p>Ma qui arriviamo a una soluzione, cio\u00e8 il piano in Postgres non dipende dalla dimensione specifica impostata nel Shared Buffer, ma dipende da effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (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 \u00e8 il volume di cache previsto che abbiamo a disposizione, cio\u00e8 la somma del Buffer Cache e della cache del filesystem. Questo \u00e8 impostato nella configurazione. E questa memoria non viene allocata. <\/p>\n<p><\/p>\n<p>E grazie a questo parametro possiamo ingannare Postgres, affermando che in realt\u00e0 abbiamo accesso a molti dati, anche se questi dati non sono disponibili. In questo modo, i piani corrisponderanno completamente all'ambiente di produzione. <\/p>\n<p><\/p>\n<p>Ma ci\u00f2 potrebbe influire sui tempi. Ottimizziamo le richieste in base ai tempi, ma \u00e8 importante notare che i tempi dipendono da molti fattori: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Dipende dal carico attuale su prod. <\/p>\n<p>\n<\/li>\n<li>\n<p>Dipende dalle caratteristiche della macchina stessa. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>E questo \u00e8 un parametro indiretto, ma in realt\u00e0 possiamo ottimizzare in base alla quantit\u00e0 di dati che questa richiesta legger\u00e0 per ottenere un risultato. <\/p>\n<p><\/p>\n<p>E se vogliamo che il timing si avvicini a quello che vedremo in prod, dobbiamo utilizzare hardware il pi\u00f9 simile possibile e, forse, anche di pi\u00f9, per ospitare tutti i cloni. Ma questo \u00e8 un compromesso, cio\u00e8 avrete stessi piani, vedrete quanti dati legge una specifica query e potrete trarre conclusioni: questa query \u00e8 buona (o migrata) oppure cattiva, e deve essere ottimizzata ulteriormente. <\/p>\n<p><\/p>\n<p>Analizziamo come avviene precisamente l'ottimizzazione con Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prendiamo una query da un sistema reale. In questo caso, il database \u00e8 di 1 terabyte. E vogliamo calcolare il numero di post recenti che hanno ricevuto pi\u00f9 di 10 like. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Scriviamo un messaggio nel canale, si \u00e8 aperto un clone per noi. E vedremo che una tale query si eseguir\u00e0 in 2,5 minuti. \u00c8 la prima cosa che noteremo.<\/p>\n<p><\/p>\n<p>Joe mostrer\u00e0 raccomandazioni automatiche basate sul piano e sulle metriche. <\/p>\n<p><\/p>\n<p>Vedremo che la query sta elaborando troppi dati per ottenere un numero relativamente ridotto di righe. \u00c8 necessario un indice specializzato, poich\u00e9 abbiamo notato che nella query ci sono troppe righe filtrate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vediamo pi\u00f9 nel dettaglio cosa \u00e8 successo. In effetti, abbiamo letto quasi un gigabyte e mezzo di dati dalla cache di file o addirittura dal disco. E questo non \u00e8 positivo, poich\u00e9 abbiamo recuperato solo 142 righe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eppure, qui abbiamo una scansione dell'indice e dovrebbe funzionare rapidamente, ma poich\u00e9 abbiamo filtrato troppe righe (abbiamo dovuto contarlas), la query \u00e8 risultata lenta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ci\u00f2 \u00e8 avvenuto nel piano a causa del fatto che le condizioni nella query e quelle nell'indice non coincidono completamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Proviamo a rendere l'indice pi\u00f9 preciso e vediamo come cambia l'esecuzione della query dopo questo aggiustamento. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La creazione dell'indice ha richiesto abbastanza tempo, ma ora stiamo verificando la query e osserviamo che il tempo invece di 2,5 minuti \u00e8 diventato solo 156 millisecondi, il che \u00e8 piuttosto buono. E leggiamo solo 6 megabyte di dati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ora stiamo utilizzando una scansione solo indice.<\/p>\n<p><\/p>\n<p>Un'altra questione importante \u00e8 che vogliamo presentare il piano in un modo pi\u00f9 comprensibile. Abbiamo implementato una visualizzazione tramite Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 un'altra richiesta, pi\u00f9 complessa. Costruiamo i Flame Graphs su due parametri: la quantit\u00e0 di dati che un nodo specifico ha elaborato e il timing, ovvero il tempo di esecuzione del nodo. <\/p>\n<p><\/p>\n<p>Qui possiamo confrontare specificamente i nodi tra di loro. Sar\u00e0 chiaro quale consuma di pi\u00f9 o di meno, cosa che di solito \u00e8 difficile da fare con altri metodi di visualizzazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Certo, tutti conoscono explain.depesz.com. Una buona caratteristica di questa visualizzazione \u00e8 che salviamo il piano testuale e riportiamo alcuni parametri principali in una tabella per poterli ordinare. <\/p>\n<p><\/p>\n<p>E anche gli sviluppatori che non hanno ancora approfondito questo argomento usano explain.depesz.com, perch\u00e9 per loro \u00e8 pi\u00f9 semplice capire quali metriche siano importanti e quali no. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'\u00e8 un nuovo approccio alla visualizzazione: explain.dalibo.com. Fanno una visualizzazione ad albero, ma qui \u00e8 molto difficile confrontare i nodi tra di loro. \u00c8 possibile capire bene la struttura, ma se c'\u00e8 una grande richiesta, sar\u00e0 necessario scorrere avanti e indietro, ma \u00e8 pur sempre un'opzione. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Collaborazione<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, come ho gi\u00e0 detto, Slack ci offre la possibilit\u00e0 di collaborare. Ad esempio, se ci troviamo di fronte a una richiesta complessa che non \u00e8 chiara da ottimizzare, possiamo chiarire questa questione con i nostri colleghi in un thread su Slack. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Il bot DBA Joe. Anatolij Stancler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Riteniamo sia importante testare su dati a grandezza naturale. Per questo abbiamo creato lo strumento Update Database Lab, che \u00e8 disponibile in open source. Puoi usare anche il bot Joe. Puoi prenderlo subito e implementarlo da te. Tutti i guide sono disponibili l\u00ec. <\/p>\n<p><\/p>\n<p>\u00c8 importante anche notare che la soluzione in s\u00e9 non \u00e8 rivoluzionaria, poich\u00e9 esiste Delphix, ma \u00e8 una soluzione enterprise. \u00c8 completamente chiusa e costa molto. Noi ci specializziamo su Postgres. Tutti i nostri prodotti sono in open source. Unisciti a noi! <\/p>\n<p><\/p>\n<p>Con questo concludo. Grazie!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Domande<\/h2>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la presentazione! \u00c8 molto interessante, soprattutto per me, poich\u00e9 ho affrontato un compito simile qualche tempo fa. Pertanto, ho una serie di domande. Spero di poterne fare almeno alcune.<\/em><\/p>\n<p><\/p>\n<p><em>\u00c8 interessante sapere come calcolate lo spazio per questo ambiente. La tecnologia implica che, in determinate circostanze, i vostri cloni possano crescere fino a raggiungere la dimensione massima. In termini semplici, se avete un database di dieci terabyte e 10 cloni, \u00e8 facile immaginare una situazione in cui ogni clone pesi 10 dati unici. Come calcolate quello spazio, cio\u00e8 quel delta di cui avete parlato, in cui vivranno questi cloni?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda. \u00c8 importante monitorare i cloni specifici. Se un clone subisce un cambiamento eccessivo, iniziando a crescere, possiamo prima avvisare l'utente di questo, oppure fermare immediatamente quel clone per evitare una situazione di fail. <\/p>\n<p><\/p>\n<p><em>S\u00ec, ho una domanda correlata. Come garantite il ciclo di vita di questi moduli? \u00c8 un problema e una storia a parte per noi. Come avviene?<\/em><\/p>\n<p><\/p>\n<p>Ogni clone ha un ttl. In linea di principio, abbiamo un ttl fisso. <\/p>\n<p><\/p>\n<p><em>Qual \u00e8, se non \u00e8 un segreto?<\/em><\/p>\n<p><\/p>\n<p>1 ora, cio\u00e8 idle \u2013 1 ora. Se non viene utilizzato, lo eliminiamo. Ma qui non c'\u00e8 nulla di sorprendente, poich\u00e9 possiamo creare un clone in pochi secondi. E se serve di nuovo, allora \u2013 prego. <\/p>\n<p><\/p>\n<p><em>Anch'io sono curioso riguardo alla scelta delle tecnologie, perch\u00e9, ad esempio, noi utilizziamo parallelamente diversi metodi per vari motivi. Perch\u00e9 proprio ZFS? Perch\u00e9 non hai usato LVM? Hai menzionato che ci sono stati problemi con LVM. Quali erano questi problemi? A mio avviso, la soluzione pi\u00f9 ottimale \u00e8 quella con lo storage condiviso, in termini di prestazioni.<\/em> <\/p>\n<p><\/p>\n<p><em>Qual \u00e8 il principale problema con ZFS? Il fatto che devi eseguirlo su un unico host, cio\u00e8 tutti gli instances vivranno all'interno di un'unica operativit\u00e0. E nel caso dello storage condiviso, puoi collegare hardware diverso. E il collo di bottiglia \u00e8 costituito solo dai blocchi che si trovano nello storage condiviso. E la questione interessante \u00e8 proprio quella della scelta delle tecnologie. Perch\u00e9 non LVM?<\/em><\/p>\n<p><\/p>\n<p>Possiamo discutere specificamente di LVM durante il meetup. Per quanto riguarda lo storage, \u00e8 semplicemente costoso. Possiamo implementare il sistema ZFS ovunque. Puoi distribuirlo sulla tua macchina. Puoi semplicemente scaricare il repository e installarlo. ZFS \u00e8 praticamente installabile ovunque, se parliamo di Linux. Cio\u00e8, abbiamo una soluzione molto flessibile. E ZFS in s\u00e9 offre gi\u00e0 moltissimo out of the box. Puoi caricare un numero illimitato di dati, collegare un gran numero di dischi, e ci sono snapshot. E, come ho gi\u00e0 detto, \u00e8 molto semplice da amministrare. Cio\u00e8, risulta molto piacevole da usare. \u00c8 collaudato, ha molti anni. Ha una community molto ampia, che continua a crescere. ZFS \u00e8 una soluzione molto affidabile. <\/p>\n<p><\/p>\n<p>Nikolay Samokhvalov: Posso aggiungere un commento? Mi chiamo Nikolay, lavoro insieme ad Anatoliy. Sono d'accordo, lo storage \u00e8 fantastico. E alcuni dei nostri clienti hanno Pure Storage, ecc. <\/p>\n<p><\/p>\n<p>Anatoliy ha giustamente sottolineato che puntiamo alla modularit\u00e0. In futuro, possiamo implementare un'unica interfaccia \u2013 crea uno snapshot, crea un clone, distruggi un clone. \u00c8 tutto molto semplice. E lo storage \u00e8 fantastico, se disponibile.<\/p>\n<p><\/p>\n<p>Ma ZFS \u00e8 accessibile a tutti. \u00c8 tempo che Delphix smetta di monopolizzare, hanno 300 clienti. Di questi, 50 sono nella fortune 100, cio\u00e8 sono orientati verso la NASA e simili. \u00c8 ora di rendere questa tecnologia accessibile a tutti. Ecco perch\u00e9 abbiamo il Core open source. Abbiamo una parte dell'interfaccia che non \u00e8 open source. Questa \u00e8 la piattaforma che mostreremo. Ma vogliamo che sia disponibile per tutti. Vogliamo fare una rivoluzione affinch\u00e9 tutti i tester smettano di indovinare sui laptop. Dobbiamo scrivere SELECT e vedere immediatamente che \u00e8 lento. \u00c8 sufficiente aspettare che il DBA ce ne parli. Questo \u00e8 l'obiettivo principale. E penso che ci arriveremo tutti. E queste cose le facciamo per renderle accessibili a tutti. Ecco perch\u00e9 ZFS, perch\u00e9 sar\u00e0 disponibile ovunque. Grazie alla community per la risoluzione dei problemi e per avere la licenza open source, e cos\u00ec via. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! Mi chiamo Maxim. Abbiamo affrontato problemi simili. Li abbiamo risolti da noi. Come separate le risorse tra questi cloni? Ogni clone pu\u00f2 occuparsi di un compito specifico: uno testa una cosa, un altro un'altra, qualcuno sta costruendo un indice, qualcun altro ha un lavoro pesante in corso. Se per quanto riguarda la CPU si pu\u00f2 anche suddividere, per l'IO come lo dividete? Questa \u00e8 la prima domanda.<\/em><\/p>\n<p><\/p>\n<p><em>E la seconda domanda riguarda la diversit\u00e0 degli ambienti. Supponiamo che qui io abbia ZFS e tutto funzioni alla grande, ma il cliente in produzione non ha ZFS, ma ad esempio ext4. Come possiamo gestire questa situazione?<\/em><\/p>\n<p><\/p>\n<p>Le domande sono molto buone. Ho accennato brevemente a questo problema relativo alla condivisione delle risorse. E la soluzione \u00e8 la seguente. Immaginate di testare in staging. Potreste trovavi anche in una situazione simile, in cui qualcuno sta creando un certo carico di lavoro e qualcun altro un altro. Alla fine, visualizzate metriche poco chiare. Anche un problema simile pu\u00f2 verificarsi in produzione. Quando volete controllare una certa query e notate che presenta dei problemi \u2013 \u00e8 lenta nel rispondere, in realt\u00e0 il problema non era nella query, ma nel carico di lavoro parallelo presente. <\/p>\n<p><\/p>\n<p>E per questo \u00e8 importante concentrarsi su quale sar\u00e0 il piano, quali passi seguiremo nel piano e quanti dati apporteremo. Il fatto che i nostri dischi, ad esempio, possano essere sovraccarichi da qualcos'altro influenzer\u00e0 specificamente il timing. Ma possiamo valutare, in base alla quantit\u00e0 di dati, quanto carico genera questa query. Non \u00e8 cos\u00ec importante se ci sar\u00e0 qualcun altro a eseguire operazioni contemporaneamente. <\/p>\n<p><\/p>\n<p><em>Ho due domande. \u00c8 una cosa davvero interessante. Ci sono stati casi in cui i dati in produzione sono critici, ad esempio, i numeri delle carte di credito? Esiste gi\u00e0 qualcosa di pronto o \u00e8 un'attivit\u00e0 separata? E la seconda domanda: esiste qualcosa del genere per MySQL?<\/em><\/p>\n<p><\/p>\n<p>Per quanto riguarda i dati. Stiamo pianificando di fare offuscamento, anche se attualmente non lo facciamo. Ma se stai implementando proprio Joe, se non dai accesso agli sviluppatori, non ci sar\u00e0 accesso ai dati. Perch\u00e9? Perch\u00e9 Joe non mostra i dati. Mostra solo metriche, piani e altro. \u00c8 stato progettato appositamente in quanto \u00e8 una delle richieste del nostro cliente. Volevano avere la possibilit\u00e0 di ottimizzare, ma senza dare accesso indiscriminato. <\/p>\n<p><\/p>\n<p>Per quanto riguarda MySQL. Questo sistema pu\u00f2 essere utilizzato per qualsiasi cosa che memorizzi state su disco. E poich\u00e9 ci occupiamo di Postgres, stiamo attualmente realizzando l'automazione completa per Postgres. Vogliamo automatizzare l'estrazione dei dati dai backup. Configuriamo correttamente Postgres. Sappiamo come fare in modo che i piani coincidano, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Ma poich\u00e9 il sistema \u00e8 espandibile, sar\u00e0 possibile utilizzarlo anche per MySQL. E ci sono esempi di questo tipo. Una cosa simile esiste in Yandex, ma non viene pubblicata da nessuna parte. La usano internamente in Yandex.Metrica. E l\u00ec si parla proprio di MySQL. Ma le tecnologie sono le stesse, ZFS. <\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Ho anche un paio di domande. Hai menzionato che il cloning pu\u00f2 essere utilizzato per l'analisi, ad esempio, per costruire indici aggiuntivi. Puoi spiegare un po' meglio come funziona?<\/em><\/p>\n<p><\/p>\n<p><em>E faccio subito la seconda domanda riguardo alla uniformit\u00e0 dei stand, uniformit\u00e0 dei piani. Il piano dipende anche dalle statistiche raccolte da Postgres. Come affrontate questo problema?<\/em><\/p>\n<p><\/p>\n<p>Non abbiamo casi specifici di analisi, perch\u00e9 non l'abbiamo ancora utilizzato in questo modo, ma questa possibilit\u00e0 esiste. Se parliamo di indici, immagina un query su una tabella con centinaia di milioni di record e su una colonna che generalmente non \u00e8 indicizzata in produzione. E vogliamo calcolare alcuni dati. Se eseguiamo questa query in produzione, c'\u00e8 la possibilit\u00e0 che ci sia un downtime, perch\u00e9 la query potrebbe impiegare un minuto per eseguire. <\/p>\n<p><\/p>\n<p>Ok, facciamo un clone leggero che possiamo fermare senza problemi per qualche minuto. Per rendere pi\u00f9 comoda l'analisi dei dati, aggiungeremo indici per le colonne di nostro interesse. <\/p>\n<p><\/p>\n<p><em>L'indice verr\u00e0 creato ogni volta?<\/em><\/p>\n<p><\/p>\n<p>Possiamo fare in modo di toccare i dati, creare snapshot, e poi ripristinare da quello snapshot e lanciare nuove query. Cio\u00e8, possiamo fare in modo di poter creare nuovi cloni gi\u00e0 con gli indici impostati.<\/p>\n<p><\/p>\n<p>Per quanto riguarda la questione delle statistiche, se ci ripristiniamo da un backup e facciamo replica, avremo esattamente le stesse statistiche. Perch\u00e9 porteremo tutta la struttura fisica dei dati, cio\u00e8 i dati come sono con tutte le metriche statistiche. <\/p>\n<p><\/p>\n<p>Qui c'\u00e8 un'altra problematica. Se stai utilizzando una soluzione cloud, avrai accesso solo a dump logici, perch\u00e9 Google e Amazon non ti permettono di ottenere una copia fisica. Questo rappresenter\u00e0 un problema. <\/p>\n<p><\/p>\n<p><em>Grazie per la relazione. Sono emerse due buone domande su MySQL e sulla divisione delle risorse. Tuttavia, in sostanza, tutto si riduce al fatto che si tratta di un argomento non specifico per i DBMS, ma in generale per i file system. Pertanto, anche le domande sulla divisione delle risorse devono essere affrontate da quel punto di vista, non considerando solo Postgres, ma il file system in <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/server\/dts-dronten\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">server<\/a>, nell'istanza.<\/em> <\/p>\n<p><\/p>\n<p><em>La mia domanda \u00e8 un po' diversa. Riguarda di pi\u00f9 la multilivello del database, dove ci sono diversi strati. Noi, ad esempio, abbiamo configurato l'aggiornamento di un'immagine di dieci terabyte, con la replica in corso. E stiamo utilizzando specificamente questa soluzione per i database. La replica \u00e8 in atto e i dati vengono aggiornati. Qui lavorano parallelamente 100 dipendenti che eseguono continuamente queste diverse istantanee. Cosa fare? Come fare per evitare conflitti, in cui avviano una cosa e poi il file system cambia, e queste istantanee si rovinano tutte?<\/em> <\/p>\n<p><\/p>\n<p>Non si rovinano, perch\u00e9 ZFS funziona in questo modo. Possiamo mantenere separatamente in un unico flusso le modifiche al file system, che arrivano grazie alla replica. E mantenere sui vecchi versioni dei dati i cloni che gli sviluppatori utilizzano. E questo per noi funziona, va tutto bene.<\/p>\n<p><\/p>\n<p><em>Quindi, l'aggiornamento avverr\u00e0 come uno strato aggiuntivo, e tutte le nuove immagini saranno basate su questo strato, giusto?<\/em> <\/p>\n<p><\/p>\n<p>Dai livelli precedenti, che provenivano dalle repliche precedenti. <\/p>\n<p><\/p>\n<p><em>I livelli precedenti verranno rimossi, ma faranno riferimento al vecchio strato, e le nuove immagini verranno prese dall'ultimo strato ottenuto con l'aggiornamento?<\/em><\/p>\n<p><\/p>\n<p>In generale, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Allora, come conseguenza, avremo molti strati. E col tempo dovranno essere compressi?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, esatto. C'\u00e8 una certa finestra. Manteniamo snapshot settimanali. Questo dipende dalle risorse che hai. Se hai la possibilit\u00e0 di conservare molti dati, puoi mantenere gli snapshot per un lungo periodo. Non si eliminano da soli. Non ci sar\u00e0 corruzione dei dati. Se gli snapshot diventano obsoleti, come ci sembra, cio\u00e8 dipende dalla policy aziendale, allora possiamo semplicemente eliminarli e liberare spazio. <\/p>\n<p><\/p>\n<p><em>Buongiorno, grazie per la presentazione! Riguardo alla domanda di Joe. Hai detto che il cliente non voleva dare accesso indiscriminato ai dati. Tecnicalmente, se una persona ha il risultato di Explain Analyze, pu\u00f2 monitorare i dati.<\/em> <\/p>\n<p><\/p>\n<p>Esatto. Ad esempio, possiamo scrivere: \u00abSELECT FROM WHERE email = qualcuno\u00bb. Cio\u00e8, non vedremo i dati stessi, ma possiamo osservare alcuni indizi indiretti. \u00c8 importante capirlo. D'altra parte, per\u00f2, tutto questo \u00e8 visibile. Abbiamo l'audit dei log, abbiamo il controllo degli altri colleghi, che vedono anche cosa fanno gli sviluppatori. E se qualcuno prova a farlo, il servizio di sicurezza arriver\u00e0 da loro e si occuper\u00e0 della questione. <\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la presentazione! Ho una domanda breve. Se Slack non \u00e8 utilizzato in azienda, c'\u00e8 attualmente qualche collegamento a esso oppure possiamo lanciare istanze per sviluppatori, in modo da collegare un'app di test ai database?<\/em><\/p>\n<p><\/p>\n<p>Attualmente c'\u00e8 un collegamento a Slack, cio\u00e8 non esiste nessun altro messaggero, ma sarebbe bello implementare il supporto per altri messaggeri. Cosa puoi fare? Puoi lanciare un DB Lab senza Joe, utilizzare la nostra piattaforma o l'API REST per creare cloni e connetterti tramite PSQL. Ma \u00e8 fattibile solo se sei disposto a dare ai tuoi sviluppatori accesso ai dati, poich\u00e9 qui non ci sar\u00e0 alcuno schermo. <\/p>\n<p><\/p>\n<p><em>Questa interfaccia non mi serve, ma ho bisogno di questa possibilit\u00e0.<\/em><\/p>\n<p><\/p>\n<p>Allora \u2013 s\u00ec, si pu\u00f2 fare.<\/p>\n<p>Fonte: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/it\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Bot DBA Joe. Anatolij Stansler (Postgres.ai) | ProHoster","description":"Come fa un backend developer a capire se una query SQL funzioner\u00e0 bene in produzione? In grandi aziende o in quelle in rapida crescita, l'accesso alla produzione non \u00e8 per tutti. E anche con l'accesso, non \u00e8 sempre possibile testare le query senza problemi, e la creazione di una copia del database spesso richiede ore. Per affrontare questi problemi, abbiamo creato un DBA artificiale \u2013 Joe. Ha gi\u00e0 avuto successo.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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:description":"\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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}