- Una extensión de replicación activo-activo para PostgreSQL creada y publicada por AWS
- Cuando se necesita escribir y modificar datos en varias instancias de PostgreSQL, en lugar del modelo tradicional activo-en espera donde una sola instancia acepta cambios, permite construir una arquitectura con cambios simultáneos y replicación entre múltiples instancias
- Es adecuada para escenarios como bases de datos de alta disponibilidad en varias regiones, minimizar la latencia de escritura, actualizaciones blue/green de aplicaciones y migración bidireccional de datos
- Aprovecha la replicación lógica para admitir detección de conflictos, resolución de conflictos de escritura y conversión de formato de la base de datos de destino
Concepto de replicación activo-activo
- La replicación (Replication) es una tecnología para sincronizar cambios entre bases de datos
- La estructura tradicional activo-en espera de PostgreSQL permite que solo una instancia acepte cambios y las demás sean de solo lectura, por lo que un solo lugar actúa como fuente única de datos
- pgactive ofrece una topología de replicación activo-activo, lo que permite escribir datos simultáneamente en varias instancias
- Este enfoque es adecuado para entornos que requieren varios puntos de escritura, como despliegues multirregión o migraciones bidireccionales
- En el modelo activo-activo se requiere una gestión adicional de conflictos, latencia y ciertas limitaciones funcionales
Tecnología clave: replicación lógica
- La replicación lógica (Logical Replication) transmite los datos en un formato que puede ser interpretado por sistemas externos
- Mediante la replicación lógica se pueden implementar diversas funciones adicionales en la base de datos de destino, como detección de conflictos, resolución de conflictos de escritura y transformación de consultas
- PostgreSQL introdujo la replicación lógica básica en la versión 10 en 2017, pero la replicación activo-activo requiere capacidades adicionales
- Debido a las características de diseño de PostgreSQL, estas funciones pueden desarrollarse y aplicarse en forma de extensión (extension)
- La comunidad de desarrollo de PostgreSQL también está incorporando gradualmente estas capacidades al proyecto principal
1 comentarios
Comentarios en Hacker News
Lo primero que salió, y que todavía sigue siendo open source, es BDR1 (enlace), y pgactive está basado en eso
BDR2 fue una reescritura de BDR1 como software de código cerrado, y al final fue descartado
Luego salieron pglogical v1 y v2 (ambos open source, enlace), y de esos, v1 fue ampliamente modificado e integrado en Postgres 10
Basándose en la experiencia con la replicación lógica de Postgres 10, 2nd Quadrant empezó a desarrollar pglogical v2, y de ahí también salió pgEdge
Después, 2nd Quadrant creó las versiones cerradas pglogical v3 y BDR v3, y al combinarlas nació BDR v4
Más tarde, el nombre del producto BDR cambió a Postgres Distributed (PGD, enlace)
Tras la adquisición de 2ndQuadrant por parte de EDB, EDB lanzó PGD v6
Cuando ocurre un conflicto, se aplica finalmente el valor escrito más recientemente según la marca de tiempo
El historial de conflictos queda registrado en una tabla especial llamada pgactive_conflict_history, así que es posible revisar el historial o resolverlos manualmente
Para más detalles y documentación, ver aquí
Sería interesante si esa funcionalidad pudiera aceptarse oficialmente en Postgres
Por ejemplo, quieren usar una base de datos secundaria que lea datos de producción o staging, pero que solo pueda modificarse localmente y cuyos resultados no se reflejen de vuelta hacia upstream
Actualmente, lo común es crear snapshots enviando periódicamente dumps de datos o consultas con scripts (como cron), guardarlos en S3 y luego descargarlos localmente para restaurar los datos
Este método suele funcionar bien, pero a veces la construcción de índices tarda demasiado
Por sus implicaciones legales y éticas, la mayoría de las empresas no recomienda este enfoque
Así se pueden modificar tablas locales sin afectar al primary
Recomiendan el comando
createdb --templateNo se les ocurre una estrategia de merge que funcione para todos los casos
No es que se bloquee la escritura en la réplica, sino que simplemente el resultado no se propaga a otros lugares
Lo mejor es diseñar la arquitectura para que no haya superposición en las áreas de datos que se escriben entre todas las instancias activas
En esos casos, herramientas como pgactive pueden ser útiles
O bien, lo correcto es usar desde el inicio una base de datos distribuida (como Yugabyte)
Proponen que todos los master puedan leer todos los schemas, pero que al escribir cada uno se encargue solo del suyo
Preguntan si, además del schema, también podría usarse algo como particiones para distribuir responsabilidades
No se les ocurre que usen directamente esta funcionalidad en sus propios productos
RDS usa block replication, y Aurora usa su propia replicación SAN
Suponen que tal vez la intención era usarlo en algo como DMS
Se preguntan por qué habría que hacer esto en una base de datos relacional fuerte en ACID
Pero hace 1 mes hubo noticias de que se publicó oficialmente como open source para la comunidad (anuncio oficial)
Para poder dormir tranquilos por la noche, preferirían evitarlo al máximo
Parece que la combinación patroni+etcd+haproxy se recomienda mucho, y viendo a quienes ya la usaron hablar con tanto entusiasmo, debe haber buenas razones
Aun así, al ver archivos de ejemplo con docker compose, les pareció un poco intimidante
pgpool parece más simple porque solo hay que ponerlo delante de cada postgres
Quieren recomendaciones o experiencias reales de gente que use Postgres en producción
Su objetivo es montar, con docker compose y de la forma más simple posible, un clúster con alta disponibilidad, (como mínimo) sin pérdida de datos y con point-in-time recovery
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Post de Hacker News (post de octubre de 2023, 1 comentario)
Es decir, según cada situación, hay que aceptar sus ventajas y desventajas