4

Cómo habilitar Hot-Standby con PostgreSQL

1957Puntos

hace 5 años

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 primerofue 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:
  • wal sender process
Listo, ahora tu base de datos se encuentra protegida con el servicio Hot-Standby. Yapuedes 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ístratehoy 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.
Cesar
Cesar
@reicek

1957Puntos

hace 5 años

Todas sus entradas
Escribe tu comentario
+ 2
1
8418Puntos

He seguido sin exito estas instrucciones, lo estoy intentando con postgres 10, en el momento de hacer el backup con pg_basebackup me sale el siguiente error :

could not connect to server: could not connect to server: Connection timed out
Is the server running on host “192.168.2.94” and accepting
TCP/IP connections on port 5432?

En postgresql.conf - listen_addresses lo puse en *
En pg_hba.conf lo puse como recomienda este articulo.

Que puede que me este pasando por alto y por lo tanto no me puedo conectar?

Desde ya muchas gracias