{"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\/pt\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"Bot DBA Joe. Anatoly Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como um desenvolvedor backend entende que uma consulta SQL funcionar\u00e1 bem em produ\u00e7\u00e3o? Em grandes ou rapidamente crescentes empresas, o acesso \u00e0 produ\u00e7\u00e3o n\u00e3o \u00e9 garantido para todos. E mesmo com acesso, nem todas as consultas podem ser testadas sem riscos, e criar uma c\u00f3pia do banco de dados frequentemente leva horas. Para resolver esses problemas, criamos um DBA artificial \u2014 Joe. Ele j\u00e1 foi implementado com sucesso em v\u00e1rias empresas e ajuda mais de uma dezena de desenvolvedores. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>V\u00eddeo:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f913081905dc4e15aeed783\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oi pessoal! Meu nome \u00e9 Anatoly Stansler. Trabalho na empresa <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Estamos focados em acelerar o processo de desenvolvimento, eliminando as lat\u00eancias relacionadas ao uso do Postgres para desenvolvedores, DBAs e QA.<\/p>\n<p><\/p>\n<p>Temos clientes incr\u00edveis e hoje parte da apresenta\u00e7\u00e3o ser\u00e1 dedicada a casos que encontramos em nosso trabalho com eles. Vou contar como os ajudamos a resolver problemas bastante s\u00e9rios.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando estamos desenvolvendo e realizando migra\u00e7\u00f5es complexas e pesadas, nos fazemos a pergunta: \"Essa migra\u00e7\u00e3o vai funcionar?\". Usamos revis\u00f5es, utilizamos os conhecimentos de colegas mais experientes, especialistas em DBA. E eles podem nos dizer \u2014 vai funcionar ou n\u00e3o. <\/p>\n<p><\/p>\n<p>Mas, talvez, fosse melhor se pud\u00e9ssemos testar isso n\u00f3s mesmos em c\u00f3pias em tamanho real. E hoje vamos falar exatamente sobre quais abordagens existem atualmente para teste e como isso pode ser feito da melhor forma e com quais ferramentas. Tamb\u00e9m discutiremos os pr\u00f3s e contras dessas abordagens e o que podemos melhorar aqui. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quem j\u00e1 fez \u00edndices ou fez altera\u00e7\u00f5es diretamente em produ\u00e7\u00e3o? Bastante gente. E quantos disso resultaram em perda de dados ou interrup\u00e7\u00f5es? Ent\u00e3o voc\u00ea conhece essa dor. Gra\u00e7as a Deus, temos backups. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A primeira abordagem \u00e9 o teste em produ\u00e7\u00e3o. Ou seja, quando o desenvolvedor est\u00e1 em sua m\u00e1quina local, possui dados de teste, h\u00e1 uma amostra limitada. E n\u00f3s implantamos em produ\u00e7\u00e3o e obtemos essa situa\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Isso \u00e9 doloroso, isso \u00e9 caro. Provavelmente, essa n\u00e3o \u00e9 a melhor maneira de fazer. <\/p>\n<p><\/p>\n<p>E como podemos fazer isso melhor? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos levar o staging e dedicar uma parte da produ\u00e7\u00e3o para isso. Ou, na melhor das hip\u00f3teses, vamos usar a verdadeira produ\u00e7\u00e3o, todos os dados. E, ap\u00f3s desenvolver localmente, vamos verificar tamb\u00e9m no staging. <\/p>\n<p><\/p>\n<p>Isso nos permitir\u00e1 eliminar uma parte dos erros, ou seja, evitar problemas na produ\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>Quais s\u00e3o os problemas? <\/p>\n<p><\/p>\n<ul>\n<li>O problema \u00e9 que este ambiente de staging \u00e9 compartilhado com colegas. E muitas vezes acontece que voc\u00ea faz uma altera\u00e7\u00e3o e, de repente, n\u00e3o h\u00e1 dados, todo o trabalho perdido. O staging tinha muitos terabytes. E \u00e9 necess\u00e1rio esperar muito tempo at\u00e9 que ele se recupere. Decidimos adiar isso para amanh\u00e3. A nossa desenvolvimento parou. <\/li>\n<li>E, claro, temos muitos colegas l\u00e1, muitas equipes. E \u00e9 preciso aprovar tudo manualmente. Isso \u00e9 inconveniente. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E \u00e9 importante mencionar que temos apenas uma tentativa, um tiro, se quisermos fazer algumas altera\u00e7\u00f5es no banco de dados, mexer nos dados, mudar a estrutura. E se algo der errado, se houve um erro na migra\u00e7\u00e3o, n\u00e3o conseguiremos voltar facilmente. <\/p>\n<p><\/p>\n<p>Isso \u00e9 melhor do que a abordagem anterior, mas ainda h\u00e1 uma grande probabilidade de que algum erro passe para a produ\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que nos impede de dar a cada desenvolvedor um ambiente de teste, uma c\u00f3pia completa? Acho que \u00e9 evidente o que est\u00e1 impedindo. <\/p>\n<p><\/p>\n<p>Quem tem um banco de dados maior que um terabyte? Mais da metade da sala. <\/p>\n<p><\/p>\n<p>E \u00e9 claro que manter m\u00e1quinas para cada desenvolvedor, quando a produ\u00e7\u00e3o \u00e9 t\u00e3o grande, \u00e9 muito caro e tamb\u00e9m leva muito tempo. <\/p>\n<p><\/p>\n<p>Temos clientes que entenderam que \u00e9 muito importante testar todas as mudan\u00e7as em c\u00f3pias completas, mas eles t\u00eam bancos menores que um terabyte, e n\u00e3o t\u00eam recursos para manter um ambiente de teste para cada desenvolvedor. Portanto, eles precisam baixar dumps localmente em suas m\u00e1quinas e testar dessa forma. Isso leva muito tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mesmo que voc\u00ea fa\u00e7a isso dentro da infraestrutura, baixar um terabyte de dados em uma hora j\u00e1 \u00e9 muito bom. Mas eles usam dumps l\u00f3gicos, baixam localmente da nuvem. Para eles, a velocidade \u00e9 em torno de 200 gigabytes por hora. E ainda precisa haver tempo para restaurar do dump l\u00f3gico, aplicar os \u00edndices, etc.<\/p>\n<p><\/p>\n<p>Mas eles usam essa abordagem porque isso permite manter a produ\u00e7\u00e3o confi\u00e1vel. <\/p>\n<p><\/p>\n<p>O que podemos fazer aqui? Vamos tornar os ambientes de teste baratos e dar a cada desenvolvedor seu pr\u00f3prio ambiente de teste.<\/p>\n<p><\/p>\n<p>E isso \u00e9 poss\u00edvel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E nesta abordagem, quando criamos clones finos para cada desenvolvedor, podemos compartilh\u00e1-los em uma \u00fanica m\u00e1quina. Por exemplo, se voc\u00ea tem um banco de dados de quatro terabytes e deseja fornec\u00ea-lo a 10 desenvolvedores, n\u00e3o precisa ter 10 bancos de dados de quatro terabytes. Uma \u00fanica m\u00e1quina \u00e9 suficiente para criar c\u00f3pias isoladas e finas para cada desenvolvedor, usando um s\u00f3 equipamento. Como isso funciona contarei um pouco mais tarde. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um exemplo real:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>O banco de dados \u2013 4,5 terabytes. <\/p>\n<p>\n<\/li>\n<li>\n<p>Podemos obter c\u00f3pias independentes em 30 segundos. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Voc\u00ea n\u00e3o precisa esperar um ambiente de testes e depender do tamanho dele. Voc\u00ea pode obt\u00ea-lo em segundos. Ser\u00e3o ambientes totalmente isolados, mas que compartilham dados entre si. <\/p>\n<p><\/p>\n<p>Isso \u00e9 incr\u00edvel. Aqui estamos falando de m\u00e1gica e de um universo paralelo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No nosso caso, isso funciona com o sistema OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS \u00e9 um sistema de arquivos copy-on-write que j\u00e1 suporta snapshots e clones. \u00c9 confi\u00e1vel e escal\u00e1vel. \u00c9 muito f\u00e1cil de gerenciar. Pode ser implementado em apenas duas linhas de comando. <\/p>\n<p><\/p>\n<p>Existem outras op\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Sistemas de Armazenamento (por exemplo, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>O Database Lab, sobre o qual estou falando, \u00e9 modular. Pode ser implementado usando essas op\u00e7\u00f5es. Mas por enquanto nos concentramos no OpenZFS, porque houve problemas especificamente com LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como isso funciona? Em vez de reescrever os dados cada vez que os modificamos, n\u00f3s os preservamos, apenas marcando que esses novos dados pertencem a um novo ponto no tempo, a um novo snapshot. <\/p>\n<p><\/p>\n<p>E posteriormente, quando queremos reverter ou criar um novo clone de alguma vers\u00e3o mais antiga, simplesmente dizemos: \"Ok, nos d\u00ea esses blocos de dados que est\u00e3o marcados assim\". <\/p>\n<p><\/p>\n<p>E esse usu\u00e1rio trabalhar\u00e1 com esse conjunto de dados. Ele os modificar\u00e1 gradualmente, criando seus pr\u00f3prios snapshots. <\/p>\n<p><\/p>\n<p>E teremos ramifica\u00e7\u00f5es. Cada desenvolvedor, no nosso caso, ter\u00e1 a chance de ter seu pr\u00f3prio clone, que ele pode editar, enquanto os dados que s\u00e3o compartilhados ser\u00e3o compartilhados entre todos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para implementar um sistema como esse, \u00e9 necess\u00e1rio resolver dois problemas: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>A primeira \u00e9 a fonte de dados de onde voc\u00ea ir\u00e1 obt\u00ea-los. \u00c9 poss\u00edvel configurar a replica\u00e7\u00e3o a partir do ambiente de produ\u00e7\u00e3o. Voc\u00ea pode usar os backups que j\u00e1 tem configurados, espero. WAL-E, WAL-G ou Barman. E mesmo que voc\u00ea esteja utilizando alguma solu\u00e7\u00e3o em nuvem, como RDS ou Cloud SQL, voc\u00ea pode usar dumps l\u00f3gicos. Mas ainda assim, recomendamos utilizar os backups, pois com essa abordagem voc\u00ea tamb\u00e9m preservar\u00e1 a estrutura f\u00edsica dos arquivos, o que permitir\u00e1 ficar ainda mais pr\u00f3ximo das m\u00e9tricas que voc\u00ea veria em produ\u00e7\u00e3o, para capturar os problemas existentes. <\/p>\n<p>\n<\/li>\n<li>\n<p>A segunda \u00e9 o local onde voc\u00ea deseja hospedar o Database Lab. Pode ser na nuvem ou no local. \u00c9 importante ressaltar que o ZFS suporta compress\u00e3o de dados. E faz isso muito bem. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Imagine que cada um desses clones, dependendo das opera\u00e7\u00f5es que realizamos com o banco, ter\u00e1 um espa\u00e7o de dev crescente. Para esse dev, tamb\u00e9m ser\u00e1 necess\u00e1rio espa\u00e7o. Por\u00e9m, como pegamos um banco de 4,5 terabytes, o ZFS ir\u00e1 compact\u00e1-lo para 3,5 terabytes. Dependendo das configura\u00e7\u00f5es, isso pode ser ajustado. E ainda teremos espa\u00e7o para o dev. <\/p>\n<p><\/p>\n<p>Esse sistema pode ser utilizado para diversos casos. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>S\u00e3o desenvolvedores e DBAs para verificar consultas e otimiza\u00e7\u00f5es. <\/p>\n<p>\n<\/li>\n<li>\n<p>Isso pode ser usado em testes de QA para validar uma migra\u00e7\u00e3o espec\u00edfica antes que implantemos isso em produ\u00e7\u00e3o. E tamb\u00e9m podemos criar ambientes especiais para QA com dados reais, onde eles podem testar novas funcionalidades. E isso levar\u00e1 segundos, em vez de esperar horas ou at\u00e9 mesmo dias em outros casos, onde c\u00f3pias finas n\u00e3o s\u00e3o utilizadas. <\/p>\n<p>\n<\/li>\n<li>\n<p>E ainda h\u00e1 um caso separado. Se a empresa n\u00e3o tiver um sistema de analytics configurado, podemos criar um clone fino do banco de dados do produto e disponibiliz\u00e1-lo para consultas longas ou para \u00edndices especiais que podem ser utilizados na an\u00e1lise.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Com essa abordagem:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Baixa probabilidade de erros em produ\u00e7\u00e3o, pois testamos todas as altera\u00e7\u00f5es em dados completos. <\/p>\n<p>\n<\/li>\n<li>\n<p>N\u00f3s desenvolvemos uma cultura de testes, j\u00e1 que agora n\u00e3o \u00e9 necess\u00e1rio esperar por horas pelo seu pr\u00f3prio ambiente. <\/p>\n<p>\n<\/li>\n<li>\n<p>E n\u00e3o h\u00e1 barreiras, nem esperas entre os testes. Voc\u00ea realmente pode ir e verificar. E ser\u00e1 melhor, pois aceleraremos o desenvolvimento. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Haver\u00e1 menos refatora\u00e7\u00e3o. Menos bugs chegar\u00e3o ao prod. N\u00f3s os refatoraremos menos depois. <\/p>\n<p>\n<\/li>\n<li>\n<p>Podemos fazer altera\u00e7\u00f5es irrevers\u00edveis. Isso n\u00e3o est\u00e1 nos m\u00e9todos padr\u00e3o. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>\u00c9 vantajoso, pois dividimos os recursos dos ambientes de teste. <\/li>\n<\/ol>\n<p><\/p>\n<p>J\u00e1 \u00e9 bom, mas o que mais poderia ser acelerado?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gra\u00e7as a esse sistema, podemos reduzir bastante a barreira de entrada para esse tipo de teste. <\/p>\n<p><\/p>\n<p>Atualmente, existe um ciclo vicioso, onde o desenvolvedor, para ter acesso a dados reais em tamanho real, precisa se tornar um especialista. Ele deve ter esse acesso confi\u00e1vel. <\/p>\n<p><\/p>\n<p>Mas como crescer se n\u00e3o h\u00e1 isso? E se voc\u00ea tiver acesso apenas a um conjunto muito pequeno de dados de teste? Ent\u00e3o n\u00e3o ser\u00e1 poss\u00edvel ganhar experi\u00eancia real. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como sair desse ciclo? Como primeira interface, acess\u00edvel para desenvolvedores de todos os n\u00edveis, escolhemos um bot do Slack. Mas pode ser qualquer outra interface. <\/p>\n<p><\/p>\n<p>O que ele permite fazer? Voc\u00ea pode pegar uma consulta espec\u00edfica e envi\u00e1-la para um canal especial para o banco de dados. N\u00f3s automaticamente, em segundos, implantaremos um clone leve. Executaremos essa consulta. Coletaremos m\u00e9tricas e recomenda\u00e7\u00f5es. Mostraremos a visualiza\u00e7\u00e3o. E, em seguida, esse clone permanecer\u00e1 para que essa consulta possa ser otimizada, adicionar \u00edndices, etc. <\/p>\n<p><\/p>\n<p>E tamb\u00e9m o Slack nos oferece oportunidades de colabora\u00e7\u00e3o prontas para uso. Como \u00e9 apenas um canal, podemos come\u00e7ar a discutir essa consulta diretamente no thread, mencionando nossos colegas, DBAs que est\u00e3o dentro da empresa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas, claro, existem problemas. Como estamos no mundo real, e usamos um servidor que hospeda muitos clones ao mesmo tempo, temos que limitar a quantidade de mem\u00f3ria e capacidade de processamento dispon\u00edveis para os clones. <\/p>\n<p><\/p>\n<p>Mas para que esses testes sejam realistas, precisamos resolver esse problema de alguma forma. <\/p>\n<p><\/p>\n<p>\u00c9 claro que um aspecto importante s\u00e3o os dados id\u00eanticos. Mas isso n\u00f3s j\u00e1 temos. E queremos alcan\u00e7ar uma configura\u00e7\u00e3o id\u00eantica. E podemos fornecer uma configura\u00e7\u00e3o praticamente id\u00eantica. <\/p>\n<p><\/p>\n<p>Seria \u00f3timo ter o mesmo hardware que na produ\u00e7\u00e3o, mas isso pode variar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos lembrar como o Postgres trabalha com a mem\u00f3ria. Temos dois caches. Um do sistema de arquivos e outro do pr\u00f3prio Postgres, ou seja, o Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>\u00c9 importante notar que o Shared Buffer Cache \u00e9 alocado ao iniciar o Postgres, dependendo do tamanho que voc\u00ea definir na configura\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>E o segundo cache utiliza todo o espa\u00e7o dispon\u00edvel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quando fazemos v\u00e1rias c\u00f3pias em uma \u00fanica m\u00e1quina, acabamos preenchendo a mem\u00f3ria gradualmente. E, na verdade, o Shared Buffer Cache deve ser cerca de 25% do total de mem\u00f3ria dispon\u00edvel na m\u00e1quina. <\/p>\n<p><\/p>\n<p>E assim, se n\u00e3o mudarmos esse par\u00e2metro, poderemos executar apenas 4 inst\u00e2ncias em uma m\u00e1quina, ou seja, apenas 4 dessas c\u00f3pias leves. E isso \u00e9, claro, ruim, porque gostar\u00edamos de ter muito mais. <\/p>\n<p><\/p>\n<p>Mas, por outro lado, o Buffer Cache \u00e9 usado para executar consultas, para \u00edndices, ou seja, o plano depende do tamanho de nossos caches. E se simplesmente pegarmos esse par\u00e2metro e diminuirmos, nossos planos podem mudar significativamente.<\/p>\n<p><\/p>\n<p>Por exemplo, se em produ\u00e7\u00e3o tivermos um cache grande, o Postgres preferir\u00e1 usar o \u00edndice. Se n\u00e3o, ent\u00e3o ser\u00e1 SeqScan. E qual seria o sentido se esses planos n\u00e3o coincidissem? <\/p>\n<p><\/p>\n<p>Mas aqui chegamos \u00e0 conclus\u00e3o de que, na verdade, o plano no Postgres n\u00e3o depende do tamanho espec\u00edfico definido no Shared Buffer, mas sim do effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/1457fd7b65c342f64733b952130125cf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Effective_cache_size \u00e9 o volume estimado de cache que temos dispon\u00edvel, ou seja, a soma do Buffer Cache e do cache do sistema de arquivos. Isso \u00e9 definido pela configura\u00e7\u00e3o. E essa mem\u00f3ria n\u00e3o \u00e9 alocada. <\/p>\n<p><\/p>\n<p>E com esse par\u00e2metro, podemos enganar o Postgres, dizendo que temos, na verdade, muitos dados dispon\u00edveis, mesmo que n\u00e3o os tenhamos. Dessa forma, os planos coincidir\u00e3o completamente com a produ\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>Mas isso pode influenciar o timing. E otimizamos as consultas com base no timing, mas \u00e9 importante que o timing depende de muitos fatores: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Depende da carga atual em produ\u00e7\u00e3o. <\/p>\n<p>\n<\/li>\n<li>\n<p>Depende das caracter\u00edsticas da pr\u00f3pria m\u00e1quina. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>E esse \u00e9 um par\u00e2metro indireto, mas na verdade podemos otimizar com base na quantidade de dados que essa consulta ir\u00e1 ler para obter o resultado. <\/p>\n<p><\/p>\n<p>E se quisermos que o tempo seja semelhante ao que veremos em produ\u00e7\u00e3o, precisamos usar hardware o mais parecido poss\u00edvel e, talvez, at\u00e9 mais, para que todas as c\u00f3pias caibam. Mas isso \u00e9 um compromisso, ou seja, voc\u00ea ter\u00e1 os mesmos planos, ver\u00e1 quanta informa\u00e7\u00e3o uma consulta espec\u00edfica l\u00ea e poder\u00e1 concluir \u2013 esta consulta \u00e9 boa (ou a migra\u00e7\u00e3o) ou ruim, precisando de mais otimiza\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>Vamos detalhar como a otimiza\u00e7\u00e3o ocorre com o Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos usar uma consulta de um sistema real. Neste caso, a base de dados tem 1 terabyte. E queremos calcular o n\u00famero de posts recentes que tiveram mais de 10 likes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00f3s enviamos uma mensagem no canal e um clone foi ativado para n\u00f3s. E veremos que tal consulta levar\u00e1 2,5 minutos. Essa \u00e9 a primeira coisa que notaremos.<\/p>\n<p><\/p>\n<p>O Joe mostrar\u00e1 recomenda\u00e7\u00f5es autom\u00e1ticas baseadas no plano e nas m\u00e9tricas. <\/p>\n<p><\/p>\n<p>Veremos que a consulta est\u00e1 processando muitos dados para obter um n\u00famero relativamente pequeno de linhas. E precisamos de algum \u00edndice especializado, uma vez que notamos que na consulta existem muitas linhas filtradas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos examinar mais de perto o que aconteceu. De fato, vemos que lemos quase um giga e meio de dados do cache de arquivos ou at\u00e9 mesmo do disco. E isso n\u00e3o \u00e9 bom, pois conseguimos apenas 142 linhas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, aparentemente, temos um \u00edndice de varredura e deveria ter sido r\u00e1pido, mas, como filtramos muitas linhas (tivemos que cont\u00e1-las), a consulta foi lenta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E isso ocorreu no plano devido ao fato de que as condi\u00e7\u00f5es da consulta e as condi\u00e7\u00f5es do \u00edndice n\u00e3o coincidem parcialmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos tentar fazer um \u00edndice mais preciso e ver como a execu\u00e7\u00e3o da consulta mudar\u00e1 depois disso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A cria\u00e7\u00e3o do \u00edndice levou bastante tempo, mas agora checamos a consulta e vemos que o tempo, em vez de 2,5 minutos, agora \u00e9 de apenas 156 milissegundos, o que \u00e9 bastante bom. E estamos lendo apenas 6 megabytes de dados.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E agora estamos usando uma varredura apenas de \u00edndice.<\/p>\n<p><\/p>\n<p>Outra quest\u00e3o importante \u00e9 que queremos apresentar o plano de uma maneira mais compreens\u00edvel. Implementamos uma visualiza\u00e7\u00e3o com o uso de Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esta \u00e9 uma consulta diferente, mais complexa. Constru\u00edmos os Flame Graphs com base em dois par\u00e2metros: a quantidade de dados que um n\u00f3 espec\u00edfico no plano leu e o tempo, ou seja, o tempo de execu\u00e7\u00e3o do n\u00f3. <\/p>\n<p><\/p>\n<p>Aqui podemos comparar especificamente os n\u00f3s entre si. E ser\u00e1 claro qual deles ocupa mais ou menos espa\u00e7o, o que geralmente \u00e9 complicado de fazer em outros m\u00e9todos de visualiza\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Claro, todos conhecem explain.depesz.com. Uma boa caracter\u00edstica dessa visualiza\u00e7\u00e3o \u00e9 que salvamos o plano textual e tamb\u00e9m extra\u00edmos alguns par\u00e2metros principais em uma tabela, para que possamos classificar. <\/p>\n<p><\/p>\n<p>E desenvolvedores que ainda n\u00e3o se aprofundaram nesse tema tamb\u00e9m utilizam explain.depesz.com, porque para eles \u00e9 mais f\u00e1cil entender quais m\u00e9tricas s\u00e3o importantes e quais n\u00e3o s\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e1 uma nova abordagem de visualiza\u00e7\u00e3o \u2013 \u00e9 o explain.dalibo.com. Eles fazem uma visualiza\u00e7\u00e3o em \u00e1rvore, mas aqui \u00e9 muito dif\u00edcil comparar os n\u00f3s entre si. Aqui d\u00e1 para entender bem a estrutura, na verdade, se houver uma consulta grande, ser\u00e1 necess\u00e1rio rolar para l\u00e1 e para c\u00e1, mas tamb\u00e9m \u00e9 uma op\u00e7\u00e3o. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Colabora\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, como j\u00e1 disse, o Slack nos oferece a possibilidade de colabora\u00e7\u00e3o. Por exemplo, se encontramos uma consulta complicada que n\u00e3o sabemos como otimizar, podemos esclarecer essa quest\u00e3o no thread do Slack com nossos colegas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acreditamos que \u00e9 importante testar com dados de tamanho real. Para isso, criamos a ferramenta Update Database Lab, que est\u00e1 dispon\u00edvel em c\u00f3digo aberto. Voc\u00ea pode usar o bot Joe tamb\u00e9m. Voc\u00ea pode peg\u00e1-lo agora e implement\u00e1-lo em seu sistema. Todos os guias est\u00e3o dispon\u00edveis l\u00e1. <\/p>\n<p><\/p>\n<p>\u00c9 importante tamb\u00e9m ressaltar que a solu\u00e7\u00e3o em si n\u00e3o \u00e9 algo revolucion\u00e1rio, porque existe o Delphix, mas \u00e9 uma solu\u00e7\u00e3o empresarial. Ela \u00e9 totalmente fechada e custa muito caro. N\u00f3s nos especializamos em Postgres. Todos esses produtos s\u00e3o open source. Junte-se a n\u00f3s! <\/p>\n<p><\/p>\n<p>Com isso, eu encerro. Obrigado!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Perguntas<\/h2>\n<p><\/p>\n<p><em>Ol\u00e1! Obrigado pela palestra! Muito interessante, especialmente para mim, porque enfrentei uma tarefa semelhante h\u00e1 algum tempo atr\u00e1s. E por isso tenho uma s\u00e9rie de perguntas. Espero conseguir fazer pelo menos algumas.<\/em><\/p>\n<p><\/p>\n<p><em>\u00c9 interessante saber como voc\u00ea calcula o espa\u00e7o para esse ambiente? A tecnologia pressup\u00f5e que sob certas circunst\u00e2ncias seus clones podem crescer at\u00e9 o tamanho m\u00e1ximo. Grosso modo, se voc\u00ea tem um banco de dados de dez terabytes e 10 clones, \u00e9 f\u00e1cil simular uma situa\u00e7\u00e3o em que cada clone ocuparia 10 dados \u00fanicos. Como voc\u00ea calcula esse espa\u00e7o, ou seja, a delta da qual voc\u00ea falou, onde esses clones v\u00e3o viver?<\/em><\/p>\n<p><\/p>\n<p>Boa pergunta. Aqui \u00e9 importante monitorar clones espec\u00edficos. Se houver uma altera\u00e7\u00e3o muito grande em um clone, e ele come\u00e7ar a crescer, podemos, primeiro, emitir um aviso ao usu\u00e1rio sobre isso, ou ent\u00e3o parar imediatamente esse clone para evitar uma situa\u00e7\u00e3o de falha. <\/p>\n<p><\/p>\n<p><em>Sim, eu tenho uma pergunta adicional. Ou seja, como voc\u00ea garante o ciclo de vida desses m\u00f3dulos? Para n\u00f3s, isso \u00e9 um problema e uma hist\u00f3ria separada. Como isso funciona?<\/em><\/p>\n<p><\/p>\n<p>Cada clone tem um certo ttl. Basicamente, temos um ttl fixo. <\/p>\n<p><\/p>\n<p><em>Qual \u00e9, se n\u00e3o for segredo?<\/em><\/p>\n<p><\/p>\n<p>1 hora, ou seja, idle \u2013 1 hora. Se n\u00e3o for utilizado, n\u00f3s o descartamos. Mas isso n\u00e3o \u00e9 surpreendente, pois podemos levantar um clone em segundos. E se ele for necess\u00e1rio novamente, \u00e9 s\u00f3 fazer. <\/p>\n<p><\/p>\n<p><em>Estou curioso tamb\u00e9m sobre a escolha das tecnologias, porque n\u00f3s, por exemplo, usamos v\u00e1rios m\u00e9todos ao mesmo tempo por v\u00e1rias raz\u00f5es. Por que exatamente ZFS? Por que voc\u00ea n\u00e3o usou LVM? Voc\u00ea mencionou que houve problemas com LVM. Quais foram os problemas? A meu ver, a op\u00e7\u00e3o com a SAN \u00e9 a mais otimizada em termos de desempenho.<\/em> <\/p>\n<p><\/p>\n<p><em>Qual \u00e9 o principal problema com ZFS? O fato de que voc\u00ea deve operar em um \u00fanico host, ou seja, todas as inst\u00e2ncias viver\u00e3o dentro do mesmo sistema operacional. No caso de uma SAN, voc\u00ea pode conectar diferentes equipamentos. O \u00fanico gargalo s\u00e3o os blocos que est\u00e3o na SAN. E a pergunta sobre a escolha das tecnologias \u00e9 realmente interessante. Por que n\u00e3o usar LVM?<\/em><\/p>\n<p><\/p>\n<p>Podemos discutir especificamente sobre LVM no meetup. Sobre a SAN \u2013 isso \u00e9 simplesmente caro. O sistema ZFS pode ser implementado em qualquer lugar. Voc\u00ea pode instal\u00e1-lo na sua m\u00e1quina. Voc\u00ea pode apenas baixar o reposit\u00f3rio e instal\u00e1-lo. ZFS pode ser instalado praticamente em qualquer lugar, se estamos falando de Linux. Ou seja, temos uma solu\u00e7\u00e3o muito flex\u00edvel. E o pr\u00f3prio ZFS, pronto para uso, oferece muito. Voc\u00ea pode carregar tantos dados quanto quiser, conectar um grande n\u00famero de discos, h\u00e1 snapshots. E, como j\u00e1 mencionei, \u00e9 f\u00e1cil de administrar. Ou seja, parece ser muito agrad\u00e1vel de usar. Ele \u00e9 testado, tem muitos anos. E possui uma comunidade muito grande que continua a crescer. ZFS \u00e9 uma solu\u00e7\u00e3o muito confi\u00e1vel. <\/p>\n<p><\/p>\n<p>Nikolai Samokhvalov: Posso fazer mais um coment\u00e1rio? Meu nome \u00e9 Nikolai, trabalho junto com Anatoly. Concordo que a SAN \u00e9 excelente. E alguns dos nossos clientes t\u00eam Pure Storage, etc. <\/p>\n<p><\/p>\n<p>Anatoly corretamente observou que estamos focados na modularidade. No futuro, podemos implementar uma \u00fanica interface \u2013 fa\u00e7a um snapshot, fa\u00e7a um clone, destrua o clone. Tudo isso \u00e9 simples. E o storage \u00e9 incr\u00edvel, se estiver dispon\u00edvel.<\/p>\n<p><\/p>\n<p>Mas o ZFS est\u00e1 dispon\u00edvel para todos. J\u00e1 chega de DelPhix, eles t\u00eam 300 clientes. Destes, 50 est\u00e3o na lista da Fortune 100, ou seja, eles miram no NASA e assim por diante. \u00c9 hora de todos terem essa tecnologia. E \u00e9 por isso que temos o Core open source. Temos uma parte da interface que n\u00e3o \u00e9 open source. Esta \u00e9 a plataforma que vamos mostrar. Mas queremos que isso esteja acess\u00edvel a todos. Queremos fazer uma revolu\u00e7\u00e3o para que todos os testadores parem de adivinhar em laptops. Precisamos escrever SELECT e ver imediatamente que est\u00e1 lento. Chega de esperar que o DBA fale sobre isso. Esse \u00e9 o nosso principal objetivo. E eu acho que conseguiremos isso. E estamos fazendo essa solu\u00e7\u00e3o para que todos tenham acesso. Por isso o ZFS, porque ele estar\u00e1 dispon\u00edvel em toda parte. Obrigado \u00e0 comunidade por resolver problemas e por ter licen\u00e7a open source, etc. <\/p>\n<p><\/p>\n<p><em>Sauda\u00e7\u00f5es! Obrigado pela apresenta\u00e7\u00e3o! Meu nome \u00e9 Maxim. N\u00f3s enfrentamos os mesmos problemas. N\u00f3s j\u00e1 resolvemos. Como voc\u00eas dividem os recursos entre esses clones? Cada clone pode estar lidando com algo diferente a qualquer momento: um testa uma coisa, o outro outra, algu\u00e9m est\u00e1 construindo um \u00edndice, outro est\u00e1 executando um job pesado. E, se for poss\u00edvel dividir pelo CPU, como voc\u00eas fazem em rela\u00e7\u00e3o ao IO? Essa \u00e9 a primeira pergunta.<\/em><\/p>\n<p><\/p>\n<p><em>E a segunda pergunta \u00e9 sobre a discrep\u00e2ncia entre os ambientes. Suponha que eu tenha ZFS aqui e tudo esteja \u00f3timo, mas o cliente em produ\u00e7\u00e3o n\u00e3o tem ZFS, e sim ext4, por exemplo. Como voc\u00eas lidam com isso?<\/em><\/p>\n<p><\/p>\n<p>Essas s\u00e3o quest\u00f5es muito boas. Eu mencionei um pouco sobre o problema de como dividimos os recursos. A solu\u00e7\u00e3o \u00e9 a seguinte. Imagine que voc\u00ea est\u00e1 testando no staging. Voc\u00ea tamb\u00e9m pode ter uma situa\u00e7\u00e3o em que algu\u00e9m est\u00e1 gerando uma carga, enquanto outra pessoa gera outra. E, no final, voc\u00ea v\u00ea m\u00e9tricas confusas. Um problema semelhante pode ocorrer em produ\u00e7\u00e3o. Quando voc\u00ea quer verificar um determinado comando e v\u00ea que h\u00e1 algum problema \u2013 ele est\u00e1 processando lentamente \u2013 na verdade, o problema n\u00e3o estava no comando, mas na carga paralela. <\/p>\n<p><\/p>\n<p>Portanto, \u00e9 importante focar em qual ser\u00e1 o plano, quais etapas seguiremos e quantos dados iremos levantar para isso. O fato de que teremos discos, por exemplo, sendo sobrecarregados com algo, impactar\u00e1 especificamente no timing. Mas podemos avaliar, com base na quantidade de dados, qu\u00e3o intensa \u00e9 essa solicita\u00e7\u00e3o. N\u00e3o \u00e9 t\u00e3o importante que, ao mesmo tempo, haja alguma outra execu\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><em>Eu tenho duas perguntas. Isso \u00e9 realmente incr\u00edvel. Houve casos em que dados em produ\u00e7\u00e3o s\u00e3o criticamente importantes, como n\u00fameros de cart\u00f5es de cr\u00e9dito? J\u00e1 existe algo pronto ou isso \u00e9 uma tarefa separada? E a segunda pergunta \u2013 existe algo assim para MySQL?<\/em><\/p>\n<p><\/p>\n<p>Sobre os dados. N\u00f3s faremos ofusca\u00e7\u00e3o, enquanto isso n\u00e3o estamos fazendo. Mas se voc\u00ea est\u00e1 implementando especificamente o Joe, e n\u00e3o d\u00e1 acesso aos desenvolvedores, ent\u00e3o n\u00e3o h\u00e1 acesso aos dados. Por qu\u00ea? Porque o Joe n\u00e3o mostra os dados. Ele apenas mostra m\u00e9tricas, planos e tudo mais. Isso foi feito intencionalmente, pois \u00e9 uma das exig\u00eancias do nosso cliente. Eles queriam ter a capacidade de otimizar, mas sem dar acesso indiscriminado a todos. <\/p>\n<p><\/p>\n<p>Sobre o MySQL. Este sistema pode ser usado para qualquer coisa que armazene estado no disco. E como estamos focando no Postgres, atualmente estamos priorizando toda a automa\u00e7\u00e3o para o Postgres. Queremos automatizar a recupera\u00e7\u00e3o de dados do backup. Estamos configurando o Postgres corretamente. Sabemos como fazer para que os planos coincidam, etc. <\/p>\n<p><\/p>\n<p>Mas como o sistema \u00e9 expans\u00edvel, tamb\u00e9m poder\u00e1 ser utilizado para MySQL. Existem alguns exemplos disso. Um sistema similar est\u00e1 no Yandex, mas eles n\u00e3o publicam em nenhum lugar. Eles usam isso internamente no Yandex.Metrica. E l\u00e1, de fato, \u00e9 uma hist\u00f3ria sobre MySQL. Mas as tecnologias s\u00e3o as mesmas, ZFS. <\/p>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o! Eu tamb\u00e9m tenho algumas perguntas. Voc\u00ea mencionou que a clonagem pode ser utilizada para an\u00e1lise, por exemplo, para construir \u00edndices adicionais. Poderia nos contar um pouco mais sobre como isso funciona?<\/em><\/p>\n<p><\/p>\n<p><em>E j\u00e1 vou fazer a segunda pergunta sobre a uniformidade dos ambientes e dos planos. O plano depende, entre outras coisas, da estat\u00edstica coletada pelo Postgres. Como voc\u00ea resolve esse problema?<\/em><\/p>\n<p><\/p>\n<p>N\u00e3o temos an\u00e1lises de casos espec\u00edficos, pois ainda n\u00e3o utilizamos dessa forma, mas essa possibilidade existe. Se falarmos sobre \u00edndices, imagine que um pedido \u00e9 executado em uma tabela com centenas de milh\u00f5es de registros e em uma coluna que geralmente n\u00e3o est\u00e1 indexada em produ\u00e7\u00e3o. E n\u00f3s queremos calcular alguns dados. Se esse pedido for executado em produ\u00e7\u00e3o, h\u00e1 a possibilidade de que a produ\u00e7\u00e3o tenha uma paralisa\u00e7\u00e3o, pois o pedido pode levar um minuto para ser processado. <\/p>\n<p><\/p>\n<p>Certo, vamos criar um clone leve, que n\u00e3o seja um problema parar por alguns minutos. E para torna mais f\u00e1cil calcular a an\u00e1lise, adicionaremos \u00edndices nas colunas que nos interessam. <\/p>\n<p><\/p>\n<p><em>O \u00edndice ser\u00e1 criado toda vez?<\/em><\/p>\n<p><\/p>\n<p>Podemos fazer de modo que mexamos nos dados, fa\u00e7amos snapshots, e depois recuperemos desses snapshots para executar novos pedidos. Ou seja, podemos criar novos clones j\u00e1 com os \u00edndices definidos.<\/p>\n<p><\/p>\n<p>Quanto \u00e0 quest\u00e3o sobre estat\u00edsticas, se estamos nos recuperando de um backup, se estamos fazendo replica\u00e7\u00e3o, as estat\u00edsticas ser\u00e3o exatamente as mesmas. Pois teremos toda a estrutura f\u00edsica dos dados, ou seja, traremos os dados como est\u00e3o, com todas as m\u00e9tricas estat\u00edsticas. <\/p>\n<p><\/p>\n<p>Aqui temos um outro problema. Se voc\u00ea est\u00e1 utilizando uma solu\u00e7\u00e3o em nuvem, apenas dumps l\u00f3gicos est\u00e3o dispon\u00edveis, pois Google, Amazon n\u00e3o permitem acessar uma c\u00f3pia f\u00edsica. Esse ser\u00e1 o problema. <\/p>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o. Aqui surgiram duas boas perguntas sobre MySQL e sobre a divis\u00e3o de recursos. Mas, essencialmente, tudo se resume ao fato de que isso n\u00e3o \u00e9 uma quest\u00e3o de sistemas gerenciadores de banco de dados espec\u00edficos, mas sim do sistema de arquivos como um todo. Portanto, as quest\u00f5es de divis\u00e3o de recursos tamb\u00e9m devem ser abordadas a partir desse ponto, n\u00e3o no final, considerando que se trata de Postgres, mas sim no sistema de arquivos. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/dts-dronten\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">servidor<\/a>, na inst\u00e2ncia.<\/em> <\/p>\n<p><\/p>\n<p><em>Minha pergunta \u00e9 um pouco diferente. Ela se aproxima mais da multilayer dos bancos de dados, onde existem v\u00e1rias camadas. Por exemplo, configuramos a atualiza\u00e7\u00e3o de uma imagem de dez terabytes, estamos realizando a replica\u00e7\u00e3o. E usamos essa solu\u00e7\u00e3o especificamente para bancos de dados. A replica\u00e7\u00e3o est\u00e1 ativa, enquanto a atualiza\u00e7\u00e3o dos dados ocorre. Paralelamente, 100 funcion\u00e1rios est\u00e3o trabalhando, constantemente executando diferentes snapshots. O que fazer? Como evitar conflitos, caso eles executem uma opera\u00e7\u00e3o e, em seguida, a estrutura do sistema de arquivos seja alterada, e esses snapshots fiquem corrompidos?<\/em> <\/p>\n<p><\/p>\n<p>Eles n\u00e3o v\u00e3o, porque \u00e9 assim que o ZFS funciona. Podemos manter, separadamente, em um fluxo, as altera\u00e7\u00f5es do sistema de arquivos que, gra\u00e7as \u00e0 replica\u00e7\u00e3o, chegam. E manter clones das vers\u00f5es antigas dos dados que os desenvolvedores usam. E isso est\u00e1 funcionando para n\u00f3s, est\u00e1 tudo bem.<\/p>\n<p><\/p>\n<p><em>Ent\u00e3o, a atualiza\u00e7\u00e3o acontecer\u00e1 como uma camada adicional, e todas as novas instant\u00e2neas ser\u00e3o geradas a partir dessa camada, certo?<\/em> <\/p>\n<p><\/p>\n<p>Das camadas anteriores, que foram das replica\u00e7\u00f5es anteriores. <\/p>\n<p><\/p>\n<p><em>As camadas anteriores desaparecer\u00e3o, mas elas estar\u00e3o referenciadas na camada antiga, e as novas imagens ser\u00e3o extra\u00eddas da \u00faltima camada obtida na atualiza\u00e7\u00e3o?<\/em><\/p>\n<p><\/p>\n<p>Em geral, sim. <\/p>\n<p><\/p>\n<p><em>Ent\u00e3o, como consequ\u00eancia, teremos muitas camadas. E com o tempo, elas precisar\u00e3o ser compactadas?<\/em><\/p>\n<p><\/p>\n<p>Sim, exatamente. H\u00e1 uma certa janela. Mantemos instant\u00e2neas semanais. Isso depende de qu\u00e3o grande \u00e9 o seu recurso. Se voc\u00ea puder armazenar muitos dados, pode manter as instant\u00e2neas por muito tempo. Elas n\u00e3o ser\u00e3o exclu\u00eddas automaticamente. N\u00e3o haver\u00e1 corrup\u00e7\u00e3o de dados. Se as instant\u00e2neas estiverem desatualizadas, como achamos, ou seja, isso depende da pol\u00edtica da empresa, podemos simplesmente exclu\u00ed-las e liberar espa\u00e7o. <\/p>\n<p><\/p>\n<p><em>Ol\u00e1, obrigado pela apresenta\u00e7\u00e3o! Em rela\u00e7\u00e3o \u00e0 pergunta do Joe. Voc\u00ea disse que o cliente n\u00e3o queria dar acesso irrestrito aos dados. Estritamente falando, se uma pessoa possui o resultado do Explain Analyze, ela pode visualizar os dados.<\/em> <\/p>\n<p><\/p>\n<p>Isso mesmo. Por exemplo, podemos escrever: \"SELECT FROM WHERE email = algo assim\". Ou seja, n\u00e3o veremos os pr\u00f3prios dados, mas poderemos olhar alguns ind\u00edcios indiretos. Isso precisa ser compreendido. Mas, por outro lado, isso tudo \u00e9 vis\u00edvel. Temos auditoria de logs, temos o controle de outros colegas, que tamb\u00e9m veem o que os desenvolvedores est\u00e3o fazendo. E se algu\u00e9m tentar fazer isso, a equipe de seguran\u00e7a vir\u00e1 at\u00e9 eles e investigar\u00e1 a quest\u00e3o. <\/p>\n<p><\/p>\n<p><em>Bom dia! Obrigado pela apresenta\u00e7\u00e3o! Tenho uma pergunta r\u00e1pida. Se o Slack n\u00e3o \u00e9 usado na empresa, existe algum tipo de vincula\u00e7\u00e3o atualmente, ou \u00e9 poss\u00edvel desenvolver inst\u00e2ncias para os desenvolvedores se conectarem ao aplicativo de teste da base de dados?<\/em><\/p>\n<p><\/p>\n<p>Atualmente, h\u00e1 integra\u00e7\u00e3o com o Slack, ou seja, n\u00e3o h\u00e1 outros mensageiros dispon\u00edveis, mas gostar\u00edamos muito de implementar suporte a outros mensageiros tamb\u00e9m. O que voc\u00ea pode fazer? Voc\u00ea pode implantar o DB Lab em sua infraestrutura sem o Joe, usar a API REST ou a nossa plataforma para criar clones e conectar-se ao PSQL. Mas isso s\u00f3 pode ser feito se voc\u00ea estiver disposto a fornecer acesso aos dados para seus desenvolvedores, pois aqui n\u00e3o teremos mais uma interface gr\u00e1fica. <\/p>\n<p><\/p>\n<p><em>N\u00e3o preciso dessa camada, mas sim dessa funcionalidade.<\/em><\/p>\n<p><\/p>\n<p>Ent\u00e3o \u2013 sim, isso pode ser feito.<\/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.3 - 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\/pt\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Bot DBA Joe. Anatoly Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}