Cadangan postgresql Incremental sareng pgbackrest - kursus pikeun pejuang ngora ti pamekar

Bantahan

Abdi pamekar. Kuring nulis kode sarta berinteraksi sareng database ngan salaku pamaké. Henteu aya cara kuring nyamar janten administrator sistem, langkung seueur dba. Tapi…

Ieu jadi kajadian nu kuring diperlukeun pikeun ngatur cadangan database postgresql. Taya awan - ngan make SSH tur pastikeun sagalana jalan tanpa nanyakeun duit. Naon anu urang laksanakeun dina kasus sapertos kitu? Éta leres, urang nyorong pgdump kana cron, nyadangkeun sadayana kana arsip unggal dinten, sareng upami urang leungit lengkep, kami ngirimkeun arsip ieu ka tempat anu jauh.

Waktos ieu kasusahna nyaéta yén dumasar kana rencana, pangkalan data diperkirakeun tumbuh sakitar +- 100 MB per dinten. Tangtosna, saatos sababaraha minggu kahayang pikeun nyadangkeun sadayana sareng pgdump bakal ngaleungit. Ieu dimana cadangan incremental datang ka nyalametkeun teh.

metot? Wilujeng sumping di ucing.

Cadangan Incremental mangrupikeun jinis cadangan nalika henteu sadayana file sumber ditiron, tapi ngan ukur anu énggal sareng anu dirobih ti saprak nyiptakeun salinan sateuacana.

Sapertos pamekar anu leres-leres henteu daék (dina waktos éta) ngartos seluk-beluk postgres, kuring hoyong milarian tombol héjo. Nya, anjeun terang, sapertos dina AWS, DigitalOcean: anjeun mencét hiji tombol - anjeun ngagaduhan réplikasi, anjeun mencét kadua - anjeun nyetél cadangan, anu katilu - anjeun ngagulung sadayana deui sababaraha jam. Kuring teu manggihan tombol atawa alat GUI geulis. Upami anjeun terang hiji (gratis atanapi mirah), nyerat ngeunaan éta dina koméntar.

Saatos googling kuring mendakan dua alat pgbarman и pgbackrest. Kuring ngan saukur teu hasil jeung kahiji (dokumentasi pisan sparse, Kuring diusahakeun angka sagalana kaluar nurutkeun manual heubeul), tapi jeung kadua dokuméntasi tétéla nepi ka tara, tapi teu tanpa flaws. Pikeun nyederhanakeun pagawéan jalma anu nyanghareupan tugas anu sami, tulisan ieu ditulis.

Saatos maca tulisan ieu, anjeun bakal diajar kumaha cara nyieun cadangan incremental, simpen ka server jauh (Repository sareng cadangan) sareng malikkeunana upami kaleungitan data atanapi masalah sanés dina server utama.

palatihan

Pikeun ngahasilkeun deui manual anjeun peryogi dua VPS. Kahiji bakal gudang (Repository on nu cadangan bakal disimpen), sarta kadua, kanyataanna, server sorangan kalawan postgres (dina hal kuring, versi 11 of postgres).

Hal ieu dianggap yén dina server kalawan postgres anjeun boga root, sudo pamaké, postgres pamaké sarta postgres sorangan dipasang (pamaké postgres dijieun otomatis nalika masang postgresql), sarta dina server Repository aya root na sudo pamaké (dina manual). ngaran pamaké pgbackrest bakal dipaké).

Sangkan anjeun gaduh masalah pangsaeutikna nalika reproducing parentah, kuring nulis dina miring di mana, kalayan naon pamaké sarta kalawan hak naon kuring ngaéksekusi paréntah bari nulis jeung mariksa artikel.

Masang pgbackrest

Repository (pamaké pgbackrest):

1. Unduh arsipna tina pgbackrest sareng transfer eusina kana folder /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. Pasang dependensi dipikabutuh pikeun assembly:

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

3. Masang pgbackrest:

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

4. Salin file executable kana diréktori /usr/bin:

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

5. Pgbackrest merlukeun perl. Masang:

sudo apt-get install perl

6. Jieun diréktori pikeun log, pasihan aranjeunna hak-hak anu tangtu:

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. Pariksa:

pgbackrest version

Server Postgres (pangguna sudo atanapi root):

Prosés masang pgbackrest dina server sareng postgres sami sareng prosés instalasi dina gudang (enya, pgbackrest kedah dipasang dina duanana server), tapi dina paragraf ka-6 paréntah kadua sareng terakhir:

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

ganti ku:

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

Nyetel interaksi antara server liwat SSH tanpa sandi

Supaya pgbackrest tiasa dianggo leres, perlu pikeun ngonpigurasikeun interaksi antara server postgres sareng gudang nganggo file konci.

Repository (pamaké pgbackrest):

Jieun pasangan konci:

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

Awas! Urang ngajalankeun paréntah di luhur tanpa sudo.

Server Postgres (pangguna sudo atanapi root):

Jieun pasangan konci:

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

Salin konci umum tina server postgres ka 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@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Dina hambalan ieu anjeun bakal dipénta sandi pikeun pamaké root. Anjeun kedah ngalebetkeun kecap akses pangguna root tina server postgres!

Server Postgres (pamaké sudo):

Nyalin konci umum gudang ka server nganggo 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

Dina hambalan ieu anjeun bakal dipénta sandi pikeun pamaké root. Anjeun kedah ngalebetkeun persis kecap konci pangguna akar gudang!

Kami cek:

Repository (pangguna root, pikeun kamurnian percobaan):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (pangguna root, pikeun kamurnian percobaan):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Urang mastikeun yén urang meunang aksés tanpa masalah.

Nyetél server postgres

Server Postgres (pangguna sudo atanapi root):

1. Hayu urang ngidinan knocking on server postgres ti IP éksternal. Jang ngalampahkeun ieu, édit file postgresql.conf (tempatna di /etc/postgresql/11/folder utama), nambahkeun garis ka dinya:

listen_addresses = '*'

Upami garis sapertos kitu tos aya, copot koméntar atanapi setel nilai parameter janten '*'.

Dina file pg_hba.conf (ogé ayana dina folder /etc/postgresql/11/main) tambahkeun garis ieu:

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

dimana:

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

2. Hayu urang nyieun setélan diperlukeun dina postgresql.conf (aya dina folder /etc/postgresql/11/main) pikeun pgbackrest dianggo:

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

3. Hayu urang nyieun setélan diperlukeun dina file konfigurasi pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Muat ulang postgresql:

sudo service postgresql restart

Nyetél server gudang

Repository (pamaké pgbackrest):

Hayu urang nyieun setélan diperlukeun dina file konfigurasi 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

Nyieun gudang

Repository (pamaké pgbackrest):

Jieun gudang anyar pikeun klaster utama:

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

pamariksaan

Server Postgres (pangguna sudo atanapi root):

Kami pariksa dina server postgres:

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

Repository (pamaké pgbackrest):

Urang pariksa dina server gudang:

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

Kami mastikeun yén dina kaluaran kami ningali garis "pariksa tungtung paréntah: réngsé suksés".

capé? Hayu urang ngaléngkah ka bagian paling metot.

Nyieun cadangan

Repository (pamaké pgbackrest):

1. Laksanakeun cadangan:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Pastikeun yén cadangan geus dijieun:

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

Pgbackrest bakal nyieun cadangan pinuh munggaran. Upami anjeun hoyong, anjeun tiasa ngajalankeun paréntah cadangan deui sareng pastikeun yén sistem nyiptakeun cadangan tambahan.

Upami anjeun hoyong ngadamel cadangan lengkep deui, teras tangtoskeun bandéra tambahan:

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

Upami anjeun hoyong kaluaran konsol anu lengkep, teras sebutkeun ogé:

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

Malikkeun cadangan

Server Postgres (pangguna sudo atanapi root):

1. Ngeureunkeun klaster ngajalankeun:

sudo pg_ctlcluster 11 main stop

2. Malikkeun tina cadangan:

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

Pikeun mulangkeun pangkalan data kana kaayaan cadangan FULL anu terakhir, paké paréntah tanpa nangtukeun recovery_target:

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

Kadé! Saatos pamulihan, éta tiasa lumangsung yén pangkalan data macét dina modeu pamulihan (bakal aya kasalahan sapertos ERROR: teu tiasa ngaéksekusi DROP DATABASE dina transaksi anu dibaca wungkul). Jujur, kuring henteu acan ngartos naon hubunganana ieu. Solusina nyaéta kieu (anjeun kedah ngantosan sakedik saatos paréntahna dieksekusi):

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

Kanyataanna, kasebut nyaéta dimungkinkeun pikeun mulangkeun cadangan husus ku ngaranna. Di dieu kuring wungkul Kuring baris nyadiakeun tumbu ka pedaran fitur ieu dina dokuméntasi. Pamekar nyarankeun ngagunakeun pilihan ieu kalayan ati-ati sareng ngajelaskeun kunaon. Abdi tiasa nambihan ti kuring sorangan yén kuring nganggo éta. Lamun bener perlu, pastikeun yén sanggeus recovery database kaluar mode recovery (pilih pg_is_in_recovery () kedah nembongkeun "f") jeung, ngan bisi, nyieun cadangan pinuh sanggeus recovery.

3. Mimitian klaster:

sudo pg_ctlcluster 11 main start

Saatos malikkeun cadangan, urang kedah ngalakukeun cadangan kadua:

Repository (pamaké pgbackrest):

sudo pgbackrest --stanza=main backup

Éta hungkul. Dina kacindekan, abdi hoyong ngingetkeun yén kuring henteu nyobian pura-pura janten dba senior sareng bakal nganggo awan dina kasempetan anu sakedik. Ayeuna, kuring sorangan mimiti diajar sababaraha topik sapertos cadangan, réplikasi, monitoring, jsb. jeung kuring nulis laporan leutik ngeunaan hasil dina raraga nyieun kontribusi leutik ka masarakat jeung ninggalkeun lambaran curang leutik keur kuring sorangan.

Dina artikel di handap ieu kuring bakal coba ngobrol ngeunaan fitur tambahan - recovery data ka klaster bersih, enkripsi cadangan tur medarkeun ka S3, cadangan via rsync.

sumber: www.habr.com

Tambahkeun komentar