Actualización Mayor de Postgres y Modelo Django con Replicación Lógica

La Replicación Lógica puede ser más flexible de lo que parece

- 7 mins read

Series: Postgres

La historia

Un cliente necesitaba actualizar su Aurora RDS Postgres de v13 a v16 debido al EOL de v13. Este es un requisito común y, hasta ahora, un proceso directo. La complejidad surgió cuando necesitaron actualizar su modelo de aplicación, lo cual estaba tomando mucho tiempo debido a que la mayoría de las tablas requerían una reescritura completa.

La migración de Django estaba tomando varias horas en ejecutarse, lo que hacía inviable una actualización blue/green y la posterior ejecución de la migración debido al largo tiempo de inactividad que causaría.

Backups Online sin archivos en PGBackRest

Reduciendo costos de almacenamiento evitando el almacenamiento de archivos

- 2 mins read

Series: Postgres

Aunque no está documentado en la documentación oficial, es posible evitar almacenar archivos en configuraciones de PGBackRest. En ciertos escenarios, puedes querer ignorar el almacenamiento de archivos para reducir costos, especialmente si estás usando almacenamiento en la nube para tus backups.

Esas situaciones podrían ser:

  • Entornos de pruebas, ya sea que ejecutes pruebas intensivas pero no necesitas o te importa PITR (Point in Time Recovery).
  • Bases de datos Postgres altamente actualizadas, donde puedes recuperar cambios por otros medios, como scraping o restaurando desde fuentes externas.
⚠️  
  • No almacenar archivos puede llevarte a pérdida de datos si no tienes una estrategia adecuada para manejar los deltas.
  • Todavía necesitas almacenar archivos durante la ejecución del backup si quieres backups online. De lo contrario, no serán recuperables.
  • Si no quieres almacenar archivos en absoluto, necesitas ejecutar el backup offline. Es decir, deteniendo tu instancia y ejecutando pgbackrest backup.

Configuration

Configuración en tu postgresql.conf:

Evaluando el Sharding por hash de PGCat

Distribuyendo shards a través de nodos.

- 8 mins read

Series: Postgres

ℹ️   La característica de sharding de PGCat está actualmente en fase experimental. El código del laboratorio se puede encontrar en lab_pgcat.

Mecanismos de sharding de PGCat

A partir de hoy, PGCat soporta 2 mecanismos de sharding a través de sintaxis extendida:

  • Estableciendo el shard explícitamente: SET SHARD TO '<index>';, lo que te permite hacer sharding determinístico, ya sea que elijas tu shard de acuerdo a una regla, como una búsqueda, región, grupo de clientes, etc. Esto es genial si tienes uno de esos bien delimitados o una distribución uniforme. Pero, sigue siendo un buen enfoque y algo escalable. No nos enfocaremos en esta estrategia en este post, ya que su implementación depende de requisitos personalizados.
  • Estableciendo sharding_function para usar una de las funciones disponibles: pg_bigint_hash y sha1. La sintaxis extendida SET SHARDING KEY TO '<value>'; calculará el índice. No está muy claro en la documentación cómo se usa la función sha1, así que este post se enfocará en el caso de pg_bigint_hash. Shard por hash es una estrategia audaz, particularmente si esperas tener una carga de trabajo grande, y necesitas tener suficiente cómputo en todos los shards. Esta sintaxis extendida se puede hacer a través de comentarios, consulta la documentación de Sharding de pgcat. En este laboratorio, nos enfocaremos en la función pg_bigint_hash. No está claro en la documentación de PGCat cómo debería implementarse sha1, pero extenderé el laboratorio para cubrirlo – eso es, si supero mis problemas de habilidad :P .

En este punto, puedes estar consciente de las complejidades de implementar sharding, y qué limitaciones esperamos del enfoque de hashing. Ten en cuenta que esta característica de PGCat está vinculada a la partición de Postgres, basada en la misma HASH_PARTITION_SEED. Consulta también pgcat hash seed.

Introducción

ℹ️   El laboratorio para este post se puede encontrar en babelfishpg-lab.
⚠️   En este post cubrimos la versión 4.2.0. Hay una ligera diferencia en la configuración y formato de logging desde 4.1.1.

Aunque BabelfishPG es una variante de Postgres, la configuración se hace a través de sus extensiones (babelfish_tds y babelfish_tsql). En este post, nos enfocamos en cómo registrar tiempos de consulta y habilitar mostrar planes de consulta.

Timeouts en cascada a través del Pool (PGBouncer)

query_timeout de Pgbouncer y statement_timeout de Postgres

- 2 mins read

Series: Postgres

Combinando query_timeout y statement_timeout

En la documentación de pgbouncer se establece que el query_timeout debería configurarse ligeramente más alto que el statement_timeout de Postgres. Aunque esto aplica en la mayoría de los casos, depende de los requisitos del negocio.

Generalmente, el statement_timeout debería configurarse al percentil 99 de la duración de tus statements. Sin embargo, hay casos donde ciertos statements requieren timeouts más largos, debido a particularidades como un conjunto grande de clientes, o campos más grandes, como en casos de compresión TOAST.

[BabelfishPG] Usando tds_fdw para acceder a BabelfishPG

Consultando BabelfishPG/MSSQL Server desde Postgres

Series: BabelfishPG

¿Soporta TDS, verdad?

Algunas cosas pasan una vez en la vida, y la historia alrededor de esto es bastante particular. Un cliente requirió algo que al principio sonaba contraintuitivo: migrar una base de datos Postgres existente a BabelfishPG.

La cosa era que la aplicación era un núcleo crítico del negocio, con una gran cantidad de código que requeriría años para migrar completamente para soportar otra estrategia de almacenamiento. Pero la razón real era que su cliente no quería apegarse a ningún modelo de licenciamiento privado, y requería usar soluciones Open Source.

El siguiente post cubrirá pruebas de rendimiento usando tdspool.

Arquitectura de conexión de BabelfishPG

Heredada de la arquitectura de conexión de Postgres, cada conexión a través del puerto TDS instanciará un backend de Postgres. Como en Postgres, BabelfishPG necesita un middleware para canalizar conexiones a través del puerto TDS para evitar quedarse sin conexiones y capacidad de procesamiento en el servidor de base de datos.

Para Postgres, tenemos muchas opciones, como PGBouncer, Odyssey, pgcat, nómbralo. Para T-SQL (léase como lenguaje compatible con MSSQL), no hay muchas soluciones de código abierto.