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