Selasa, 16 Juli 2024

POSTGRES-pgbackrest

https://dev.to/mehdipourfar/backup-and-replicate-postgresql-12-using-pgbackrest-in-ubuntu-20-04-5c4e 


Cadangkan dan replikasi Postgresql 12 menggunakan pgBackRest di Ubuntu 20.04

Dalam postingan ini, saya akan memandu Anda melalui proses pengaturan sistem pencadangan berkelanjutan dan server replikasi menggunakan pgBackRest.

Untuk panduan ini, kita perlu memiliki 3 server: pg-masterpg-replicadan pg-backup.

Di semua server ini, kita perlu menambahkan baris berikut ke /etc/hostsfile dan meletakkan ips yang benar di sana:

{master_server_ip} pg-master
{replica_server_ip} pg-replica
{backup_server_ip} pg-backup

Pada pg-master:

sudo apt install postgresql-12 pgbackrest

Pada pg-replica:

sudo apt install postgresql-12 pgbackrest

Pada pg-backup:

sudo apt install pgbackrest

Karena server kami harus berkomunikasi satu sama lain menggunakan koneksi ssh, kami membuat pasangan kunci ssh pada masing-masing server:

Aktif pg-masterpg-replicadan pg-backupjalankan perintah ini:

sudo su postgres
ssh-keygen -t rsa -b 4096 -N ""

Dan kemudian bagikan semua kunci publik di dalam /var/lib/postgresql/.ssh/authorized_keysfile di setiap server. Kemudian kita perlu memeriksa apakah semua koneksi dapat dibuat tanpa masalah:

Pada pg-master:

sudo -u postgres ssh postgres@pg-backup
[exit]
sudo -u postgres ssh postgres@pg-replica
[exit]

Pada pg-replica:

sudo -u postgres ssh postgres@pg-backup
[exit]
sudo -u postgres ssh postgres@pg-master
[exit]

Pada pg-backup:

sudo -u postgres ssh postgres@pg-master
[exit]
sudo -u postgres ssh postgres@pg-replica
[exit]

Jika semuanya berfungsi dengan benar, saatnya mengkonfigurasi pgBackRest.

Pada pg-master, ubah konten /etc/pgbackrest.confdengan baris berikut:

[my_cluster]
pg1-path=/var/lib/postgresql/12/main

[global]
repo1-host=pg-backup
repo1-host-user=postgres

[global:archive-push]
compress-level=3

Lalu, buka /etc/postgresql/12/main/postgresql.confdan ubah variabel berikut:

archive_command = 'pgbackrest --stanza=my_cluster archive-push %p'
archive_mode = on
listen_addresses = '*'
max_wal_senders = 3
wal_level = replica

Dan kemudian restart postgresql:

sudo systemctl restart postgresql

Setelah itu kita akan membuat beberapa data uji:

sudo -u postgres psql

psql (12.4 (Ubuntu 12.4-1.pgdg18.04+1))
Type "help" for help.

postgres=# CREATE DATABASE my_db;
CREATE DATABASE
postgres=# \c my_db
You are now connected to database "my_db" as user "postgres".
my_db=# CREATE TABLE nums(val int);
CREATE TABLE
my_db=# INSERT INTO nums VALUES(1);
INSERT 0 1
my_db=# INSERT INTO nums VALUES(2);
INSERT 0 1
my_db=# INSERT INTO nums VALUES(3);
INSERT 0 1

Sekarang kita memiliki database yang diberi nama my_dbdengan tabel yang diberi nama numsdengan tiga nilai.

Saatnya membuat cadangan kami di pg-backupserver. /etc/pgbackrest.confEdit dulu pg-backupseperti di bawah ini:

[my_cluster]
pg1-host=pg-master
pg1-host-user=postgres
pg1-path=/var/lib/postgresql/12/main                                                                                                               

[global]                                                                                                                                  
process-max=2
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-retention-diff=1
repo1-host-user=postgres
start-fast=y

Kemudian jalankan perintah ini untuk membuat stanza cadangan di pg-backupserver:

sudo -u postgres pgbackrest --stanza=my_cluster --log-level-console=info stanza-create

Kemudian, jalankan perintah ini pada keduanya pg-masterdan pg-backupperiksa apakah semuanya baik-baik saja:

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

Jika semuanya berfungsi dengan baik, saatnya melakukan pencadangan pertama kami di pg-backupserver:

sudo -u postgres pgbackrest --stanza=my_cluster --log-level-console=info backup

Secara default, pgBackRest bekerja dengan menyalin file arsip baru ke server cadangan tetapi jika kita membiarkannya, hard disk akan segera penuh. Jadi kita perlu membuat cadangan baru berdasarkan beberapa rutinitas dan pgBackRest akan menghapus cadangan lama untuk kita berdasarkan kebijakan penyimpanan yang telah kita tetapkan di atas. Untuk melakukan ini, kita akan menggunakan Cronjob.

Di pg-backupserver:

sudo -u postgres
crontab -e

Dan tambahkan baris ini di akhir file dan tekan enter untuk membuat baris baru. Kemudian simpan dan keluar.

30 06  *   *   0     pgbackrest --type=full --stanza=my_cluster backup
30 06  *   *   1-6   pgbackrest --type=diff --stanza=my_cluster backup

Anda dapat membaca lebih lanjut tentang kebijakan pencadangan penuh, pencadangan berbeda, dan penyimpanan di dokumentasi pgBackRest.

Sekarang server cadangan kita telah dikonfigurasi dengan benar, saatnya mengkonfigurasi server replikasi kita. Karena kita ingin memiliki replikasi streaming, pertama-tama kita harus membuat pengguna replikasi di pg-master:

sudo -u postgres psql
CREATE USER replicator PASSWORD '123123' REPLICATION";

Aktif pg-master, buka /etc/postgresql/12/main/pg_hba.confdan tambahkan baris ini dan ubah pg_replicate_ipke ip pg-replicaserver:

host    replication     replicator      {pg_replicate_ip}/32       md5

Dan kemudian restart postgresql

systemctl restart postgresql

Sekarang, pg-replicabuka file /etc/pgbackrest.confdan ubah konten dengan baris ini:

[my_cluster]
pg1-path=/var/lib/postgresql/12/main
recovery-option=primary_conninfo=host=pg-master port=5432 user=replicator password=123123 application_name=replica1

[global]
repo1-host=pg-backup
repo1-host-user=postgres

Jangan khawatir jika Anda tidak tahu apa application_nameitu. Kami akan membicarakannya nanti.
Pada pg-replica, jalankan perintah berikut untuk mengambil data database master:

systemctl stop postgresql
sudo -u postgres pgbackrest --stanza=my_cluster --delta --type=standby --log-level-console=info restore
systemctl start postgresql

Untuk memeriksa apakah semuanya berfungsi dengan benar, buka pg-replicapsql dan periksa apakah my_dbdatabase ada:

sudo -u postgres psql -d my_db
SELCET * FROM nums;

Anda akan melihat nilai-nilai ini sebagai hasilnya:

 val 
-----
   1
   2
   3
(3 rows)

Sekarang, kami menambahkan beberapa data pg-masteruntuk memeriksa perubahan yang akan tercermin pada replika:

sudo -u postgres psql -d my_db
INSERT INTO nums VALUES (4);

Pada, pg-replica:

SELECT * FROM nums;

Sekarang Anda akan melihat nilai-nilai ini sebagai hasilnya:

 val 
-----
   1
   2
   3
   4
(3 rows)

Jika Anda tidak melihat 4 nilai, lihat pg-replicafile log ' untuk mengetahui masalahnya:

tail /var/log/postgresql/postgresql-12-main.log

Seperti yang Anda lihat sebelumnya, kami telah menetapkan application_name=replica1 di info koneksi kami, tapi apa itu? Secara default, Postgresql akan menggunakan replikasi asynchronous, artinya, replikasi akan dilakukan dengan lag (biasanya hanya beberapa milidetik) namun jika Anda ingin memiliki replikasi sinkron (artinya commit akan diblokir hingga replikasi selesai) maka Anda dapat mengatur nama_aplikasi ini di pg-masterpostgresql.conf.
Jika Anda ingin melakukan ini, pada pg-master, buka file /ect/postgresql/12/main/postgresql.confdan ubah nilainya:

synchronous_standby_names = 'replica1'

Dan kemudian restart postgresql. Sekarang replikasinya harus sinkron. Untuk mengujinya, buka pg-mastersql Shell dan tambahkan baris baru:

sudo -u postgres psql -d my_db
INSERT INTO nums VALUES(5);

Jika tidak hang berarti semuanya baik-baik saja. Beli jika Anda menghentikan server replika postgresql, perintah akan hang dan klien akan diblokir.

Pada pg-replica:

systemctl stop postgresql

Pada pg-master:

INSERT INTO nums VALUES(6);

Sekarang seperti yang Anda lihat, pg-masterklien psql hang tetapi segera setelah Anda memulai pg-replicaserver postgresql, semuanya akan baik-baik saja.

systemctl start postgresql

Sekarang saatnya menguji proses pemulihan. Untuk tujuan pengujian, kami memotong numstabel dan memulihkan data.
Pada pg-master, jalankan perintah di bawah ini dan salin nilai waktu:

sudo -u postgres psql -Atc  "select current_timestamp"
2020-09-24 14:17:23.105194+03:30

Buka psql dan potong tabel angka:

sudo -u postgres psql -d my_db
TRUNCATE nums;
SELECT * FROM nums;
 val 
-----
(0 rows)

Hentikan server Postgresql di pg-masterdanpg-replica

systemctl stop postgresql

Saat pg-mastermenjalankan perintah di bawah ini:

sudo -u postgres pgbackrest --stanza=my_cluster --delta --type=time "--target=2020-09-24 14:17:23.105194+03:30" --target-action=promote restore

Dan kemudian mulai server postgresql:

systemctl start postgresql

Periksa tabel angka:

sudo -u postgres psql -d my_db

 val 
-----
   1
   2
   3
   4
   5
   6
(6 rows)

Seperti yang Anda lihat, kami telah memulihkan tabel terpotong kami di pg-master. Sekarang kita perlu mengembalikannya ke pg-replica. Pertama, buka pg-backupserver dan dapatkan cadangan baru:

sudo -u postgres pgbackrest --stanza=my_cluster --log-level-console=info backup

Kemudian, di pg-replicaserver, pulihkan data:

sudo -u postgres pgbackrest --stanza=my_cluster --delta --type=standby restore
systemctl start postgresql

Sekarang untuk menguji apakah semuanya berfungsi dengan benar, tambahkan nilai ke numstabel pg-masterdan periksa apakah itu akan mencerminkan pg-replica.

Itu saja.

Tidak ada komentar:

Posting Komentar