sábado, 3 de marzo de 2007

Instalación de Slony – I en Windows XP, Windows Server y Windows Vista

Hola, me llamo Sergio López Tosca, en la empresa en la que trabajo se implementó un sistema utilizando la base de datos PostgreSQL cuya información es sumamente importante, por lo que se necesita tener una copia de la base de datos en caso de que el servidor primario falle por cualquier motivo.

Buscando en la red, me topé con Slony, sin embargo no es la única herramienta para replicar una base de datos en Postgresql, existen muchos, pero leyendo comentarios de otros usuarios en distintos foros, encontré que la que se lleva el premio es Slony – I.

La ventaja que tenemos aquí es que el servidor primario manda las actualizaciones en tiempo real a la base de datos esclava y en caso de que falle el servidor primario, continuamos trabajando con la base de datos esclava.

A continuación, presento un tutorial que te va ayudar a instalar Slony – I en tus computadoras (Maestro – Esclavo)...


Pre – requisitos

- Haber instalado PostgreSQL 8.1 o superior, puedes bajarlo en http://www.postgresql.org/
- Bajar el software de Slony – I con instalación para Windows, lo puedes bajar de http://developer.pgadmin.org/~hiroshi/Slony-I/. Hay dos versiones de Slony –I, para la versión 8.1 y la 8.2. Baja la que corresponda a tu PostgreSQL.

1. Ejecuta el instalador de Slony – I y sigue las instrucciones.











































Regresa a C:\Program Files\PostgreSQL\8.2\bin> y pon el comando: Slon y debe salir algo como esto:




2. Abre el programa pgAdmin III dale doble clic a la base de datos que quieras replicar y vas a ver un icono que dice “replicación” selecciónalo, pon botón derecho del Mouse, luego "Nuevo Slony-I cluster" y vas a ver un cuadro que dice “No hay comandos de creación de Slony – I disponibles; sólo es posible …”



Bien, por el momento no podemos realizar ninguna replicación, es necesario decirle a nuestro pgAdmin III donde tenemos instalado nuestros archivos de Slony – I. Por lo tanto, para esto damos doble clic a Archivo -- > Opciones e introducimos la ruta que en este caso es: C:\Program Files\PostgreSQL\8.2\share y si regresamos al paso anterior vamos a ver algo como esto.



3. Ahora vamos a crear un script al cual se le introduce que tablas queremos replicar, se especifica quien será el nodo maestro y el nodo o nodos secundarios a los cuales queremos replicar nuestra información, etc...

Abre el bloc de notas, copia lo siguiente y modifica los parámetros de este script:


######################################################################################
#--
# 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=exampledb host=192.168.1.8 user=postgres password= postgres';
node 2 admin conninfo = 'dbname=exampledb host=192.168.1.9 user=postgres password= postgres';

#--
# 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.tabla1',
comment='mi tabla de tabla1');
set add table (set id=1, origin=1, id=2, fully qualified name = 'public.tabla2',
comment='mi tabla de tabla2');
#set add table (set id=1, origin=1, id=3, fully qualified name = 'public.mi_tabla_sin_llave_primaria', key = serial, comment='la tabla sin llave primaria');

#--
# 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=exampledb host=192.168.1.8 user=postgres password=postgres');
store path (server = 2, client = 1, conninfo='dbname=exampledb host=192.168.1.9 user=postgres password=postgres');
store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);

######################################################################################

Nota: Los campos en rojo son los que debes modificar.

4. una vez creado tu script y haber modificado los parámetros correspondientes, guárdalo en C:\Program Files\PostgreSQL\8.2\bin>, yo lo guardé con el nombre maestro.txt, pero tu ponle el que quieras. Ahora, vamos a ejecutarlo como se muestra a continuación:


En la linea de comando y estando en el directorio C:\Program Files\PostgreSQL\8.2\bin> ejecuta:

- slonik maestro.txt

Si todo sale bien, debes de ver algo como esto:



En caso contrario, si ves algo como esto:



Verifica los archivos pg_hba.conf y postgresql.conf tanto de la computadora maestra como la esclava y comprueba que se comuniquen entre las dos. Yo asumo que previamente ya configuraste tu PostgreSQL e incluso que ya añadiste el puerto 5432 en el firewall de Windows, sino no te dejará conectar.


5. Ahora abre PgAdmin III en la computadora maestra, ve a la base de datos que vas a replicar y verás algo como esto:



Repite el paso 5 en la computadora que tendrá la base de datos esclava y verás que también añadió las instrucciones para la replica.

6. Ahora ve a la computadora que tendrá la base de datos esclava (Suscriptor). Vamos a crear el siguiente script, este script es para indicarle a que computadora se va a conectar.

Abre el bloc de notas, copia lo siguiente y modifica los parámetros de este script:

######################################################################################
CLUSTER NAME = slony_example;


node 1 admin conninfo = 'dbname=exampledb host=192.168.1.8 user= postgres password= postgres';

node 2 admin conninfo = 'dbname=exampledb host=192.168.1.9 user= postgres password= postgres';

SUBSCRIBE SET (ID = 1, PROVIDER = 1, RECEIVER = 2, FORWARD = YES);

######################################################################################

Nota: Los campos en rojo son los que debes modificar.

Una vez creado tu script y habiendo modificado los parámetros correspondientes, guárdalo en C:\Program Files\PostgreSQL\8.2\bin>, yo lo guardé con el nombre de suscriptor.txt, pero tu ponle el nombre que quieras.

Ahora, vamos a ejecutarlo como se muestra a continuación:

En la linea de comando y estando en el directorio C:\Program Files\PostgreSQL\8.2\bin> ejecuta:

- slonik suscriptor.txt

y deberás ver algo como lo siguiente:



7. Ahora regresa a la computadora donde está la base de datos maestra, abre la línea de comandos y ejecuta lo siguiente en C:\Program Files\PostgreSQL\8.2\bin>:

slon slony_example "dbname= exampledb user=postgres" &


Nota: Los campos en rojo son los que debes modificar.



8. Perfecto, ahora repite este paso, pero en la computadora esclava:

slon slony_example "dbname= exampledb user=postgres" &

Nota: Los campos en rojo son los que debes modificar.

Deberás de ver algo como en la foto de arriba…

9. A partir de este momento la base de datos se están replicando a la computadora esclava, pero todavía no hemos acabado. Será molesto que cada vez que enciendas las computadoras tengas que introducir el comando para que se repliquen las bases de datos. Para esto, vamos a crear un servicio en Windows.

10. En Windows XP y en Windows Server con tan solo ir a la línea de comandos en C:\Program Files\PostgreSQL\8.2\bin> y ejecuta:

- slon –regservice

Con esto hemos creado el servicio, ve a Servicios de Windows y busca el servicio llamado Slony-I para verificar que todo se haya ejecutado correctamente, pero no lo actives.

11. Abre el bloc de notas, copia lo siguiente, modifícalo según tus parámetros y guardalo. Yo lo guardé con el nombre de slon.conf en C:\Program Files\PostgreSQL\8.2\bin>
Esto lo vas hacer tanto en el servidor esclavo con en el maestro.

######################################################################################
cluster_name = 'exampledb' conn_info = 'dbname=exampledb host=192.168.1.8 user=postgres password=postgres'

######################################################################################

Nota: Los campos en rojo son los que debes modificar.

12. Prueba que el archivo slon.conf funcione correctamente, para esto lo que deberás hacer es en la linea de comandos C:\Program Files\PostgreSQL\8.2\bin> Ejecutar:

- slon –f slon.conf



Esto lo vas hacer en las dos computadoras y verifica que se estén replicando los datos. Deberás de ver algo como en la figura del punto 7.

13. Vuelve abrir la línea de comandos en C:\Program Files\PostgreSQL\8.2\bin>, pero cierra las ventanas donde se están replicando, ahora ejecuta el comando:

- slon -addengine slon.conf



Esto lo harás en las dos computadoras.

14. Abre los servicios de Windows, busca el que se llama “Slony-I”, ponle iniciar y LISTO! Tu base de dato se está replicando!.



Referencias:

- Configuring Slony-I on PostgreSQL/Win32
http://www.idep.org.uk/cgi-bin/blosxom.cgi/2006/
- Database Replication with Slony-I http://www.linuxjournal.com/article/7834
- Alpha testing Slony on win32 Crib Notes http://people.planetpostgresql.org/xzilla/index.php?/archives/200-Alpha-testing-Slony-on-win32-Crib-Notes.html

18 comentarios:

Yino dijo...

Hola:
Excelente tutorial, fue de gran ayuda.
Pero encontramos necesario mencionar un paso previo que nos costo un tiempo encontrar.
Hay que tener los mismos esquemas en las bases de datos. O sea hagan un dump de su base de datos a replicar y cargenlo en su computadora esclava. Esto se debe a que la replicacion es de DATOS, no crea las tablas en el computador esclavo.
Seria todo, gracias por el tutorial fue de gran ayuda.
Otra cosa, postgres 8.2 viene con slony incluido NO LO INSTALEN. Instalen slony por separado.

El Pocho dijo...
Este comentario ha sido eliminado por el autor.
El Pocho dijo...

Si el paso 3 falla por no poder conectarse, recomiendo buscar la linea de "listen_addresses" en postgresql.conf, descomentarla (si esta comentada) y setearla a listen_addresses = '*'. Luego abrir pg_hba.conf y agregar una linea extra para permitir las conexiones necesarias -por ej. red local "host all all 192.168.0.0/24 md5"-.
En el paso 11, observar que cluster_name y conn_info deben estar en distintas lineas, y que cluster_name seria 'slony_example' en vez de 'exampledb'. Es decir:

cluster_name = 'slony_example'
conn_info = 'dbname=exampledb host=192.168.1.8 user=postgres password=postgres'

Marcelo dijo...

Despues de mucho buscar, he dado con tu articulo, creo que unos de los pocos, sino el unico a mi juicio que explica con "peras y manzanas" como funciona Slony-I (y en español), mis felicitaciones por tu articulo y ojala sigas escribiendo temas tan interesantes como este.

Felicitaciones nuevamente

Unknown dijo...

Mi estimado, he llegado a tu pagina despudes de tanta busqueda, por que no me hace el paso 3 que tu tutorial dice ahi, de hecho ya le cambie a la ip que me mandas ahi y nada...

entre computadoras si puedo entrar, si hago ping y todo eso, pero en el slony me marca el siguiente error:
"cliente14.txt:28:fatal:no pg_hba.conf entry for host "192.168.254.243", used "informa" databases"informa", ssl off
error: no admin conninfo for node 4021184

donde:
192.168.254.243 es la ip de la compu "servidor"
192.168.254.200 es la ip de la compu "esclavo"

se te agradece...

Diego Cartes S. dijo...

Muchas gracias, muy buen tutoria, aunque lo que necesito es que replique de un servidor con mssql a otro servidor con pgsql. pero igual me sirvio de conocimiento.

Gracias.-

Unknown dijo...

Muy buen tutorial pero tengo un probema. Llego al punto 8 y el equipo esclavo envía cada 5 segundos el siguiente mensaje de error :
2009-05-19 16:24:17 Hora est. del PacÝfico SA ERROR remoteListenThread_1: db_ge
tLocalNodeId() returned 2 - wrong database?

Alguna idea?, les cuento que hice una prueba de inserté un registro en la base de datos maestra pero en la esclava esto no se vió reflejado.

salu2

Unknown dijo...

Me funcionó el problema era en el archivo de configuración de slonik para nodo maestro había puesto localhost en vez de la ip y eso me vino a dar problemas posteriormente en la etapa de la ejecución de slon, no así con slonik.
slds

Aspal dijo...

Excelente tutorial, de verdad muy bien explicado y documentado hoy lo pondre en practica esperando que todo salga bien.

Tambien agradeceria el saber si alguien tiene informacion como se hace este mismo proceso pero bajo el SO Debian, me imagino que debe ser la misma teoria, si hay diferencias se les agradeceria.

Saludos

Aspal dijo...

Ahh y disculpen es necesario tener instalado el windows server o ese es un servicio basico de windows xp?

disculpen la ignorancia estoy comenzando a trabajar con postgre bajo windows

Edgar dijo...

Sencillamente excelente tutorial. La verdad es que busqué mucho sobre slony y ésta es la mejor información que encontré. Me ha funcionado a la perfección. Sólo tengo una consulta: Es posible que la replicación se haga en ambos sentidos? Osea, cuando guardo registros en la bd maestra, éstos se replican sin problemas a la esclava. Pero, podría hacerse también vice versa? Cuando traté de guardar registros a mi bd esclava me lanza una excepción que dice que no puedo guardar datos en la tabla porque la misma está siendo replicada? Alguien tendría información sobre esto?

Andres Mesa dijo...

¡Buena esa¡ casi me saco un ojo pero funciono , muchas gracias

Carlos Eduardo Hernandez dijo...

loko sucede algo extraño pongo todos los parametros del maestro y esclavo pero me sale el siguiente error en la linea

.txt:28: PGRES_FATAL_ERROR SET datestyle TO 'ISO'; SET session_replication_role TO local; - ERROR: se a denegado permiso para cambiar la opcion session_replication_role
Unable to set datestyle

por favor
no encuentro solucion alguna y disculmen si es una estupidez pero soy extremo novato

Carlos Eduardo Hernandez dijo...

al ejecutar el script maestro.txt
es decir en el paso 4 del tutorial,
por favor ayuda ayuda ayuda me e estado matando la cabeza pensando como solucionarlo

Carlos Eduardo Hernandez dijo...

aaa otra cosita
estoy usando postgresql 8.4 y el slony lo descarge del start builder de postgresql

Unknown dijo...

Muchas gracias, alfin encontre un post de slonyi realmente util, todos los demas dicen "lee la documentacion" (¿?) y lo peor es que con poner eso se sienten mas listos que uno, de nuevo muchas gracias!!!!

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Segui este tutorial y no logro replicar los datos de las tablas corro los script y todo OK corro el Slon de la maestra y de la esclava y funcionan en aparentemente bien. ojala alguien me pudiera ayudar.
Saludos
Abel.