Serep postgresql tambahan karo pgbackrest - kursus kanggo pejuang enom saka pangembang

Penafian

Aku pangembang. Aku nulis kode lan sesambungan karo database mung minangka pangguna. Aku ora nyamar dadi administrator sistem, luwih-luwih dba. Nanging…

Kedaden aku kudu ngatur serep database postgresql. Ora ana awan - mung gunakake SSH lan priksa manawa kabeh bisa digunakake tanpa njaluk dhuwit. Apa sing kudu ditindakake ing kasus kaya ngono? Bener, kita push pgdump menyang cron, serep kabeh menyang arsip saben dina, lan yen kita wis ilang, kita ngirim arsip iki nang endi wae adoh.

Wektu iki kangelan yaiku miturut rencana, basis data kudune tuwuh kira-kira +- 100 MB saben dina. Mesthi, sawise sawetara minggu kepinginan kanggo nggawe cadangan kabeh karo pgdump bakal ilang. Iki ngendi serep tambahan teka kanggo ngluwari.

menarik? Sugeng rawuh ing kucing.

Incremental backup minangka jinis serep nalika ora kabeh file sumber disalin, nanging mung sing anyar lan sing diganti wiwit nggawe salinan sadurunge.

Kaya pangembang sing pancen ora gelem (ing wektu iku) ngerti seluk-beluk postgres, aku pengin golek tombol ijo. Ya, sampeyan ngerti, kaya ing AWS, DigitalOcean: sampeyan menet tombol siji - sampeyan entuk replikasi, sampeyan menet nomer loro - sampeyan nyiyapake serep, nomer telu - sampeyan mbaleni kabeh sawetara jam. Aku ora nemu tombol utawa alat GUI ayu. Yen sampeyan ngerti siji (gratis utawa murah), tulis babagan ing komentar.

Sawise googling aku nemokake rong alat pgbarman ΠΈ pgbackrest. Aku mung ora sukses karo sing pisanan (dokumentasi sing arang banget, aku nyoba ngerteni kabeh miturut manual lawas), nanging kanthi sing nomer loro, dokumentasi kasebut cocog, nanging ora ana cacat. Kanggo nyederhanakake karya wong-wong sing ngadhepi tugas sing padha, artikel iki ditulis.

Sawise maca artikel iki, sampeyan bakal sinau babagan nggawe serep tambahan, simpen menyang server remot (gudang karo serep) lan mulihake yen ana data ilang utawa masalah liyane ing server utama.

Latihan

Kanggo ngasilake manual sampeyan butuh rong VPS. Sing pisanan bakal dadi panyimpenan (gudang sing bakal disimpen serep), lan sing nomer loro, nyatane, server kasebut dhewe karo postgres (ing kasusku, versi 11 postgres).

Dianggep yen ing server karo postgres sampeyan duwe root, sudo user, postgres user lan postgres dhewe diinstal (pangguna postgres digawe kanthi otomatis nalika nginstal postgresql), lan ing server repositori ana root lan sudo user (ing manual jeneng panganggo pgbackrest bakal digunakake).

Supaya sampeyan duwe masalah luwih sithik nalika ngasilake instruksi, aku nulis miring ngendi, karo apa pangguna lan apa hak aku nindakake printah nalika nulis lan mriksa artikel.

Nginstal pgbackrest

Repositori (pangguna pgbackrest):

1. Download arsip saka pgbackrest lan transfer isine menyang 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. Instal dependensi sing dibutuhake kanggo perakitan:

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

3. Ngrakit pgbackrest:

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

4. Salin file eksekusi menyang direktori /usr/bin:

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

5. Pgbackrest mbutuhake perl. Instal:

sudo apt-get install perl

6. Nggawe direktori kanggo log, wenehi hak tartamtu:

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

pgbackrest version

Server postgres (pangguna sudo utawa root):

Proses nginstal pgbackrest ing server kanthi postgres padha karo proses instalasi ing repositori (ya, pgbackrest kudu diinstal ing loro server kasebut), nanging ing paragraf kaping 6 prentah kapindho lan pungkasan:

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

ganti karo:

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

Nggawe interaksi antarane server liwat SSH tanpa sandi

Supaya pgbackrest bisa digunakake kanthi bener, perlu kanggo ngatur interaksi antarane server postgres lan gudang nggunakake file kunci.

Repositori (pangguna pgbackrest):

Nggawe pasangan kunci:

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

Ati-ati Kita mbukak printah ing ndhuwur tanpa sudo.

Server postgres (pangguna sudo utawa root):

Nggawe pasangan kunci:

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 ""

Repositori (pangguna sudo):

Salin kunci publik server postgres menyang server repositori:

(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

Ing langkah iki, sampeyan bakal dijaluk sandhi kanggo pangguna root. Sampeyan kudu ngetik sandhi pangguna root server postgres!

Server postgres (pangguna sudo):

Salin kunci umum repositori menyang server kanthi 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

Ing langkah iki, sampeyan bakal dijaluk sandhi kanggo pangguna root. Sampeyan kudu ngetik persis sandhi pangguna root saka gudang!

Priksa:

Repositori (pangguna root, kanggo kemurnian eksperimen):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (pangguna root, kanggo kemurnian eksperimen):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Kita priksa manawa kita entuk akses tanpa masalah.

Nggawe server postgres

Server postgres (pangguna sudo utawa root):

1. Ayo ngidini nuthuk server postgres saka IP eksternal. Kanggo nindakake iki, sunting file postgresql.conf (dumunung ing /etc/postgresql/11/folder utama), nambahake baris kasebut:

listen_addresses = '*'

Yen baris kasebut wis ana, copot komentar utawa setel nilai parameter minangka '*'.

Ing file pg_hba.conf (uga dumunung ing folder /etc/postgresql/11/main) tambahake baris ing ngisor iki:

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

ing pundi:

hostssl/host - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Ρ‡Π΅Ρ€Π΅Π· SSL (ΠΈΠ»ΠΈ Π½Π΅Ρ‚)
all - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм Π±Π°Π·Π°ΠΌ
all - имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (всСм)
0.0.0.0/0 - маска сСти с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ
md5 - способ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ пароля

2. Ayo dadi nggawe setelan perlu ing postgresql.conf (iku ana ing folder /etc/postgresql/11/main) kanggo pgbackrest bisa digunakake:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Π“Π΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кластСра. ΠŸΡ€ΠΈ установкС postgres автоматичСски создаСт кластСр main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Ayo nggawe setelan sing perlu ing 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. Reload postgresql:

sudo service postgresql restart

Nggawe server repositori

Repositori (pangguna pgbackrest):

Ayo nggawe setelan sing dibutuhake ing 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

Nggawe repositori

Repositori (pangguna pgbackrest):

Nggawe panyimpenan anyar kanggo kluster utama:

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

pengawasan

Server postgres (pangguna sudo utawa root):

Kita mriksa server postgres:

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

Repositori (pangguna pgbackrest):

Kita mriksa server repositori:

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

Kita priksa manawa ing output kita ndeleng baris "mriksa printah pungkasan: rampung kasil".

kesel? Ayo pindhah menyang bagean sing paling menarik.

Nggawe serep

Repositori (pangguna pgbackrest):

1. Gawe serep:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Priksa manawa serep wis digawe:

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

Pgbackrest bakal nggawe serep lengkap pisanan. Yen sampeyan pengin, sampeyan bisa mbukak printah serep maneh lan priksa manawa sistem nggawe serep tambahan.

Yen sampeyan pengin nggawe serep lengkap maneh, banjur nemtokake gendera tambahan:

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

Yen sampeyan pengin output console rinci, banjur uga nemtokake:

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

Mulihake serep

Server postgres (pangguna sudo utawa root):

1. Mungkasi kluster mlaku:

sudo pg_ctlcluster 11 main stop

2. Mulihake saka serep:

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

Kanggo mulihake database menyang status serep FULL pungkasan, gunakake printah tanpa nemtokake recovery_target:

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

Penting! Sawise pemulihan, bisa uga database macet ing mode pemulihan (bakal ana kesalahan kaya ERROR: ora bisa nglakokake DROP DATABASE ing transaksi mung diwaca). Jujur, aku durung ngerti hubungane karo apa. Solusi kasebut kaya ing ngisor iki (sampeyan kudu ngenteni sethithik sawise printah dieksekusi):

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

Nyatane, iku bisa kanggo mulihake serep tartamtu kanthi jeneng. Ing kene aku mung Aku bakal nyedhiyani link kanggo katrangan fitur iki ing dokumentasi. Pangembang menehi saran nggunakake pilihan iki kanthi ati-ati lan nerangake sebabe. Aku bisa nambah saka aku digunakake. Yen pancene perlu, priksa manawa sawise Recovery database metu saka mode Recovery (pilih pg_is_in_recovery () kudu nuduhake "f") lan, mung ing kasus, nggawe serep lengkap sawise Recovery.

3. Miwiti kluster:

sudo pg_ctlcluster 11 main start

Sawise mulihake serep, kita kudu nindakake serep kapindho:

Repositori (pangguna pgbackrest):

sudo pgbackrest --stanza=main backup

Mekaten. Ing kesimpulan, aku pengin ngelingake sampeyan yen aku ora nyoba pura-pura dadi dba senior lan bakal nggunakake awan ing kesempatan sing paling sithik. Saiki, aku dhewe wiwit sinau macem-macem topik kayata backup, replikasi, monitoring, lsp. lan aku nulis laporan cilik babagan asil kanggo nggawe kontribusi cilik kanggo masyarakat lan ninggalake sheet cheat cilik kanggo aku.

Ing artikel ing ngisor iki aku bakal nyoba kanggo pirembagan bab fitur tambahan - Recovery data menyang cluster resik, enkripsi serep lan Publishing kanggo S3, serep liwat rsync.

Source: www.habr.com

Add a comment