Π΅ΠΉΠΌΠ΅Ρ
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
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