Disclaimer
Sono uno sviluppatore. Scrivo codice, interagisco con il database solo come utente. Non pretendo in alcun modo di essere un amministratore di sistema, né tanto meno un DBA. Ma...
Mi è capitato di dover organizzare una copia di backup del database PostgreSQL. Niente cloud, solo SSH e far funzionare tutto senza chiedere soldi. Cosa facciamo in questi casi? Esatto, inseriamo pgdump in cron, eseguiamo il backup di tutto in un archivio ogni giorno e, se siamo completamente fuori controllo, spediamo questo archivio da qualche parte lontano.
Questa volta la difficoltà era che, secondo i piani, il database avrebbe dovuto crescere di circa +- 100 MB al giorno. Naturalmente, nel giro di un paio di settimane la necessità di eseguire il backup di tutto con pgdump sarebbe scomparsa. È qui che i backup incrementali vengono in soccorso.
Interessante? Benvenuti sotto il taglio.
Il backup incrementale è un tipo di copia di backup in cui non vengono copiati tutti i file sorgente, ma solo quelli nuovi e modificati rispetto alla creazione della copia precedente.
Come ogni sviluppatore, ASSOLUTAMENTE riluttante (a quel tempo) a comprendere le complessità di PostgreSQL, volevo trovare un pulsante verde. Beh, sapete, come in AWS, DigitalOcean: premi un pulsante - ottieni la replica, premi il secondo - imposta i backup, il terzo - ripristina tutto a un paio d'ore prima. Non ho trovato un pulsante o un bell'interfaccia utente grafica. Se ne conoscete uno (gratuito o economico), scrivetelo nei commenti.
Dopo aver cercato su Google ho trovato due strumenti pgbarman и pgbackrestCon il primo non ho avuto successo (documentazione pessima, ho cercato di risolvere tutto usando vecchi manuali), ma la documentazione del secondo si è rivelata all'altezza degli standard, ma non priva di difetti. Questo articolo è stato scritto per semplificare il lavoro di chi si troverà ad affrontare un compito simile.
Dopo aver letto questo articolo, imparerai come effettuare backup incrementali, salvarli su un server remoto (repository con backup) e ripristinarli in caso di perdita di dati o altri problemi sul server principale.
Formazione
Per riprodurre il manuale, avrai bisogno di due VPS. Il primo sarà uno storage (repository in cui verranno archiviati i backup) e il secondo, di fatto, il server vero e proprio con PostgreSQL (nel mio caso, la versione 11 di PostgreSQL).
Si presume che sul server con postgres siano installati root, l'utente sudo, l'utente postgres e postgres stesso (l'utente postgres viene creato automaticamente quando si installa postgresql), e sul server del repository siano installati root e l'utente sudo (nel manuale verrà utilizzato il nome utente pgbackrest).
Per facilitarvi la lettura delle istruzioni, le scrivo in corsivo. dove, come quale utente e con quali diritti ho eseguito il comando durante la scrittura e la verifica dell'articolo.
Installazione di pgbackrest
Repository (utente pgbackrest):
1. Scaricare l'archivio con pgbackrest e spostarne il 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. Installare le dipendenze necessarie per l'assemblaggio:
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. Copiare 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 perl. Installazione:
sudo apt-get install perl6. Creare directory per i log e assegnare loro determinati diritti:
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. Controllare:
pgbackrest versionServer Postgres (utente sudo o root):
Il processo di installazione di pgbackrest su un server con postgres è simile al processo di installazione su un repository (sì, pgbackrest deve essere installato su entrambi i server), ma al punto 6 il secondo e ultimo comando:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.confsostituire con:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confImpostazione dell'interazione tra server tramite SSH senza password
Affinché pgbackrest funzioni correttamente, è necessario configurare l'interazione tra il server PostgreSQL e il repository tramite 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! Eseguiamo 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 PostgreSQL sul server del repository:
(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' &&
echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' &&
sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) |
sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keysA questo punto ti verrà richiesta la password dell'utente root. Devi inserire la password dell'utente root del server PostgreSQL!
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@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) |
sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys
A questo punto ti verrà chiesta la password per l'utente root. Devi inserire la password dell'utente root del repository!
Controlliamo:
Repository (utente root, per motivi di purezza dell'esperimento):
sudo -u pgbackrest ssh postgres@<postgres_server_ip>Server Postgres (utente root, per motivi di purezza dell'esperimento):
sudo -u postgres ssh pgbackrest@<repository_server_ip>Ci assicuriamo di potervi accedere senza problemi.
Configurazione del server Postgres
Server Postgres (utente sudo o root):
1. Consentiamo l'accesso al server PostgreSQL da IP esterni. Per farlo, modifica il file postgresql.conf (situato nella cartella /etc/postgresql/11/main), aggiungendovi la riga:
listen_addresses = '*'Se una riga del genere esiste già, rimuoverla dal commento oppure impostare il valore del parametro su '*'.
In archivio pg_hba.conf (si trova anche nella cartella /etc/postgresql/11/main) aggiungere le seguenti righe:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5dove:
hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля2. Effettuiamo le impostazioni necessarie in postgresql.conf (si trova nella cartella /etc/postgresql/11/main) affinché pgbackrest funzioni:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica3. Effettuiamo le impostazioni necessarie nel file di configurazione di pgbackrest (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=<repository_server_ip>4. Riavviare postgresql:
sudo service postgresql restartImpostazione di un server di repository
Repository (utente pgbackrest):
Effettuiamo le impostazioni necessarie nel file di configurazione pgbackrest
(/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий - первые два будут удалены вместе с инкрементами.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingCreazione di un repository
Repository (utente pgbackrest):
Crea un nuovo storage per il cluster principale:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Проверка
Server Postgres (utente sudo o root):
Controlliamo sul server Postgres:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info checkRepository (utente pgbackrest):
Controlliamo sul server del repository:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkCi assicuriamo che nell'output sia presente la riga "check command end: completed successfully".
Stanchi? Passiamo alla parte più interessante.
Facciamo un backup
Repository (utente pgbackrest):
1. Eseguire un backup:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Assicurarsi 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 assicurarti che il sistema crei un backup incrementale.
Se si desidera effettuare nuovamente un backup completo, specificare un flag aggiuntivo:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backupSe si desidera un output dettagliato della console, specificare anche:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupRipristino del backup
Server Postgres (utente sudo o root):
1. Arrestare il cluster in esecuzione:
sudo pg_ctlcluster 11 main stop2. Ripristina dal backup:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Avviare il cluster:
sudo pg_ctlcluster 11 main startDopo aver ripristinato il backup, dobbiamo eseguire un secondo backup:
Repository (utente pgbackrest):
sudo pgbackrest --stanza=main backupPer ora è tutto. In conclusione, vorrei ricordarvi che non intendo in alcun modo spacciarmi per un DBA senior e che userò il cloud ogni volta che sarà possibile. Al momento, sto iniziando a studiare vari argomenti come backup, repliche, monitoraggio, ecc. e sto scrivendo brevi report sui risultati per dare un piccolo contributo alla community e lasciare piccoli promemoria per me stesso.
Nei seguenti articoli cercherò di parlare di funzionalità aggiuntive: ripristino dei dati in un cluster pulito, crittografia dei backup e pubblicazione su S3, backup tramite rsync.
Fonte: habr.com
