https://dev.to/mehdipourfar/backup-and-replicate-postgresql-12-using-pgbackrest-in-ubuntu-20-04-5c4e
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-master
, pg-replica
dan pg-backup
.
Di semua server ini, kita perlu menambahkan baris berikut ke /etc/hosts
file 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-master
, pg-replica
dan pg-backup
jalankan 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_keys
file 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.conf
dengan 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.conf
dan 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_db
dengan tabel yang diberi nama nums
dengan tiga nilai.
Saatnya membuat cadangan kami di pg-backup
server. /etc/pgbackrest.conf
Edit dulu pg-backup
seperti 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-backup
server:
sudo -u postgres pgbackrest --stanza=my_cluster --log-level-console=info stanza-create
Kemudian, jalankan perintah ini pada keduanya pg-master
dan pg-backup
periksa 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-backup
server:
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-backup
server:
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.conf
dan tambahkan baris ini dan ubah pg_replicate_ip
ke ip pg-replica
server:
host replication replicator {pg_replicate_ip}/32 md5
Dan kemudian restart postgresql
systemctl restart postgresql
Sekarang, pg-replica
buka file /etc/pgbackrest.conf
dan 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_name
itu. 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-replica
psql dan periksa apakah my_db
database 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-master
untuk 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-replica
file 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-master
postgresql.conf.
Jika Anda ingin melakukan ini, pada pg-master
, buka file /ect/postgresql/12/main/postgresql.conf
dan ubah nilainya:
synchronous_standby_names = 'replica1'
Dan kemudian restart postgresql. Sekarang replikasinya harus sinkron. Untuk mengujinya, buka pg-master
sql 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-master
klien psql hang tetapi segera setelah Anda memulai pg-replica
server postgresql, semuanya akan baik-baik saja.
systemctl start postgresql
Sekarang saatnya menguji proses pemulihan. Untuk tujuan pengujian, kami memotong nums
tabel 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-master
danpg-replica
systemctl stop postgresql
Saat pg-master
menjalankan 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-backup
server dan dapatkan cadangan baru:
sudo -u postgres pgbackrest --stanza=my_cluster --log-level-console=info backup
Kemudian, di pg-replica
server, 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 nums
tabel pg-master
dan periksa apakah itu akan mencerminkan pg-replica
.
Itu saja.
Tidak ada komentar:
Posting Komentar