sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo usar pgBackRest para respaldar PostgreSQL y TimescaleDB

Sus datos son probablemente los activos más valiosos de la empresa, por lo que debe tener un Plan de recuperación ante desastres (DRP) para evitar la pérdida de datos en caso de accidente o falla del hardware. Una copia de seguridad es la forma más simple de DR. Puede que no siempre sea suficiente para garantizar un objetivo de punto de recuperación (RPO) aceptable, pero es un buen primer enfoque. Además, debe definir un objetivo de tiempo de recuperación (RTO) de acuerdo con los requisitos de su empresa. Hay muchas formas de alcanzar el valor RTO, depende de los objetivos de la empresa.

En este blog, veremos cómo utilizar pgBackRest para realizar copias de seguridad de PostgreSQL y TimescaleDB y cómo utilizar una de las características más importantes de esta herramienta de copia de seguridad, la combinación de copias de seguridad completas, incrementales y diferenciales, para minimizar el tiempo de inactividad.

¿Qué es pgBackRest?

Existen diferentes tipos de copias de seguridad para bases de datos:

  • Lógico:la copia de seguridad se almacena en un formato legible por humanos como SQL.
  • Físico:la copia de seguridad contiene datos binarios.
  • Completo/Incremental/Diferencial:la definición de estos tres tipos de copias de seguridad está implícita en el nombre. La copia de seguridad completa es una copia completa de todos sus datos. La copia de seguridad incremental solo realiza una copia de seguridad de los datos que han cambiado desde la copia de seguridad anterior y la copia de seguridad diferencial solo contiene los datos que han cambiado desde la última copia de seguridad completa ejecutada. Las copias de seguridad incrementales y diferenciales se introdujeron como una forma de reducir la cantidad de tiempo y el uso de espacio en disco que se necesita para realizar una copia de seguridad completa.

pgBackRest es una herramienta de copia de seguridad de código abierto que crea copias de seguridad físicas con algunas mejoras en comparación con la herramienta clásica pg_basebackup. Podemos usar pgBackRest para realizar una copia inicial de la base de datos para Streaming Replication usando una copia de seguridad existente, o podemos usar la opción delta para reconstruir un antiguo servidor en espera.

Algunas de las características más importantes de pgBackRest son:

  • Copia de seguridad y restauración en paralelo
  • Operación local o remota
  • Copias de seguridad completas, incrementales y diferenciales
  • Rotación de copias de seguridad y caducidad de archivos
  • Comprobación de la integridad de la copia de seguridad
  • Resumen de copia de seguridad
  • Restauración delta
  • Cifrado

Ahora, veamos cómo podemos usar pgBackRest para respaldar nuestras bases de datos PostgreSQL y TimescaleDB.

Cómo usar pgBackRest

Para esta prueba, usaremos CentOS 7 como sistema operativo y PostgreSQL 11 como servidor de base de datos. Asumiremos que tiene la base de datos instalada; si no, puede seguir estos enlaces para implementar tanto PostgreSQL como TimescaleDB de una manera sencilla mediante ClusterControl.

Primero, necesitamos instalar el paquete pgbackrest.

$ yum install pgbackrest

pgBackRest se puede usar desde la línea de comandos o desde un archivo de configuración ubicado de manera predeterminada en /etc/pgbackrest.conf en CentOS7. Este archivo contiene las siguientes líneas:

[global]
repo1-path=/var/lib/pgbackrest
#[main]
#pg1-path=/var/lib/pgsql/10/data

Puede consultar este enlace para ver qué parámetro podemos agregar en este archivo de configuración.

Agregaremos las siguientes líneas:

[testing]
pg1-path=/var/lib/pgsql/11/data

Asegúrese de haber agregado la siguiente configuración en el archivo postgresql.conf (estos cambios requieren reiniciar el servicio).

archive_mode = on
archive_command = 'pgbackrest --stanza=testing archive-push %p'
max_wal_senders = 3
wal_level = logical

Ahora, hagamos una copia de seguridad básica. Primero, necesitamos crear una "estrofa", que defina la configuración de la copia de seguridad para un clúster de base de datos PostgreSQL o TimescaleDB específico. La sección de stanza debe definir la ruta del clúster de la base de datos y el host/usuario si el clúster de la base de datos es remoto.

$ pgbackrest --stanza=testing --log-level-console=info stanza-create
2019-04-29 21:46:36.922 P00   INFO: stanza-create command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:46:37.475 P00   INFO: stanza-create command end: completed successfully (554ms)

Y luego, podemos ejecutar el comando de verificación para validar la configuración.

$ pgbackrest --stanza=testing --log-level-console=info check
2019-04-29 21:51:09.893 P00   INFO: check command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:51:12.090 P00   INFO: WAL segment 000000010000000000000001 successfully stored in the archive at '/var/lib/pgbackrest/archive/testing/11-1/0000000100000000/000000010000000000000001-f29875cffe780f9e9d9debeb0b44d945a5165409.gz'
2019-04-29 21:51:12.090 P00   INFO: check command end: completed successfully (2197ms)

Para realizar la copia de seguridad, ejecute el siguiente comando:

$ pgbackrest --stanza=testing --type=full --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=full
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 15:43:21": backup begins after the next regular checkpoint completes
INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
WARN: aborted backup 20190429-215508F of same type exists, will be cleaned to remove invalid files and resumed
INFO: backup file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: full backup size = 31.8MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000130
INFO: new backup label = 20190429-215508F
INFO: backup command end: completed successfully (12810ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (10ms)

Ahora, tenemos la copia de seguridad terminada con el resultado "completado con éxito", así que vamos a restaurarla. Detendremos el servicio postgresql-11.

$ service postgresql-11 stop
Redirecting to /bin/systemctl stop postgresql-11.service

Y deja el directorio de datos vacío.

$ rm -rf /var/lib/pgsql/11/data/*

Ahora, ejecuta el siguiente comando:

$ pgbackrest --stanza=testing --log-level-stderr=info restore
INFO: restore command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
INFO: restore backup set 20190429-215508F
INFO: restore file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: write /var/lib/pgsql/11/data/recovery.conf
INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
INFO: restore command end: completed successfully (10819ms)

Luego, inicie el servicio postgresql-11.

$ service postgresql-11 stop

Y ahora tenemos nuestra base de datos funcionando.

$ psql -U app_user world
world=> select * from city limit 5;
 id |      name      | countrycode |   district    | population
----+----------------+-------------+---------------+------------
  1 | Kabul          | AFG         | Kabol         |    1780000
  2 | Qandahar       | AFG         | Qandahar      |     237500
  3 | Herat          | AFG         | Herat         |     186800
  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800
  5 | Amsterdam      | NLD         | Noord-Holland |     731200
(5 rows)

Ahora, veamos cómo podemos realizar una copia de seguridad diferencial.

$ pgbackrest --stanza=testing --type=diff --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=diff
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: last backup label = 20190429-215508F, version = 2.13
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 21:22:58": backup begins after the next regular checkpoint completes
INFO: backup start archive = 00000002000000000000000B, lsn = 0/B000028
WARN: a timeline switch has occurred since the last backup, enabling delta checksum
INFO: backup file /var/lib/pgsql/11/data/base/16429/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/16429/2608 (448KB, 8%) checksum 53bd7995dc4d29226b1ad645995405e0a96a4a7b
. . .
INFO: diff backup size = 40.1MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 00000002000000000000000B, lsn = 0/B000130
INFO: new backup label = 20190429-215508F_20190430-212258D
INFO: backup command end: completed successfully (23982ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (14ms)

Para copias de seguridad más complejas, puede seguir la guía del usuario de pgBackRest.

Como mencionamos anteriormente, puede usar la línea de comando o los archivos de configuración para administrar sus copias de seguridad.

Cómo usar pgBackRest en ClusterControl

Desde la versión 1.7.2, ClusterControl agregó soporte para pgBackRest para realizar copias de seguridad de las bases de datos PostgreSQL y TimescaleDB, así que veamos cómo podemos usarlo desde ClusterControl.

Crear una copia de seguridad

Para esta tarea, vaya a ClusterControl -> Seleccionar clúster -> Copia de seguridad -> Crear copia de seguridad.

Podemos crear una nueva copia de seguridad o configurar una programada. Para nuestro ejemplo, crearemos una única copia de seguridad al instante.

Debemos elegir un método, el servidor desde el que se realizará la copia de seguridad y dónde queremos almacenar la copia de seguridad. También podemos subir nuestra copia de seguridad a la nube (AWS, Google o Azure) habilitando el botón correspondiente.

En este caso, elegiremos el método pgbackrestfull para realizar una copia de seguridad completa inicial. Al seleccionar esta opción, veremos la siguiente nota roja:

"Durante el primer intento de hacer una copia de seguridad de pgBackRest, ClusterControl reconfigurará el nodo (implementa y configura pgBackRest) y luego el nodo db debe reiniciarse primero".

Así que, por favor, tómalo en cuenta para el primer intento de copia de seguridad.

Luego especificamos el uso de compresión y el nivel de compresión para nuestra copia de seguridad.

En la sección de copia de seguridad, podemos ver el progreso de la copia de seguridad e información como el método, el tamaño, la ubicación y más.

Los pasos son los mismos para crear un diferencial de copia de seguridad incremental. Solo necesitamos elegir el método deseado durante la creación de la copia de seguridad.

Restauración de una copia de seguridad

Una vez finalizada la copia de seguridad, podemos restaurarla usando ClusterControl. Para ello, en nuestra sección de copia de seguridad (ClusterControl -> Seleccionar Clúster -> Copia de seguridad), podemos seleccionar "Restaurar copia de seguridad", o directamente "Restaurar" sobre la copia de seguridad que queremos restaurar.

Tenemos tres opciones para restaurar la copia de seguridad. Podemos restaurar la copia de seguridad en un nodo de base de datos existente, restaurar y verificar la copia de seguridad en un host independiente o crear un nuevo clúster a partir de la copia de seguridad.

Si elegimos la opción Restaurar en el nodo, debemos especificar el nodo principal, ya que es el único en el que se puede escribir en el clúster.

Podemos monitorear el progreso de nuestra restauración desde la sección Actividad en nuestro ClusterControl.

Verificación de copia de seguridad automática

Una copia de seguridad no es una copia de seguridad si no es restaurable. La verificación de las copias de seguridad es algo que muchos suelen descuidar. Veamos cómo ClusterControl puede automatizar la verificación de las copias de seguridad de PostgreSQL y TimescaleDB y ayudar a evitar sorpresas.

En ClusterControl, seleccione su clúster y vaya a la sección "Copia de seguridad", luego seleccione "Crear copia de seguridad".

La función de copia de seguridad de verificación automática está disponible para las copias de seguridad programadas. Entonces, elijamos la opción "Programar copia de seguridad".

Al programar una copia de seguridad, además de seleccionar las opciones comunes como el método o el almacenamiento, también debemos especificar la programación/frecuencia.

En el siguiente paso, podemos comprimir nuestra copia de seguridad y habilitar la función "Verificar copia de seguridad".

Para usar esta característica, necesitamos un host dedicado (o VM) que no sea parte del clúster.

ClusterControl instalará el software y restaurará la copia de seguridad en este host. Después de la restauración, podemos ver el icono de verificación en la sección Copia de seguridad de ClusterControl.

Recomendaciones

También hay algunos consejos que podemos tener en cuenta a la hora de crear nuestras copias de seguridad:

  • Almacene la copia de seguridad en una ubicación remota:no debemos almacenar la copia de seguridad en el servidor de la base de datos. En caso de falla del servidor, podríamos perder la base de datos y la copia de seguridad al mismo tiempo.
  • Mantenga una copia de la última copia de seguridad en el servidor de la base de datos:esto podría ser útil para una recuperación más rápida.
  • Utilice copias de seguridad incrementales/diferenciales:para reducir el tiempo de recuperación de la copia de seguridad y el uso del espacio en disco.
  • Copia de seguridad de las WAL:si necesitamos restaurar una base de datos desde la última copia de seguridad, si solo la restaura, perderá los cambios desde que se realizó la copia de seguridad hasta el momento de la restauración, pero si tenemos las WAL, podemos aplicar los cambios y podemos usar PITR.
  • Utilice copias de seguridad tanto lógicas como físicas:ambas son necesarias por diferentes motivos, por ejemplo, si queremos restaurar solo una base de datos/tabla, no necesitamos la copia de seguridad física, solo necesitamos la copia de seguridad lógica y ser aún más rápido que restaurar todo el servidor.
  • Tomar copias de seguridad de los nodos en espera (si es posible):para evitar una carga adicional en el nodo principal, es una buena práctica tomar la copia de seguridad del servidor en espera.
  • Pruebe sus copias de seguridad:la confirmación de que se ha realizado la copia de seguridad no es suficiente para asegurarse de que funciona. Deberíamos restaurarlo en un servidor independiente y probarlo para evitar una sorpresa en caso de falla.

Conclusión

Como pudimos ver, pgBackRest es una buena opción para mejorar nuestra estrategia de copias de seguridad. Le ayuda a proteger sus datos y podría ser útil para alcanzar el RTO al reducir el tiempo de inactividad en caso de falla. Las copias de seguridad incrementales pueden ayudar a reducir la cantidad de tiempo y espacio de almacenamiento utilizado para el proceso de copia de seguridad. ClusterControl puede ayudar a automatizar el proceso de copia de seguridad de sus bases de datos PostgreSQL y TimescaleDB y, en caso de falla, restaurarlo con unos pocos clics.