lunes, 13 de febrero de 2012

Replica de base de datos en PostgreSQL

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:


Descargar slony desde: http://slony.info/ para windows, en linux tiene otro proceso que espero también ponerlo en otro post.

Importante es siempre tener en cuenta la documentación: http://slony.info/documentation/2.0/index.html

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.   ;)

4 comentarios:

Jose dijo...

hola es un buen post podrias dar un ejemplo de como seria a la inversa por ejemplo yo tengo 3 esclavos y un maestro y necesito enviar la data de los esclavos al master

saludos

Jose

Anónimo dijo...

Keep on wгiting, great job!

Also visit my website ... payday loans

Anónimo dijo...

Thanks for evегy other eхcellent
article. Where elѕe may anуone gеt thаt κind of info іn such
an ideal mаnner of writing? Ӏ have
a prеѕentatiοn subѕequent week, аnd I'm at the search for such information.

Here is my homepage ... payday loans

Anónimo dijo...

hola ps mi gran pregunta por q de verdad no encuentro nada en replicas en ubuntu, y las que hay no es por menos preciar a nadie pero no son completas asi q si pueden enviar alguito les agradeceria.