Saludos, en esta oportunidad veremos el tema de replicación de datos en PostgreSQL, para ello definamos algunos conceptos:
- Nodo.- Base de datos que se encuentra envuelta en el proceso de replicación entre los principales tenemos: nodo origen y nodo suscriptor.
- Replicación.- Proceso por el cual se desea mantener y copiar los datos de una base de datos de manera que estos datos son transportados y son almacenados.
- Replicación maestro.- Se encarga de transferir las modificaciones de forma asíncrona a los nodos suscriptores.
Software
El software que utilizaremos en esta oportunidad es Slony-I para windows, el cual permite la replicación basada en triggers de forma asíncrona. Utiliza un simple master para múltipes esclavos (nodos suscriptores).
Cada tabla o secuencia en el master podría ser replicada vía triggers remotos a los esclavos. Actulizaciones son realizadas en la base de datos y luegos son replicadas mediante eventos.
Una replicación basada en triggers usa on insert, on update, on delete en las tablas para mantener la replicación entre el nodo master y esclavo.
- Limitaciones
- Tablas deben de ser primarias o únicas.
- Solo tablas y secuencias son permitidas en replicación.
- Base de datos esclavas no pueden ser modificadas.
- Ventajas
- Usando Slony-I podemos actualizar postgres de una versión a otra sin tiempo muerto.
- Desventajas
- No detecta fallo en la red.
- No se permiten usar cambios de DDL en la replicación de tablas mientras el servicio de Slony-I esta ejecutandose.
A continuación se muestran otras opciones de replicación a tener en cuenta:
Topología de red (ejemplo)
Nodo maestro (192.168.1.34)
Nodo esclavo (192.168.1.63)
Instalación y configuración
1. Instalar Slony-I en el nodo maestro y esclavo, para esto lo podemos hacer desde el Stack Builder de PostgreSQL.
2. Configurar el fichero pg_hba.conf del nodo maestro y esclavo añadiendo la siguiente información:
#maestro
host all all 192.168.1.34/32 md5
#esclavo
host all all 192.168.1.63/32 md5
3. Seleccionar una base de datos de prueba yo utilizare la siguiente:
HR.backup
4. Indicamos al nodo maestro y esclavo la ruta del software Slony, En PgAddmin Click en menú Archivo->Options, luego en la pestaña General, llenamos el campo Slony-I path con:
5. Configurar los puertos habilitados en el firewall de windows excepciones a los puertos de base de datos 5432.
6. En el nodo maestro crear un script que nos digan las tablas de la base de datos que queremos replicar:
#--
# define the namespace the replication system uses in our example it is
# slony_example
#--
cluster name = slony_example;
#--
# admin conninfo's are used by slonik to connect to the nodes one for each
# node on each side of the cluster, the syntax is that of PQconnectdb in
# the C-API - replace the parameters which are appropriate for your setup
#
# this section tells slonik how to connect to the various nodes when running
# this script.
# --
node 1 admin conninfo = 'dbname=hr host=192.168.1.34 user=postgres password= admin';
node 2 admin conninfo = 'dbname=hr host=192.168.1.63 user=postgres password= admin';
#--
# init the first node. Its id MUST be 1. This creates the schema
# _$CLUSTERNAME containing all replication system specific database
# objects.
#--
init cluster ( id=1, comment = 'Nodo Maestro');
#--
# this is an example of how to work around a table that has no primary key
# and is based on an example by Robert Treat. The history table referred to
# is one of the tables being replicated.
#
# Because the history table does not have a primary key or other unique
# constraint that could be used to identify a row, we need to add one.
# The following command adds a bigint column named
# _Slony-I_$CLUSTERNAME_rowID to the table. It will have a default value
# of nextval('_$CLUSTERNAME.s1_rowid_seq'), and have UNIQUE and NOT NULL
# constraints applied. All existing rows will be initialized with a
# number
#--
# Traducción: Esto solo es necesario usarlo si tienes una tabla que no tenga una llave primaria, procura hacer un buen diseño en tu base de datos.
#table add key (node id = 1, fully qualified name = 'public.mi_tabla_sin_llave_primaria');
#--
# Slony-I organizes tables into sets. The smallest unit a node can
# subscribe is a set. The following commands create one set containing
# all tables to be replicated. Tables not named here will not be replicated.
# The master or origin of the set is node 1. Note that the second id must be
# incremented for each table added.
#--
create set (id=1, origin=1, comment='aqui van todas mis tablas');
set add table (set id=1, origin=1, id=1, fully qualified name = 'public.employees',comment='mi tabla empleado');
set add table (set id=1, origin=1, id=2, fully qualified name = 'public.departments',comment='mi tabla departamento');
#--
# Create the second node (the slave) tell the 2 nodes how to connect to
# each other and how they should listen for events.
# we have to repeat the conninfo detils here, because these details are written into
# the slony database.
#--
store node (id=2, comment = 'Nodo Esclavo');
store path (server = 1, client = 2, conninfo = 'dbname=hr host=192.168.1.34 user=postgres password= admin');
store path (server = 2, client = 1, conninfo = 'dbname=hr host=192.168.1.63 user=postgres password= admin');
store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);
######################################################################################
7. Luego de creado copiar este scripts a c:\Program Files\PostgreSQL\8.3\bin con el nombre maestro.txt
8. Crear el el nodo esclavo el siguiente script para luego guardarlo en c:\Program Files\PostgreSQL\8.3\bin con el nombre esclavo.txt como sigue:
cluster name = slony_example;
node 1 admin conninfo = 'dbname=hr host=192.168.1.34 user=postgres password= admin';
node 2 admin conninfo = 'dbname=hr host=192.168.1.63 user=postgres password= admin';
subscribe set (id=1, provider=1,receiver=2,forward=yes);
9. En el nodo maestro y en línea de comando estando en el directorio c:\Program Files\PostgreSQL\8.3\bin ejecutar:
# slonik maestro.txt
Si todo sale bien no deberás ningún mensaje de error en consola de windows como resultado de ejecutar la sentencia anterior y poder ver configurado slony en el nodo maestro.
Ahora el comando también debe de haber creado el cluster en el nodo esclavo, para ello verificamos:
10. Desde el nodo subscriptor (esclavo) y en el directorio c:\Program Files\PostgreSQL\8.3\bin ejecutar:
# slonik esclavo.txt
Si hemos tenido éxito no deberemos tener ningún mensaje de error en pantalla.
11. En el nodo maestro y en línea de comando estando en el directorio c:\Program Files\PostgreSQL\8.3\bin ejecutar:
# slon slony_example "dbname=hr user=postgres password= admin"
Esta línea me permite iniciar la replicación en el maestro.
12. En el nodo esclavo y en línea de comando estando en el directorio c:\Program Files\PostgreSQL\8.3\bin ejecutar:
# slon slony_example "dbname=hr user=postgres password= admin"
Esta línea me permite iniciar la replicación en el nodo esclavo.
Nota: las consolas abiertas tanto en el paso 11 y 12 no deberán cerrarse.
Pruebas
En el nodo maestro abrir la base de datos HR e ingresar un registro a la tabla employees como sigue:
Verificamos en el esclavo:
Terminamos, espero que les sirva. ;)