Para evitar interrupciones en el servicio,
PostgreSQL permite que los clientes puedan
conectarse al servidor mientras está en recuperación o mantenimiento. De esta manera, nuestros usuarios pueden hacer búsquedas en la base de datos gracias a un servicio llamado
Hot-standby; que usa una técnica llamada
streaming-replication para mantener actualizados los servidores de
standby. Y estos son, precisamente, los que entran en acción cuando nuestro servidor por alguna razón no está operativo.
PostgreSQL usa una técnica llamada
Write-Ahead Logging (
WAL) para crear un registro de cada transacción hecha en el servidor principal y transmitirla a todos los
servidores standby. Para mantenerse sincronizados con el servidor, estos a su vez, hacen estas operaciones en su copia local
.
Los servidores
standbypueden funcionar en modo
warm-standbyo
hot-standby.El primero
fue introducido en la versión 8.3 y consiste en
un servidor de respaldo que se mantiene actualizado por medio del WAL. Cuando el servidor primario no está disponible, el servidor de warm-standby puede ser usado para tomar el rol de servidor primario y, al mismo tiempo, el servidor principal ahora pasará a ser el de
standby. A este proceso se le llama
failover.
El modo
hot-standby funciona muy similar al warm-standby. Fue introducido en la versión 9 y se usa cuando el servidor principal no está funcionando por alguna razón. Al habilitar esta función éste empieza a
recibir operaciones de sólo lectura (búsquedas) hasta que el servidor principal regresa a la normalidad.
Amazon PostgreSQL RDS ofrece servicio de
failover automático usando esta característica. Para activarla basta con activar
Multi-AZ deployment al crear un nuevo servidor.
Hot-Standby nos permite hacer labores de mantenimiento dejando un mínimo de funcionalidad en las aplicaciones o servicios que dependan de nuestro servidor, y regresar todo a modo normal de forma fácil y rápida sin interrumpir el servicio.
Amazon PostgreSQL RDS ofrece servicio de
Read Replicas que aprovecha Hot-Standby para crear servidores para enrutar las lecturas. De esta manera, el servidor principal sólo se usa para las actividades de escritura. Esto permite
escalar la capacidad de transacciones que podemos manejar en nuestra base de datos.
Para habilitar Hot-Standby en un servidor de PostgreSQL debemos seguir estos pasos:
Primero debemos considerar que es necesario tener la misma versión de PostgreSQL en ambos servidores. Además, todos los cambios u operaciones que hagamos en uno, debemos hacerlas también en el otro.
Después, es necesario
configurar la autenticación SSH sin password para el usuario
postgres. Puedes usar la función
ssh-copy-id y correr el siguiente comando en tu servidor. Recuerda realizar todas tus operaciones en ambos servidores con el usuario
postgres:
[code]
ssh-copy-id <IP-DEL-SERVIDOR-STANDBY>
[/code]
El siguiente paso es crear un usuario llamado
replicator en el servidor principal. No es necesario hacer esto en el servidor
standby pues el usuario será copiado automáticamente. Para agregar el usuario puedes usar el siguiente comando:
[code]
psql -c "CREATE USER replicator SUPERUSER LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'tu_clave_secreta';"
[/code]
Después debes configurar ambos nodos para aceptar conexiones desde el otro servidor. Para lograrlo asegúrate de tener lo siguiente en el archivo
pg_hba.conf
[code]
host replication replicator <IP_DEL_OTRO_SERVIDOR>/32 md5
[/code]
Ahora debes activar el registro WAL en ambos servidores. Para hacerlo agrega los siguientes parámetros en el archivo
postgresql.conf:
[code]
hot_standby = on
max_wal_senders = 1
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
listen_addresses = 'localhost,<IP_DE_ESTE_SERVIDOR>'
[/code]
Lo siguiente es reiniciar el servidor principal y hacer un respaldo en el de
standby. Para esto te recomiendo crear un
bash script para poder ejecutarlo rápidamente y sin errores cuando se requiera:
[code]
BACKUP_LABEL="base-backup"
psql -p $PORT -c "select pg_start_backup('$BACKUP_LABEL');"
rsync -cva --inplace --exclude=*pg_xlog* $PGDATA/ <IP_DEL_OTRO_SERVIDOR>:$PGDATA/
psql -p $PORT -c "select pg_stop_backup();"
[/code]
En el servidor de
standby crea un archivo llamado
recovery.conf en el directorio
$PGDATA y agrega lo siguiente:
[code]
standby_mode = 'on'
primary_conninfo = 'host=<IP_OF_OTHER_HOST> port=$PORT user=replicator password=changeme'
trigger_file = '/tmp/postgresql.trigger.$PORT'
[/code]
Ahora inicia el servidor
standby. Puedes verificar que todo está funcionando correctamente
revisandoel log de ambos en el archivo
/var/log/postgresql/postgresql-9.1-<NOMBRE_DEL_CLUSTER>.log
En el servidor
standby deberías poder encontrar:
- streaming replication successfully connected to primary
- wal receiver process
Y en el servidor principal deberías encontrar:
Listo, ahora tu base de datos se
encuentra protegida con el servicio
Hot-Standby. Ya
puedes correr búsquedas en el servidor
standby para asegurarte que los datos son iguales en ambos servidores.
Si deseas
aprender más sobre este y otros secretos regístrate
hoy al curso de
PostgreSQL de Platzi y no te pierdas los artículos y tutoriales que estaremos publicando. Si te interesa algún tema en específico, no dudes en dejarlo en los comentarios.