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 /build2. 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-dev3. Compila pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Copia l'eseguibile nella directory /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest richiede la presenza di perl. Installa:
sudo apt-get install perl6. 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.conf7. Verifica:
pgbackrest versionServer 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.confcon:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confConfigurazione 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_keysIn 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 md5dove:
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 password2. 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 = replica3. 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 restartConfigurazione 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-archivingCreazione 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 checkRepository (utente pgbackrest):
Verifichiamo sul server di repository:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkAssicuriamoci 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 backupSe vuoi un output dettagliato sulla console, specifica anche:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupRipristiniamo il backup
Server Postgres (utente sudo o root):
1. Arrestiamo il cluster in esecuzione:
sudo pg_ctlcluster 11 main stop2. Ripristiniamoci dal backup:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Avviamo il cluster:
sudo pg_ctlcluster 11 main startDopo il ripristino del backup, dobbiamo eseguire un backup ripetuto:
Repository (utente pgbackrest):
sudo pgbackrest --stanza=main backupQuesto è 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
