{"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":"DBA-bot Joe. Anatoly Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"DBA-bot 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>Come fa un sviluppatore backend a capire se una query SQL funzioner\u00e0 bene in produzione? In aziende grandi o in rapida crescita, l'accesso alla produzione non \u00e8 garantito per tutti. E anche con accesso, non tutti i query possono essere testati senza problemi, e creare una copia del database pu\u00f2 richiedere ore. Per affrontare questi problemi, abbiamo creato un DBA artificiale \u2014 Joe. \u00c8 gi\u00e0 stato implementato con successo in diverse aziende e assiste pi\u00f9 di una dozzina 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=\"DBA-bot 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>Ciao a tutti! Mi chiamo Anatolij Stansler. Lavoro per l'azienda <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Ci occupiamo di velocizzare il processo di sviluppo, eliminando le pause legate all'uso di Postgres per sviluppatori, DBA e QA.<\/p>\n<p><\/p>\n<p>Abbiamo clienti fantastici e oggi parte della mia presentazione sar\u00e0 dedicata ai casi che abbiamo affrontato lavorando con loro. Vi parler\u00f2 di come li abbiamo aiutati a risolvere problemi piuttosto gravi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Quando conduciamo sviluppo e facciamo migrazioni complesse e pesanti, ci poniamo la domanda: \"Questa migrazione avr\u00e0 successo?\" Usiamo revisioni, attingiamo alla conoscenza di colleghi pi\u00f9 esperti e DBA esperti. E possono dirci se avr\u00e0 successo o meno. <\/p>\n<p><\/p>\n<p>Ma, forse sarebbe meglio se potessimo testarlo noi stessi su copie a grandezza naturale. E oggi discuteremo proprio dei metodi attuali di test e di come possiamo farlo al meglio e quali strumenti utilizzare. Parleremo anche dei vantaggi e svantaggi di questi approcci e di cosa possiamo migliorare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Chi ha mai creato indici o apportato modifiche direttamente in produzione? In molti. E a chi \u00e8 capitato di perdere dati o subire interruzioni? Allora conoscete questo dolore. Per fortuna, ci sono i backup. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Il primo approccio \u00e8 il test in produzione. Oppure, quando uno sviluppatore lavora dalla sua macchina locale, ha dati di test e c'\u00e8 un campione limitato. E distribuiamo in produzione, ottenendo una situazione del genere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Questo \u00e8 doloroso, questo \u00e8 costoso. Probabilmente, sarebbe meglio non farlo. <\/p>\n<p><\/p>\n<p>Qual \u00e8 il modo migliore per procedere? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Prendiamo un ambiente di staging e riserviamo l\u00ec una parte della produzione. O, meglio ancora, prendiamo una vera produzione, tutti i dati. E dopo aver sviluppato localmente, verificheremo ulteriormente anche su staging. <\/p>\n<p><\/p>\n<p>Questo ci permetter\u00e0 di eliminare alcuni errori, ovvero di non farli arrivare in produzione. <\/p>\n<p><\/p>\n<p>Quali problemi ci sono? <\/p>\n<p><\/p>\n<ul>\n<li>Il problema \u00e8 che condividiamo questo staging con i colleghi. E molto spesso succede che fai una modifica, bam \u2013 e non ci sono dati, tutto inutile. Lo staging era di diversi terabyte. E bisogna aspettare molto perch\u00e9 si riparta. E decidiamo di rinviare il lavoro a domani. Insomma, lo sviluppo \u00e8 bloccato. <\/li>\n<li>E, naturalmente, ci sono molti colleghi che lavorano l\u00ec, molte squadre. E bisogna coordinarsi manualmente. E questo \u00e8 poco pratico. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E va detto che abbiamo solo un tentativo, un colpo, se vogliamo apportare delle modifiche al database, toccare i dati, cambiare la struttura. E se qualcosa va storto, se c'\u00e8 un errore nella migrazione, non possiamo tornare indietro rapidamente. <\/p>\n<p><\/p>\n<p>\u00c8 meglio rispetto al precedente approccio, ma c'\u00e8 comunque un'alta probabilit\u00e0 che qualche errore vada in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>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>\u00c8 chiaro che mantenere macchine per ogni sviluppatore, quando si ha un grande ambiente di produzione, \u00e8 molto costoso e richiede tempo. <\/p>\n<p><\/p>\n<p>Abbiamo clienti che hanno capito quanto sia importante testare tutte le modifiche su copie a grandezza naturale, ma hanno database che sono sotto il terabyte e non hanno risorse per tenere un ambiente di test per ogni sviluppatore. Quindi devono scaricare i dump localmente sul proprio computer e fare i test in questo modo. Questo richiede molto tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Anche se lo fai all'interno dell'infrastruttura, scaricare un terabyte di dati in un'ora \u00e8 gi\u00e0 molto buono. Ma loro usano dump logici, scaricano localmente dal cloud. Per loro la velocit\u00e0 \u00e8 di circa 200 gigabyte all'ora. E ci vuole tempo anche per estrarre dai dump logici, applicare gli indici, ecc.<\/p>\n<p><\/p>\n<p>Ma utilizzano 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 ogni sviluppatore il proprio ambiente di test.<\/p>\n<p><\/p>\n<p>E questo \u00e8 possibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E in questo approccio, quando facciamo clone leggeri per ogni sviluppatore, possiamo condividerlo su una sola macchina. Ad esempio, se hai un database di quattro terabyte e vuoi darlo a 10 sviluppatori, non hai bisogno di avere 10 volte il database di quattro terabyte. Ti basta una macchina per fare copie isolate e leggere per ogni sviluppatore, utilizzando una sola macchina. Come funziona te lo racconter\u00f2 pi\u00f9 tardi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Esempio reale:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>DB \u2013 4,5 terabyte. <\/p>\n<p>\n<\/li>\n<li>\n<p>Possiamo ottenere copie indipendenti in 30 secondi. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Non devi aspettare un ambiente di test e dipendere dalla sua dimensione. Puoi ottenerlo in pochi secondi. Saranno ambienti completamente isolati, ma che condividono i dati tra di loro. <\/p>\n<p><\/p>\n<p>\u00c8 fantastico. Qui parliamo di magia e universi paralleli. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Nel nostro caso funziona grazie al sistema OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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 \u00e8 un file system copy-on-write che supporta nativamente snapshot e cloni. \u00c8 affidabile e scalabile. \u00c8 molto facile da gestire. Pu\u00f2 essere implementato letteralmente con due comandi. <\/p>\n<p><\/p>\n<p>Ci sono altre opzioni:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Storage di rete (ad esempio, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, di cui parlo, \u00e8 modulare. Pu\u00f2 essere implementato utilizzando tali opzioni. Ma al momento ci siamo concentrati su OpenZFS, perch\u00e9 abbiamo avuto problemi specifici con LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Come funziona? Invece di riscrivere i dati ogni volta che li modifichiamo, li salviamo semplicemente contrassegnando i nuovi dati come appartenenti a un nuovo momento temporale, a un nuovo snapshot. <\/p>\n<p><\/p>\n<p>E in seguito, quando vogliamo tornare indietro o vogliamo creare un nuovo clone da una versione precedente, diciamo semplicemente: 'Ok, dammi questi blocchi di dati contrassegnati in questo modo'. <\/p>\n<p><\/p>\n<p>E questo utente lavorer\u00e0 con questo insieme di dati. Li modificher\u00e0 progressivamente, creando i propri snapshot. <\/p>\n<p><\/p>\n<p>E ci sar\u00e0 una ramificazione. Ogni sviluppatore, nel nostro caso, avr\u00e0 la possibilit\u00e0 di avere il proprio clone che modifica, mentre i dati condivisi saranno condivisi tra tutti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Per implementare un sistema del genere, \u00e8 necessario risolvere due problemi: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>La prima \u00e8 la fonte di dati da cui li prenderete. Potete configurare la replica con la produzione. Potete utilizzare gi\u00e0 i backup che spero abbiate configurato. WAL-E, WAL-G o Barman. E anche, se state utilizzando qualche soluzione Cloud, come RDS o Cloud SQL, potete utilizzare dump logici. Ma vi consigliamo comunque di utilizzare i backup, perch\u00e9 con questo approccio conserverete anche la struttura fisica dei file, il che vi permetter\u00e0 di essere ancora pi\u00f9 vicini a quelle metriche che vedreste in produzione, per identificare i problemi che ci sono. <\/p>\n<p>\n<\/li>\n<li>\n<p>La seconda \u00e8 il luogo dove desiderate ospitare Database Lab. Pu\u00f2 essere Cloud o On-premise. Qui \u00e8 importante notare che ZFS supporta la compressione dei dati. E lo fa abbastanza bene. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Immaginate che ognuno di questi cloni, a seconda delle operazioni che eseguiamo con il database, avr\u00e0 una certa crescita dev. Per questo dev sar\u00e0 necessario uno spazio. Ma dato che abbiamo preso un database di 4,5 terabyte, ZFS lo comprimer\u00e0 a 3,5 terabyte. A seconda delle impostazioni, questo pu\u00f2 variare. E ci rimarr\u00e0 anche spazio per il dev. <\/p>\n<p><\/p>\n<p>Un sistema del genere pu\u00f2 essere utilizzato per diversi casi. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>\u00c8 per sviluppatori, DBA per controllare le query, per l'ottimizzazione. <\/p>\n<p>\n<\/li>\n<li>\n<p>Pu\u00f2 essere utilizzato nel QA-testing per verificare una migrazione specifica prima di implementarla in prod. E possiamo anche creare ambienti speciali per il QA con dati reali, dove possono testare nuove funzionalit\u00e0. E questo richieder\u00e0 secondi invece di aspettare ore, o forse giorni in altri casi dove non sono utilizzate copie sottili. <\/p>\n<p>\n<\/li>\n<li>\n<p>E un altro caso separato. Se nell'azienda non \u00e8 configurato un sistema di analytics, possiamo creare un clone sottile del database di produzione e destinarlo a query lunghe o a indici speciali che possono essere utilizzati nell'analisi.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Con questo approccio:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Bassa probabilit\u00e0 di errori in produzione, perch\u00e9 abbiamo testato tutte le modifiche su dati a piena dimensione. <\/p>\n<p>\n<\/li>\n<li>\n<p>Sviluppiamo una cultura del testing, poich\u00e9 ora non \u00e8 necessario aspettare ore per il proprio stand. <\/p>\n<p>\n<\/li>\n<li>\n<p>E non ci sono barriere, n\u00e9 attese tra i test. Puoi davvero andare e verificare. E cos\u00ec sar\u00e0 meglio, 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. Meno bug arriver\u00e0 in prod. Li rifattorizzeremo meno in seguito. <\/p>\n<p>\n<\/li>\n<li>\n<p>Possiamo gestire modifiche irreversibili. Questo non \u00e8 previsto nei metodi 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>Gi\u00e0 bene, ma cosa altro potremmo velocizzare?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Grazie a questo sistema possiamo abbattere significativamente la soglia di ingresso a questo tipo di test. <\/p>\n<p><\/p>\n<p>Attualmente c'\u00e8 un circolo vizioso, dove lo sviluppatore, per accedere a dati reali e completi, deve diventare un esperto. Deve essergli concessa tale fiducia. <\/p>\n<p><\/p>\n<p>Ma come pu\u00f2 crescere se non ce l'ha? E se hai accesso solo a un piccolo set di dati di test? In questo caso, non si pu\u00f2 acquisire esperienza reale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Come uscire da questo circolo? Come primo interfaccia, comoda per sviluppatori di qualsiasi livello, abbiamo scelto un bot di Slack. Ma potrebbe essere qualsiasi altra interfaccia. <\/p>\n<p><\/p>\n<p>Cosa consente di fare? Si pu\u00f2 prendere una richiesta specifica e inviarla in un canale speciale per il database. Espanderemo automaticamente un clone snello in pochi secondi. Eseguiamo questa richiesta. Raccoglieremo metriche e raccomandazioni. Mostreremo la visualizzazione. E poi questo clone rimarr\u00e0 per ottimizzare in qualche modo questa richiesta, aggiungere indici, ecc. <\/p>\n<p><\/p>\n<p>E Slack ci offre anche opportunit\u00e0 di collaborazione. Poich\u00e9 \u00e8 semplicemente un canale, si pu\u00f2 iniziare a discutere questa richiesta direttamente l\u00ec nel thread, pingando i colleghi, i DBA all'interno dell'azienda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Tuttavia, ci sono ovviamente anche problemi. Poich\u00e9 siamo nel mondo reale e usiamo un server che ospita pi\u00f9 cloni, dobbiamo comprimere la memoria e la potenza di elaborazione disponibili per i cloni. <\/p>\n<p><\/p>\n<p>Ma per rendere questi test credibili, \u00e8 necessario risolvere questo problema in qualche modo. <\/p>\n<p><\/p>\n<p>\u00c8 chiaro che un elemento fondamentale sono i dati identici. Ma questo lo abbiamo gi\u00e0. E vogliamo ottenere una configurazione uniforme. Possiamo fornire una configurazione praticamente identica. <\/p>\n<p><\/p>\n<p>Sarebbe fantastico avere hardware uguale a quello di produzione, ma potrebbe differire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Ricordiamo come Postgres gestisce la memoria. Abbiamo due cache. Una dalla file system e una propria di Postgres, cio\u00e8 il Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>\u00c8 importante notare che il Shared Buffer Cache viene allocato all'avvio di Postgres in base alla dimensione che si imposta nella configurazione. <\/p>\n<p><\/p>\n<p>Il secondo cache utilizza tutto lo spazio disponibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E quando facciamo pi\u00f9 clone su una macchina, finiamo per riempire gradualmente la memoria. Idealmente, il Shared Buffer Cache dovrebbe essere il 25% dell'intera memoria disponibile sulla macchina. <\/p>\n<p><\/p>\n<p>E risulta che se non cambiamo questo parametro, possiamo avviare solo 4 istanze su una macchina, cio\u00e8 solo 4 di questi sottili cloni. E questo \u00e8 problematico, perch\u00e9 vogliamo averne molti di pi\u00f9. <\/p>\n<p><\/p>\n<p>Ma dall'altro lato, il Buffer Cache \u00e8 utilizzato per eseguire le query, per gli indici, cio\u00e8 il piano dipende dalla dimensione dei nostri cache. E se semplicemente prendiamo questo parametro e lo riduciamo, i nostri piani potrebbero cambiare drasticamente.<\/p>\n<p><\/p>\n<p>Ad esempio, se su prod abbiamo un grande cache, Postgres preferir\u00e0 utilizzare l'indice. Ma se no, allora si far\u00e0 un SeqScan. E che senso avrebbe se i nostri piani non corrispondessero? <\/p>\n<p><\/p>\n<p>Ma qui arriviamo alla conclusione che in realt\u00e0 il piano in Postgres non dipende dalla dimensione specificata nel Shared Buffer, bens\u00ec da effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>L\u2019effective_cache_size \u00e8 la dimensione presunta del cache che abbiamo a disposizione, cio\u00e8 la somma del Buffer Cache e del cache del filesystem. Questo viene impostato nella configurazione. E questa memoria non viene allocata. <\/p>\n<p><\/p>\n<p>E grazie a questo parametro possiamo ingannare Postgres, diciamo che in realt\u00e0 abbiamo accesso a molti dati, anche se non li abbiamo. In questo modo, i piani corrisponderanno perfettamente alla produzione. <\/p>\n<p><\/p>\n<p>Ma questo potrebbe influire sui tempi. Ottimizziamo le query basandoci sui tempi, ma \u00e8 importante sapere che il timing dipende 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 query legger\u00e0 per ottenere il risultato. <\/p>\n<p><\/p>\n<p>E se vogliamo che il timing sia vicino a quello che vedremo in prod, dobbiamo prendere hardware il pi\u00f9 simile possibile e, forse, anche di pi\u00f9, affinch\u00e9 tutti i cloni possano entrare. Ma questo \u00e8 un compromesso, cio\u00e8 avrai gli stessi piani, vedrai quante informazioni legge una specifica query e potrai concludere: questa query \u00e8 buona (o la migrazione) o cattiva, deve ancora essere ottimizzata. <\/p>\n<p><\/p>\n<p>Analizziamo come avviene concretamente l'ottimizzazione con Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Prendiamo una query da un sistema reale. In questo caso, il database \u00e8 di 1 terabyte. E vogliamo contare il numero di post freschi che hanno ricevuto pi\u00f9 di 10 like. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Scriviamo un messaggio nel canale, si \u00e8 attivato per noi un clone. E vedremo che tale query si eseguir\u00e0 in 2,5 minuti. Questo \u00e8 il primo aspetto 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 elabora troppi dati per ottenere un numero relativamente ristretto di righe. \u00c8 necessario qualche indice specializzato, poich\u00e9 abbiamo notato che ci sono troppe righe filtrate nella query. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Esaminiamo pi\u00f9 a fondo cosa \u00e8 successo. Infatti, vediamo di aver letto quasi un gigabyte e mezzo di dati dalla cache dei file o addirittura dal disco. E questo non \u00e8 buono, dato che abbiamo estratto solo 142 righe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E, a prima vista, sembrerebbe che abbiamo una scansione dell'indice e dovrebbe eseguirsi rapidamente, ma poich\u00e9 abbiamo filtrato troppe righe (abbiamo dovuto contarle), la query ha impiegato tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E questo \u00e8 accaduto nel piano a causa della parziale incongruenza tra le condizioni nella query e quelle nell'indice. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Proviamo a rendere l'indice pi\u00f9 preciso e vediamo come cambia l'esecuzione della query dopo questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>La creazione dell'indice ha richiesto abbastanza tempo, ma ora controlliamo la query e vediamo che il tempo \u00e8 passato da 2,5 minuti a soli 156 millisecondi, il che \u00e8 piuttosto buono. E stiamo leggendo solo 6 megabyte di dati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E ora stiamo utilizzando una scansione dell'indice solo.<\/p>\n<p><\/p>\n<p>Un'altra questione importante \u00e8 che vogliamo presentare il piano in un modo pi\u00f9 comprensibile. Abbiamo implementato la visualizzazione tramite Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Questa \u00e8 un'altra query, pi\u00f9 complessa. E costruiamo Flame Graphs in base a due parametri: la quantit\u00e0 di dati che un nodo specifico nel piano ha letto e il timing, cio\u00e8 il tempo di esecuzione del nodo. <\/p>\n<p><\/p>\n<p>Qui possiamo confrontare specificamente i nodi tra loro. E sar\u00e0 chiaro quale di essi occupi pi\u00f9 o meno spazio, il che \u00e8 solitamente difficile da fare con altri metodi di visualizzazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Certo, tutti conoscono explain.depesz.com. Una buona caratteristica di questa visualizzazione \u00e8 che conserviamo il piano testuale e inoltre estraiamo alcuni parametri principali in una tabella, in modo da poter essere ordinati. <\/p>\n<p><\/p>\n<p>E anche gli sviluppatori che non hanno ancora approfondito questo tema utilizzano explain.depesz.com, perch\u00e9 \u00e8 pi\u00f9 facile per loro capire quali metriche sono importanti e quali no. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>C'\u00e8 un nuovo approccio alla visualizzazione: explain.dalibo.com. Fanno una visualizzazione ad albero, ma qui \u00e8 molto difficile confrontare i nodi tra loro. Qui si pu\u00f2 ben comprendere la struttura, ma se c'\u00e8 una richiesta molto grande, sar\u00e0 necessario scorrere avanti e indietro, ma anche questo \u00e8 un'opzione. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Collaborazione<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>E, come ho gi\u00e0 detto, Slack ci offre la possibilit\u00e0 di collaborare. Ad esempio, se ci imbattiamo in una richiesta complessa che non sappiamo come ottimizzare, possiamo chiarire questa domanda con i nostri colleghi nel thread di Slack. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-bot 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>Riteniamo sia importante testare su dati a piena scala. Per questo abbiamo creato lo strumento Update Database Lab, disponibile in open source. Puoi utilizzare anche il bot Joe. Puoi prenderlo adesso e integrarlo nel tuo lavoro. Tutti i guide sono disponibili l\u00ec. <\/p>\n<p><\/p>\n<p>\u00c8 anche importante notare che la soluzione in s\u00e9 non \u00e8 rivoluzionaria, perch\u00e9 esiste Delphix, ma \u00e8 una soluzione enterprise. \u00c8 completamente chiusa e costa molto. Noi ci specializziamo in Postgres. Questi sono tutti prodotti 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, perch\u00e9 ho risolto pi\u00f9 o meno lo stesso problema un po' di tempo fa. Pertanto, ho una serie di domande. Spero di poterne fare almeno una parte.<\/em><\/p>\n<p><\/p>\n<p><em>\u00c8 interessante vedere come calcolate lo spazio per questo ambiente? La tecnologia implica che, in determinate circostanze, i vostri cloni possano crescere fino alla dimensione massima. In parole povere, se avete un database di dieci terabyte e 10 cloni, \u00e8 facile simulare una situazione in cui ogni clone pesa 10 dati unici. Come calcolate quello spazio, cio\u00e8 quella delta di cui avete parlato, in cui vivranno questi cloni?<\/em><\/p>\n<p><\/p>\n<p>Bella domanda. Qui \u00e8 importante monitorare i cloni specifici. E se ci sono cambiamenti troppo grandi in un clone, inizia a crescere, possiamo innanzitutto avvisare l'utente su questo, oppure fermare immediatamente quel clone per evitare di trovarci in una situazione di fail. <\/p>\n<p><\/p>\n<p><em>S\u00ec, ho una domanda secondaria. Cio\u00e8, come assicurate il ciclo di vita di questi moduli? Per noi \u00e8 un problema e una storia a parte. Come avviene?<\/em><\/p>\n<p><\/p>\n<p>Ogni clone ha un certo ttl. Fondamentalmente, 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 ne avremo nuovamente bisogno, beh, siamo a disposizione. <\/p>\n<p><\/p>\n<p><em>Sono anche interessato alla scelta delle tecnologie, perch\u00e9 noi, ad esempio, utilizziamo diversi metodi per vari motivi. Perch\u00e9 proprio ZFS? Perch\u00e9 non avete usato LVM? Hai accennato a problemi con LVM. Quali problemi c'erano? A mio avviso, la soluzione ottimale \u00e8 quella con lo storage, dal punto di vista delle prestazioni.<\/em> <\/p>\n<p><\/p>\n<p><em>Qual \u00e8 il principale problema con ZFS? Il fatto che devi eseguirlo su un singolo host, cio\u00e8 tutti gli instances vivranno nell'ambito di un unico sistema operativo. E nel caso dello storage, puoi collegare diverse attrezzature. E il collo di bottiglia sono solo i blocchi che si trovano nello storage. \u00c8 interessante la questione della scelta delle tecnologie. Perch\u00e9 non LVM?<\/em><\/p>\n<p><\/p>\n<p>Possiamo discutere specificamente di LVM al meetup. Riguardo allo storage \u2013 \u00e8 semplicemente costoso. Possiamo implementare il sistema ZFS ovunque. Puoi installarlo sul tuo computer. Puoi semplicemente scaricare il repository e installarlo. ZFS pu\u00f2 essere installato praticamente ovunque, se parliamo di Linux. Cio\u00e8, otteniamo una soluzione molto flessibile. E ZFS stesso offre gi\u00e0 molto di per s\u00e9. Puoi caricare un'infinit\u00e0 di dati, collegare un gran numero di dischi, ci sono snapshot. E, come gi\u00e0 detto, \u00e8 facile da amministrare. Cio\u00e8, sembra molto piacevole da usare. \u00c8 collaudato, ha molti anni. Ha una comunit\u00e0 molto ampia che cresce. ZFS \u00e8 una soluzione molto affidabile. <\/p>\n<p><\/p>\n<p>Nikolaj Samokhvalov: Posso aggiungere un commento? Mi chiamo Nikolaj, lavori insieme ad Anatolij. Concordo sul fatto che lo storage sia fantastico. E alcuni dei nostri clienti hanno Pure Storage e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Anatolij ha giustamente sottolineato che puntiamo sulla modularit\u00e0. E in futuro possiamo implementare un'unica interfaccia: crea un snapshot, crea un clone, distruggi un clone. Tutto questo \u00e8 facile. E se hai uno storage classico, \u00e8 fantastico, se ce l'hai.<\/p>\n<p><\/p>\n<p>Ma ZFS \u00e8 accessibile a tutti. \u00c8 ora di basta con Delphix, hanno 300 clienti. Di questi, 50 sono nella fortune 100, cio\u00e8 puntano su NASA e cos\u00ec via. \u00c8 tempo che tutti abbiano accesso a questa tecnologia. E per questo abbiamo un Core open source. Abbiamo una parte dell'interfaccia che non \u00e8 open source. Questa \u00e8 la piattaforma che presenteremo. Ma vogliamo che sia accessibile a chiunque. Vogliamo fare una rivoluzione, affinch\u00e9 tutti i tester smettano di indovinare sui portatili. Dobbiamo scrivere SELECT e vedere immediatamente che \u00e8 lento. Basta aspettare che il DBA lo racconti. Questa \u00e8 la nostra principale obiettivo. E credo che ci arriveremo tutti. E questo strumento lo realizziamo affinch\u00e9 tutti lo possano avere. Ecco perch\u00e9 ZFS, perch\u00e9 sar\u00e0 disponibile ovunque. Grazie alla community per la risoluzione dei problemi e per la licenza open source e cos\u00ec via. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la relazione! Mi chiamo Maksim. Abbiamo affrontato problemi simili. Li abbiamo risolti internamente. Come dividete le risorse tra questi cloni? Ogni clone pu\u00f2 essere occupato con qualcosa di diverso in ogni momento: uno testando qualcosa, un altro qualcos'altro, uno sta costruendo un indice, un altro sta eseguendo un lavoro pesante. E se per la CPU si pu\u00f2 ancora dividere, come fate con l'IO? Questa \u00e8 la prima domanda.<\/em><\/p>\n<p><\/p>\n<p><em>E la seconda domanda riguarda la differenza degli ambienti. Supponiamo che qui abbia ZFS e tutto vada bene, ma il cliente in produzione non ha ZFS, ma ext4, per esempio. Come vi comportate in questo caso?<\/em><\/p>\n<p><\/p>\n<p>Domande molto buone. Ho appena accennato a questo problema riguardante la divisione delle risorse. E la soluzione \u00e8 la seguente. Immaginate di testare su staging. Potete avere una situazione simile, dove qualcuno genera un certo carico e qualcun altro un altro. E alla fine vedete metriche poco chiare. Anche problemi simili possono sorgere in produzione. Quando volete controllare una certa query e notate che ha qualche problema, come ad esempio che \u00e8 lenta, in realt\u00e0 il problema non era nella query, ma nel fatto che c'era un carico parallelo. <\/p>\n<p><\/p>\n<p>E quindi qui \u00e8 importante concentrarsi su quale sar\u00e0 il piano, quali passaggi seguiremo e quanti dati raccoglieremo. Il fatto che i nostri dischi, ad esempio, saranno caricati da qualcosa influenzer\u00e0 specificamente il timing. Ma possiamo stimare la pesantezza di questa richiesta in base al numero di dati. Non \u00e8 cos\u00ec importante che ci sia anche qualche esecuzione simultanea. <\/p>\n<p><\/p>\n<p><em>Ho due domande. Questa \u00e8 davvero una cosa interessante. Ci sono stati casi in cui i dati in produzione sono critici, ad esempio i numeri delle carte di credito? C'\u00e8 gi\u00e0 qualcosa di pronto o \u00e8 un compito separato? E la seconda domanda: c'\u00e8 qualcosa del genere per MySQL?<\/em><\/p>\n<p><\/p>\n<p>Riguardo ai dati. Faremo obfuscazione, anche se non lo stiamo facendo ancora. Ma se stai implementando precisamente Joe, se non dai accesso agli sviluppatori, allora non ci sar\u00e0 accesso ai dati. Perch\u00e9? Perch\u00e9 Joe non mostra i dati. Mostra solo metriche, piani e cos\u00ec via. \u00c8 stato fatto specificamente in questo modo poich\u00e9 \u00e8 uno dei requisiti del nostro cliente. Volevano avere la possibilit\u00e0 di ottimizzare, ma senza dare accesso indiscriminato a tutti. <\/p>\n<p><\/p>\n<p>Riguardo a MySQL. Questo sistema pu\u00f2 essere utilizzato per qualsiasi cosa che memorizzi lo stato su disco. E poich\u00e9 ci occupiamo di Postgres, stiamo innanzitutto automatizzando completamente per Postgres. Vogliamo automatizzare l'ottenimento dei dati dal backup. Configuriamo correttamente Postgres. Sappiamo come fare affinch\u00e9 i piani coincidano, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Ma poich\u00e9 il sistema \u00e8 espandibile, potr\u00e0 essere utilizzato anche per MySQL. E ci sono esempi di questo. C'\u00e8 una cosa simile in Yandex, ma non lo pubblicano da nessuna parte. Lo utilizzano all'interno di Yandex.Metrica. E proprio l\u00ec c'\u00e8 la questione di MySQL. Ma le tecnologie sono le medesime, ZFS. <\/p>\n<p><\/p>\n<p><em>Grazie per la relazione! Ho anche un paio di domande. Hai menzionato che il cloning pu\u00f2 essere utilizzato per analisi, ad esempio, per costruire indici aggiuntivi. Puoi spiegare un po' pi\u00f9 in dettaglio come funziona?<\/em><\/p>\n<p><\/p>\n<p><em>E subito far\u00f2 la seconda domanda riguardo all'omogeneit\u00e0 degli stand, all'uniformit\u00e0 dei piani. Il piano dipende anche dalle statistiche raccolte da Postgres. Come risolvete questo problema?<\/em><\/p>\n<p><\/p>\n<p>Non ci sono analisi di casi specifici, perch\u00e9 non li abbiamo ancora utilizzati in quel modo, ma c'\u00e8 questa possibilit\u00e0. Se parliamo di indici, immaginate una query che gira su una tabella con centinaia di milioni di record e su una colonna che di solito non \u00e8 indicizzata in produzione. E noi vogliamo calcolare alcuni dati. Se eseguiamo questa query in produzione, c'\u00e8 la possibilit\u00e0 che ci sia un arresto, perch\u00e9 la query richieder\u00e0 un minuto per essere elaborata. <\/p>\n<p><\/p>\n<p>Ok, facciamo una copia leggera che non ci spaventa fermare per qualche minuto. E per rendere pi\u00f9 agevole il calcolo dell'analisi, aggiungiamo indici sulle 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 da questi snapshot recuperare e lanciare nuove query. Cio\u00e8, possiamo fare in modo di creare nuovi cloni con gli indici gi\u00e0 impostati.<\/p>\n<p><\/p>\n<p>Per quanto riguarda la questione delle statistiche, se recuperiamo da un backup, se facciamo replicazione, le statistiche saranno esattamente le stesse. Perch\u00e9 abbiamo completamente la struttura fisica dei dati, cio\u00e8 porteremo anche i dati come sono con tutte le metriche statistiche. <\/p>\n<p><\/p>\n<p>Qui c'\u00e8 un altro problema. Se usate una soluzione cloud, solo i dump logici sono disponibili, perch\u00e9 Google e Amazon non consentono di prendere una copia fisica. Ci sar\u00e0 un problema simile qui. <\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione. Sono emerse due buone domande su MySQL e sulla separazione delle risorse. Ma, in sostanza, tutto si riduce al fatto che si tratta di un tema non specifico dei database, bens\u00ec dell'intero sistema di file. E di conseguenza, le domande sulla separazione delle risorse devono essere risolte da l\u00ec, non alla fine, come se fosse Postgres, ma nel sistema di file, <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. \u00c8 pi\u00f9 vicina alla multi-layer architecture del database, dove ci sono pi\u00f9 layer. Ad esempio, abbiamo impostato l'aggiornamento di un'immagine di dieci terabyte, c'\u00e8 replicazione in corso. E stiamo specificamente usando questa soluzione per database. La replicazione avviene, ci sono aggiornamenti dei dati. Qui lavorano contemporaneamente 100 dipendenti, che eseguono costantemente questi diversi snapshot. Cosa fare? Come fare per evitare conflitti, quando ne avviano uno e poi il sistema dei file cambia, e tutti questi snapshot diventano obsoleti?<\/em> <\/p>\n<p><\/p>\n<p>Non andranno, perch\u00e9 cos\u00ec funziona ZFS. Possiamo tenere separatamente in un unico flusso le modifiche al file system che arrivano grazie alla replica. E sulle versioni pi\u00f9 vecchie dei dati tenere i cloni che gli sviluppatori utilizzano. E questo per noi funziona, tutto va bene.<\/p>\n<p><\/p>\n<p><em>Quindi, l'aggiornamento avverr\u00e0 come un ulteriore strato, e tutte le nuove istantanee verranno gi\u00e0 da questo strato, giusto?<\/em> <\/p>\n<p><\/p>\n<p>Dai livelli precedenti, che sono stati dalle repliche precedenti. <\/p>\n<p><\/p>\n<p><em>I livelli precedenti si perderanno, ma faranno riferimento al vecchio livello, mentre le nuove immagini prenderanno dall'ultimo livello ottenuto durante l'aggiornamento?<\/em><\/p>\n<p><\/p>\n<p>In generale, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Quindi, come conseguenza, avremo un sacco di livelli. E col tempo dovranno essere compressi?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, esatto. C'\u00e8 un certo intervallo. Salviamo istantanee settimanali. Questo dipende da quali sono le tue risorse. Se hai la possibilit\u00e0 di conservare molti dati, puoi mantenere le istantanee per molto tempo. Non si eliminano automaticamente. Non ci sar\u00e0 alcuna corruzione dei dati. Se le istantanee sono obsolete, come ci sembra, cio\u00e8 dipende dalla politica aziendale, possiamo semplicemente eliminarle e liberare spazio. <\/p>\n<p><\/p>\n<p><em>Buongiorno, grazie per la relazione! Riguardo alla domanda di Joe. Hai detto che il cliente non voleva dare accesso a tutti ai dati. A rigor di termini, se una persona ha il risultato dell'Explain Analyze, pu\u00f2 visualizzare i dati.<\/em> <\/p>\n<p><\/p>\n<p>Esatto. Ad esempio, possiamo scrivere: \u00abSELECT FROM WHERE email = quello l\u00ec\u00bb. Cio\u00e8, non vedremo i dati stessi, ma possiamo osservare alcuni segni indiretti. Questo va capito. Ma dall'altro lato, tutto ci\u00f2 \u00e8 visibile. Abbiamo l'audit dei log, abbiamo il controllo di altri colleghi che vedono anche cosa fanno gli sviluppatori. E se qualcuno cerca di farlo, il servizio di sicurezza interverr\u00e0 e si occuper\u00e0 di questo problema. <\/p>\n<p><\/p>\n<p><em>Buon pomeriggio! Grazie per la relazione! Ho una domanda breve. Se in azienda non si utilizza Slack, c'\u00e8 qualche collegamento attuale o \u00e8 possibile per gli sviluppatori lanciare istanze per collegare un'app di prova ai database?<\/em><\/p>\n<p><\/p>\n<p>Attualmente c'\u00e8 un'integrazione con Slack, cio\u00e8 non ci sono altri messenger, ma ci piacerebbe molto implementare il supporto per altri messenger. Cosa potete fare? Potete installare DB Lab da soli senza Joe, utilizzare il REST API o la nostra piattaforma per creare cloni e collegarvi con PSQL. Ma questa \u00e8 una possibilit\u00e0, se siete pronti a dare accesso ai dati ai vostri sviluppatori, poich\u00e9 non ci sar\u00e0 pi\u00f9 nessuno schermo. <\/p>\n<p><\/p>\n<p><em>Non ho bisogno di questo strato, ma di questa funzionalit\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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"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: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\udd47DBA-bot Joe. Anatolij Stansler (Postgres.ai) | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}