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

Uso de Barman para la recuperación ante desastres de PostgreSQL

Debe haber muchas herramientas poderosas disponibles como opción de respaldo y restauración para PostgreSQL en general; Barman, PgBackRest, BART son, por nombrar algunos, en este contexto. Lo que nos llamó la atención fue que Barman es una herramienta que se está poniendo al día rápidamente con el despliegue de producción y las tendencias del mercado.

Ya sea una implementación basada en Docker, la necesidad de almacenar copias de seguridad en un almacenamiento en la nube diferente o las necesidades de una arquitectura de recuperación ante desastres altamente personalizable, Barman es un competidor muy fuerte en todos estos casos.

Este blog explora Barman con pocas suposiciones sobre la implementación, sin embargo, en ningún caso, esto debe considerarse como un conjunto posible de características. Barman está mucho más allá de lo que podemos capturar en este blog y debe explorarse más a fondo si se considera la "copia de seguridad y restauración de la instancia de PostgreSQL".

Suposición de implementación DR Ready 

RPO=0 generalmente tiene un costo:la implementación del servidor en espera síncrono a menudo cumpliría con eso, pero luego afecta el TPS del servidor principal con bastante frecuencia.

Al igual que PostgreSQL, Barman ofrece numerosas opciones de implementación para satisfacer sus necesidades cuando se trata de RPO frente a rendimiento. Piense en la simplicidad de implementación, RPO=0 o ​​un impacto de rendimiento casi nulo; Barman cabe en todos.

Consideramos la siguiente implementación para establecer una solución de recuperación ante desastres para nuestra arquitectura de respaldo y restauración.

Figura 1:Implementación de PostgreSQL con Barman

Hay dos sitios (como en general para sitios de recuperación de desastres) - Sitio-X y Sitio-Y.

En Site-X hay:

  • Un servidor 'pgServer' que aloja una instancia de servidor PostgreSQL pgServer y un usuario de sistema operativo 'postgres' 
    • Instancia de PostgreSQL también para albergar un rol de superusuario 'bmuser'
  • Un servidor 'bServer' que aloja los archivos binarios de Barman y un usuario de sistema operativo 'bmuser'

En el Sitio-Y hay:

  • Un servidor 'geobServer' que aloja los archivos binarios de Barman y un usuario de sistema operativo 'bmuser'

Hay varios tipos de conexión involucrados en esta configuración.

  • Entre 'bServer' y 'pgServer':
    • Conectividad del plano de administración de Barman a la instancia de PostgreSQL
    • conectividad rsync para hacer una copia de seguridad base real desde Barman a la instancia de PostgreSQL
    • Archivado WAL mediante barman-wal-archive desde la instancia de PostgreSQL a Barman
    • Transmisión WAL usando pg_receivexlog en Barman
  • Entre 'bServer' y 'geobserver':
    • Sincronización entre servidores Barman para proporcionar replicación geográfica

Conectividad primero 

La principal necesidad de conectividad entre los servidores es a través de ssh. Para hacerlo sin contraseña, se utilizan claves ssh. Establezcamos las claves ssh e intercambiémoslas.

En pgServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

En bServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

En geobServer:

[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null

[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"

Configuración de la instancia de PostgreSQL 

Hay dos cosas principales que necesitamos para reconstituir una instancia de postgres:el directorio base y los registros WAL / Transactions generados a partir de entonces. El servidor Barman realiza un seguimiento inteligente de ellos. Lo que necesitamos es asegurarnos de que se generen los feeds adecuados para que Barman recolecte estos artefactos.

Agregue las siguientes líneas a postgresql.conf:

listen_addresses = '172.25.130.180'     #as per above deployment assumption

wal_level = replica                     #or higher 

archive_mode = on

archive_command = 'barman-wal-archive -U bmuser bserver pgserver %p'

El comando Archivar garantiza que cuando la instancia de postgres va a archivar WAL, la utilidad barman-wal-archive lo envía al servidor Barman. Cabe señalar que el paquete barman-cli, por lo tanto, debe estar disponible en 'pgServer'. Hay otra opción de usar rsync si no queremos usar la utilidad barman-wal-archive.

Agregue lo siguiente a pg_hba.conf:

host     all                    all     172.25.130.186/32     md5

host     replication            all     172.25.130.186/32     md5

Básicamente permite una replicación y una conexión normal desde 'bmserver' a esta instancia de postgres.

Ahora simplemente reinicie la instancia y cree un rol de superusuario llamado bmuser:

[email protected]$ pg_ctl restart

[email protected]$ createuser -s -P bmuser 

Si es necesario, también podemos evitar usar bmuser como superusuario; eso necesitaría privilegios asignados a este usuario. Para el ejemplo anterior, también usamos bmuser como contraseña. Pero eso es prácticamente todo, en lo que respecta a la configuración de una instancia de PostgreSQL.

Configuración del barman 

Barman tiene tres componentes básicos en su configuración:

  • Configuración global 
  • Configuración de nivel de servidor 
  • Usuario que ejecutará el barman 

 En nuestro caso, dado que Barman se instaló mediante rpm, nuestros archivos de configuración global se almacenaron en:

/etc/barman.conf

Queríamos almacenar la configuración de nivel de servidor en el directorio de inicio de bmuser, por lo tanto, nuestro archivo de configuración global tenía el siguiente contenido:

[barman]

barman_user = bmuser

configuration_files_directory = /home/bmuser/barman.d

barman_home = /home/bmuser

barman_lock_directory = /home/bmuser/run

log_file = /home/bmuser/barman.log

log_level = INFO

Configuración del servidor primario de Barman 

En la implementación anterior, decidimos mantener el servidor Barman principal en el mismo centro de datos/sitio donde se guarda la instancia de PostgreSQL. El beneficio del mismo es que hay menos retraso y una recuperación más rápida en caso de ser necesario. No hace falta decir que también se requieren menos necesidades informáticas y/o de ancho de banda de red en el servidor PostgreSQL.

Para permitir que Barman administre la instancia de PostgreSQL en pgServer, debemos agregar un archivo de configuración (llamamos pgserver.conf) con el siguiente contenido:

[pgserver]

description =  "Example pgserver configuration"

ssh_command = ssh [email protected]

conninfo = host=pgserver user=bmuser dbname=postgres

backup_method = rsync

reuse_backup = link

backup_options = concurrent_backup

parallel_jobs = 2

archiver = on

archiver_batch_size = 50

path_prefix = "/usr/pgsql-12/bin"



streaming_conninfo = host=pgserver user=bmuser dbname=postgres

streaming_archiver=on

create_slot = auto

Y un archivo .pgpass que contiene las credenciales para bmuser en la instancia de PostgreSQL:

echo 'pgserver:5432:*:bmuser:bmuser' > ~/.pgpass 

Para comprender un poco más los elementos de configuración importantes:

  • comando_ssh :se utiliza para establecer una conexión a través de la cual se realizará rsync 
  • conninfo :Cadena de conexión para permitir que Barman establezca una conexión con el servidor postgres
  • reutilización_copia de seguridad :para permitir copias de seguridad incrementales con menos almacenamiento 
  • método_de_respaldo :método para realizar una copia de seguridad del directorio base
  • ruta_prefijo :ubicación donde se almacenan los binarios pg_receivexlog 
  • streaming_conninfo :cadena de conexión utilizada para transmitir WAL 
  • create_slot :para asegurarse de que las ranuras hayan sido creadas por la instancia de postgres 

Configuración del servidor Barman pasivo 

La configuración de un sitio de replicación geográfica es bastante simple. Todo lo que necesita es una información de conexión ssh sobre la cual este sitio de nodo pasivo realizará la replicación.

Lo interesante es que un nodo tan pasivo puede funcionar en modo mixto; en otras palabras, pueden actuar como servidores Barman activos para realizar copias de seguridad de los sitios PostgreSQL y, en paralelo, actuar como un sitio de replicación/en cascada para otros servidores Barman.

Dado que, en nuestro caso, esta instancia de Barman (en el Sitio-Y) debe ser solo un nodo pasivo, todo lo que necesitamos es crear el archivo /home/bmuser/barman.d/pgserver.conf con la siguiente configuración:

[pgserver]

description =  "Geo-replication or sync for pgserver"

primary_ssh_command = ssh [email protected]

Suponiendo que las claves se intercambiaron y la configuración global en este nodo se realizó como se mencionó anteriormente, casi hemos terminado con la configuración.

Y aquí está nuestra primera copia de seguridad y restauración 

En el servidor b, asegúrese de que se haya activado el proceso en segundo plano para recibir WAL; y luego verifique la configuración del servidor:

[email protected]$ barman cron

[email protected]$ barman check pgserver

La verificación debería estar bien para todos los subpasos. De lo contrario, consulte /home/bmuser/barman.log.

Emita el comando de copia de seguridad en Barman para asegurarse de que haya DATOS base en los que se pueda aplicar WAL:

[email protected]$ barman backup pgserver

En el 'geobmserver', asegúrese de que la replicación se realice ejecutando los siguientes comandos:

[email protected]$ barman cron 

[email protected]$ barman list-backup pgserver

El cron debe insertarse en el archivo crontab (si no está presente). En aras de la simplicidad, no lo he mostrado aquí. El último comando mostrará que la carpeta de copia de seguridad también se ha creado en el geobmserver.

Ahora, en la instancia de Postgres, creemos algunos datos ficticios:

[email protected]$ psql -U postgres -c "CREATE TABLE dummy_data( i INTEGER);"

[email protected]$ psql -U postgres -c "insert into dummy_data values ( generate_series (1, 1000000 ));"

La replicación de WAL desde la instancia de PostgreSQL se puede ver usando el siguiente comando:

[email protected]$ psql -U postgres -c "SELECT * from pg_stat_replication ;”

Para volver a crear una instancia en el Sitio-Y, primero asegúrese de que los registros WAL se cambien. o este ejemplo, para crear una recuperación limpia:

[email protected]$ barman switch-xlog --force --archive pgserver

En Site-X, abramos una instancia de PostgreSQL independiente para verificar si la copia de seguridad es correcta:

[email protected]$ barman cron 

barman recover --get-wal pgserver latest /tmp/data

Ahora, edite los archivos postgresql.conf y postgresql.auto.conf según sus necesidades. A continuación, explique los cambios realizados para este ejemplo:

  • postgresql.conf :listen_addresses comentado de forma predeterminada en localhost
  • postgresql.auto.conf :eliminado sudo bmuser de restore_command 

Revise estos DATOS en /tmp/data y verifique la existencia de sus registros.

Conclusión

Esto fue solo la punta de un iceberg. Barman es mucho más profundo que esto debido a la funcionalidad que proporciona, p. actuando como espera sincronizada, secuencias de comandos de enlace, etc. No hace falta decir que se debe explorar la documentación en su totalidad para configurarla según las necesidades de su entorno de producción.