Copias de seguridad incrementales de Postgresql con pgbackrest: un curso de luchador joven del desarrollador

Descargo de responsabilidad

Soy un desarrollador Escribo código, interactúo con la base de datos solo como usuario. En ningún caso pretendo ser administrador del sistema y, especialmente, dba. Pero ...

Resultó que necesitaba organizar una copia de seguridad de la base de datos postgresql. Sin nubes: mantén SSH y haz que funcione y no pidas dinero. ¿Qué hacemos en tales casos? Así es, empujamos pgdump a cron, todos los días hacemos copias de seguridad de todo en el archivo, y si nos hemos dispersado por completo, enviamos este archivo al infierno.

Esta vez, la dificultad fue que, según los planes, se suponía que la base crecería en aproximadamente + - 100 MB por día. Por supuesto, en un par de semanas, el deseo de hacer una copia de seguridad de todo con pgdump desaparecerá. Aquí las copias de seguridad incrementales vienen al rescate.

Interesante? Bienvenido a cat.

La copia de seguridad incremental es un tipo de copia de seguridad cuando no se realizan copias de seguridad de todos los archivos de origen, sino solo nuevas y modificadas desde que se creó la copia de seguridad anterior.
Al igual que cualquier desarrollador, TOTALMENTE no queriendo (en ese momento) comprender las complejidades de los postgres, quería encontrar un botón verde. Bueno, ya sabes, como en AWS, DigitalOcean: hice clic en un botón, obtuve replicación, hice clic en el segundo, configuró copias de seguridad y el tercero, retrocedió hace un par de horas. Botones y una hermosa herramienta GUI que no he encontrado. Si sabe esto (gratis o barato), escríbalo en los comentarios.

Buscando en Google, encontré dos herramientas pgbarman y pgbackrest . Simplemente no tuve un problema con el primero (documentación muy escasa, traté de plantear todo de acuerdo con los manuales antiguos), pero el segundo resultó estar a nivel, pero no sin fallas. Para simplificar el trabajo para aquellos que se enfrentan a una tarea similar y este artículo ha sido escrito.
Después de leer este artículo, aprenderá cómo hacer copias de seguridad incrementales, guardarlas en un servidor remoto (un repositorio con copias de seguridad) y restaurarlas en caso de pérdida de datos u otros problemas en el servidor principal.

Preparación


Para reproducir el manual necesitará dos VPS. El primero será el repositorio (el repositorio en el que se ubicarán las copias de seguridad), y el segundo, de hecho, el servidor con postgres (en mi caso, la versión 11 de postgres).

Se supone que en el servidor con postgres usted tiene root, sudo user, postgres user y postgres está instalado (postgres user se crea automáticamente cuando postgresql está instalado), y en el servidor de repositorio hay root y sudo user (el nombre de usuario pgbackrest se usará en el manual) .

Para que tenga menos problemas al reproducir las instrucciones, en cursiva escribo dónde, por qué usuario y con qué derechos ejecuté el comando mientras escribía y revisaba el artículo.

Instalar pgbackrest


Repositorio (usuario pgbackrest):

1. Descargue el archivo con 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 el ensamblaje:

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

3. Recopilamos 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:

 sudo apt-get install perl 

6. Crear directorios para registros, otorgarles derechos específicos:

 sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /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 pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

7. Verificar:

 pgbackrest version 

Servidor Postgres (usuario de sudo o root):

El proceso de instalación de pgbackrest en un servidor con postgres es similar al proceso de instalación en un repositorio (sí, pgbackrest debe estar en ambos servidores), pero en el sexto párrafo, el segundo y último comando:

 sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

reemplazar con:

 sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf 

Configurar la comunicación entre servidores a través de SSH sin contraseña


Para que pgbackrest funcione correctamente, debe configurar la interacción entre el servidor postgres y el repositorio utilizando el archivo de clave.

Repositorio (usuario pgbackrest):

Crea un par de claves:

 mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Atencion Ejecutamos los comandos anteriores sin sudo.

Servidor Postgres (usuario de sudo o root):

Crea un par de claves:

 sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Repositorio (usuario de sudo):

Copie la clave pública del servidor postgres en el servidor del repositorio:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | \ sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys 

En este paso, le pedirá la contraseña al usuario root. ¡Debe ingresar la contraseña de root del usuario del servidor postgres!

Servidor Postgres (usuario de sudo):

Copie la clave pública del repositorio al servidor con postgres:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | \ sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys 

En este paso, le pedirá la contraseña al usuario root. ¡Debe ingresar la contraseña de root del usuario del repositorio!

Comprobamos:

Repositorio (usuario root, para la pureza del experimento):

 sudo -u pgbackrest ssh postgres@<postgres_server_ip> 

Servidor Postgres (usuario root, por la pureza del experimento):

 sudo -u postgres ssh pgbackrest@<repository_server_ip> 

Nos aseguramos de tener acceso sin problemas.

Configurando el servidor postgres



Servidor Postgres (usuario de sudo o root):

1. "Golpeemos" en el servidor postgres desde una IP externa. Para hacer esto, edite el archivo postgresql.conf (ubicado en la carpeta / etc / postgresql / 11 / main), agregándole la línea:

 listen_addresses = '*' 

Si tal línea ya existe, descomente o establezca el valor del parámetro en '*'.

En el archivo pg_hba.conf (también ubicado en la carpeta / etc / postgresql / 11 / main ), agregue las siguientes líneas:

 hostssl all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 md5 

donde:

 hostssl/host -   SSL ( ) all -      all -  ,    () 0.0.0.0/0 -       md5 -    

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

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

3. Realice 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-host=<repository_server_ip> 

4. Reinicie postgresql:

 sudo service postgresql restart 

Configurar un servidor de repositorio


Repositorio (usuario de pgbackrest):

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

 [main] pg1-host=<postgres_server_ip> pg1-path=/var/lib/postgresql/11/main [global] repo1-path=/var/lib/pgbackrest repo1-retention-full=2 # ,     . ..            -       . start-fast=y #    ,       https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving 

Creación de almacenamiento


Repositorio (usuario de pgbackrest):

Cree un nuevo almacenamiento para el clúster principal :

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

Cheque


Servidor Postgres (usuario de sudo o root):

Verifique en el servidor postgres:

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

Repositorio (usuario de pgbackrest):

Verifique en el servidor del repositorio:

 sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check 

Nos aseguramos de que en la salida veamos la línea "check command end: complete exitosamente".

Estas cansado Pasamos a lo más interesante.

Hacer copia de seguridad


Repositorio (usuario de pgbackrest):


1. Realizamos copias de seguridad:

 sudo -u pgbackrest pgbackrest --stanza=main backup 

2. Nos aseguramos de que se haya creado la copia de seguridad:

 ls /var/lib/pgbackrest/backup/main/ 

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 cree una copia de seguridad incremental.

Si desea volver a realizar una copia de seguridad completa, especifique un indicador adicional:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full backup 

Si desea una salida detallada a la consola, también especifique:

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

Restaurar copia de seguridad


Servidor Postgres (usuario de sudo o root):

1. Detenga el clúster de trabajo:

 sudo pg_ctlcluster 11 main stop 

2. Nos recuperamos de la copia de seguridad:

 sudo -u postgres pgbackrest --stanza=main --delta restore 

3. Ejecute el clúster:

 sudo pg_ctlcluster 11 main start 

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

Repositorio (usuario de pgbackrest):

 sudo pgbackrest --stanza=main backup 

Eso es todo. En conclusión, quiero recordarles que en ningún caso estoy tratando de construirme un dba senior y, a la menor oportunidad, usaré nubes. Actualmente, yo mismo estoy comenzando a estudiar varios temas, como copia de seguridad, replicación, monitoreo, etc. y escribo pequeños informes sobre los resultados para hacer una pequeña contribución a la comunidad y dejar pequeñas cunas para mí.

En los siguientes artículos intentaré hablar sobre características adicionales: recuperación de datos en un clúster limpio, cifrado de copias de seguridad y publicación en S3, copias de seguridad a través de rsync.

Source: https://habr.com/ru/post/476206/


All Articles