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 /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. Copiamo il file 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. Installiamo:
sudo apt-get install perl6. 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.conf7. Verifichiamo:
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, i secondi e gli ultimi comandi:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.confli sostituiamo con:
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):
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_keysIn 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 md5dove:
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 password2. 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 = replica3. 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 restartConfigurazione 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-archivingCreazione 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 checkRepository (utente pgbackrest):
Verifichiamo sul server repository:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkAssicuriamoci 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 backupSe desideri un output dettagliato nella console, specifica anche:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupRipristino del backup
Server Postgres (utente sudo o root):
1. Ferma il cluster in esecuzione:
sudo pg_ctlcluster 11 main stop2. Esegui il ripristino dal backup:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Avvia il cluster:
sudo pg_ctlcluster 11 main startDopo il ripristino del backup, dobbiamo eseguire un nuovo backup:
Repository (utente pgbackrest):
sudo pgbackrest --stanza=main backupQuesto è 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
