Backup postgresql incrementali cù pgbackrest - un ghjovanu corsu di cumbattimentu da un sviluppatore

Disclaimer

Sò un sviluppatore. Scrivu codice, interagisce cù a basa di dati solu cum'è utilizatore. In ogni modu ùn mi prete di esse un amministratore di sistema è, in più, un dba. Ma…

Hè accadutu chì avia bisognu di urganizà una copia di salvezza di a basa di dati postgresql. Nisuna nuvola - mantene SSH è fate tuttu u travagliu è micca dumandà soldi. Cosa facemu in tali casi? Hè propiu, spingemu pgdump in cron, ogni ghjornu facemu una copia di salvezza di tuttu in l'archiviu, è se dispersemu cumplettamente, mandemu stu archiviu in un locu luntanu.

Questa volta, a difficultà era chì, sicondu i piani, a basa di dati era suppostu di cresce da circa + - 100 MB per ghjornu. Di sicuru, dopu à un paru di settimane, u desideriu di fà una copia di salvezza di tuttu cù pgdump sparirà. Questu hè induve i backup incrementali sò utili.

Interessante? Benvenuti sottu u gattu.

Una copia di salvezza incrementale hè un tipu di copia di salvezza quandu micca tutti i fugliali fonte sò copiati, ma solu novi è cambiati da quandu a copia precedente hè stata creata.

Cum'è qualsiasi sviluppatore chì era TOTALMENTE dispostu (à quellu tempu) per capisce l'intricacies di postgres, vulia truvà un buttone verde. Ebbè, sapete, cum'è in AWS, DigitalOcean: aghju premutu un buttone - aghju avutu a replicazione, aghju premutu u sicondu - aghju stabilitu backups, u terzu - tuttu hè tornatu un paru d'ore fà. Ùn aghju micca trovu un buttone è una bella strumentu GUI. Se ne cunnosci unu (gratuitu o economicu) - scrivite nantu à i cumenti.

Google aghju trovu dui arnesi pgbarman и pgbackrest. Cù u primu, ùn aghju micca successu (ducumentazione assai povira, aghju pruvatu à coglie tuttu sicondu i manuali antichi), ma a seconda documentazione hè stata à u livellu, ma micca senza difettu. Per simplificà u travagliu di quelli chì facenu un compitu simili, stu articulu hè statu scrittu.

Dopu avè lettu stu articulu, amparate cumu fà una copia di salvezza incrementali, salvà in un servitore remotu (repositoriu cù copia di salvezza) è restaurà in casu di perdita di dati o altri prublemi nantu à u servitore principale.

A preparazione di

Avete bisognu di dui VPS per ghjucà u manuale. U primu serà u repository (u repository nantu à quale seranu i backups), è u sicondu, in fattu, u servitore stessu cù postgres (in u mo casu, a versione 11 di postgres).

Si assume chì in u servitore cù postgres avete root, sudo user, postgres user è postgres stessu installatu (l'utilizatore postgres hè creatu automaticamente quandu installate postgresql), è in u servitore di repository avete root è sudo user (username pgbackrest serà utilizatu). in u manuale).

Cusì chì avete menu prublemi quandu ripruduce l'istruzzioni - Scrivu in corsu induve, cù quale utilizatore è cù quali diritti aghju eseguitu u cumandamentu mentre scrive è rivista l'articulu.

installazione di pgbackrest

Repository (utente pgbackrest):

1. Scaricate l'archiviu da pgbackrest è trasfiriu u so cuntenutu à u cartulare /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 e dipendenze necessarie per l'assemblea:

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

3. Cullemu pgbackrest:

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

4. Copia u schedariu eseguibile in u cartulare /usr/bin:

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

5. Pgbackrest richiede perl. Installa:

sudo apt-get install perl

6. Crea cartulari per i logs, dà li certi 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.conf

7. Verificate:

pgbackrest version

Servitore Postgres (sudo user o root):

U prucessu di installà pgbackrest in un servitore postgres hè simile à l'installazione in un repository (sì, pgbackrest deve esse installatu nantu à i dui servitori), ma in u 6u paràgrafu, u sicondu è l'ultimu cumandamentu:

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

rimpiazzà cù:

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

Configurazione di a cumunicazione trà i servitori via SSH senza password

Per pgbackrest per travaglià bè, hè necessariu di cunfigurà l'interazzione trà u servitore postgres è u repository usendu u schedariu chjave.

Repository (utente pgbackrest):

Crea un paru di chjave:

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

Attenzione! I cumandamenti sopra sò eseguiti senza sudo.

Servitore Postgres (sudo user o root):

Crea un paru di chjave:

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 (sudo user):

Copia a chjave publica di u servitore postgres à u servitore 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@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

À questu passu, dumandarà a password da l'utilizatore root. Avete bisognu di entre esattamente a password di l'utilizatore root di u servitore postgres!

Servitore Postgres (sudo user):

Copia a chjave publica di u repositoriu à u servitore cù 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

À questu passu, dumandarà a password da l'utilizatore root. Avete bisognu di inserisce a password di l'utilizatore root di u repository!

Verificate:

Repository (utente root, per a purità di l'esperimentu):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Servitore Postgres (utente root, per a purità di l'esperimentu):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Avemu sicuru chì avemu accessu senza prublemi.

Configurazione di un servitore postgres

Servitore Postgres (sudo user o root):

1. Permettemu "picchi" in u servore postgres da ip esterna. Per fà questu, edità u schedariu postgresql.conf (situatu in u cartulare /etc/postgresql/11/main) aghjunghjendu a seguente linea:

listen_addresses = '*'

Se una tale linea esiste già, o discommentala o stabilisce u valore di u paràmetru à '*'.

In u schedariu pg_hba.conf (situatu ancu in u cartulare /etc/postgresql/11/main) aghjunghje e seguenti linee:

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

induve:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Andemu fà i paràmetri nicissarii in postgresql.conf (hè in u cartulare /etc/postgresql/11/main) per pgbackrest per travaglià:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Fate i paràmetri necessarii in u schedariu di cunfigurazione pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Restart postgresql:

sudo service postgresql restart

Configurazione di un servitore di repository

Repository (utente pgbackrest):

Fate i paràmetri necessarii in u schedariu di cunfigurazione 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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Crea una volta

Repository (utente pgbackrest):

Crea un novu almacenamentu per u cluster principale:

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

pirmittennu

Servitore Postgres (sudo user o root):

Verificate u servitore postgres:

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

Repository (utente pgbackrest):

Verificate nantu à u servitore di repository:

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

Facemu sicuru chì in u output vedemu a linea "verificà a fine di u cumandamentu: finita cun successu".

Stancu ? Passemu à u più interessante.

Fà una copia di salvezza

Repository (utente pgbackrest):

1. Eseguite una copia di salvezza:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Facemu sicuru chì a copia di salvezza hè stata creata:

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

pgbackrest creà a prima copia di salvezza completa. Se vulete, pudete eseguisce u cumandamentu di salvezza di novu è assicuratevi chì u sistema crea una copia di salvezza incrementale.

Se vulete fà una copia di salvezza completa, allora specificate una bandiera supplementaria:

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

Se vulete un output di cunsola verbose, allora specificate ancu:

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

Risturà una copia di salvezza

Servitore Postgres (sudo user o root):

1. Arresta u cluster in esecuzione:

sudo pg_ctlcluster 11 main stop

2. Risturà da una copia di salvezza:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Per restaurà a basa di dati à u statu di l'ultima copia di salvezza FULL, utilizate u cumandamentu senza specificà recovery_target:

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

Impurtante! Dopu a ricuperazione, pò accade chì a basa di dati si ferma in modu di ricuperazione (ci saranu errori cum'è ERRORE: ùn pò micca eseguisce DROP DATABASE in una transazzione di sola lettura). Per esse onesto, ùn aghju micca ancu capitu ciò chì questu hè cunnessu. A suluzione hè a siguenti (avete bisognu di aspittà un pocu dopu chì u cumandimu hè eseguitu):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

In fatti, hè pussibule di risturà una copia di salvezza specifica da u so nome. Quì sò solu Puderaghju un ligame à a descrizzione di sta funzione in a documentazione. I sviluppatori cunsiglianu di utilizà sta opzione cun prudenza è spieganu perchè. Puderaghju aghjunghje da mè stessu chì l'aghju utilizatu. Sè avete veramente bisognu, assicuratevi chì dopu a ricuperazione, a basa di dati esce da u modu di ricuperazione (selezziunà pg_is_in_recovery () deve mustrà "f") è, in casu, fate una copia di salvezza completa dopu a ricuperazione.

3. Cumincià u cluster:

sudo pg_ctlcluster 11 main start

Dopu a restaurazione di a copia di salvezza, avemu bisognu di fà una seconda copia di salvezza:

Repository (utente pgbackrest):

sudo pgbackrest --stanza=main backup

Eccu tuttu. In cunclusioni, vogliu ricurdà chì ùn aghju micca intesu di fà finta di esse un senior dba è aduprà e nuvole à a minima opportunità. Attualmente, aghju cuminciatu à studià diversi temi cum'è copia di salvezza, replicazione, monitoraghju, etc. è scrivu picculi rapporti nantu à i risultati per fà una piccula cuntribuzione à a cumunità è lascià picculi schede per mè stessu.

In l'articuli seguenti pruvaraghju di parlà di funzioni supplementari - restaurà dati in un cluster pulito, criptu di salvezza è publicazione in S3, backups via rsync.

Source: www.habr.com

Add a comment