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.