Backup incrementali di postgresql con pgbackrest — corso per principianti da uno sviluppatore

Disclaimer

Sono uno sviluppatore. Scrivo codice e interagisco con il database solo come utente. Non pretendo in alcun modo di assumere il ruolo di amministratore di sistema, tanto meno di DBA. Ma...

È successo che dovevo organizzare il backup di un database postgresql. Niente cloud — utilizza SSH e fai in modo che tutto funzioni senza richiedere soldi. Cosa facciamo in questi casi? Esatto, mettiamo pgdump in cron, facciamo un backup ogni giorno in un archivio e, se le cose si fanno serie, inviamo quell'archivio altrove.

Questa volta la difficoltà era che, secondo i piani, il database sarebbe cresciuto di circa ± 100 MB al giorno. Naturalmente, dopo un paio di settimane, il desiderio di eseguire il backup di tutto con pgdump svanirà. Qui entrano in gioco i backup incrementali.

Interessato? Benvenuto sotto il tag.

Il backup incrementale è una forma di copia di sicurezza in cui non tutti i file della fonte vengono copiati, ma solo quelli nuovi e modificati dall'ultima creazione della copia precedente.

Come qualsiasi sviluppatore, che NON desidera affatto (in quel momento) approfondire le complessità di postgres, volevo trovare un pulsante verde. Beh, sapete, come in AWS, DigitalOcean: premi un pulsante e ottieni la replica, premi un secondo e configuri i backup, un terzo e ritorni indietro di qualche ora. Non ho trovato pulsanti o uno strumento GUI carino. Se conoscete qualcosa di simile (gratuito o economico) — fatemelo sapere nei commenti.

Cercando su Google ho trovato due strumenti pgbarman e pgbackrest. Con il primo non sono riuscito a combinare nulla (documentazione molto scarsa, ho provato a impostare tutto seguendo vecchi manuali), mentre con il secondo la documentazione era adeguata, ma non priva di difetti. Per semplificare il lavoro a chi si troverà ad affrontare un compito simile, è stato scritto questo articolo.

Leggendo questo articolo imparerai a fare backup incrementali, a salvarli su un server remoto (repository dei backup) e a ripristinarli in caso di perdita di dati o altri problemi sul server principale.

Preparazione

Per seguire il manuale ti serviranno due VPS. Il primo sarà lo storage (repository in cui saranno salvati i backup), mentre il secondo sarà il server con postgres (nel mio caso la versione 11 di postgres).

Si prevede che sul server con postgres tu abbia l'utente root, un utente sudo, l'utente postgres e che postgres stesso sia installato (l'utente postgres viene creato automaticamente durante l'installazione di postgresql), e che sul server di repository ci siano l'utente root e l'utente sudo (nel manuale sarà utilizzato il nome utente pgbackrest).

Per ridurre i problemi durante la riproduzione delle istruzioni, uso il corsivo per indicare dove, con quale utente e con quali permessi ho eseguito il comando durante la scrittura e la verifica dell'articolo.

Installazione di pgbackrest

Repository (utente pgbackrest):

1. Scarica l'archivio di pgbackrest e sposta il suo contenuto nella cartella /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. Installa le dipendenze necessarie per la compilazione:

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

3. Compila pgbackrest:

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

4. Copia l'eseguibile nella directory /usr/bin:

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

5. Pgbackrest richiede la presenza di perl. Installa:

sudo apt-get install perl

6. Crea le directory per i log, assegnando loro i permessi appropriati:

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. Verifica:

pgbackrest version

Server Postgres (utente sudo o root):

Il processo di installazione di pgbackrest sul server con postgres è simile al processo di installazione sul repository (sì, pgbackrest deve essere presente su entrambi i server), ma nel punto 6 sostituisci i comandi penultimo e ultimo:

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

con:

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

Configurazione dell'interazione tra i server tramite SSH senza password

Affinché pgbackrest funzioni correttamente, è necessario configurare l'interazione tra il server postgres e il repository utilizzando un file chiave.

Repository (utente pgbackrest):

Crea una coppia di chiavi:

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

Attenzione! Esegui i comandi sopra indicati senza sudo.

Server Postgres (utente sudo o root):

Crea una coppia di chiavi:

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 ""

Repository (utente sudo):

Copia la chiave pubblica del server postgres sul server di repository:

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

In questo passaggio ti verrà richiesta la password dell'utente root. Devi inserire precisamente la password dell'utente root del server Postgres!

Server Postgres (utente sudo):

Copiamo la chiave pubblica del repository sul server 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@ cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

In questo passaggio ti verrà richiesta la password dell'utente root. Devi inserire precisamente la password dell'utente root del repository!

Controlliamo:

Repository (utente root, per comodità dell'esperimento):

sudo -u pgbackrest ssh postgres@

Server Postgres (utente root, per comodità dell'esperimento):

sudo -u postgres ssh pgbackrest@

Verifichiamo di avere accesso senza problemi.

Configurazione del server Postgres

Server Postgres (utente sudo o root):

1. Permettiamo connessioni al server Postgres da indirizzi IP esterni. Per fare ciò, modifichiamo il file , affinché il tuo database di test non voglia effettuare un backup silenziosamente. (si trova nella cartella /etc/postgresql/11/main), aggiungendo la seguente riga:

listen_addresses = '*'

Se tale riga è già presente, commentala oppure imposta il valore del parametro a '*'.

Nel file pg_hba.conf (si trova anch'esso nella cartella /etc/postgresql/11/main) aggiungiamo le seguenti righe:

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

dove:

hostssl/host - ci connettiamo tramite SSL (o meno)
all - consentiamo connessioni a tutti i database
all - nome utente a cui consentiamo la connessione (a tutti)
0.0.0.0/0 - maschera di rete da cui è consentita la connessione
md5 - metodo di crittografia della password

2. Apportiamo le necessarie modifiche a , affinché il tuo database di test non voglia effettuare un backup silenziosamente. (si trova nella cartella /etc/postgresql/11/main) per il funzionamento di pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Dove main è il nome del cluster. Durante l'installazione, Postgres crea automaticamente il cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Apportiamo le necessarie modifiche al file di configurazione di pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=

4. Riavviamo postgresql:

sudo service postgresql restart

Configurazione del server repository

Repository (utente pgbackrest):

Apportiamo le necessarie modifiche al file di configurazione pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

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

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Parametro che indica quanti backup completi mantenere. Cioè, se hai due backup completi e crei un terzo - i primi due verranno eliminati insieme agli incrementi.
start-fast=y # Inizia il backup immediatamente, puoi leggere di questo parametro qui https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Creazione dello storage

Repository (utente pgbackrest):

Creiamo un nuovo storage per il cluster main:

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

Verifica

Server Postgres (utente sudo o root):

Verifichiamo sul server postgres:

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

Repository (utente pgbackrest):

Verifichiamo sul server di repository:

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

Assicuriamoci di vedere nel output la stringa «check command end: completed successfully».

Stanchi? Passiamo alla parte più interessante.

Facciamo un backup

Repository (utente pgbackrest):

1. Eseguiamo il backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Assicuriamoci che il backup sia stato creato:

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

Pgbackrest creerà il primo backup completo. Se lo desideri, puoi eseguire nuovamente il comando di backup e verificare che il sistema crei un backup incrementale.

Se desideri eseguire nuovamente un backup completo, specifica un flag aggiuntivo:

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

Se vuoi un output dettagliato sulla console, specifica anche:

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

Ripristiniamo il backup

Server Postgres (utente sudo o root):

1. Arrestiamo il cluster in esecuzione:

sudo pg_ctlcluster 11 main stop

2. Ripristiniamoci dal backup:

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

3. Avviamo il cluster:

sudo pg_ctlcluster 11 main start

Dopo il ripristino del backup, dobbiamo eseguire un backup ripetuto:

Repository (utente pgbackrest):

sudo pgbackrest --stanza=main backup

Questo è tutto. In conclusione, voglio ricordare che non sto cercando di farmi passare per un DBA senior e, ogni volta che sarà possibile, utilizzerò il cloud. Attualmente, sto iniziando a studiare vari argomenti come backup, repliche, monitoraggio, ecc. e scrivo piccoli rapporti sui risultati, per contribuire in piccolo alla comunità e lasciarmi delle piccole guide.

Nei prossimi articoli cercherò di parlare di funzionalità aggiuntive — ripristino dei dati su un cluster pulito, crittografia dei backup e pubblicazione su S3, backup tramite rsync.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster