Configuración de los servicios en los nodos del CLUSTER

Imagen de deathUser

En este punto estamos listos para crear el servicio, previo a esto, debemos asegurarnos de tener todos los recursos disponibles en cada uno de los nodos del cluster, para esto, crearemos el script /etc/init.d/initpg en cada uno de los nodos, y lo probaremos con la finalidad de asegurar que cada nodo pueda iniciar el servicio de PostgreSQL independientemente.

Lo primero será crear el punto de montaje del recurso NFS, esto lo haremos con el comando:


mkdir /opt/data

Luego probaremos el montaje del recurso con el comando:


mount -t nfs server:/data /opt/data

Luego como usuario postgres, crearemos el cluster inicial de PostgreSQL con el comando:


initdb /opt/data/cluster

Obtendremos una salida como la siguiente:


The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale en_US.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "english".

creating directory /opt/data/cluster ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /opt/data/cluster/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:
postgres -D /opt/data/cluster
or
pg_ctl -D /opt/data/cluster -l logfile start

Editaremos el archivo /op/data/cluster/postgresql.conf y cambiaremos la línea:


listen_addresses = 'localhost'

Por:


listen_addresses = '*'

Con la finalidad de que PostgreSQL escuche en todas las direcciones IP disponibles, y editaremos el archivo /opt/data/cluster/pg_hba.conf , y agregaremos la línea:


host all all 0.0.0.0/0 md5

Para probar que funcione el servicio de PostgreSQL ejecutaremos el comando:


pg_ctl -D /opt/data/cluster -l /tmp/log.txt start

Y posteriormente crearemos un usuario y una base de datos para dicho usuario y verificaremos que tiene acceso al servidor con los comandos:

Crear el usuario edbstore:

createuser edbstore -P -S -R -D

Crear la base de datos edbstore:

createdb -O edbstore edbstore

La salida del comando:

echo "\\l" | psql -U edbstore -d edbstore

Debería ser algo como:

Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
edbstore | edbstore | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres=CTc/postgres

Una vez terminadas las pruebas en este nodo, bajamos el servicio con el comando:


pg_ctl -D /opt/data/cluster -l /tmp/log.txt stop

Y desmontamos el recurso NFS con el comando:


umount /opt/data

Y procedemos a realizar las pruebas de levantamiento del servicio y conexión en los otros nodos del cluster.


mkdir /opt/data
mount -t nfs server:/data /opt/data
su - postgres
pg_ctl -D /opt/data/cluster -l /tmp/log.txt start
echo "\\l" | psql -U edbstore -d edbstore

Debiendo obtener como resultado la lista de bases de datos del paso anterior, de igual manera, bajamos el servicio y desmontamos el recurso compartido.
Ahora procedemos a crear y probar el script /etc/init.d/initpg, este script debe responder a las llamadas del tipo:


initpg start
initpg stop
initpg status

El software de administración del cluster interpretará la salida del script de la siguiente manera, si es un cero “0” asumirá que la ejecución fue correcta si es un valor distinto de cero “0” por ejemplo uno “1”, será interpretado como que ocurrió un error y el servicio tratará de ser recuperado, el script que se muestra, se ha desarrollado con propósitos académicos y no debería ser usado en entornos de producción, solamente pretende ilustrar una funcionalidad básica requerida por un script para ser usado como recurso con REDHAT CLUSTER SUITE.

Contenido del scrip initpg:


#!/bin/sh
#
# initpg This is the init script for starting up the PostgreSQL
# server.
#
# chkconfig: - 64 36
# description: PostgreSQL database server.
# processname: postmaster
# pidfile: /var/run/postmaster.PORT.pid
BINDIR=/usr/bin/
DATADIR=/opt/data/cluster
# This script is slightly unusual in that the name of the daemon (postmaster)
# is not the same as the name of the subsystem (postgresql)

# See how we were called.
case "$1" in
start)
mount -t nfs server:/data /opt/data
su - -c "${BINDIR}/pg_ctl -D ${DATADIR} -l /tmp/pg.log start" postgres
exit 0
;;
stop)
su - -c "${BINDIR}/pg_ctl -D ${DATADIR} -l /tmp/pg.log stop" postgres
umount /opt/data
exit 0
;;
restart)
su - -c "${BINDIR}/pg_ctl -D ${DATADIR} -l /tmp/pg.log restart" postgres
exit 0
;;
status)
if [ `su - -c "${BINDIR}/pg_ctl -D ${DATADIR} status | grep -c PID" postgres` -eq 1 ]; then
exit 0;
else
exit 1;
fi
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac

Este script debe ser copiado en todos los nodos del cluster, debemos probar su funcionamiento en cada nodo del cluster con los siguientes comandos:


/etc/init.d/initpg start
echo "\\l" | psql -U edbstore -d edbstore
/etc/init.d/initpg stop

El resultado debería ser nuevamente la lista de las bases de datos.