{"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\/es\/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>\u00bfC\u00f3mo entiende un desarrollador backend que una consulta SQL funcionar\u00e1 bien en producci\u00f3n? En empresas grandes o de r\u00e1pido crecimiento, no todos tienen acceso a la producci\u00f3n. Adem\u00e1s, incluso con acceso, no todas las consultas se pueden comprobar sin complicaciones, y crear una copia de la base de datos a menudo toma horas. Para resolver estos problemas, hemos creado un DBA artificial: Joe. Ya ha sido implementado con \u00e9xito en varias empresas y ayuda a m\u00e1s de una decena de desarrolladores. <\/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=\"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>\u00a1Hola a todos! Me llamo Anatoly Stan\u0441ler. Trabajo en la empresa <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Nos dedicamos a acelerar el proceso de desarrollo eliminando las demoras relacionadas con el funcionamiento de Postgres, para los desarrolladores, DBA y QA.<\/p>\n<p><\/p>\n<p>Tenemos clientes fant\u00e1sticos y hoy una parte de la presentaci\u00f3n estar\u00e1 dedicada a los casos que hemos encontrado trabajando con ellos. Les contar\u00e9 c\u00f3mo les ayudamos a resolver problemas bastante serios.<\/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>Cuando estamos desarrollando y hacemos migraciones complejas y pesadas, nos hacemos la pregunta: \"\u00bfFuncionar\u00e1 esta migraci\u00f3n?\". Utilizamos revisiones, aprovechamos el conocimiento de colegas m\u00e1s experimentados y expertos en DBA. Y pueden decir si funcionar\u00e1 o no. <\/p>\n<p><\/p>\n<p>Pero, quiz\u00e1s, ser\u00eda mejor si pudi\u00e9ramos probar esto en copias a gran escala por nosotros mismos. Y hoy hablaremos precisamente de los enfoques actuales para las pruebas y c\u00f3mo podemos hacerlo mejor y con qu\u00e9 herramientas. Tambi\u00e9n discutiremos los pros y los contras de estos enfoques y qu\u00e9 podemos mejorar aqu\u00ed. <\/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>\u00bfAlguna vez alguien ha hecho \u00edndices o ha realizado cambios directamente en producci\u00f3n? Bastante gente. \u00bfY a cu\u00e1ntos les ha llevado esto a perder datos o a experimentar tiempos de inactividad? Entonces conocen este dolor. Gracias a Dios, hay copias de seguridad. <\/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>El primer enfoque es la prueba en producci\u00f3n. O cuando un desarrollador est\u00e1 en su m\u00e1quina local, tiene datos de prueba, hay una muestra limitada. Y lanzamos en producci\u00f3n y se obtiene una situaci\u00f3n como esta.<\/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>Es doloroso, es costoso. Probablemente no sea la mejor forma de hacerlo. <\/p>\n<p><\/p>\n<p>\u00bfY cu\u00e1l ser\u00eda la mejor forma de hacerlo? <\/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>Tomemos el entorno de staging y dediquemos alguna parte de la producci\u00f3n. O, en el mejor de los casos, tomemos producci\u00f3n real, todos los datos. Y despu\u00e9s de haber desarrollado localmente, verificaremos adicionalmente tambi\u00e9n en staging. <\/p>\n<p><\/p>\n<p>Esto nos permitir\u00e1 eliminar algunos errores, es decir, no permitir que lleguen a producci\u00f3n. <\/p>\n<p><\/p>\n<p>\u00bfCu\u00e1les son los problemas? <\/p>\n<p><\/p>\n<ul>\n<li>El problema es que compartimos este staging con colegas. Y muy a menudo sucede que haces alg\u00fan cambio, \u00a1bam! \u2013 y no hay datos, el trabajo se va al traste. El staging era de varios terabytes. Y hay que esperar mucho tiempo para que se reinicie. Y decidimos que lo mejor es desarrollarlo ma\u00f1ana. Eso es todo, nuestra capacidad de desarrollo se detuvo. <\/li>\n<li>Y, por supuesto, tenemos muchos colegas ah\u00ed, muchos equipos. Y hay que coordinar manualmente. Y eso no es conveniente. <\/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>Y hay que decir que solo tenemos un intento, un disparo, si queremos hacer alg\u00fan cambio en la base de datos, manipular los datos, cambiar la estructura. Y si algo sale mal, si hay un error en la migraci\u00f3n, no podremos retroceder r\u00e1pidamente. <\/p>\n<p><\/p>\n<p>Es mejor que el enfoque anterior, pero a\u00fan existe una gran probabilidad de que alg\u00fan error llegue a producci\u00f3n.<\/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>\u00bfQu\u00e9 nos impide dar a cada desarrollador un entorno de pruebas, una copia completa? Creo que queda claro qu\u00e9 es lo que impide eso. <\/p>\n<p><\/p>\n<p>\u00bfQui\u00e9n tiene una base de datos que supere el terabyte? M\u00e1s de la mitad de los asistentes. <\/p>\n<p><\/p>\n<p>Y est\u00e1 claro que mantener m\u00e1quinas para cada desarrollador, cuando la producci\u00f3n es tan grande, es muy costoso y, adem\u00e1s, lleva tiempo. <\/p>\n<p><\/p>\n<p>Tenemos clientes que han comprendido que es muy importante probar todos los cambios en copias completas, pero su base es menor de un terabyte, y no tienen los recursos para mantener un entorno de pruebas para cada desarrollador. Por eso tienen que descargar los vol\u00famenes localmente en sus m\u00e1quinas y probar de esa manera. Eso lleva mucho tiempo. <\/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>Incluso si lo haces dentro de la infraestructura, descargar un terabyte de datos en una hora ya es bastante bueno. Pero utilizan vol\u00famenes l\u00f3gicos, los descargan localmente desde la nube. Para ellos, la velocidad es de unos 200 gigabytes por hora. Y adem\u00e1s necesitan tiempo para descomprimir el volumen l\u00f3gico, aplicar los \u00edndices, etc.<\/p>\n<p><\/p>\n<p>Pero utilizan este enfoque porque les permite mantener la producci\u00f3n confiable. <\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 podemos hacer aqu\u00ed? Hagamos que los entornos de pruebas sean econ\u00f3micos y proporcionemos a cada desarrollador su propio entorno de pruebas.<\/p>\n<p><\/p>\n<p>Y eso es posible. <\/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>Y en este enfoque, cuando hacemos clones delgados para cada desarrollador, podemos compartirlo en una sola m\u00e1quina. Por ejemplo, si tienes una base de datos de cuatro terabytes y quieres proporcion\u00e1rsela a 10 desarrolladores, no necesitas tener 10 bases de datos de cuatro terabytes. Con una sola m\u00e1quina, puedes crear copias aisladas delgadas para cada desarrollador usando una sola m\u00e1quina. C\u00f3mo funciona te lo contar\u00e9 un poco m\u00e1s adelante. <\/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>Un ejemplo real:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>La base de datos tiene 4,5 terabytes. <\/p>\n<p>\n<\/li>\n<li>\n<p>Podemos obtener copias independientes en 30 segundos. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>No necesitas esperar a que se configure un entorno de pruebas ni depender de su tama\u00f1o. Puedes obtenerlo en segundos. Ser\u00e1n entornos completamente aislados, pero que comparten datos entre s\u00ed. <\/p>\n<p><\/p>\n<p>Eso es genial. Aqu\u00ed estamos hablando de magia y universos paralelos. <\/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>En nuestro caso, esto funciona con el 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 es un sistema de archivos copy-on-write que soporta de forma nativa snapshots y clones. Es confiable y escalable. Es f\u00e1cil de gestionar. Se puede desplegar literalmente en dos comandos. <\/p>\n<p><\/p>\n<p>Hay otras opciones:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Almacenamiento de red (por ejemplo, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, del que hablo, es modular. Se puede implementar utilizando tales opciones. Pero por ahora nos hemos centrado en OpenZFS, porque espec\u00edficamente con LVM tuvimos problemas. <\/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>\u00bfC\u00f3mo funciona? En lugar de sobrescribir los datos cada vez que los cambiamos, los guardamos, simplemente marcando que estos nuevos datos pertenecen a un nuevo momento en el tiempo, a un nuevo snapshot. <\/p>\n<p><\/p>\n<p>Y luego, cuando queremos retroceder o crear un nuevo clon de alguna versi\u00f3n m\u00e1s antigua, simplemente decimos: 'Ok, dame esos bloques de datos que est\u00e1n marcados de esta manera'. <\/p>\n<p><\/p>\n<p>Y este usuario trabajar\u00e1 con ese conjunto de datos. Los ir\u00e1 cambiando gradualmente, creando sus propios snapshots. <\/p>\n<p><\/p>\n<p>Y tendremos ramificaci\u00f3n. Cada desarrollador en nuestro caso tendr\u00e1 la oportunidad de tener su propio clon, que editar\u00e1, mientras que los datos que son comunes ser\u00e1n compartidos 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 desplegar un sistema as\u00ed, hay que resolver dos problemas: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>La primera es la fuente de datos de donde los obtendr\u00e1s. Se puede configurar la replicaci\u00f3n con producci\u00f3n. Se pueden utilizar las copias de seguridad que ya tienes configuradas, espero. WAL-E, WAL-G o Barman. Y, incluso si usas alguna soluci\u00f3n en la nube, como RDS o Cloud SQL, puedes utilizar volcado l\u00f3gico. Pero, de todos modos, te recomendamos utilizar copias de seguridad, porque con este enfoque tambi\u00e9n mantendr\u00e1s la estructura f\u00edsica de los archivos, lo que permitir\u00e1 estar m\u00e1s cerca de las m\u00e9tricas que ver\u00edas en producci\u00f3n, para detectar los problemas que surjan. <\/p>\n<p>\n<\/li>\n<li>\n<p>La segunda es el lugar donde deseas hospedar Database Lab. Puede ser en la nube o en local. Aqu\u00ed es importante mencionar que ZFS soporta la compresi\u00f3n de datos. Y lo hace bastante bien. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Imagina que cada una de estas copias, dependiendo de las operaciones que realicemos con la base, tendr\u00e1 un crecimiento en alg\u00fan dev. Tambi\u00e9n se necesitar\u00e1 espacio para ese dev. Pero gracias a que tomamos una base de 4,5 terabytes, ZFS la comprimir\u00e1 a 3,5 terabytes. Dependiendo de la configuraci\u00f3n, esto se puede variar. Y a\u00fan nos quedar\u00e1 espacio para dev. <\/p>\n<p><\/p>\n<p>Este sistema se puede utilizar para diferentes casos de uso. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Son desarrolladores y DBA para verificar consultas y optimizaci\u00f3n. <\/p>\n<p>\n<\/li>\n<li>\n<p>Esto se puede utilizar en pruebas QA para verificar una migraci\u00f3n espec\u00edfica antes de implementarla en producci\u00f3n. Y tambi\u00e9n podemos generar entornos especiales para QA con datos reales, donde pueden probar nuevas funcionalidades. Y esto tomar\u00e1 segundos en lugar de esperar horas, o incluso d\u00edas en otros casos donde no se utilizan copias delgadas. <\/p>\n<p>\n<\/li>\n<li>\n<p>Y otro caso particular. Si en la empresa no hay un sistema de an\u00e1lisis configurado, podemos crear un clon delgado de la base de datos del producto y entregarlo para consultas largas o para \u00edndices especiales que puedan utilizarse en el an\u00e1lisis.<\/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>Con este enfoque:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Baja probabilidad de errores en producci\u00f3n, porque hemos probado todos los cambios con datos a gran escala. <\/p>\n<p>\n<\/li>\n<li>\n<p>Se genera una cultura de pruebas, ya que ahora no hay que esperar horas por tu propio entorno. <\/p>\n<p>\n<\/li>\n<li>\n<p>Y no hay barreras, no hay esperas entre las pruebas. Realmente puedes ir y comprobar. Y ser\u00e1 mejor as\u00ed, porque aceleraremos el desarrollo. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Habr\u00e1 menos refactorizaci\u00f3n. Menos errores llegar\u00e1n a producci\u00f3n. Los refactorizaremos menos despu\u00e9s. <\/p>\n<p>\n<\/li>\n<li>\n<p>Podemos realizar cambios irreversibles. Esto no est\u00e1 en los enfoques est\u00e1ndar. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>Es ventajoso porque compartimos los recursos de los entornos de prueba. <\/li>\n<\/ol>\n<p><\/p>\n<p>Ya es un buen avance, \u00bfqu\u00e9 m\u00e1s se podr\u00eda acelerar?<\/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>Gracias a este sistema, podemos reducir dr\u00e1sticamente la barrera de entrada para este tipo de pruebas. <\/p>\n<p><\/p>\n<p>Actualmente existe un c\u00edrculo vicioso, donde el desarrollador, para acceder a datos reales en tama\u00f1o completo, debe convertirse en un experto. Debe confiarse en \u00e9l dicho acceso. <\/p>\n<p><\/p>\n<p>Pero, \u00bfc\u00f3mo crecer si no hay? \u00bfY si solo tienes un conjunto de datos de prueba muy peque\u00f1o? Entonces no podr\u00e1s obtener experiencia 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>\u00bfC\u00f3mo salir de este c\u00edrculo? Como primera interfaz, c\u00f3moda para desarrolladores de cualquier nivel, elegimos un bot de Slack. Pero podr\u00eda ser cualquier otra interfaz. <\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 permite hacer? Se puede tomar una consulta espec\u00edfica y enviarla a un canal especial para la base de datos. Autom\u00e1ticamente desplegaremos un clon delgado en segundos. Ejecutaremos esta consulta. Recopilaremos m\u00e9tricas y recomendaciones. Mostraremos visualizaci\u00f3n. Y luego, este clon quedar\u00e1 para que esa consulta pueda optimizarse de alguna manera, a\u00f1adir \u00edndices, etc. <\/p>\n<p><\/p>\n<p>Adem\u00e1s, Slack nos ofrece oportunidades de colaboraci\u00f3n de inmediato. Dado que es solo un canal, puedes empezar a discutir esa consulta en un hilo espec\u00edfico, mencionando a tus colegas y DBA que est\u00e1n dentro de la 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>Pero, por supuesto, tambi\u00e9n hay problemas. Dado que es el mundo real y estamos utilizando un servidor en el que alojamos muchos clones, tenemos que limitar la cantidad de memoria y potencia de procesamiento disponible para los clones. <\/p>\n<p><\/p>\n<p>Pero para que estas pruebas sean cre\u00edbles, hay que resolver de alguna manera este problema. <\/p>\n<p><\/p>\n<p>Est\u00e1 claro que un aspecto importante son los datos id\u00e9nticos. Pero eso ya lo tenemos. Y queremos lograr una configuraci\u00f3n id\u00e9ntica. Y podemos ofrecer una configuraci\u00f3n pr\u00e1cticamente id\u00e9ntica. <\/p>\n<p><\/p>\n<p>Ser\u00eda genial tener el mismo hardware que en producci\u00f3n, aunque puede diferir. <\/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>Recordemos c\u00f3mo Postgres trabaja con la memoria. Tenemos dos cach\u00e9s. Uno de la sistema de archivos y el otro propio de Postgres, es decir, el Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Es importante se\u00f1alar que el Shared Buffer Cache se aloca al iniciar Postgres dependiendo del tama\u00f1o que especifiques en la configuraci\u00f3n. <\/p>\n<p><\/p>\n<p>Y el segundo cach\u00e9 utiliza todo el espacio disponible. <\/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>Y cuando hacemos varios clones en una sola m\u00e1quina, resulta que vamos llenando la memoria gradualmente. Y en buen sentido, el Shared Buffer Cache deber\u00eda ser el 25 % de la capacidad total de memoria disponible en la m\u00e1quina. <\/p>\n<p><\/p>\n<p>Y resulta que si no cambiamos este par\u00e1metro, solo podremos ejecutar 4 instancias en una m\u00e1quina, es decir, solamente 4 de esos delgados clones. Y esto, por supuesto, es malo, porque queremos tener muchos m\u00e1s. <\/p>\n<p><\/p>\n<p>Pero, por otro lado, el Buffer Cache se utiliza para realizar consultas, para \u00edndices, es decir, el plan depende del tama\u00f1o de nuestros cach\u00e9s. Y si simplemente tomamos este par\u00e1metro y lo reducimos, nuestros planes pueden cambiar dr\u00e1sticamente.<\/p>\n<p><\/p>\n<p>Por ejemplo, si en producci\u00f3n tenemos un cach\u00e9 grande, entonces Postgres preferir\u00e1 utilizar el \u00edndice. Pero si no, entonces se realizar\u00e1 un SeqScan. \u00bfY cu\u00e1l ser\u00eda el sentido si nuestros planes no coincidieran? <\/p>\n<p><\/p>\n<p>Pero aqu\u00ed llegamos a la soluci\u00f3n de que, en realidad, el plan en Postgres no depende del tama\u00f1o espec\u00edfico establecido en el Shared Buffer, sino que depende del 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 es la cantidad de cach\u00e9 que se supone que tenemos disponible, es decir, la suma de Buffer Cache y el cach\u00e9 del sistema de archivos. Esto se establece en la configuraci\u00f3n. Y esta memoria no se aloca. <\/p>\n<p><\/p>\n<p>Y gracias a este par\u00e1metro, podemos enga\u00f1ar a Postgres al decir que en realidad tenemos acceso a muchos datos, incluso si esos datos no existen. Y de esta manera, los planes coincidir\u00e1n completamente con producci\u00f3n. <\/p>\n<p><\/p>\n<p>Pero esto puede afectar el tiempo. Y optimizamos las consultas en funci\u00f3n del tiempo, pero lo importante es que el tiempo depende de muchos factores: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Depende de la carga que actualmente existe en producci\u00f3n. <\/p>\n<p>\n<\/li>\n<li>\n<p>Depende de las caracter\u00edsticas de la m\u00e1quina misma. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Y este es un par\u00e1metro indirecto, pero en realidad podemos optimizar en funci\u00f3n de la cantidad de datos que esta consulta leer\u00e1 para obtener un resultado. <\/p>\n<p><\/p>\n<p>Y si queremos que el tiempo de respuesta se asemeje a lo que veremos en producci\u00f3n, debemos utilizar hardware lo m\u00e1s parecido posible y, tal vez, incluso m\u00e1s, para que todos los clones quepan. Pero esto es un compromiso, es decir, recibir\u00e1n los mismos planes, ver\u00e1n cu\u00e1ntos datos lee una consulta en particular y podr\u00e1n concluir si esta consulta es buena (o la migraci\u00f3n) o mala y necesita optimizaci\u00f3n. <\/p>\n<p><\/p>\n<p>Vamos a analizar c\u00f3mo se lleva a cabo la optimizaci\u00f3n espec\u00edficamente con 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>Tomemos una consulta de un sistema real. En este caso, la base de datos tiene 1 terabyte. Y queremos contar el n\u00famero de publicaciones recientes que han recibido m\u00e1s de 10 'me gusta'. <\/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>Escribimos un mensaje en el canal y se despliega un clon para nosotros. Y veremos que dicha consulta se ejecutar\u00e1 en 2,5 minutos. Esto es lo primero que notaremos.<\/p>\n<p><\/p>\n<p>B Joe mostrar\u00e1 recomendaciones autom\u00e1ticas basadas en el plan y las m\u00e9tricas. <\/p>\n<p><\/p>\n<p>Veremos que la consulta est\u00e1 procesando demasiados datos para obtener un n\u00famero relativamente peque\u00f1o de filas. Se necesita alg\u00fan \u00edndice especializado, ya que hemos notado que en la consulta hay demasiadas filas 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>Miremos m\u00e1s de cerca qu\u00e9 ocurri\u00f3. De hecho, vemos que le\u00edmos casi un gigabyte y medio de datos desde el cach\u00e9 de archivos o incluso desde el disco. Y esto no es bueno, ya que solo obtuvimos 142 filas. <\/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>Y, a primera vista, tuvimos un escaneo de \u00edndice que deber\u00eda haber funcionado r\u00e1pidamente, pero, dado que filtramos demasiadas filas (tuvimos que contarlas), la consulta se ejecut\u00f3 lentamente. <\/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>Y esto sucedi\u00f3 en el plan debido a que las condiciones en la consulta y las del \u00edndice no coincid\u00edan 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>Intentemos hacer que el \u00edndice sea m\u00e1s preciso y veamos c\u00f3mo cambia la ejecuci\u00f3n de la consulta despu\u00e9s de esto. <\/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>La creaci\u00f3n del \u00edndice tom\u00f3 bastante tiempo, pero ahora verificamos la consulta y vemos que el tiempo en lugar de 2,5 minutos se redujo a solo 156 milisegundos, lo cual es bastante bueno. Y solo leemos 6 megabytes de datos.<\/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>Y ahora se est\u00e1 utilizando un escaneo solo de \u00edndice.<\/p>\n<p><\/p>\n<p>Otra historia importante es que queremos presentar el plan de una manera m\u00e1s comprensible. Hemos implementado visualizaci\u00f3n mediante gr\u00e1ficos de llamas. <\/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 es otra consulta, m\u00e1s compleja. Y los gr\u00e1ficos de llamas los construimos seg\u00fan dos par\u00e1metros: la cantidad de datos que le\u00eda un nodo espec\u00edfico en el plan y el tiempo, es decir, el tiempo de ejecuci\u00f3n del nodo. <\/p>\n<p><\/p>\n<p>Aqu\u00ed podemos comparar nodos espec\u00edficos entre s\u00ed. Ser\u00e1 evidente cu\u00e1l de ellos ocupa m\u00e1s o menos espacio, lo que suele ser complicado en otros m\u00e9todos de visualizaci\u00f3n. <\/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>Por supuesto, todos conocen explain.depesz.com. Una buena caracter\u00edstica de esta visualizaci\u00f3n es que guardamos el plan de texto y tambi\u00e9n extraemos algunos par\u00e1metros clave en una tabla, para que sea posible clasificar. <\/p>\n<p><\/p>\n<p>Y los desarrolladores que a\u00fan no se han adentrado en este tema tambi\u00e9n utilizan explain.depesz.com, porque les resulta m\u00e1s f\u00e1cil entender qu\u00e9 m\u00e9tricas son importantes y cu\u00e1les no. <\/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>Hay un nuevo enfoque de visualizaci\u00f3n: explain.dalibo.com. Hacen una visualizaci\u00f3n en forma de \u00e1rbol, pero aqu\u00ed es muy dif\u00edcil comparar los nodos entre s\u00ed. Aqu\u00ed se puede entender bien la estructura, sin embargo, si hay una consulta grande, ser\u00e1 necesario desplazarse de un lado a otro, pero tambi\u00e9n es una opci\u00f3n. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Colaboraci\u00f3n<\/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>Y, como mencion\u00e9 antes, Slack nos brinda la oportunidad de colaborar. Por ejemplo, si encontramos una consulta complicada que no sabemos c\u00f3mo optimizar, podemos aclarar esta cuesti\u00f3n con nuestros colegas en un hilo en Slack. <\/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>Nos parece que es importante probar con datos de tama\u00f1o completo. Para esto, hemos creado la herramienta Update Database Lab, que est\u00e1 disponible en open source. Tambi\u00e9n pueden usar el bot Joe. Pueden llevarlo justo ahora e implementarlo en su propio entorno. Todas las gu\u00edas est\u00e1n all\u00ed disponibles. <\/p>\n<p><\/p>\n<p>Tambi\u00e9n es importante se\u00f1alar que la soluci\u00f3n en s\u00ed no es revolucionaria, porque existe Delphix, pero es una soluci\u00f3n empresarial. Est\u00e1 completamente cerrada y es muy cara. Nosotros nos especializamos en Postgres. Todos nuestros productos son open source. \u00a1\u00danete a nosotros! <\/p>\n<p><\/p>\n<p>Con esto concluyo. \u00a1Gracias!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Preguntas<\/h2>\n<p><\/p>\n<p><em>\u00a1Hola! Gracias por la presentaci\u00f3n. \u00a1Muy interesante, especialmente para m\u00ed, porque resolv\u00ed un problema similar hace un tiempo. Por eso tengo una serie de preguntas. Espero poder hacer al menos algunas de ellas!<\/em><\/p>\n<p><\/p>\n<p><em>Es interesante saber c\u00f3mo calculan el espacio para este entorno. La tecnolog\u00eda implica que bajo ciertas circunstancias, sus clones pueden alcanzar el tama\u00f1o m\u00e1ximo. A grandes rasgos, si tienes una base de datos de diez terabytes y 10 clones, es f\u00e1cil simular una situaci\u00f3n en la que cada clon contenga 10 datos \u00fanicos. \u00bfC\u00f3mo calculan ese espacio, es decir, la diferencia de la que hablaban, en la que vivir\u00e1n estos clones?<\/em><\/p>\n<p><\/p>\n<p>Buena pregunta. Aqu\u00ed es importante estar atento a los cl\u00f3nicos espec\u00edficos. Y si alguna modificaci\u00f3n en un cl\u00f3n es demasiado grande y comienza a crecer, podemos primero alertar al usuario sobre esto o detener ese cl\u00f3n inmediatamente para evitar que se produzca una situaci\u00f3n de fallo. <\/p>\n<p><\/p>\n<p><em>S\u00ed, tengo una pregunta adicional. Es decir, \u00bfc\u00f3mo garantizan el ciclo de vida de estos m\u00f3dulos? Para nosotros, esto es un problema y toda una historia aparte. \u00bfC\u00f3mo funciona?<\/em><\/p>\n<p><\/p>\n<p>Cada cl\u00f3n tiene un ttl. En principio, tenemos un ttl fijo. <\/p>\n<p><\/p>\n<p><em>\u00bfCu\u00e1l es, si no es un secreto?<\/em><\/p>\n<p><\/p>\n<p>1 hora, es decir, inactivo \u2013 1 hora. Si no se utiliza, lo eliminamos. Pero aqu\u00ed no hay nada sorprendente, ya que podemos levantar un cl\u00f3n en segundos. Y si se necesita de nuevo, simplemente lo hacemos. <\/p>\n<p><\/p>\n<p><em>Tambi\u00e9n me interesa su elecci\u00f3n de tecnolog\u00edas, porque nosotros, por ejemplo, usamos varios m\u00e9todos al mismo tiempo por distintas razones. \u00bfPor qu\u00e9 eligieron ZFS? \u00bfPor qu\u00e9 no usaron LVM? Mencionaron que hubo problemas con LVM. \u00bfCu\u00e1les fueron esos problemas? En mi opini\u00f3n, la opci\u00f3n con almacenamiento de bloques es la m\u00e1s \u00f3ptima desde el punto de vista del rendimiento.<\/em> <\/p>\n<p><\/p>\n<p><em>\u00bfCu\u00e1l es el principal problema con ZFS? Que debes ejecutarlo en un solo host, es decir, todas las instancias vivir\u00e1n dentro de un mismo sistema operativo. En el caso del almacenamiento de bloques, puedes conectar diferentes equipos. Y el cuello de botella son solo aquellos bloques que est\u00e1n en el almacenamiento. Y es interesante la cuesti\u00f3n de la elecci\u00f3n de tecnolog\u00edas. \u00bfPor qu\u00e9 no LVM?<\/em><\/p>\n<p><\/p>\n<p>Podemos discutir espec\u00edficamente sobre LVM en el meetup. En cuanto al almacenamiento de bloques, simplemente es caro. Podemos implementar el sistema ZFS en cualquier lugar. Puedes desplegarlo en tu propia m\u00e1quina. Simplemente puedes descargar el repositorio y ejecutarlo. ZFS se puede instalar pr\u00e1cticamente en cualquier lugar si hablamos de Linux. Es decir, obtenemos una soluci\u00f3n muy flexible. Adem\u00e1s, ZFS ofrece muchas capacidades de serie. Puedes cargar tantos datos como quieras, conectar un gran n\u00famero de discos, hay instant\u00e1neas. Y, como ya dije, es f\u00e1cil de administrar. Es decir, parece muy agradable de usar. Est\u00e1 comprobado, tiene muchos a\u00f1os. Tiene una comunidad muy grande que sigue creciendo. ZFS es una soluci\u00f3n muy fiable. <\/p>\n<p><\/p>\n<p>Nikolai Samokhvalov: \u00bfPuedo comentar algo m\u00e1s? Me llamo Nikolai, trabajo junto con Anatoliy. Estoy de acuerdo en que el almacenamiento de bloques es genial. Y algunos de nuestros clientes tienen Pure Storage, etc. <\/p>\n<p><\/p>\n<p>Anatoli se\u00f1al\u00f3 correctamente que estamos enfocados en la modularidad. Y en el futuro podemos implementar una \u00fanica interfaz: hacer un snapshot, clonar, destruir el clon. Todo esto es f\u00e1cil. Y el almacenamiento es genial, si est\u00e1 disponible.<\/p>\n<p><\/p>\n<p>Pero ZFS est\u00e1 disponible para todos. Ya es suficiente con DelPhix, tienen 300 clientes. De ellos, en el Fortune 100 hay 50 clientes, es decir, est\u00e1n enfocados en la NASA, etc. Es hora de que esta tecnolog\u00eda est\u00e9 al alcance de todos. Por eso tenemos un Core de c\u00f3digo abierto. Hay una parte de la interfaz que no es de c\u00f3digo abierto. Esta es la plataforma que vamos a mostrar. Pero queremos que sea accesible para todos. Queremos hacer una revoluci\u00f3n, para que todos los testers dejen de adivinar en sus laptops. Debemos escribir SELECT y ver de inmediato que es lento. Ya es suficiente de esperar a que el DBA nos lo cuente. Este es el objetivo principal. Y creo que lo lograremos. Y estamos creando esto para que todos lo tengan. Por eso ZFS, porque estar\u00e1 disponible en todas partes. Gracias a la comunidad por resolver problemas y por tener una licencia de c\u00f3digo abierto, etc. <\/p>\n<p><\/p>\n<p><em>\u00a1Saludos! \u00a1Gracias por la presentaci\u00f3n! Me llamo Maxim. Nosotros hemos resuelto problemas similares. Lo hemos resuelto en casa. \u00bfC\u00f3mo dividen los recursos entre estos clones? Cada clon, en cada momento, puede estar haciendo su propia tarea: uno prueba una cosa, otro prueba otra, alguno est\u00e1 construyendo un \u00edndice, otro ejecutando un job pesado. Y si se puede dividir por CPU, \u00bfc\u00f3mo lo dividen en t\u00e9rminos de IO? Esa es la primera pregunta.<\/em><\/p>\n<p><\/p>\n<p><em>Y la segunda pregunta sobre las diferencias entre los entornos. Supongamos que aqu\u00ed tengo ZFS y todo va perfecto, pero en el cliente en producci\u00f3n no hay ZFS, sino ext4, por ejemplo. \u00bfQu\u00e9 hacemos en ese caso?<\/em><\/p>\n<p><\/p>\n<p>Las preguntas son muy buenas. Mencion\u00e9 brevemente este problema con la divisi\u00f3n de recursos. Y la soluci\u00f3n es la siguiente. Imagina que est\u00e1s probando en staging. Puede que tambi\u00e9n tengas una situaci\u00f3n en la que alguien est\u00e1 generando una carga, y otra persona otra. Y al final ves m\u00e9tricas confusas. Incluso el mismo problema puede surgir en producci\u00f3n. Cuando quieres verificar alguna consulta y te das cuenta de que hay un problema \u2013 que est\u00e1 tardando en ejecutarse \u2013 en realidad el problema no estaba en la consulta, sino que hab\u00eda alguna carga paralela. <\/p>\n<p><\/p>\n<p>Y por eso es importante centrarse en cu\u00e1l ser\u00e1 el plan, qu\u00e9 pasos seguiremos en el plan y cu\u00e1ntos datos levantaremos para ello. El hecho de que nuestros discos, por ejemplo, est\u00e9n sobrecargados con algo, afectar\u00e1 espec\u00edficamente el tiempo. Pero podemos evaluar, por la cantidad de datos, cu\u00e1n demandante es esta solicitud. No es tan importante que simult\u00e1neamente haya alguna otra ejecuci\u00f3n. <\/p>\n<p><\/p>\n<p><em>Tengo dos preguntas. Esto es realmente genial. \u00bfHa habido casos en los que los datos en producci\u00f3n son cr\u00edticamente importantes, por ejemplo, n\u00fameros de tarjetas de cr\u00e9dito? \u00bfHay algo ya preparado o es una tarea separada? Y la segunda pregunta: \u00bfhay algo as\u00ed para MySQL?<\/em><\/p>\n<p><\/p>\n<p>En cuanto a los datos. Haremos ofuscaci\u00f3n, aunque en este momento no lo estamos haciendo. Pero si est\u00e1s desplegando precisamente Joe, si no das acceso a los desarrolladores, entonces no hay acceso a los datos. \u00bfPor qu\u00e9? Porque Joe no muestra los datos. Solo muestra m\u00e9tricas, planes y eso es todo. Se dise\u00f1\u00f3 as\u00ed porque esta es una de las demandas de nuestro cliente. Quer\u00edan tener la capacidad de optimizar, pero sin dar acceso a todos. <\/p>\n<p><\/p>\n<p>Acerca de MySQL. Este sistema se puede utilizar para cualquier cosa que almacene estado en disco. Y dado que trabajamos con Postgres, actualmente estamos automatizando completamente todo para Postgres. Queremos automatizar la obtenci\u00f3n de datos de la copia de seguridad. Estamos configurando Postgres correctamente. Sabemos c\u00f3mo hacer que los planes coincidan, etc. <\/p>\n<p><\/p>\n<p>Pero dado que el sistema es extensible, tambi\u00e9n se podr\u00e1 utilizar para MySQL. Y hay ejemplos de ello. Hay algo similar en Yandex, pero no lo publican en ning\u00fan lado. Lo utilizan dentro de Yandex.Metrica. Y ah\u00ed la historia es precisamente sobre MySQL. Pero las tecnolog\u00edas son las mismas, ZFS. <\/p>\n<p><\/p>\n<p><em>\u00a1Gracias por la presentaci\u00f3n! Tambi\u00e9n tengo un par de preguntas. Mencionaste que la clonaci\u00f3n se puede utilizar para an\u00e1lisis, por ejemplo, para construir \u00edndices adicionales. \u00bfPuedes contar un poco m\u00e1s sobre c\u00f3mo funciona esto?<\/em><\/p>\n<p><\/p>\n<p><em>Y har\u00e9 la segunda pregunta de inmediato sobre la uniformidad de los entornos, la uniformidad de los planes. El plan depende, entre otras cosas, de las estad\u00edsticas recopiladas por Postgres. \u00bfC\u00f3mo resuelven este problema?<\/em><\/p>\n<p><\/p>\n<p>No hay an\u00e1lisis de casos espec\u00edficos porque a\u00fan no hemos utilizado esto, pero existe esa posibilidad. Si hablamos de \u00edndices, imagina que se ejecuta una consulta en una tabla con cientos de millones de registros y en una columna que normalmente no est\u00e1 indexada en producci\u00f3n. Y queremos calcular algunos datos. Si esta consulta se ejecuta en producci\u00f3n, hay una posibilidad de que haya inactividad, ya que la consulta podr\u00eda tardar un minuto en procesarse. <\/p>\n<p><\/p>\n<p>Ok, hagamos un clon ligero que no asuste detener por unos minutos. Y para facilitar la recopilaci\u00f3n de an\u00e1lisis, agreguemos \u00edndices en las columnas que nos interesan. <\/p>\n<p><\/p>\n<p><em>\u00bfSe crear\u00e1 el \u00edndice cada vez?<\/em><\/p>\n<p><\/p>\n<p>Se puede hacer de manera que toquemos los datos, hagamos instant\u00e1neas, luego nos recuperemos de esta instant\u00e1nea y ejecutemos nuevas consultas. Es decir, se puede hacer de tal manera que podamos levantar nuevos clones con los \u00edndices ya establecidos.<\/p>\n<p><\/p>\n<p>En cuanto a la pregunta sobre las estad\u00edsticas, si nos recuperamos de una copia de seguridad, si hacemos replicaci\u00f3n, entonces nuestras estad\u00edsticas ser\u00e1n exactamente las mismas. Porque traemos toda la estructura f\u00edsica de los datos, es decir, los datos tal cual, junto con todas las m\u00e9tricas de estad\u00edsticas. <\/p>\n<p><\/p>\n<p>Aqu\u00ed hay otro problema. Si utilizas una soluci\u00f3n en la nube, solo hay disponibles volcado l\u00f3gicos, porque Google, Amazon no permiten obtener una copia f\u00edsica. Entonces habr\u00e1 ese problema. <\/p>\n<p><\/p>\n<p><em>Gracias por el informe. Aqu\u00ed surgieron dos buenas preguntas sobre MySQL y sobre la divisi\u00f3n de recursos. Pero, en esencia, todo se reduce a que este es un tema no de bases de datos espec\u00edficas, sino en general del sistema de archivos. Por lo tanto, las preguntas sobre la divisi\u00f3n de recursos tambi\u00e9n deben resolverse desde all\u00ed, no al final, sino desde el sistema de archivos. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/es\/server\/dts-dronten\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">servidor<\/a>, en instancia.<\/em> <\/p>\n<p><\/p>\n<p><em>Mi pregunta est\u00e1 un poco m\u00e1s cerca de la multi-capa de la base de datos, donde hay varias capas. Por ejemplo, hemos configurado la actualizaci\u00f3n de una imagen de diez terabytes, estamos en replicaci\u00f3n. Y usamos espec\u00edficamente esta soluci\u00f3n para bases de datos. Hay replicaci\u00f3n, se est\u00e1 actualizando la informaci\u00f3n. Mientras tanto, 100 empleados est\u00e1n trabajando paralelamente, lanzando estas diferentes instant\u00e1neas. \u00bfQu\u00e9 hacer? \u00bfC\u00f3mo evitar conflictos, donde iniciaron una cosa y luego el sistema de archivos cambi\u00f3, y todas esas instant\u00e1neas se arruinaron?<\/em> <\/p>\n<p><\/p>\n<p>No ir\u00e1n, porque as\u00ed funciona ZFS. Podemos mantener por separado en un solo flujo los cambios del sistema de archivos, que llegan gracias a la replicaci\u00f3n. Y mantener clones de versiones antiguas de los datos que utilizan los desarrolladores. Y esto funciona bien para nosotros, est\u00e1 todo en orden.<\/p>\n<p><\/p>\n<p><em>Entonces, \u00bfla actualizaci\u00f3n ocurrir\u00e1 como una capa adicional y todas las nuevas instant\u00e1neas se basar\u00e1n en esta capa, verdad?<\/em> <\/p>\n<p><\/p>\n<p>De las capas anteriores, que eran de las replicaciones pasadas. <\/p>\n<p><\/p>\n<p><em>Las capas anteriores desaparecer\u00e1n, pero se referir\u00e1n a la capa antigua, y las nuevas im\u00e1genes se tomar\u00e1n de la \u00faltima capa que se obtuvo en la actualizaci\u00f3n?<\/em><\/p>\n<p><\/p>\n<p>En general, s\u00ed. <\/p>\n<p><\/p>\n<p><em>Entonces, como consecuencia, tendremos muchas capas. \u00bfY con el tiempo ser\u00e1 necesario comprimarlas?<\/em><\/p>\n<p><\/p>\n<p>S\u00ed, eso es correcto. Hay un cierto intervalo. Mantenemos instant\u00e1neas semanales. Esto depende de los recursos que tengas. Si puedes almacenar muchos datos, puedes retener las instant\u00e1neas durante mucho tiempo. No se eliminar\u00e1n autom\u00e1ticamente. No habr\u00e1 corrupci\u00f3n de datos. Si las instant\u00e1neas est\u00e1n desactualizadas, como creemos, es decir, esto depende de la pol\u00edtica en la empresa, podemos eliminarlas y liberar espacio. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola, gracias por la presentaci\u00f3n! Sobre la pregunta de Joe. Dijo que el cliente no quer\u00eda dar acceso a todos los datos. Estrictamente hablando, si alguien tiene el resultado de Explain Analyze, puede ver los datos.<\/em> <\/p>\n<p><\/p>\n<p>As\u00ed es. Por ejemplo, podemos escribir: \u00abSELECT FROM WHERE email = algo\u00bb. Es decir, no ver\u00edamos los datos en s\u00ed, pero podr\u00edamos ver algunos indicios indirectos. Hay que entender esto. Pero, por otro lado, todo esto es visible. Tenemos auditor\u00eda de registros, tenemos control de otros colegas que tambi\u00e9n ven en qu\u00e9 est\u00e1n trabajando los desarrolladores. Y si alguien intenta hacerlo, el servicio de seguridad se acercar\u00e1 a ellos y trabajar\u00e1 en esta cuesti\u00f3n. <\/p>\n<p><\/p>\n<p><em>\u00a1Buenos d\u00edas! Gracias por la presentaci\u00f3n. Tengo una pregunta corta. Si en la empresa no se usa Slack, \u00bfhay alguna vinculaci\u00f3n con \u00e9l actualmente o se pueden desplegar instancias para que los desarrolladores conecten una aplicaci\u00f3n de prueba a las bases de datos?<\/em><\/p>\n<p><\/p>\n<p>Actualmente, hay integraci\u00f3n con Slack, es decir, no hay ning\u00fan otro mensajero, pero realmente queremos agregar soporte para otros mensajeros tambi\u00e9n. \u00bfQu\u00e9 puedes hacer? Puedes desplegar DB Lab sin Joe, usar la REST API o nuestra plataforma para crear clones y conectarte con PSQL. Pero esto se puede hacer si est\u00e1s dispuesto a darle a tus desarrolladores acceso a los datos, ya que aqu\u00ed no habr\u00e1 ninguna interfaz. <\/p>\n<p><\/p>\n<p><em>No necesito esa capa, sino tal capacidad.<\/em><\/p>\n<p><\/p>\n<p>Entonces, s\u00ed, se puede hacer.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524542\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u00ab\u043f\u0440\u043e\u0434\u0435\u00bb? \u0412 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0438\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u00ab\u043f\u0440\u043e\u0434\u0443\u00bb \u0435\u0441\u0442\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445. \u0414\u0430 \u0438 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0430\u0441\u044b. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e DBA \u2014 Joe. \u041e\u043d \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97940,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97939","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - 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\/es\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bot DBA Joe. Anatoly Stanler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}