Backup incrementali postgresql con pgbackrest — il corso per principianti dal разработчика

Disclaimer

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

È successo che avessi bisogno di organizzare il backup di un database postgresql. Niente cloud — usa SSH e fai in modo che tutto funzioni senza chiedere soldi. Cosa facciamo in questi casi? Esatto, mettiamo pgdump in cron, facciamo il backup ogni giorno in un archivio e se le cose si complicano, spediamo questo archivio lontano.

Questa volta la difficoltà era che, secondo i piani, il database avrebbe dovuto crescere di circa 100 MB al giorno. Ovviamente, dopo un paio di settimane, la voglia di fare backup con pgdump svanirà. Qui entrano in gioco i backup incrementali.

Interessato? Benvenuto nel seguito.

Il backup incrementale è un tipo di copia di sicurezza in cui non vengono copiati tutti i file di origine, ma solo quelli nuovi e modificati dal momento della creazione della copia precedente.

Come qualsiasi sviluppatore, COMPLETAMENTE riluttante (in quel momento) a scendere nei dettagli di postgres, volevo trovare un pulsante verde. Sapete, come in AWS, DigitalOcean: premi un pulsante e ottieni la replica, premi il secondo e imposti i backup, il terzo e riporti tutto indietro di qualche ora. Non ho trovato né pulsanti né strumenti GUI belli. 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 ho avuto fortuna (documentazione molto scarsa, ho provato a seguire antichi manuali), mentre con il secondo la documentazione era di buon livello, ma non senza difetti. Per semplificare il lavoro a chi si troverà ad affrontare compiti simili, è stato scritto questo articolo.

Leggendo questo articolo imparerete a fare backup incrementali, a conservarli su un server remoto (un deposito di backup) e a ripristinarli in caso di perdita di dati o altri problemi sul server principale.

Preparazione

Per riprodurre il manuale, avrai bisogno di due VPS. Il primo fungerà da archivio (il repository dove verranno conservati i backup), e il secondo sarà il server con postgres (nel mio caso, la versione 11 di postgres).

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

Per ridurre i problemi durante la riproduzione delle istruzioni — in corsivo indico dove, con quale utente e con quali permessi ho eseguito il comando durante la stesura e il controllo dell'articolo.

Installazione di pgbackrest

Repository (utente pgbackrest):

1. Scarica l'archivio di pgbackrest e trasferisci 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. Copiamo il file 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. Installiamo:

sudo apt-get install perl

6. Creiamo le directory per i log e assegniamo i diritti 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. Verifichiamo:

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, i secondi e gli ultimi comandi:

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

li sostituiamo 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):

Creiamo una coppia di chiavi:

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

Attenzione! Eseguiamo i comandi sopra senza sudo.

Server Postgres (utente sudo o root):

Creiamo 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 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 questa fase verrà richiesta la password dell'utente root. Devi inserire esattamente la password dell'utente root del server postgres!

Server Postgres (utente sudo):

Copia 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 questa fase verrà richiesta la password dell'utente root. Devi inserire esattamente la password dell'utente root del repository!

Controllando:

Repository (utente root, per la pulizia dell'esperimento):

sudo -u pgbackrest ssh postgres@

Server Postgres (utente root, per la pulizia dell'esperimento):

sudo -u postgres ssh pgbackrest@

Verifichiamo di avere accesso senza problemi.

Configurazione del server postgres

Server Postgres (utente sudo o root):

1. Permetteremo le connessioni al server postgres da IP esterni. Per fare ciò, modificheremo il file postgresql.conf (si trova nella cartella /etc/postgresql/11/main), aggiungendo la seguente riga:

listen_addresses = '*'

Se esiste già una riga simile — è possibile decommentarla oppure impostare il valore del parametro come ‘*’.

Nel file pg_hba.conf (si trova anche 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 - permettiamo la connessione a tutti i database
all - nome utente a cui permettiamo la connessione (a tutti)
0.0.0.0/0 - maschera di rete da cui è possibile connettersi
md5 - metodo di crittografia della password

2. Apporteremo le necessarie modifiche a postgresql.conf (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 di postgres, viene automaticamente creato il cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Apporteremo 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 di repository

Repository (utente pgbackrest):

Apporteremo 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 conservare. 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 del repository

Repository (utente pgbackrest):

Creiamo un nuovo repository 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 repository:

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

Assicuriamoci di vedere la riga «check command end: completed successfully» nell'output.

Stanco? 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 ripetere 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 desideri un output dettagliato nella console, specifica anche:

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

Ripristino del backup

Server Postgres (utente sudo o root):

1. Ferma il cluster in esecuzione:

sudo pg_ctlcluster 11 main stop

2. Esegui il ripristino dal backup:

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

3. Avvia il cluster:

sudo pg_ctlcluster 11 main start

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

Repository (utente pgbackrest):

sudo pgbackrest --stanza=main backup

Questo è tutto. In conclusione, voglio ricordare che non sto cercando in alcun modo di presentarmi come un senior dba e, appena possibile, utilizzerò il cloud. Attualmente sto iniziando a studiare vari temi come backup, replica, monitoraggio, ecc., e scrivo brevi report sui risultati per contribuire alla comunità e lasciare per me delle piccole note di riferimento.

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, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster