Pemahaman tentang pg_probackup. Bagian pertama

gambar



Hai, saya Alexander Nikitin, kepala administrator sistem BARS Group. Pada artikel ini, saya ingin memperkenalkan Anda pada alat pg_probackup .



Pg_probackup adalah pengembangan dari Postgres Professional yang membantu membuat salinan cadangan DBMS PostgreSQL. Tidak seperti utilitas pg_basebackup standar, alat ini memungkinkan Anda membuat cadangan tambahan di tingkat blok data (8Kb secara default), memvalidasi cadangan dan DBMS, menetapkan kebijakan penyimpanan, dan banyak lagi.



Pada artikel ini, saya tidak bermaksud untuk menjelaskan semua aspek yang mungkin dari bekerja dengan pg_probackup, saya hanya ingin memberikan pemahaman tentang bagaimana Anda dapat menggunakan alat ini dalam pekerjaan Anda.



Kasus penggunaan berikut akan dipertimbangkan:



  • wal-


1



Diberikan: Kami memiliki dua server (OS CentOS 7), yang pertama kami memiliki database kami (hostname srv_db1, user postgres, PostgreSQL 12.4 diinstal), dan yang kedua kami akan menyimpan backup (hostname srv_bkp, user backup_user).

Anda harus mengkonfigurasi cadangan sehingga salinan cluster PostgreSQL disimpan di server srv_bkp.



Solusi:

pg_probackup dapat bekerja melalui ssh, meluncurkan agen pada host jarak jauh yang menggunakan koneksi ssh sebagai saluran komunikasi dan transportasi. Oleh karena itu, Anda perlu memastikan bahwa backup_user di host srv_bkp dapat terhubung ke pengguna postgres di host srv_db1.



1) Hubungkan ke srv_bkp dengan backup_user dan jalankan perintah berikut:



ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1


Hidupkan mode paranoid dan edit file ~ / .ssh / authorized_keys pada server srv_db1

Sebelum baris dengan kunci, masukkan yang berikut ini:



command="pg_probackup-12 agent"


Jadi Anda harus berakhir dengan sesuatu seperti ini:

command="pg_probackup-12 agent" ssh-rsa AAAA....


Dengan ini kami mengatakan bahwa tidak ada selain "pg_probackup-12 agent" yang dapat diluncurkan melalui SSH (Anda dapat membaca lebih lanjut tentang ini di sini ).



2) Kami menginstal pg_probackup di kedua mesin (dalam contoh kami sedang mengerjakan CentOS, tetapi untuk distribusi lain proses instalasi dijelaskan dalam dokumentasi ):



yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo


Versi terbaru pg_probackup yang tersedia akan diinstal, pada saat penulisan ini - 2.4.2.



3) buat alias di srv_bkp (ini tidak perlu, tetapi lebih mudah) dan tentukan variabel yang berisi jalur ke direktori dengan cadangan (setelah membuat direktori ini sebelumnya):



mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile


memuat profil



. .bash_profile


4) di srv_bkp, inisialisasi direktori backup dan tambahkan instance baru:



pg_probackup init


Tambahkan instance PostgreSQL ke direktori, beri nama db1, tentukan parameter koneksi ssh - host, nama pengguna, dan jalur ke PGDATA.



pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data


Jika garis itu muncul



INFO: Instance 'db1' successfully inited


Jadi inisialisasi berhasil.

Mari tentukan kebijakan untuk retensi cadangan:



pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2


Kebijakan yang dihasilkan bermuara sebagai berikut:



semua cadangan harus disimpan di bawah 7 hari,

sedangkan jumlah cadangan penuh harus setidaknya dua



5) Untuk membuat cadangan, Anda perlu terhubung ke DBMS, jadi kami membuat database di cluster PostgreSQL tempat koneksi akan terjadi untuk mengelola proses pencadangan (dari sudut pandang keamanan, ini lebih baik daripada menghubungkan ke database produk), dan juga mengubah parameter database:



$ createdb backupdb


bergabung dengan database baru



psql -d backupdb


buat peran database atas nama yang proses pencadangannya akan dikelola:



BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;


Mari perhatikan parameter listen_addresses:



show listen_addresses;


jika localhost, ubah ke *



alter system set listen_addresses='*';


Jika Anda mengubah listen_addresses, maka PostgreSQL harus direstart.



Mari kita lihat di mana kita telah menemukan file pg_hba.conf



psql –c 'show hba_file'


Tambahkan aturan berikut ke pg_hba.conf:



# pg_probackup access permission
host    backupdb   backup          srv_bkp        md5
host    replication  backup          srv_bkp        md5


Kami membaca kembali konfigurasi:

psql -c 'select pg_reload_conf()'


Kami memeriksa apakah ada kesalahan ketik:



psql -c 'select * from pg_hba_file_rules'


Di srv_bkp, di direktori home dari pengguna backup_user, buat file di mana kita menulis nama server atau alamat ip, port, nama database, nama pengguna dan kata sandi. File ini diperlukan agar kata sandi dimasukkan secara otomatis saat membuat salinan cadangan.



echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass


Tetapkan hak akses yang diperlukan untuk file ini



chmod 600 ~/.pgpass


Dan buat cadangan pertama:



pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres


Jika kami melakukan semuanya dengan benar, maka sesuatu seperti ini akan muncul di layar:



INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy


Perhatikan peringatan yang dikeluarkan oleh pg_probackup - pemeriksaan checksum tidak diaktifkan di cluster kami, sehingga tidak dapat memeriksa kebenaran blok data. Dengan kata lain, Anda tidak terlindungi dari fakta bahwa blok data yang buruk tidak masuk ke dalam cadangan.



Mari kita lihat pengaturan saat ini:



pg_probackup show-config --instance db1


Sekarang mari kita persingkat perintah untuk membuat cadangan - kita akan menulis beberapa parameter dalam konfigurasi contoh db1:



pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log


Mari kita bandingkan: bagaimana itu dan bagaimana jadinya



pg_probackup show-config --instance db1


Dulu Telah menjadi
# Backup instance information

pgdata = /var/lib/pgsql/12/data

system-identifier = 6863327140287059463

xlog-seg-size = 16777216

# Connection parameters

pgdatabase = backup_user



# Replica parameters

replica-timeout = 5min

# Archive parameters

archive-timeout = 5min

# Logging parameters

log-level-console = INFO

log-level-file = OFF

log-filename = pg_probackup.log



log-rotation-size = 0TB

log-rotation-age = 0d

# Retention parameters

retention-redundancy = 2

retention-window = 7

wal-depth = 0

# Compression parameters

compress-algorithm = none

compress-level = 1

# Remote access parameters

remote-proto = ssh

# Backup instance information

pgdata = /var/lib/pgsql/12/data

system-identifier = 6863327140287059463

xlog-seg-size = 16777216

# Connection parameters

pgdatabase = backupdb

pghost = srv_db1

pguser = backup


# Replica parameters

replica-timeout = 5min

# Archive parameters

archive-timeout = 5min

# Logging parameters

log-level-console = INFO

log-level-file = LOG

log-filename = backup_cron.log

log-directory = /home/backup_user/backup_db/log


log-rotation-size = 0TB

log-rotation-age = 0d

# Retention parameters

retention-redundancy = 2

retention-window = 7

wal-depth = 0

# Parameter

kompresi algoritme kompres = tidak ada

level kompres = 1

# Parameter akses

jarak jauh remote-proto = ssh

remote-host = srv_db1

remote-user = postgres






Mari membuat salinan inkremental dalam mode DELTA tanpa menentukan parameter yang disetel dalam konfigurasi:



pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired


Mari kita lihat apa yang kita punya

BACKUP INSTANCE 'db1'
=====================================================================================================================================
 Instance  Version  ID      Recovery Time           Mode   WAL Mode  TLI   Time   Data   WAL  Zratio  Start LSN   Stop LSN    Status
=====================================================================================================================================
 db1       12       QFERKZ  2020-08-21 05:55:52-04  DELTA  STREAM    1/1     9s  136kB  32MB    1.00  0/B0000028  0/B0000168  OK
 db1       12       QFERC9  2020-08-21 05:51:34-04  FULL   STREAM    1/0  1m:3s  959MB  16MB    3.52  0/AE000028  0/AE0001A0  OK 


Ada banyak informasi, penjelasan rinci dapat ditemukan dalam dokumentasi , namun, mari kita bahas beberapa poin:



Waktu Pemulihan - waktu minimum untuk memulihkan menggunakan



Mode cadangan ini - mode di mana salinan dibuat, saat ini tersedia 4 mode - satu Mode WAL penuh (FULL) dan tiga incremental (PAGE, DELTA dan PTRACK)



- opsi berikut dimungkinkan di sini - STREAM dan ARCHIVE. Salinan yang dibuat dalam mode STREAM berisi semua file yang diperlukan untuk memulihkan ke status WAL yang konsisten. Hanya agar mode ini berfungsi, itu perlu untuk memberikan peran REPLIKASI kepada pengguna cadangan kami. Mode ARCHIVE mengasumsikan bahwa kita telah mengkonfigurasi pengarsipan WAL, dan kemudian file WAL yang diperlukan akan ditempatkan di jalur yang dikenal dengan pg_probackup.



Status - ada banyak status, semuanya dijelaskan dalam dokumentasi, tetapi jika kami melihat sesuatu yang berbeda dari OK, maka masuk akal untuk membuka dokumentasi dan melihat apa yang salah.



Seperti yang mungkin sudah Anda duga, kami dapat mengurai output dari perintah pg_probackup show dan mendapatkan status dari cadangan terakhir yang dibuat, memprosesnya, dan mengirimkannya ke sistem pemantauan, dan di sana kami sudah dapat menyiapkan aturan yang akan digunakan untuk memicu pemberitahuan karyawan yang bertanggung jawab atas DBMS.



Mari buat skrip bkp_base.sh yang akan memulai pencadangan dan mengirimkan hasilnya ke sistem pemantauan:



#! /bin/sh
#    
. /home/backup_user/.bash_profile
#    ,        (FULL, DELTA  ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired 
#         zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
  result=0;
else
  result=1;
fi
#  zabbix        zabbix_trapper   pg.db_backup
#         ,      ,  ,         .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result


Kami menulis panggilan ke skrip yang dihasilkan di crontab, misalnya, Anda dapat menyetel jadwal berikut:



00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA


Ini menyelesaikan solusi dari tugas pertama - kami mengonfigurasi cadangan, menetapkan kebijakan penyimpanan salinan. Kami juga mengirim status cadangan ke sistem pemantauan.



Di bagian selanjutnya , kita akan melihat cara membuat arsip file wal dan membuat backup arsip.



All Articles