Copias de seguridad incrementales de PostgreSQL con pgBackRest. Parte 2. Cifrado, arranque en S3, restauración en un servidor nuevo, PITR

Este artículo es una continuación del artículo "Copias de seguridad incrementales de Postgresql con pgbackrest: el curso de un joven soldado del desarrollador".



En la primera parte, aprendimos cómo hacer copias de seguridad incrementales, subirlas a un servidor remoto (repositorio con copias de seguridad) y volver a la última copia de seguridad.

En este artículo, aprenderemos cómo cifrar copias de seguridad, cargarlas en un almacenamiento compatible con S3 (en lugar de un segundo servidor de repositorio), recuperarlas en un clúster limpio y, finalmente, recuperar un punto en el tiempo (PITR).


Momento El



autor no pretende ser un DBA, pero a veces le gusta configurar y ver todo él mismo.



Formación



Para reproducir este manual, necesitamos:



  1. Un servidor con una base de datos (instalaremos pgbackrest en él);
  2. Almacenamiento S3 (puede usar Amazon o cualquier compatible con S3, usaré Amazon S3);
  3. Tercer servidor. Opcional. En él, practicaremos la implementación de postgresql y pgbackrest desde cero, implementando una copia de seguridad existente desde el almacenamiento S3 (el servidor se quemó, se movió, etc.);


Se supone que ya tiene instalado postgresql y, por lo tanto, el usuario de postgres también existe.



Describí el proceso de instalación de pgbackrest en el artículo anterior, pero en caso de que lo vuelva a duplicar (te recuerdo: antes de instalar, crea un usuario sudo para ti mismo; usaré un usuario sudo con el nombre de usuario pgbackrest).



Para que tengas menos problemas a la hora de reproducir las instrucciones, escribo en cursiva dónde, por qué usuario y con qué derechos ejecuté el comando al escribir y revisar el artículo.



Seguiremos este camino:



Configurar postgresql y pgbackrest Configurar el

cifrado de respaldos (dos líneas)

Aprender a respaldar y enviar al almacenamiento S3 (cinco líneas)

Hacer un respaldo

Imaginemos que hemos roto el clúster, implementamos en un nuevo servidor, conectamos el repositorio de S3 existente y

acumulamos la copia de seguridad.Miremos PITR (Point In Time Recovery): nos recuperaremos hasta un cierto punto en el tiempo (digamos que pgbackrest ya ha realizado una copia de seguridad de la tabla desplegable, pero necesitamos retroceder 4 horas. cuando la señal aún existía)



¡Vamos!



Instalación de pgBackRest



usuario sudo o root:



1. Descargue el archivo de pgbackrest y transfiera su contenido a la carpeta / build:



sudo mkdir /build
sudo wget -q -O - \
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \
       sudo tar zx -C /build


2. Instale las dependencias necesarias para construir:



sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \
       libpq-dev


3. Montaje del pgbackrest:



cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src


4. Copie el archivo ejecutable en el directorio / usr / bin:



sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest


5.pgBackRest requiere perl. Instalar en pc:



sudo apt-get install perl


6. Cree directorios para registros, concédales ciertos derechos:



sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf


7. Compruebe:



pgbackrest version


Configuración de postgresql y pgBackRest



sudo usuario o root:



1. Realice los ajustes necesarios en postgresql.conf (se encuentra en la carpeta / etc / postgresql / 11 / main) para que pgBackRest funcione:



archive_command = 'pgbackrest --stanza=main archive-push %p' #  main -  .   postgres    main.
archive_mode = on
max_wal_senders = 3
wal_level = replica


2. Hagamos los ajustes necesarios en el archivo de configuración pgbackrest (/etc/pgbackrest/pgbackrest.conf):



[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-cipher-pass=tr5+BXdfdoxeyUqfo6AzLTrW+c+Jfd/1QbQj2CDMMBwtB0YGH3EJajry4+Eeen6D
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # ,     . ..           ,      .    "     " -     .
repo1-type=s3
repo1-s3-bucket=pgbackrest-part2-tutorial
repo1-s3-endpoint=s3.us-east-1.amazonaws.com
repo1-s3-region=us-east-1
repo1-s3-key=9wdS3G8U5wz7kNsFWVGck7DDZ7DtVDtbM
repo1-s3-key-secret=A9zRmW16zXKt2vVA8mmNsFWy2mUAPYHa
start-fast=y

[global:archive-push]
compress-level=3


Como comprenderá, aquí configuramos inmediatamente el cifrado y configuramos el soporte para el almacenamiento S3.



PD: No debería haber ningún comentario en la configuración.

PD Para generar una clave de cifrado segura, puede usar el comando:



openssl rand -base64 48


Creación de repositorios



usuario sudo o root:



sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R postgres /var/lib/pgbackrest/
sudo -u postgres pgbackrest --stanza=main stanza-create


Si todo salió bien, en el bucket de S3 verá los archivos que generó pgbackrest.



Hacer una copia de seguridad:



usuario sudo o root:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


pgBackRest creará la primera copia de seguridad completa. Si lo desea, puede ejecutar el comando de copia de seguridad nuevamente y asegurarse de que el sistema creará una copia de seguridad incremental.



Si desea volver a hacer una copia de seguridad completa, especifique una marca adicional:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main --type=full backup


Puede ver la lista de copias de seguridad con el comando:



sudo -u postgres pgbackrest --stanza=main info




Restaurando la copia de seguridad:



sudo usuario o root:



1. Detenga el clúster en ejecución:



sudo pg_ctlcluster 11 main stop


2. Recuperación de una copia de seguridad:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore


Para restaurar la base de datos al estado de la última copia de seguridad COMPLETA, use el comando sin especificar recovery_target:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore


¡Importante! Después de la recuperación, puede resultar que la base de datos se cuelgue en modo de recuperación (habrá errores como ERROR: no se puede ejecutar DROP DATABASE en una transacción de solo lectura). Se resuelve de la siguiente manera (deberá esperar un poco después de ejecutar el comando):



sudo -u postgres psql -c "select pg_wal_replay_resume()"


UPD: Según tengo entendido, este error se produce debido al hecho de que después de la recuperación con recovery_target = installed, pgbackrest pausa la base de datos . Para evitar esto, debe especificar adicionalmente algunas banderas (puede leer su significado aquí y aquí ):



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore


De hecho, es posible restaurar una copia de seguridad específica por su nombre. Aquí solo proporcionaré un enlace a la descripción de esta función en la documentación . Los desarrolladores aconsejan usar este parámetro con precaución y explican por qué. Por mi cuenta, puedo agregar que lo usé. Lo principal es asegurarse de que después de la recuperación, la base de datos salió del modo de recuperación (seleccione pg_is_in_recovery () debería mostrar "f") y, por si acaso, haga una copia de seguridad completa después de la recuperación.



3. Inicie el clúster:



sudo pg_ctlcluster 11 main start


Después de restaurar la copia de seguridad, realizaremos una segunda copia de seguridad:

sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


Restaurar la copia de seguridad a un clúster limpio:



Imaginemos que sucedió algo terrible: el servidor se quemó (se cayó, se inundó, perdió el acceso). Necesita restaurar todo a un servidor nuevo y limpio. En el nuevo servidor, ya hemos creado un usuario sudo, instalado pgbackrest, instalado postgresql y tenemos un clúster principal limpio y fresco.



Todo lo que tenemos que hacer es configurar postgresql y pgBackRest de la misma manera que en el servidor anterior, reiniciar postgresql y ejecutar el orden de comando similar a restore:



sudo user o root:



1. Detenga el clúster en ejecución:



sudo pg_ctlcluster 11 main stop


2. Recuperación de una copia de seguridad:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate  --target-action=promote --type=immediate restore


PD: describí los matices y sutilezas de este comando arriba. 



3. Inicie el clúster:



sudo pg_ctlcluster 11 main start


Después de restaurar la copia de seguridad, necesitamos realizar una segunda copia de seguridad:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


Eso, de hecho, es todo. El fuego se apaga.



Recuperación en un momento determinado (PITR)



Imaginemos una situación tal que a las 16:00 se creó una copia de seguridad, y a las 18:05 borramos accidentalmente una placa importante en la que lograron entrar en 2 horas una gran cantidad de datos importantes que no querríamos perder. PgBackRest a expensas de PostgreSQL nos brinda esa oportunidad: podemos retroceder a un punto específico en el tiempo, siempre que tengamos suficiente información para recuperar.



Funciona así:



  1. Decimos que queremos retroceder a la hora 18:04;
  2. pgBackRest busca la última copia de seguridad actual (16:00);
  3. Lo restaura, pero no todo se reinicia, solo lo que logramos hacer antes de 18.04;


PD: este mecanismo se basa en registros WAL. Puedes leerlo aquí .



Puede realizar la recuperación a un punto específico en el tiempo (después de detener el clúster) con este comando:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore


Nota importante: PostgreSQL solo puede reproducir registros de WAL hacia adelante, no hacia atrás. ¿Qué significa esto en la práctica?



Digamos que se creó una copia de seguridad a las 16:00. A las 18:05 eliminamos accidentalmente la tabla, ya las 18:10 se creó una copia de seguridad nuevamente con la tabla ya eliminada. Cuando intente hacer un PITR, pgBackRest tomará la copia de seguridad que se creó a las 16:00 y renovará todo lo que fue antes de las 18:05, y no tomará la copia de seguridad que se creó a las 18:10 y lo hará todo. Es importante comprender esto. Este mecanismo se describe con más detalle aquí .



Suponga que realizó una copia de seguridad, que ya contiene información sobre cómo eliminar una tabla. Usando la marca --set, digamos qué copia de seguridad debería usarse para la base (aquella en la que la tabla estaba quieta). pgBackRest tomará esta copia de seguridad y renovará todo lo que estaba antes de que se eliminara la tabla.



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time --set=20200905-183838F_20200906-182612I "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore


PD: mostré el comando para obtener una lista de copias de seguridad arriba.



Comencemos el clúster. Después del lanzamiento, examinemos el archivo /var/log/postgresql/postgresql-11-main.log. En él, nos interesan las siguientes líneas, que muestran que la recuperación al punto especificado en el tiempo fue exitosa:



starting point-in-time recovery to 2020-09-07 11:26:52.493127+02
...
recovery stopping before commit of transaction 576, time 2020-09-07 11:27:14.584496+02
...
last completed transaction was at log time 2020-09-07 11:24:09.583761+02


Eso es todo. Te recomiendo encarecidamente que experimentes con esta herramienta antes de usarla en combate.



All Articles