Supongamos que contamos una instancia de un servidor de bases de datos Postgres y deseamos crear una instancia adicional atendiendo peticiones en un puerto TCP/IP diferente. Este breve artículo explica cómo hacerlo.

¿Por qué crear varias instancias de un motor de bases de datos en un mismo servidor? Independientemente de la tecnología utilizada (Postgres, MySQL, SQL Server, etc.), replicar instancias de un motor de bases de datos es el método más común para implementar bases de datos repetidas, y de igual nombre, en un mismo servidor. Una situación clásica es cuando se requiere implementar diferentes entornos (desarrollo, testing y producción), de iguales características, pero sólo se cuenta con un único servidor de bases de datos. En este escenario, la mejor alternativa es replicar instancias: una para cada entorno. Esto además permite mejorar notablemente la seguridad del entorno de producción, y asignar recursos/permisos de manera independiente.



Este artículo está orientado al motor de bases de datos Postgres instalado sobre un servidor Debian GNU/Linux. A continuación se explica cómo crear y configurar una nueva instancia en dicho entorno.

Manos a la obra

El trabajo de creación de la instancia se debe ejecutar como usuario "postgres" (o el nombre que corresponda al usuario con el que corra Postgres) para no tener que corregir luego los permisos:

# su - postgres

Cambiar al directorio donde se guardan las instancias, por ejemplo /usr/local/postgres/:

$ cd /usr/local/postgres/

La creación de una nueva instancia se realiza utilizando el comando initdb:

$ initdb -D ./pg_nuevo -U postgres -W

Con la opción -D se indica el directorio de trabajo para la nueva instancia, con -U el nombre de superusuario para la instancia, y con -W que tome la contraseña para el mismo de forma interactiva. Para ver otras opciones disponibles ejecutar: initdb --help.

Una vez creada la instancia, remover todos los permisos para el grupo y el resto de los usuarios sobre el nuevo directorio creado para la instancia:

$ chmod og-wrx pg_nuevo/

Cambiar al nuevo directorio y crear un directorio para almacenar archivos de log:

$ cd pg_nuevo/
$ mkdir pg_log

El siguiente paso consiste en editar el archivo de configuración de la instancia:

$ nano postgresql.conf

Lo más importante es modificar el puerto en el que escuchará la nueva instancia. Se supone que ya existe una instancia corriendo en el puerto por defecto (5432), entonces utilizar cualquier otro puerto que esté disponible para la nueva instancia (por ejemplo 5433):

port = 5433

De ser necesario, configurar los permisos de acceso para los clientes:

$ nano pg_hba.conf

Luego, crear un script de inicio LSB para controlar el servicio relacionado a la nueva instancia:

$ nano postgresql-pg_nuevo

Script de ejemplo:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          postgresql-pg_nuevo
# Required-Start:    $local_fs $network $syslog $named
# Required-Stop:     $local_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Nueva instancia de PostgreSQL
# Description:       Nueva instancia de PostgreSQL
### END INIT INFO

. /etc/profile

if [ $# -eq 0 ] ; then
   echo "Se debe indicar el comando: start|stop|restart|reload|status"
   exit 1
fi

PGDATA=/usr/local/postgres/pg_nuevo
PGLOG="${PGDATA}/pg_log/$(date +%Y%m%d%H%M%S).log"
PGUSER="postgres"
PGCTL="/usr/local/pgsql/bin/pg_ctl"

su - $PGUSER -c "$PGCTL $1 -D ${PGDATA} -l ${PGLOG}"

Este script invoca a la utilidad pg_ctl, la cual controla al servidor Postgres, para controla a la nueva instancia.

Modificar las variables de este script según corresponda.

Guardar y cerrar el archivo, y luego cerrar la sesión con el usuario "postgres":

$ exit

Como superusuario resta instalar el script de inicio del servicio. Cambiar al directorio /etc/init.d:

# cd /etc/init.d/

Crear un link simbólico al script de inicio dentro de este directorio

# ln -s /usr/local/postgres/pg_nuevo/postgresql-pg_nuevo .

Crear los links en los directorios de inicio de servicios de System V para levantar automáticamente la nueva instancia en los runlevels 2, 3, 4 y 5:

# update-rc.d postgresql-pg_nuevo defaults

Otorgar permisos de ejecución al script de inicio:

# chmod +x /usr/local/postgres/pg_nuevo/postgresql-pg_nuevo

Finalmente, iniciar la nueva instancia:

# service postgresql-pg_nuevo start

Verificar que haya levantado:

root@debian:~# ps ax | grep postgres
 2563 ?        S      1:09 /usr/local/pgsql/bin/postgres -D /usr/local/postgres/pg_prod
 2605 ?        Ss     0:36 postgres: checkpointer process
 2606 ?        Ss     0:08 postgres: writer process
 2607 ?        Ss     0:07 postgres: wal writer process
 2608 ?        Ss     0:37 postgres: autovacuum launcher process
 2609 ?        Ss     2:58 postgres: stats collector process
15622 pts/0    S+     0:00 grep postgres
18707 ?        S      0:00 /usr/local/pgsql/bin/postgres -D /usr/local/postgres/pg_nuevo
18709 ?        Ss     0:00 postgres: checkpointer process
18710 ?        Ss     0:00 postgres: writer process
18711 ?        Ss     0:00 postgres: wal writer process
18712 ?        Ss     0:00 postgres: stats collector process

Sólo resta abrir el nuevo puerto en el firewall, según corresponda.

La siguiente tarea consiste en configurar la instancia según nuestras preferencias y características del servidor.

A partir de este momento es posible conectarse a la nueva instancia (utilizando el cliente de línea de comandos psql o el cliente gráfico pgAdmin) para comenzar a crear bases de datos, roles, usuarios, etc.

Tal vez se desee crear un usuario y bases de datos utilizando createuser y createdb.

Referencias

PostgreSQL 9.4.4 Documentation - Chapter 18. Server Configuration


Tal vez pueda interesarte


Compartí este artículo