Sistemas Distribuidos basados en Postgresql y Debian GNU/Linux

En esta entrega vamos a configurar dos servidores Postgresql uno como maestro y otro como esclavo la idea es distribuir el esquema de base de datos del servidor maestro a todos los esclavos y así contar con un sistema de alta disponibilidad. El primer paso que debemos hacer es agregar los repositorios backports de Debian squeeze:

nano /etc/apt/sources.list
Agregamos/Guardamos/Salimos
deb http://backports.debian.org/debian-backports squeeze-backports main

Seguidamente:

aptitude update
aptitude search postgresql-9.1
aptitude install postgresql-9.1

Luego de instalar los paquetes en ambos equipos comenzamos la configuración del servidor maestro:

nano -w /etc/postgresql/9.1/main/postgresql.conf
Ya dentro del archivo modificamos
listen_addresses = ‘*’
wal_level = hot_standby
max_wal_senders = 3

Luego deberemos crear un usuario en el servidor maestro. En el sisguiente paso utilizamos una conexión con ejecución externa, tener a la mano la clave del usuario “postgres” o asignarla con “ALTER USER postgres with ‘nueva clave’;”, continuamos:

psql -h localhost -U postgres -W -c “CREATE USER replication WITH REPLICATION PASSWORD ‘clave’;”

Luego debemos dejar pasar una conexión TCP para este usuario, para ello modificamos el archivo “pg_hba.conf”, y agregamos algo como:

host replication replication 192.168.15.9/0 md5

Ahora debemos detener el servicio, para ello:

/etc/init.d/postgresql stop

Muy bien, ahora en los esclavos procedemos primeramente con la edición del archivo de configuración de Postgresql:

nano -w /etc/postgresql/9.1/main/postgresql.conf
Ya dentro del archivo modificamos y guardamos
listen_addresses = ‘*’
hot_standby = on

Ahora debemos limpiar cualquier rastro de actividad en el esclavo para ello, procedemos:

/etc/init.d/postgresql stop
cd /var/lib/postgresql/9.1/main/
rm -rf *

Ya casi terminamos, luego de que eliminamos los datos necesitamos crear un archivo de configuración para que el esclavo sepa de donde conseguir los datos, de forma tal que:

nano -w /var/lib/postgresql/9.1/main/recovery.conf
Ya dentro del archivo modificamos y guardamos
primary_conninfo = ‘host=192.168.15.7 port=5432 user=replication password=clave’
standby_mode = on

Ahora juntamos todas las piezas, desde el servidor maestro y como “root” damos orden de sincronización entre ambos directorios de Postrgrseql:

rsync -av /var/lib/postgresql/9.1/main/* 192.168.15.9:/var/lib/postgresql/9.1/main/

En ambos equipos debe existir el comando “rsync” una vez que este ultimo paso concluye, se levantan los servidores:

En el maestro
/etc/init.d/postgresql start
En el esclavo
/etc/init.d/postgresql start

Listo de esta forma los servidores esclavos copiaran toda acción que se realice en el servidor Postgresl maestro. Para saber el estado de la replicación ejecutamos en el servidor maestro:

psql -h localhost -U postgres -W -c “select * from pg_stat_replication;”

Notas finales, durante la realización de este arreglo pueden surgir varios detalles por ejemplo, al levantar los esclavos el servidor reporta una falla de codificación de las base de datos como esta:


2012-08-22 15:16:58 VET FATAL: la configuraci?n regional es incompatible con el sistema operativo
2012-08-22 15:16:58 VET DETALLE: La base de datos fue inicializada con LC_COLLATE <>, el cual no es reconocido por setlocale().
2012-08-22 15:16:58 VET HINT: Recree la base de datos con otra configuraci?n regional, o instale la configuraci?n regional faltante.

Para solventar este detalle se debe ejecutar una reconfiguración del paquete “locales”:

dpkg-reconfigure locales

Luego de esto ir al archivo de configuración de Postgresql y modificar las variables de formato al que se desea, ejemplo:

c_messages = ‘es_ES.UTF-8’
lc_monetary = ‘es_ES.UTF-8’
lc_numeric = ‘es_ES.UTF-8’
lc_time = ‘es_ES.UTF-8’

También me surgió una falla de inconsistencia de datos, para solventar esto solo debemos sincronizar nuevamente los directorios con el comando “rsync”. Otro comando que pudiera ser util es:

netstat -putan | grep 5432

Con el objeto de ver las conexiones establecidas hacia el puerto de Postgresql (5432). Básicamente al revisar el log de los equipos esclavos deberiamos ver algo como esto:


el sistema de bases de datos est? listo para aceptar conexiones de s?lo lectura
2012-08-22 15:38:25 VET LOG: registro de longitud cero en 0/169D1DC
2012-08-22 15:38:25 VET LOG: la replicaci?n en flujo se ha conectado exitosamente al primario

Como una prueba final de certificación pudiéramos tratar de alterar el esquema de BD del esclavo y el log debería reportar lo siguiente:

2012-08-22 16:12:36 VET ERROR: no se puede ejecutar CREATE TABLE en una transacción de sólo lectura
2012-08-22 16:12:36 VET SENTENCIA: CREATE TABLE prueba (lola varchar);

De esta forma disponemos de una base de datos distribuida y de alta disponibilidad, pudieramos programar nuestra aplicacion web con varias variables de conexión a distintas bases de datos via PHP y tendriamos también aplicativos de alta disponibilidad. Espero les sea de ayuda y utilidad esta configuración de este potente RDBMS y cualquier cosa me avisan, saludos/regards.

3 thoughts on “Sistemas Distribuidos basados en Postgresql y Debian GNU/Linux”

  1. hola, he seguido los pasos para configurar la replica tal y como sale en el post pero una ves sincronizados los directorios de datos del maestro con el esclavo, aunque todo parece haber funcionado correctamente no puedo iniciar el servicio en el host esclavo, cuando trato de levantarlo me devuelve este error:
    FATAL: incorrect checksum in control file
    Si alguien pudiera ayudarme, llevo dias intentandolo!!

    Reply

Leave a Comment