Hola, soy Alexander Nikitin, administrador jefe de sistemas de BARS Group. En este artículo, quiero presentarle la herramienta pg_probackup .
Pg_probackup es un desarrollo de Postgres Professional que ayuda a realizar copias de seguridad de PostgreSQL DBMS. A diferencia de la utilidad pg_basebackup estándar, esta herramienta le permite crear copias de seguridad incrementales a nivel de bloque de datos (8 Kb por defecto), validar copias de seguridad y DBMS, establecer políticas de almacenamiento y mucho más.
En este artículo, no pretendo describir todos los aspectos posibles de trabajar con pg_probackup, solo quiero dar una idea de cómo puede utilizar esta herramienta en su trabajo.
Se considerarán los siguientes casos de uso:
- wal-
1
Dado: Tenemos dos servidores (OS CentOS 7), en el primero tenemos nuestra base de datos (nombre de host srv_db1, usuario postgres, PostgreSQL 12.4 está instalado), y en el segundo almacenaremos copias de seguridad (nombre de host srv_bkp, usuario backup_user).
Debe configurar la copia de seguridad para que las copias del clúster de PostgreSQL se almacenen en el servidor srv_bkp.
Solución:
pg_probackup puede funcionar a través de ssh, lanzando agentes en un host remoto que usa una conexión ssh como canal de comunicación y transporte. En consecuencia, debe asegurarse de que backup_user en el host srv_bkp pueda conectarse al usuario de postgres en el host srv_db1.
1) Conéctese a srv_bkp con backup_user y ejecute los siguientes comandos:
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
Active el modo paranoico y edite el archivo ~ / .ssh / authorized_keys en el servidor srv_db1
Antes de la línea con las claves, inserte lo siguiente:
command="pg_probackup-12 agent"
Entonces deberías terminar con algo como esto:
command="pg_probackup-12 agent" ssh-rsa AAAA....
Con esto decimos que nada más que el "agente pg_probackup-12" se puede iniciar a través de SSH (puede leer más sobre esto aquí ).
2) Instalamos pg_probackup en ambas máquinas (en el ejemplo estamos trabajando en CentOS, pero para otras distribuciones el proceso de instalación se describe en la documentación ):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
Se instalará la última versión disponible de pg_probackup, en el momento de escribir este artículo: 2.4.2.
3) cree un alias en srv_bkp (esto no es necesario, pero es más conveniente) y defina una variable que contenga la ruta al directorio con copias de seguridad (después de crear este directorio):
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
cargar el perfil
. .bash_profile
4) en srv_bkp, inicialice el directorio de respaldo y agregue una nueva instancia:
pg_probackup init
Agregue la instancia de PostgreSQL al directorio, asígnele el nombre db1, especifique los parámetros de conexión ssh: host, nombre de usuario y ruta a PGDATA.
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
Si aparece la línea
INFO: Instance 'db1' successfully inited
Entonces la inicialización fue exitosa.
Definamos una política para la retención de copias de seguridad:
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
La política resultante se reduce a lo siguiente:
es necesario mantener todas las copias de seguridad en menos de 7 días,
mientras que la cantidad de copias de seguridad completas debe ser de al menos dos
5) Para crear copias de seguridad, debe conectarse a un DBMS, por lo que creamos una base de datos en el clúster de PostgreSQL al que se producirá la conexión para gestionar el proceso de copia de seguridad (desde el punto de vista de la seguridad, esto es mejor que conectarse a una base de datos de productos), y también cambiar los parámetros de la base de datos:
$ createdb backupdb
unirse a una nueva base de datos
psql -d backupdb
Cree un rol de base de datos en nombre del cual se administrará el proceso de respaldo:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
Prestemos atención al parámetro listen_addresses:
show listen_addresses;
si localhost, cambie a *
alter system set listen_addresses='*';
Si cambió listen_addresses, debe reiniciar PostgreSQL.
Veamos dónde hemos ubicado el archivo pg_hba.conf
psql –c 'show hba_file'
Agregue las siguientes reglas a pg_hba.conf:
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
Volvemos a leer la configuración:
psql -c 'select pg_reload_conf()'
Verificamos si hubo errores tipográficos:
psql -c 'select * from pg_hba_file_rules'
En srv_bkp, en el directorio de inicio del usuario backup_user, creamos un archivo en el que escribimos el nombre del servidor o su dirección IP, puerto, nombre de la base de datos, nombre de usuario y contraseña. Este archivo es necesario para que la contraseña se ingrese automáticamente al crear una copia de seguridad.
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
Establezca los derechos de acceso necesarios a este archivo
chmod 600 ~/.pgpass
Y crea la primera copia de seguridad:
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
Si hicimos todo correctamente, aparecerá algo como esto en la pantalla:
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
Preste atención a la advertencia emitida por pg_probackup: la verificación de la suma de verificación no está habilitada en nuestro clúster, por lo que no puede verificar la corrección de los bloques de datos. En otras palabras, no está protegido del hecho de que los bloques de datos defectuosos no entren en la copia de seguridad.
Veamos la configuración actual:
pg_probackup show-config --instance db1
Ahora acortemos el comando para crear copias de seguridad; escribiremos algunos de los parámetros en la configuración de la instancia db1:
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
Comparemos: cómo fue y cómo se convirtió
pg_probackup show-config --instance db1
Era | Se ha convertido |
---|---|
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Parámetros de compresión compress-algorítm = ninguno compress-level = 1 # Parámetros de acceso remoto remote-proto = ssh remote-host = srv_db1 remote-user = postgres |
Hagamos una copia incremental en modo DELTA sin especificar los parámetros establecidos en la configuración:
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
Veamos que tenemos
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
Hay mucha información, se puede encontrar una descripción detallada en la documentación , sin embargo, detengámonos en algunos puntos:
Tiempo de recuperación : el tiempo mínimo durante el cual puede recuperarse usando este
Modo de copia de seguridad : el modo en el que se realizó la copia, actualmente 4 están disponibles modos: uno completo (FULL) y tres incrementales (PAGE, DELTA y PTRACK)
Modo WAL- Las siguientes opciones son posibles aquí - STREAM y ARCHIVE. Las copias creadas en modo STREAM contienen todos los archivos necesarios para la recuperación a un estado WAL consistente. Solo para que este modo funcione, fue necesario otorgar el rol de REPLICACIÓN a nuestro usuario de respaldo. El modo ARCHIVE asume que hemos configurado el archivo WAL, y luego los archivos WAL necesarios se ubicarán en la ruta conocida para pg_probackup.
Estado : hay muchos estados, todos se describen en la documentación, pero si vemos algo diferente de OK, entonces tiene sentido ir a la documentación y ver qué salió mal.
Como habrás adivinado, podemos analizar la salida del comando pg_probackup show y obtener el estado de la última copia de seguridad realizada, procesarla y enviarla al sistema de monitoreo, y allí ya podemos configurar las reglas por las que se disparará la notificación de los empleados responsables del DBMS.
Creemos un script bkp_base.sh que iniciará la copia de seguridad y enviará el resultado al sistema de monitoreo:
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
Escribimos una llamada al script resultante en crontab, por ejemplo, puede establecer el siguiente horario:
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
Esto completa la solución de la primera tarea: hemos configurado la copia de seguridad, definido la política de retención de copias. También enviamos el estado de las copias de seguridad al sistema de monitoreo.
En la siguiente parte, veremos cómo crear un archivo de archivo wal y crear copias de seguridad de archivos.