Migra un clúster de PostgreSQL local a Google Cloud

En este artículo, se explica cómo migrar un clúster local de PostgreSQL a Google Cloud. Este enfoque, se utiliza PgBouncer como agrupador de conexiones a fin de minimizar el tiempo de inactividad de la aplicación y se ayuda a configurar herramientas para supervisar los resultados. Este artículo está diseñado para los administradores y administradores de sistemas de PostgreSQL que trabajan en un entorno Linux.

En el siguiente diagrama, se muestra una instancia de PgBouncer que está ubicada frente a una instancia principal local.

Arquitectura de una instancia de PgBouncer que está ubicada frente a una instancia principal local.

Con la agrupación de conexiones, los clientes se enrutan a un nodo alternativo cuando se produce la conmutación por error en Google Cloud, sin tener que volver a implementar opciones de configuración de la aplicación ni realizar cambios a nivel de la aplicación.

La migración se ilustra en el siguiente diagrama.

Arquitectura de migración a Google Cloud

Para realizar la migración, cierra la instancia principal actual y, luego, promociona la réplica subordinada de Google Cloud a la instancia principal. PgBouncer redirige el tráfico al nuevo nodo principal en Google Cloud.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Puedes usar la calculadora de precios para realizar una estimación de costos según el uso previsto.

Objetivos

  • Configurar PostgreSQL en Google Cloud
  • Configurar la replicación en Compute Engine
  • Propagar los datos a una nueva instancia
  • Configurar el clúster de PostgreSQL en Google Cloud
  • Pasar al nuevo servidor
  • Implementar la supervisión

Antes de comenzar

En este instructivo, se usan los comandos de gcloudgsutil, que puedes ejecutar desde una instancia de Cloud Shell que se inició desde Cloud Console. Si deseas usar gcloudgsutil en la estación de trabajo local, instala el SDK de Cloud. En el instructivo, se muestra cómo ejecutar comandos en Cloud Shell. Si usas el SDK de Cloud en la estación de trabajo, ajusta las instrucciones según corresponda.

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir a la página del selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita la API Compute Engine.

    Habilita la API

Configura tu entorno

Para empezar, realizas las siguientes tareas:

  • Configura PostgreSQL en Google Cloud.
  • Configura la replicación en Compute Engine.

Luego, propaga los datos a una nueva instancia antes de comenzar a replicar la instancia principal.

Configura PostgreSQL en Google Cloud

Sigue los pasos que figuran en Configura PostgreSQL para alta disponibilidad y replicación con Hot Standby a fin de configurar PostgreSQL en Google Cloud en solo unos minutos. Configurarás PostgreSQL en una instancia de máquina virtual de Ubuntu en Compute Engine.

Configura la replicación en Compute Engine

Sigue los pasos de Cómo configurar PostgreSQL en Google Compute Engine a fin de configurar PostgreSQL para que se ejecute en modo Hot Standby en Compute Engine. Utilizarás dos instancias de Compute Engine. Una instancia ejecutará el servidor principal de PostgreSQL y la otra instancia ejecutará el servidor en espera.

Si bien las propiedades para configurar PostgreSQL difieren entre una instancia principal y una subordinada, los archivos de propiedades deben ser idénticos a fin de permitir una conmutación por error sin problemas.

Una instancia subordinada en un clúster de PostgreSQL se denota por la presencia del archivo recovery.conf.

En la mayoría de los casos, es importante separar el directorio de datos correspondiente a la base de datos del disco de arranque. En este ejemplo, los archivos de base de datos se almacenan en una activación en /database.

Usa los siguientes comandos para modificar el archivo postgresql.conf en la instancia principal a fin de configurar la replicación:

wal_level = 'hot_standby'
archive_mode = on
archive_command = 'test ! -f /postgresql/archivedir/%f && cp %p /postgresql/archivedir/%f'
max_wal_senders = 3
listen_addresses = '*'
wal_keep_segments = 8

Usa los siguientes comandos para modificar el archivo postgresql.conf en la réplica:

hot_standby = on
standby_mode = on
primary_conninfo = 'host=${PRIMARY_IP} port=5432 user=repuser'

Puedes compensar parte de la carga de la instancia principal si envías solicitudes Read a la réplica.

Propaga los datos

Debido a que la base de datos principal contiene un registro de transacciones con límite, la mayoría de las migraciones de PostgreSQL requieren que los datos se propaguen a una nueva instancia antes de que puedas comenzar la replicación de la instancia principal. Puedes propagar los datos de cualquiera de las siguientes maneras:

  • Vuelca una sola base de datos en una secuencia de comandos o un archivo de almacenamiento mediante Pg_dump.
  • Toma una copia binaria de un clúster de base de datos en ejecución mediante Pg_basebackup.
  • Copia la carpeta de datos en la réplica mediante rsync.
  • Restablece una copia de seguridad anterior en la réplica.

De estas opciones, recomendamos que restablezcas una copia de seguridad anterior en la réplica. Esta solución no causa ningún impacto en el rendimiento mientras se transfieren grandes volúmenes de datos, y el clúster actual puede seguir funcionando con normalidad.

Después de la propagación inicial de la base de datos, puedes usar el comando rsync para enviar a la réplica los cambios que se hayan producido desde la copia de seguridad. Con el comando se sincronizan los directorios de datos entre las dos instancias. Este paso es importante si la copia de seguridad tiene tanto atraso con respecto a la instancia principal que resulta difícil que se ponga al día mediante la replicación normal.

Configura el clúster de PostgreSQL en Google Cloud

Puedes crear el clúster de PostgreSQL mediante la replicación en cascada. Primero, migra la base de datos, como se muestra en el siguiente diagrama.

La arquitectura del entorno actual migró a Google Cloud.

Migra la base de datos

  1. Realiza una copia de seguridad completa desde el servidor principal en ejecución (label puede ser cualquier etiqueta):

    echo "select pg_start_backup('label',true);" |sudo su - postgres -c psql
    sudo tar cvfz postgresql_AAAAMMDD.tar.gz $PGDATA
    

    $PGDATA es el principal directorio de datos de PostgreSQL.

  2. Crea un depósito en el proyecto de Google Cloud llamado gs://pg-repo/.

  3. Transfiere la copia de seguridad al bucket que acabas de crear:

    master$ gsutil cp postgresql_AAAAMMDD.tar.gz gs://pg-repo/
    
  4. Transfiere el archivo de copia de seguridad a la instancia principal de Google Cloud:

    new_master$ gsutil cp gs://pg-repo/postgresql_AAAAMMDD.tar.gz
    
  5. Restablece el archivo de copia de seguridad en la instancia principal de Google Cloud:

    new_master$ (cd / ; tar xvf postgresql_AAAAMMDD.tar.gz)
    
  6. Crea un archivo recovery.conf en el directorio $PG_DATA que incluya lo que se menciona a continuación:

    standby_mode     = 'on'
    primary_conninfo = 'port=5432 host=${running_master_ip} user=${replication_user} application_name=cloud_master'
    trigger_file     = '/tmp/failover.postgresql.5432'
    
  7. Inicia el servicio de PostgreSQL:

    sudo service postgresql start
    
  8. Espera hasta que el servidor principal de Google Cloud se sincronice con la instancia principal en ejecución. En el registro, verás algo como lo que se muestra a continuación:

    tail -f /var/log/postgresql/postgresql*log
    ...
    2018-09-22 17:59:54 UTC LOG:  consistent recovery state reached at 0/230000F0
    2018-09-22 17:59:54 UTC LOG:  database system is ready to accept read only connections
    ...
    

    Además, puedes buscar en master pg_stat_replication para determinar si el nuevo subordinado (llamado cloud_master) está conectado:

    postgres=# \x
    Expanded display is on.
    postgres=# select * from pg_stat_replication where application_name='cloud_master';
    -[ RECORD 1 ]----+------------------------------
    pid              | 16940
    usesysid         | 16402
    usename          | repmgr
    application_name | cloud_master
    ...
    

Crea una base de datos subordinada

  1. Cierra la base de datos y el servidor:

    sudo service postgresql stop
    sudo shutdown -h now
    
  2. Para verificar que el servicio se haya detenido, ejecuta el siguiente comando:

    gcloud compute instances describe master-instance-name | grep status
    

    El resultado muestra el estado de la instancia como TERMINATED:

    status: TERMINATED
    

    A continuación, crea instantáneas del disco de datos para ayudar a crear nuevos subordinados.

  3. En Cloud Console, ve a la página Instantáneas.

    Ir a la página de instantáneas

  4. Desde el disco de PostgreSQL, crea una instantánea nueva.

  5. Inicia el servidor principal de Google Cloud.

  6. Ve a la página Instancias de VM, haz clic en master-instance-name y, a continuación, haz clic en Iniciar.

    El servicio de PostgreSQL se inicia automáticamente.

  7. Como comprobación, ejecuta el siguiente comando:

    ps ax | grep postgres
    

    El resultado debería ser similar a lo siguiente:

     1398 ?     S   0:00 /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/postgresql.conf
     1454 ?     Ss  0:00 postgres: checkpointer process
     1455 ?     Ss  0:00 postgres: writer process
     1456 ?     Ss  0:00 postgres: wal writer process
     1457 ?     Ss  0:00 postgres: stats collector process
    
  8. En Cloud Console, ve a la página Instancias de VM y, luego, haz clic en Crear instancia.

  9. Para el disco de arranque, elige Ubuntu 14.04.

  10. Haz clic en Administración, discos, redes, llaves SSH y agrega un nuevo disco basado en la instantánea que creaste anteriormente.

  11. Inicia el nuevo servidor y activa el disco:

    sudo mkdir /database && sudo mount /dev/sdb1 /database
    
  12. Instala PostgreSQL:

    sudo apt-get install postgresql && sudo service postgresql stop
    
  13. Configura el directorio de datos y los valores de replicación. Copia el archivo postgresql.conf y el archivo pg_hba.conf de la instancia principal de Google Cloud y edita el archivo recovery.conf para incluir lo siguiente:

    standby_mode = 'on'
    primary_conninfo = 'port=5432 host=${cloud_master_ip} user=${replication_user} application_name=cloud_slave_${identifier}'
    recovery_target_timeline = 'latest'
    
  14. Inicia el servicio de PostgreSQL mediante el nuevo archivo de configuración y apunta a la instancia principal de Google Cloud:

    sudo service postgresql restart
    
  15. Verifica que el servicio esté en ejecución:

    ps ax | grep postgres
    
  16. Verifica la instancia principal de Google Cloud mediante esta consulta:

    postgres=# \x
    Expanded display is on.
    postgres=# select * from pg_stat_replication where application_name like 'cloud_slave%';
    -[ RECORD 1 ]----+-----------------------------
    pid              | 2466
    usesysid         | 16402
    usename          | repmgr
    application_name | cloud_slave_1
    ...
    
  17. Repite estos pasos para crear otras subordinadas.

Cambia al nuevo servidor

  1. Cambia el archivo de configuración en PgBouncer para que apunte al nuevo servidor principal de Google Cloud.
  2. En la instancia de PgBouncer, cierra PgBouncer, asciende la nueva instancia principal mediante el archivo activador failover.postgresql.5432 y, luego, reinicia PgBouncer:

    service pgbouncer stop ; ssh ${cloud_master_ip} 'touch /tmp/failover.postgresql.5432' ; service pgbouncer start
    

Configura la supervisión

Google se asoció con Blue Medora para proporcionar métricas de PostgreSQL. Puedes recopilar métricas y registros desde la instancia de PostgreSQL existente y la nueva instancia de Google Cloud.

Si deseas obtener más información sobre la asistencia de supervisión de PostgreSQL para Blue Medora, visita su página Primeros pasos.

Consultas de muestra

Comprueba todas las conexiones simultáneas en el servidor:

 select * from pg_stat_activity;

Comprueba el estado de la replicación (instancia principal):

select * from pg_stat_replication;

Verifica el retraso con que se aplican los datos en la réplica (instancia principal):

select pg_xlog_location_diff(write_location, replay_location) from pg_stat_replication;

Comprueba el retraso de bytes en la replicación (instancia principal):

select client_hostname, client_addr, pg_xlog_location_diff(pg_stat_replication.sent_location,
  pg_stat_replication.replay_location)AS byte_lag from pg_stat_replication;

Comprueba si la base de datos es una réplica o no (subordinada):

select pg_is_in_recovery();

Verifica los últimos datos recibidos desde la instancia principal (subordinada):

select pg_last_xlog_receive_location();

Verifica los últimos datos aplicados desde la instancia principal (subordinada):

select pg_last_xlog_replay_location();

Verifica el retraso de replicación en segundos (subordinada):

select now() - pg_last_xact_replay_timestamp();

Limpieza

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Próximos pasos

  • Prueba otras funciones de Google Cloud. Revisa nuestros instructivos.
  • Aprende a usar los productos de Google Cloud para crear soluciones de extremo a extremo.