1. pgBackRest
backup adabili e veloci
ing. Luca Ferrari, PhD
uca1978
https://fluca1978.github.io
12 Marzo 2021
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 1 / 32
2. Attribution-NonCommercial-ShareAlike 4.0
This work is licensed under the Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International License. To view a
copy of this license, visit
http://creativecommons.org/licenses/by-nc-sa/4.0/ or send a
letter to Creative Commons, PO Box 1866, Mountain View, CA 94042,
USA.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 2 / 32
3. Who Am I?
prima versione PostgreSQL usata: 7.3 (anno 2003)!
appassionato di Open Source
Perl, Raku, Unix, Emacs!
Java, PHP, Oracle . . .
Università degli Studi di Modena e Reggio Emilia (PhD, tutor, . . . )
Nipissing University (Adjunct Professor)
https://fluca1978.github.io
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 3 / 32
5. Backup
Un backup è una copia di sicurezza dei dati.
Un backup deve essere:
sicuro e adabile, nessuno vuole scoprire di non avere un backup
completo quando serve, né di aver avuto un data leak per colpa dei
propri backup;
veloce, soprattutto per il restore;
non invasivo, perché non vogliamo fermare i nostri sistemi per fare una
copia potenzialmente mai utilizzata.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 5 / 32
6. Restore
Il processo inverso di un backup: ripristina i dati ad un punto precedente
nel tempo.
Potenzialmente si vuole poter tornare ad un attimo fa (Recovery Point
Objective - RPO - pari a zero).
Potenzialmente si vuole poter eettuare un ripristino in un lampo
(Recovery Time Objective - RTO - pari a zero).
La realtà è ovviamente un compromesso fra i due valori di cui sopra.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 6 / 32
7. Strumenti di Backup (e Restore)
PostgreSQL è un sistema completo: fornisce strumenti per il backup e il
restore (pg_dump, pg_restore, pg_dumpall).
Si tratta di backup logici.
Non sempre sono la soluzione migliore: sono invasivi, richiedono tempo
proporzionale alla dimensione del database/cluster.
Soluzione possibile: backup sico (hot backup, backup a caldo,
basebackup, ...): si fa una copia a livello di lesystem della directory
PGDATA mentre il sistema è in funzione, poi si archiviano i segmenti WAL
necessari a consolidare tale copia.
Il restore consiste nel mescolare la PGDATA e i segmenti di WAL
simulando un crash recovery.
pgbackrest eettua backup sici!
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 7 / 32
9. Parallelismo!
PgBackRest nasce con il concetto di parallelismo in mente: le operazioni di
restore devono essere veloci e parallele (o parallelizzabili).
Molti tool di backup si avvalgono di rsync(1) ma questo non è uno
strumento eciente per il backup dei database: non supporta bene il
parallelismo, la compressione è both-sides e ha il problema della risluzione
del tempo a 1 secondo.
PgBackRest decide di implementare la propria strategia di copia fortemente
integrata con PostgreSQL per risolvere i problemi piu' comuni e permettere
quindi un'esperienza migliore con database molto grandi.
pgbackrest si prende in carico il backup, ma vuole comandare! Occorre
che la stessa versione sia installata sulle macchine!
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 9 / 32
10. Features Principali
PgBackRest supporta, fra le altre, alcune feature molto interessanti:
backup full, incrementali e dierenziali con la possibilità di cancellare
backup intermedi e riallocare i backup collegandoli fra loro.
delta restore, si eettua il restore solo dei le eettivamente
modicati;
restore parziale, possibilità di eettuare il restore di un solo database
all'interno dell'intero cluster;
compressione e streaming, i le devono essere toccati il meno
possibile;
cifratura, perché anche i backup non devono consentire data-leak;
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 10 / 32
11. Concetti Generali
pgBackRest opera sul concetto di stanza e di repository.
Una stanza è una congurazione di un server remoto per il backup, di fatto
è un insieme di target da sottoporre a backup.
Un repository è uno storage locale o remoto (SSH) sul quale salvare i
backup. Il repository può essere cifrato.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 11 / 32
12. Tipologie di backup
Sono supportati tre tipi di backup:
full è il primo backup o comunque un backup totale, e quindi occupa
piu' spazio;
incr (incrementale) è un backup basato sulle dierenze dall'ultimo
backup valido (che può essere a sua volta full o incr);
di (delta) è un backup di tipo incr ma basato sempre sull'ultimo full
realizzato.
In default il backup è sempre incr (dierenze dall'ultimo backup) a parte il
primo che viene sempre fatto come full.
I backup non full dipendono da altri backup (questo è importante per la
retention).
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 12 / 32
13. Struttura del repository
La struttura del repository è interessante: pgBackRest archivia il backup
con la stessa struttura di una PGDATA.
% cd /backup/pgbackrest/
% sudo ls backup/miguel/20210207-151554F/pg_data
backup_label.gz global pg_hba.conf.gz pg_tblspc
base log pg_hba.conf~.gz pg_twophase
conf.d pg_commit_ts pg_ident.conf.gz PG_VERSION.gz
current_logfiles.gz pg_dynshmem pg_logical pg_wal
...
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 13 / 32
15. Congurazione: Concetti
Il le principale di congurazione è /etc/pgbackrest.conf:
le ini
tre sezioni particolari:
globale contiene tutte le opzioni impostate a livello globale per il
funzionamento (es. log);
repository contiene le informazioni sullo storage da usare;
stanza contiene le impostazioni di un determinato set di backup.
La stanza può contenere piu' server, nel qual caso il primo (pg1) è il
master, gli altri sono considerati standby.
Un repository può contenere piu' denizioni, ma solo la prima (repo1) è
attualmente supportata.
Ogni parametro specicato nel le di congurazione può essere sovrascritto
dal relativo parametro fornito su linea di comando.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 15 / 32
16. Simmetria
pgBackRest è simmetrico: praticamente ogni comando può essere eseguito
sulla macchina di backup o sulla machina target.
luca@miguel ~ % pgbackrest --stanza=miguel info
stanza: miguel
status: ok
cipher: none
db (current)
wal archive min/max (11-1):
0000000500000213000000D6/0000000600000213000000DA
...
luca@carmensita ~ % pgbackrest --stanza=miguel info
stanza: miguel
status: ok
cipher: none
db (current)
wal archive min/max (11-1):
0000000500000213000000D6/0000000600000213000000DA
...
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 16 / 32
17. Backup
Il primo backup deve essere sempre full. La stanza deve essere stata
creata sul repository con il comando stanza-create.
E' possibile specicare il tipo di backup con l'opzione type, ma se non
viene trovato un backup full viene eseguito in automatico:
% pgbackrest --stanza miguel --log-level-console info backup
...
P00 INFO: full backup size = 228.9MB
P00 INFO: execute non-exclusive pg_stop_backup()
and wait for all WAL segments to archive
P00 INFO: backup stop archive = 0000000500000213000000AA, lsn = 213/AA00
P00 INFO: new backup label = 20210309-123110F
P00 INFO: backup command end: completed successfully (108290ms)
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 17 / 32
18. Backup Interrotti
Se un backup viene interrotto, per qualunque motivo, il software tenta di
recuperare quanto già trasferito:
% pgbackrest --stanza miguel backup
^C
% pgbackrest --stanza miguel backup
WARN: resumable backup 20210207-151554F_20210309-122738I
of same type exists -- remove invalid files and resume
L'opzione che controlla il resume dei backup interrotti è --resume (e il
contrario --no-resume.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 18 / 32
19. Cancellazione di un backup
Si deve usare la retention policy e/o il comando expire.
Non esiste un comando per la cancellazione di un backup.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 19 / 32
20. Retention Policy
Le possibili opzioni sono:
repo-retention-full il numero di backup full da conservare. Il
valore dipende da repo-retention-full-type che può valere
time per indicare che si tratta di giorni;
count per indicare che si tratta di backup;
repo-retention-diff se impostato indica il numero di backup
dierenziali da conservare;
repo-retention-archive indica quali WAL sono rimovibili, a patto
che sia rispettato repo-retention-full;
repo-retention-archive-type vale full, incr o diff e indica
quanti WAL relativi a repo-retention-archive devono essere
mantenuti.
I valori repo-retention-archive e repo-retention-archive-type
servono solo a riparmiare spazio disco in situazioni particolari, ma il loro
utilizzo pregiudica il PITR!
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 20 / 32
21. Retention Policy in azione
Al termine di una operazione di backup, e quindi quando pgBackRest è
sicuro di avere una nuova copia, viene applicato l'expiring dei backup
presenti. La rimozione di un backup produce la rimozione anche dei backup
collegati, ad esempio la rimozione di un backup full comporta l'eliminazione
anche degli incrementali che su di esso dipendono:
% pgbackrest --stanza miguel --type full backup
...
INFO: new backup label = 20210309-123434F
INFO: backup command end: completed successfully (120011ms)
...
INFO: remove expired backup repo1: 20210207-151554F_20210309-122738I
INFO: remove expired backup repo1: 20210207-151554F_20210219-122236I
INFO: remove expired backup repo1: 20210207-151554F_20210219-112719I
INFO: remove expired backup repo1: 20210207-151554F_20210207-153442I
INFO: remove expired backup repo1: 20210207-151554F
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 21 / 32
22. Informazioni di backup
Il comando info fornisce informazioni sui backup. Accetta eventualmente
la stanza.
% pgbackrest info
stanza: miguel
status: ok
cipher: none
db (current)
wal archive min/max (12): 000000010000000300000099/000000010000000300
full backup: 20210309-123110F
timestamp start/stop: 2021-03-09 12:31:10 / 2021-03-09 12:32:58
wal start/stop: 000000010000000300000099 / 0000000100000003000000
database size: 2GB, database backup size: 2GB
repo1: backup set size: 181.5MB, backup size: 181.5MB
full backup: 20210309-123434F
timestamp start/stop: 2021-03-09 12:34:34 / 2021-03-09 12:36:32
wal start/stop: 00000001000000030000009B / 0000000100000003000000
database size: 2GB, database backup size: 2GB
repo1: backup set size: 181.5MB, backup size: 181.5MB
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 22 / 32
23. Backup da uno standby
E' possibile abilitare il backup da un nodo standby mediante l'opzione
--backup-standby:
% cat /etc/pgbackrest.conf
...
[miguel]
pg1-host = miguel
pg1-path = /postgres/12/data
pg1-host-user = postgres
pg2-host = miguel-replica
pg2-path = /postgres/12/data
pg2-host-user = postgres
% pgbackrest --stanza miguel backup --backup-standby
...
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 23 / 32
24. Restore su macchina remota
Il restore va fatto sulla macchina che ospiterà il cluster:
luca@miguel ~ % sudo -u postgres
pgbackrest --config=/usr/local/etc/pgbackrest.conf
--stanza=miguel
--pg1-path=/postgres/12/restore
restore
...
INFO: write updated /postgres/12/restore/postgresql.auto.conf
INFO: restore global/pg_control
(performed last to ensure aborted restores cannot be started)
INFO: restore command end: completed successfully (25235ms)
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 24 / 32
25. Recupero dei WAL
Il comando restore crea un le recovery.conf (versioni vecchie di
PostgreSQL) o recovery.signal (assieme alle opzioni in
postgresql.auto.conf) per ottenere i WAL:
% sudo cat /postgres/12/restore/postgresql.auto.conf
# Recovery settings generated by pgBackRest restore on 2021-03-09 15:54:59
restore_command = ’pgbackrest --config=/usr/local/etc/pgbackrest.conf
--pg1-path=/postgres/12/restore
--stanza=miguel archive-get %f %p’
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 25 / 32
26. Specicare da quale backup partire per il restore
In default si prende latest, ossia l'ultimo backup disponibile.
E' possibile specicare un backup specico con l'opzione set:
luca@miguel ~ % sudo -u postgres
pgbackrest --config=/usr/local/etc/pgbackrest.conf
--stanza=miguel
--pg1-path=/postgres/12/restore
--set 20210309-123434F_20210309-130132I
restore
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 26 / 32
27. Delta Restore
Recovery veloce su una directory cluster esistente.
Si usa l'opzione --delta.
luca@miguel ~ % sudo -u postgres
pgbackrest --config=/usr/local/etc/pgbackrest.conf
--stanza=miguel
--pg1-path=/postgres/12/restore
--set 20210309-123434F_20210309-130132I
--delta
restore
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 27 / 32
28. Restore parziale (selettivo)
E' possibile eettuare il restore di un solo database specico: in sostanza
viene eettuato il restore di tutto il cluster, ma gli altri database sono
invalidati.
% sudo -u postgres pgbackrest --stanza=miguel
--log-level-console=info --delta
--db-include=digikamdb restore
...
INFO: restore command end: completed successfully (4780ms)
% psql template1
template1=# c testdb
FATAL: relation mapping file base/16385/pg_filenode.map
contains invalid data
Previous connection kept
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 28 / 32
29. Point in Time Recovery
Si usano le opzioni target:
% sudo service postgresql stop
% sudo -u postgres
pgbackrest restore --delta --stanza=main
--type=time
--target=’2021-02-04 10:07:09.098026+02’
--target-action=promote
...
INFO: write updated /postgres/12/restore/postgresql.auto.conf
...
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 29 / 32
30. Compressione
E' possibile abilitare la compressione dei le memorizzati nel repository
(ogni le sarà .gz), nonché la compressione di rete:
[global]
...
compress = y
compress-level = 9
compress-level-network = 9
ATTENZIONE:
se compress = y allora si usa compress-level anche per la
trasmissione di rete (ossia compress-level-network è ignorato).
se compress = n allora si usa compress-level-network
(ovviamente se il database da backuppare è acceduto in modo
remoto);
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 30 / 32
31. Cifratura
L'unico algoritmo di cifratura supportato è Advanced Encryption Standard
con chiave di 256 bit:
[global]
...
repo1-cipher-type = aes-256-cbc
repo1-cipher-pass = aVeryStrongEncryptionPasswordHere
ATTENZIONE: la cifratura deve essere applicata su una nuova stanza.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 31 / 32
32. Conclusioni
pgbackrest è un software completo e maturo, fortemente ottimizzato per
database di grosse dimensioni.
ing. Luca Ferrari, PhD (uca1978) pgBackRest 12 Marzo 2021 32 / 32