Pencadangan postgresql tambahan dengan pgbackrest - kursus untuk pejuang muda dari pengembang

Π΅ΠΉΠΌΠ΅Ρ€

Saya seorang pengembang. Saya menulis kode dan berinteraksi dengan database hanya sebagai pengguna. Saya sama sekali tidak berpura-pura menjadi administrator sistem, apalagi seorang dba. Tetapi…

Kebetulan saya perlu mengatur cadangan database postgresql. Tanpa cloud - cukup gunakan SSH dan pastikan semuanya berfungsi tanpa meminta uang. Apa yang kita lakukan dalam kasus seperti itu? Itu benar, kami mendorong pgdump ke cron, mencadangkan semuanya ke arsip setiap hari, dan jika kami benar-benar hilang, kami mengirim arsip ini ke suatu tempat yang jauh.

Kesulitannya kali ini adalah menurut rencana, database seharusnya bertambah sekitar +- 100 MB per hari. Tentu saja, setelah beberapa minggu keinginan untuk mencadangkan semuanya dengan pgdump akan hilang. Di sinilah pencadangan tambahan dapat membantu.

Menarik? Selamat datang di kucing.

Pencadangan tambahan adalah jenis pencadangan ketika tidak semua file sumber disalin, tetapi hanya file baru dan yang diubah sejak pembuatan salinan sebelumnya.

Seperti pengembang mana pun yang BENAR-BENAR tidak mau (pada saat itu) memahami seluk-beluk postgres, saya ingin mencari tombol hijau. Nah, Anda tahu, seperti di AWS, DigitalOcean: Anda menekan satu tombol - Anda mendapat replikasi, Anda menekan tombol kedua - Anda menyiapkan cadangan, tombol ketiga - Anda mengembalikan semuanya beberapa jam. Saya tidak menemukan tombol atau alat GUI yang cantik. Jika Anda mengetahuinya (gratis atau murah), tulis di komentar.

Setelah googling saya menemukan dua alat pgbarman ΠΈ pgbackrest. Saya sama sekali tidak berhasil dengan yang pertama (dokumentasinya sangat jarang, saya mencoba memikirkan semuanya sesuai dengan manual lama), tetapi dengan yang kedua dokumentasinya ternyata normal, tetapi bukannya tanpa kekurangan. Untuk mempermudah pekerjaan mereka yang dihadapkan pada tugas serupa, artikel ini ditulis.

Setelah membaca artikel ini, Anda akan mempelajari cara membuat cadangan tambahan, menyimpannya ke server jauh (repositori dengan cadangan) dan memulihkannya jika terjadi kehilangan data atau masalah lain di server utama.

Latihan

Untuk mereproduksi manual Anda memerlukan dua VPS. Yang pertama adalah penyimpanan (repositori tempat cadangan akan disimpan), dan yang kedua, sebenarnya, server itu sendiri dengan postgres (dalam kasus saya, postgres versi 11).

Diasumsikan bahwa di server dengan postgres Anda memiliki root, pengguna sudo, pengguna postgres dan postgres itu sendiri diinstal (pengguna postgres dibuat secara otomatis saat menginstal postgresql), dan di server repositori ada pengguna root dan sudo (dalam manual nama pengguna pgbackrest akan digunakan) .

Agar Anda memiliki lebih sedikit masalah saat mereproduksi instruksi, saya menulis dalam huruf miring di mana, dengan pengguna apa dan dengan hak apa saya menjalankan perintah saat menulis dan memeriksa artikel.

Memasang pgbackrest

Repositori (pgbackrest pengguna):

1. Unduh arsip dari pgbackrest dan transfer isinya 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. Instal dependensi yang diperlukan untuk perakitan:

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

3. Merakit sandaran punggung:

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

4. Salin file yang dapat dieksekusi ke direktori /usr/bin:

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

5. Pgbackrest membutuhkan perl. Install:

sudo apt-get install perl

6. Buat direktori untuk log, beri 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. Periksa:

pgbackrest version

Server Postgres (pengguna sudo atau root):

Proses instalasi pgbackrest di server dengan postgres mirip dengan proses instalasi di repositori (iya, pgbackrest harus diinstal di kedua server), tapi di paragraf ke 6 perintah kedua dan terakhir:

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

ubah dengan:

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

Menyiapkan interaksi antar server melalui SSH tanpa kata sandi

Agar pgbackrest berfungsi dengan benar, perlu untuk mengkonfigurasi interaksi antara server postgres dan repositori menggunakan file kunci.

Repositori (pgbackrest pengguna):

Buat pasangan kunci:

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

Peringatan! Kami menjalankan perintah di atas tanpa sudo.

Server 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 publik server postgres ke 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

Pada langkah ini Anda akan dimintai kata sandi untuk pengguna root. Anda harus memasukkan kata sandi pengguna root server postgres!

Server Postgres (pengguna sudo):

Salin kunci publik repositori ke server 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 dimintai kata sandi untuk pengguna root. Anda harus memasukkan kata sandi pengguna root repositori dengan tepat!

Kami memeriksa:

Repositori (pengguna root, untuk kemurnian percobaan):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (pengguna root, untuk kemurnian percobaan):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Kami memastikan bahwa kami mendapatkan akses tanpa masalah.

Menyiapkan server postgres

Server Postgres (pengguna sudo atau root):

1. Izinkan mengetuk server postgres dari IP eksternal. Untuk melakukan ini, edit file tersebut postgresql.conf (terletak di folder /etc/postgresql/11/main), tambahkan baris ke dalamnya:

listen_addresses = '*'

Jika baris tersebut sudah ada, hapus komentar atau tetapkan nilai parameter sebagai '*'.

Dalam file pg_hba.conf (juga terletak di folder /etc/postgresql/11/main) tambahkan 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 kita buat pengaturan yang diperlukan postgresql.conf (ada di dalam folder /etc/postgresql/11/main) agar 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 pengaturan yang diperlukan di 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

Menyiapkan server repositori

Repositori (pengguna pgbackrest):

Mari buat pengaturan yang diperlukan di 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

Membuat repositori

Repositori (pengguna pgbackrest):

Buat penyimpanan baru untuk cluster utama:

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

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

Server Postgres (pengguna sudo atau root):

Kami memeriksa di server postgres:

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

Repositori (pengguna pgbackrest):

Kami memeriksa di server repositori:

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

Kami memastikan bahwa di output kami melihat baris "periksa akhir perintah: berhasil diselesaikan".

Lelah? Mari beralih ke bagian yang paling menarik.

Membuat cadangan

Repositori (pengguna pgbackrest):

1. Lakukan pencadangan:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Pastikan cadangan telah dibuat:

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

Pgbackrest akan membuat cadangan penuh pertama. Jika mau, Anda dapat menjalankan kembali perintah pencadangan dan memastikan sistem membuat cadangan tambahan.

Jika Anda ingin membuat cadangan penuh lagi, tentukan tanda tambahan:

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

Jika Anda ingin keluaran konsol mendetail, tentukan juga:

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

Memulihkan cadangan

Server Postgres (pengguna sudo atau root):

1. Hentikan klaster yang sedang berjalan:

sudo pg_ctlcluster 11 main stop

2. Memulihkan dari cadangan:

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

Untuk memulihkan database ke status cadangan LENGKAP terakhir, gunakan perintah tanpa menentukan target_pemulihan:

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

Penting! Setelah pemulihan, mungkin saja database terjebak dalam mode pemulihan (akan terjadi kesalahan seperti ERROR: tidak dapat mengeksekusi DROP DATABASE dalam transaksi read-only). Sejujurnya, saya belum mengerti apa hubungannya. Solusinya adalah sebagai berikut (Anda perlu menunggu sebentar setelah perintah dijalankan):

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

Faktanya, dimungkinkan untuk memulihkan cadangan tertentu berdasarkan namanya. Di sinilah aku saja Saya akan memberikan link ke deskripsi fitur ini di dokumentasi. Pengembang menyarankan untuk menggunakan opsi ini dengan hati-hati dan menjelaskan alasannya. Saya dapat menambahkan dari diri saya sendiri bahwa saya menggunakannya. Jika Anda benar-benar perlu melakukannya, pastikan setelah pemulihan database keluar dari mode pemulihan (pilih pg_is_in_recovery() akan menampilkan β€œf”) dan, untuk berjaga-jaga, buat cadangan penuh setelah pemulihan.

3. Mulai klaster:

sudo pg_ctlcluster 11 main start

Setelah memulihkan cadangan, kita perlu melakukan pencadangan kedua:

Repositori (pengguna pgbackrest):

sudo pgbackrest --stanza=main backup

Itu saja. Sebagai penutup, saya ingin mengingatkan Anda bahwa saya sama sekali tidak mencoba berpura-pura menjadi dba senior dan akan menggunakan awan jika ada kesempatan. Saat ini saya sendiri mulai mempelajari berbagai topik seperti backup, replikasi, monitoring, dll. dan saya menulis laporan kecil tentang hasilnya untuk memberikan kontribusi kecil kepada komunitas dan meninggalkan lembar contekan kecil untuk diri saya sendiri.

Pada artikel berikut saya akan mencoba berbicara tentang fitur tambahan - pemulihan data ke cluster yang bersih, enkripsi cadangan dan penerbitan ke S3, cadangan melalui rsync.

Sumber: www.habr.com

Tambah komentar