Sandaran postgresql tambahan dengan pgbackrest - kursus pejuang muda daripada pemaju

Penafian

Saya seorang pemaju. Saya menulis kod dan berinteraksi dengan pangkalan data hanya sebagai pengguna. Saya tidak berpura-pura menjadi pentadbir sistem, apalagi dba. Tetapi…

Kebetulan saya perlu mengatur sandaran pangkalan data postgresql. Tiada awan - hanya gunakan SSH dan pastikan semuanya berfungsi tanpa meminta wang. Apa yang kita lakukan dalam kes sedemikian? Betul, kami menolak pgdump ke dalam cron, menyandarkan segala-galanya ke arkib setiap hari, dan jika kami hilang sepenuhnya, kami menghantar arkib ini ke tempat yang jauh.

Kali ini kesukarannya ialah mengikut rancangan, pangkalan data sepatutnya berkembang kira-kira +- 100 MB sehari. Sudah tentu, selepas beberapa minggu keinginan untuk membuat sandaran semuanya dengan pgdump akan hilang. Di sinilah sandaran tambahan datang untuk menyelamatkan.

Menarik? Selamat datang ke kucing.

Sandaran tambahan ialah sejenis sandaran apabila tidak semua fail sumber disalin, tetapi hanya yang baharu dan yang diubah sejak penciptaan salinan sebelumnya.

Seperti mana-mana pemaju yang sama sekali tidak mahu (pada masa itu) memahami selok-belok postgres, saya ingin mencari butang hijau. Nah, anda tahu, seperti dalam AWS, DigitalOcean: anda menekan satu butang - anda mendapat replikasi, anda menekan yang kedua - anda menyediakan sandaran, yang ketiga - anda melancarkan semuanya kembali beberapa jam. Saya tidak menemui butang atau alat GUI yang cantik. Jika anda tahu satu (percuma atau murah), tulis mengenainya dalam ulasan.

Selepas googling saya menemui dua alat pgbarman ΠΈ pgbackrest. Saya hanya tidak berjaya dengan yang pertama (dokumentasi yang sangat jarang, saya cuba memikirkan segala-galanya mengikut manual lama), tetapi dengan yang kedua dokumentasi ternyata setanding, tetapi bukan tanpa kelemahan. Untuk memudahkan kerja mereka yang menghadapi tugas yang sama, artikel ini ditulis.

Selepas membaca artikel ini, anda akan belajar cara membuat sandaran tambahan, menyimpannya ke pelayan jauh (repositori dengan sandaran) dan memulihkannya sekiranya berlaku kehilangan data atau masalah lain pada pelayan utama.

Latihan

Untuk menghasilkan semula manual anda memerlukan dua VPS. Yang pertama ialah storan (repositori di mana sandaran akan disimpan), dan yang kedua, sebenarnya, pelayan itu sendiri dengan postgres (dalam kes saya, versi 11 postgres).

Diandaikan bahawa pada pelayan dengan postgres anda mempunyai root, pengguna sudo, pengguna postgres dan postgres itu sendiri dipasang (pengguna postgres dibuat secara automatik apabila memasang postgresql), dan pada pelayan repositori terdapat pengguna root dan sudo (dalam manual nama pengguna pgbackrest akan digunakan) .

Supaya anda mempunyai lebih sedikit masalah semasa mengeluarkan semula arahan, saya menulis dalam huruf condong di mana, dengan pengguna apa dan dengan hak apa saya melaksanakan arahan itu semasa menulis dan menyemak artikel.

Memasang pgbackrest

Repositori (pengguna pgbackrest):

1. Muat turun arkib dari pgbackrest dan pindahkan kandungannya ke 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 kebergantungan yang diperlukan untuk pemasangan:

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

3. Memasang pgbackrest:

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

4. Salin fail boleh laku ke direktori /usr/bin:

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

5. Pgbackrest memerlukan perl. Pasang:

sudo apt-get install perl

6. Buat direktori untuk log, berikan mereka hak tertentu:

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

pgbackrest version

Pelayan postgres (pengguna sudo atau root):

Proses memasang pgbackrest pada pelayan dengan postgres adalah serupa dengan proses pemasangan pada repositori (ya, pgbackrest mesti dipasang pada kedua-dua pelayan), tetapi dalam perenggan ke-6 perintah kedua dan terakhir:

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

gantikan dengan:

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

Menyediakan interaksi antara pelayan melalui SSH tanpa kata laluan

Agar pgbackrest berfungsi dengan betul, adalah perlu untuk mengkonfigurasi interaksi antara pelayan postgres dan repositori menggunakan fail utama.

Repositori (pengguna pgbackrest):

Buat pasangan kunci:

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

Amaran! Kami menjalankan arahan di atas tanpa sudo.

Pelayan postgres (pengguna sudo atau root):

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

Salin kunci awam pelayan postgres ke pelayan 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

Pada langkah ini anda akan diminta untuk kata laluan untuk pengguna root. Anda perlu memasukkan kata laluan pengguna root pelayan postgres!

Pelayan postgres (pengguna sudo):

Salin kunci awam repositori ke pelayan dengan 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

Pada langkah ini anda akan diminta untuk kata laluan untuk pengguna root. Anda perlu memasukkan betul-betul kata laluan pengguna root repositori!

Kami menyemak:

Repositori (pengguna akar, untuk kesucian eksperimen):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Pelayan Postgres (pengguna root, untuk kesucian percubaan):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Kami memastikan bahawa kami mendapat akses tanpa masalah.

Menyediakan pelayan postgres

Pelayan postgres (pengguna sudo atau root):

1. Mari kita benarkan mengetuk pelayan postgres daripada IP luaran. Untuk melakukan ini, edit fail postgresql.conf (terletak dalam folder /etc/postgresql/11/main), tambah baris padanya:

listen_addresses = '*'

Jika baris sedemikian sudah wujud, sama ada nyahkomennya atau tetapkan nilai parameter sebagai '*'.

Dalam fail pg_hba.conf (juga terletak dalam folder /etc/postgresql/11/main) tambah baris berikut:

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

di mana:

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

2. Mari buat tetapan yang diperlukan dalam postgresql.conf (ia ada dalam folder /etc/postgresql/11/main) untuk pgbackrest berfungsi:

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

3. Mari buat tetapan yang diperlukan dalam fail 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 semula postgresql:

sudo service postgresql restart

Menyediakan pelayan repositori

Repositori (pengguna pgbackrest):

Mari buat tetapan yang diperlukan dalam fail 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 # ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сколько Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапов. Π’.Π΅. Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… бэкапа ΠΈ Π²Ρ‹ создаСтС Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ - ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ вмСстС с ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. 
start-fast=y # НачинаСт Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Mencipta repositori

Repositori (pengguna pgbackrest):

Buat storan baharu untuk kluster utama:

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Pelayan postgres (pengguna sudo atau root):

Kami menyemak pada pelayan postgres:

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

Repositori (pengguna pgbackrest):

Kami menyemak pelayan repositori:

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

Kami memastikan bahawa dalam output kami melihat baris "semak perintah tamat: selesai dengan jayanya".

Penat? Mari kita beralih ke bahagian yang paling menarik.

Membuat sandaran

Repositori (pengguna pgbackrest):

1. Lakukan sandaran:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Pastikan sandaran telah dibuat:

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

Pgbackrest akan membuat sandaran penuh pertama. Jika anda mahu, anda boleh menjalankan arahan sandaran sekali lagi dan pastikan sistem mencipta sandaran tambahan.

Jika anda ingin membuat sandaran penuh sekali lagi, kemudian nyatakan bendera tambahan:

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

Jika anda mahukan output konsol terperinci, kemudian nyatakan juga:

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

Memulihkan sandaran

Pelayan postgres (pengguna sudo atau root):

1. Hentikan kluster berjalan:

sudo pg_ctlcluster 11 main stop

2. Memulihkan daripada sandaran:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Mulakan kluster:

sudo pg_ctlcluster 11 main start

Selepas memulihkan sandaran, kami perlu melakukan sandaran kedua:

Repositori (pengguna pgbackrest):

sudo pgbackrest --stanza=main backup

Itu sahaja. Kesimpulannya, saya ingin mengingatkan anda bahawa saya sama sekali tidak cuba berpura-pura menjadi senior dba dan akan menggunakan awan pada peluang yang sedikit. Pada masa ini, saya sendiri mula mempelajari pelbagai topik seperti sandaran, replikasi, pemantauan, dll. dan saya menulis laporan kecil tentang hasilnya untuk membuat sumbangan kecil kepada komuniti dan meninggalkan helaian penipuan kecil untuk diri saya sendiri.

Dalam artikel berikut saya akan cuba bercakap tentang ciri tambahan - pemulihan data kepada kelompok bersih, penyulitan sandaran dan penerbitan ke S3, sandaran melalui rsync.

Sumber: www.habr.com

Tambah komen