PostgreSQL Replicación Bidireccional (BDR)

PostgreSQL-2ndQuadrant
PostgreSQL es uno de los gestores de base de datos transaccional más usados, en esta entrada explicaremos la instalación y configuración de PostgreSQL Multi-master mediante BDR (Bi-Directional Replication) que resulta interesante cuando queremos tener una base de datos en alta disponibilidad.

Una de las desventajas que tiene PostgreSQL es que por defecto no es posible configurar PostgreSQL en replicación Master – Master, por tanto se debe usar otras herramientas para que sea posible como Bucardo o Bi-Directional Replication, como es en este caso. PostgreSQL BDR no es más que un PostgreSQL 9.4 parcheado por 2ndQuadrant que lo que hace es que añade una extensión a PostgreSQL y se crea un grupo donde se meten los nodos que queremos replicar.

 

PostgreSQL Replicación (BDR)

Diagrama de funcionamiento de PostgreSQL BDR

Ejemplo de configuración

Se va a configurar dos nodos Master A (10.0.0.1) y Master B (10.0.0.2) sobre Debian 8.6 Jessie.

Dependecias

Instalación

Master A y Master B

Paramos los servicios de PostgreSQL en ambos nodos:

Procedemos a la configuración de PostgreSQL que se encuentra en “/etc/postgresql/9.4/main/postgresql.conf”.

Opciones de logging. Desactivadas por defecto, actívalas si necesitas hacer debugging:

Opciones para evitar conflictos.

Master A

Configuración de accesos. Configuramos el fichero “/etc/postgresql/9.4/main/pg_hba.conf”.

El usuario que hará la replicación será postgres. Ya podemos levantar el servicio de PostgreSQL:

Creamos la base de datos a replicar

Añadimos la extensión a la base de datos

Creamos el grupo BDR

Master B

Configuración de accesos. Configuramos el fichero “/etc/postgresql/9.4/main/pg_hba.conf”.

El usuario que hará la replicación será postgres. Ya podemos levantar el servicio de PostgreSQL:

Creamos la base de datos a replicar

Añadimos la extensión a la base de datos

Añadimos el nodo al grupo creado en el Master A

Conclusiones

Configurar una replicación BDR multi-master es muy sencilla aunque no es la única opción, existen otras herramientas como Bucardo, rubyrep, PgPool-II, etc. Además, hay que tener en cuenta que hay funciones que hemos dejado sin comentar y una lista de sentencias que no se replican y te tocará hacerlo a mano en todos los nodos que pertenezcan al grupo BDR.

Para terminar, desde 2ndQuadrant han escrito en una entrada que en PostgreSQL 9.6 permitirá BDR sin necesidad de instalar un PostgreSQL parcheado por ellos solo será una extensión más.

4 comentarios
  1. Ronald
    Ronald Dice:

    Hola, cuando indicas <> te refieres a que debo crear slots físicos o lógicos?. Hago la siguiente consulta SELECT * FROM pg_replication_slots;
    y me devuelve 0 filas.

    Responder
    • Iván Alejandro Marugán
      Iván Alejandro Marugán Dice:

      Buenas Ronald,
      Primero, gracias por leer el artículo y animarte a preguntar.

      Antes de nada, para recapitular conceptos, la variable “max_replications_slots” es el número de conexiones que puedes tener abiertas para replicar con otros nodos. (Replication Slots in PostgreSQL ó PostgreSQL (documentación oficial)). Se pueden crear lógicos o físicos (habitualmente usamos lógicos para una sola base de datos, más info.).

      Hasta que no hayas configurado el BDR tanto en el nodo1 como en el nodo2, no vas a poder ver información con la consulta “SELECT * FROM pg_stat_replication;” ya que al no estar configurado, realmente no está creado el slot. El slot se crea de forma automática cuando creas el grupo BDR. (más info).

      Otra duda que tengas o si no te ha quedado claro, pregúntanos sin problemas.
      Un saludo.

      Responder
  2. Ronald
    Ronald Dice:

    Gracias por la respuesta Iván, te comento que volví a realizar todos los pasos para replicar desde la re instalación de postgresql9.4bdr, en este caso he creado una base de datos nueva y sí funciona la replicación “súper”, pero no permite modificar las estructuras de las tablas, imagino que es por las restricciones DDL que menciona. Ahora mi pregunta es ¿por que no funciona con una base de datos que ya tengo? lo que hice fue:
    En el nodo1:
    -Crear la base de datos.
    -Cambiar a la base de datos creada
    -Restaurar los datos de un backup
    -Crear las extensiones
    -Crear la configuración del nodo con “bdr_group_create”
    En el nodo 2:
    -Crear la base de datos
    -Cambiar a la base de datos creada
    -Restaurar los datos de un backup
    -Crear las extensiones
    -Crear la configuración del nodo con “bdr_group_join”
    Ahí es donde al ejecutar SELECT bdr.bdr_node_join_wait_for_ready() se me queda colgado.

    Responder

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *