PostgreSQL Database Replication
Replication adalah teknologi mendasar untuk server database karena downtime atau kehilangan data dapat mengakibatkan berkurangnya aksesibilitas, produktivitas, dan kepercayaan produk. Menggunakan replikasi data dari primary ke satu atau lebih server standby mengurangi kemungkinan kehilangan data. Dengan PostgreSQL, Anda dapat dengan mudah membuat cluster database dengan topologi Primary-Secondary (sebelumnya dikenal sebagai master-slave replication) dengan satu atau lebih server standby.
Menggunakan data WAL (Write-Ahead Logging) adalah cara tercepat yang tersedia untuk replikasi dengan kinerja tinggi, yang disebut asynchronous replication. Dalam kasus ini, server database primary bekerja dalam mode archiving, hanya menulis file WAL ke penyimpanan dan menyebarkannya ke server database standby yang beroperasi dalam mode recovery. File-file ini ditransfer ke server database standby segera setelah penulisan selesai.
Mari kita lihat bagaimana cluster database Primary-Secondary PostgreSQL dapat diinstal dan dikonfigurasi.
Creating PostgreSQL Primary-Secondary Cluster
Platform menyediakan dua cara otomatis untuk mendapatkan cluster PostgreSQL:
Pre-Packaged Marketplace Solution
Cara tercepat dan paling sederhana untuk membuat cluster PostgreSQL adalah dengan menggunakan solusi yang telah dikemas dari marketplace.
1. Klik tombol Marketplace di pojok kiri atas dashboard dan cari paket PostgreSQL Primary-Secondary Cluster.
Arahkan ke solusi tersebut dan klik Install untuk melanjutkan.
2. Di dalam dialog yang terbuka, Anda dapat memilih versi PostgreSQL yang diinginkan dan mengaktifkan load balancers Pgpool-II.
3. Tunggu beberapa menit hingga platform mempersiapkan environment Anda dan mengatur konfigurasi replikasi yang diperlukan.
Setelah selesai, Anda akan menerima notifikasi yang sesuai dengan data untuk mengakses antarmuka administrasi PostgreSQL (juga dikirim melalui email).
Topology Wizard Auto-Clustering
Cluster database PostgreSQL dapat diaktifkan melalui fitur Auto-Clustering yang tertanam di dashboard. Fitur ini menyediakan lebih banyak opsi kustomisasi dibandingkan opsi marketplace, namun tetap mengotomatisasi semua proses konfigurasi.
1. Buka wizard topology environment, pilih stack software PostgreSQL dan aktifkan switch Auto-Clustering khusus. Jika diperlukan, Anda dapat mengaktifkan load balancer Pgpool-II untuk cluster Anda.
Selanjutnya, Anda dapat sepenuhnya memanfaatkan kekuatan kustomisasi wizard untuk mengubah jumlah node per lapisan, mengalokasikan sumber daya tambahan, menambahkan stack software lain ke environment Anda, dll.
2. Jika sudah siap, klik Create dan tunggu beberapa menit hingga platform membuat environment Anda.
Managing PostgreSQL Cluster
Di bawah ini, kami menyediakan beberapa informasi bermanfaat tentang manajemen cluster PostgreSQL:
- Cluster Entry Point
- Cluster Admin Panels
- Primary PostgreSQL Configuration
- Configuring Standby
- Replication Check
- Automatic Failover Scenario
- Manual Failover Scenario
Cluster Entry Point
Jika node Pgpool-II tidak ditambahkan ke topologi cluster, gunakan node Primary untuk mengakses cluster. Jika lapisan load balancing diterapkan di depan cluster database, Anda dapat menggunakan salah satu node Pgpool-II sebagai entry point.
Cluster Admin Panels
Di PaaS, komponen cluster PostgreSQL dapat dikelola melalui CLI atau UI.
- Database Management
Node database memiliki panel administrasi manajemen bawaan phpPgAdmin. Gunakan hanya pada node Primary.
Jika diperlukan, node terpisah dapat diinstal dengan software manajemen database PostgreSQL yang lebih canggih pgAdmin4 melalui impor manifest.
- Pgpool-II Management
Node Pgpool-II juga dapat dikelola melalui panel administrasi bawaan yang ramah pengguna pgpoolAdmin.
Panel admin Pgpool-II menyediakan kemampuan untuk menyesuaikan:
- load balancing dan distribusi pada level database (bagaimana permintaan ke setiap database harus diproses dan diatur keseimbangannya)
- connection pools
- logging
- replication
- debugging
- failover dan failback
Primary PostgreSQL Configuration
Mari kita lihat parameter konfigurasi node primary yang digunakan dalam auto-clustering.
1. Temukan environment dengan database primary di daftar environment Anda. Klik tombol Config di sebelah node PostgreSQL Primary.
2. Buka direktori conf dan navigasikan ke file postgresql.conf.
Baris-baris berikut terkait dengan file WAL dapat diubah jika diperlukan:
wal_level = hot_standby
max_wal_senders = 10
archive_mode = on
archive_command = 'cd .'
Dimana:
- Parameter wal_level menentukan seberapa banyak informasi yang ditulis ke WAL. Ada tiga nilai yang memungkinkan:
- minimal - hanya menyimpan informasi yang diperlukan untuk memulihkan dari kegagalan atau shutdown darurat.
- replica - nilai default, yang menulis cukup data untuk mendukung WAL archiving dan replication, termasuk menjalankan query read-only di server standby. Dalam rilis sebelum 9.6, nilai archive dan hot_standby diizinkan untuk parameter ini. Di rilis yang lebih baru, mereka dapat diterima tetapi dipetakan ke replica.
- logical - nilai ini menambahkan informasi yang diperlukan untuk mendukung logical decoding ke level logging replica.
- max_wal_senders mengatur jumlah maksimum proses transfer WAL yang berjalan secara bersamaan.
- archive_mode memungkinkan WAL archiving bersama dengan parameter wal_level (semua nilai memungkinkan archiving kecuali nilai minimal).
- archive_command - perintah shell lokal yang akan dijalankan untuk mengarsipkan segmen WAL yang selesai. Secara default, ini tidak melakukan apa-apa dengan menjalankan ‘ cd . ' yang berarti pengarsipan sebenarnya dinonaktifkan. Anda dapat mencoba mengubahnya sebagai berikut untuk menyalin arsip WAL ke direktori tujuan yang Anda inginkan (misalnya /tmp/mydata):
archive_command = 'test ! -f /var/lib/pgsql/data/pg_wal/%f && cp %p /tmp/mydata/%f'
Tekan tombol Save di atas editor.
3. Buka file konfigurasi pg_hba.conf. Koneksi database standby diizinkan dengan menyatakan parameter berikut:
host replication all {standby_IP_address}/32 trust
Itu saja untuk primary! Mari lanjutkan ke konfigurasi server standby.
Configuring Standby
Mari kita periksa file konfigurasi pada node Secondary. Ada tiga opsi yang membedakan secondary dari primary:
1. Buka file postgresql.conf, temukan bagian Standby Servers. Seperti yang Anda lihat, server ini bertindak sebagai standby karena parameter hot_standby diatur on, tidak seperti node primary di mana parameter ini dikomentari.
2. Gulir ke akhir file konfigurasi. Terdapat parameter primary_conninfo yang menentukan string koneksi yang akan digunakan server standby untuk terhubung ke server pengirim. String koneksi harus menunjukkan nama host (atau alamat) dari server pengirim, serta nomor port. Nama pengguna yang sesuai dengan peran dengan hak istimewa yang sesuai di server pengirim juga disediakan. Password juga harus ditentukan di primary_conninfo atau di file ~/.pgpass terpisah di server backup jika pengirim mem
erlukan autentikasi password.
3. Opsi terakhir yang membuat server database sebagai secondary adalah ketersediaan file standby.signal, yang menunjukkan bahwa server harus dimulai sebagai hot standby. File ini harus terletak di direktori data PostgreSQL dan dapat kosong atau berisi informasi apa pun. Setelah secondary dipromosikan menjadi primary, file ini akan dihapus.
Ingatlah bahwa sebagian besar opsi yang diubah memerlukan server untuk di-restart. Ini dapat dilakukan dengan dua cara:
- Dari dashboard Anda dapat merestart salah satu atau kedua node.
- Melalui antarmuka baris perintah via Web SSH client. Untuk melakukannya, klik tombol Web SSH di node yang diperlukan, misalnya secondary.
Dan keluarkan perintah untuk merestart server database:
sudo service postgresql restart
Replication Check
1. Buka panel phpPgAdmin untuk database primary Anda dengan mengklik tombol Open in Browser di sebelahnya.
2. Masuk dengan kredensial database yang telah Anda terima melalui email sebelumnya dan buat database baru.
3. Kemudian, Anda harus membuka panel admin dari server database standby Anda (dengan cara yang sama seperti primary) dan memeriksa apakah database baru berhasil direplikasi atau tidak.
Automatic Failover Scenario
Fitur automatic failover untuk cluster PostgreSQL diimplementasikan dengan bantuan node Pgpool-II dan tidak tersedia untuk topologi tanpa itu (konfigurasi manual diperlukan). Node load balancing secara otomatis mendeteksi jika database primary down dan mempromosikan salah satu secondary yang tersedia. Setelah node yang bermasalah kembali, node tersebut akan secara otomatis ditambahkan kembali ke cluster (sebagai secondary) dengan semua data yang hilang dipulihkan menggunakan utilitas pg_rewind.
Manual Failover Scenario
PostgreSQL tidak memiliki skenario failover otomatis native untuk cluster database. Di sisi lain, terdapat banyak solusi pihak ketiga yang dapat digunakan untuk memastikan high-availability untuk sistem Anda. Anda juga dapat membuat solusi sendiri untuk mengatasi kegagalan cluster database Anda. Banyak situasi kegagalan cluster yang mungkin terjadi dalam kehidupan nyata. Di sini kami mempertimbangkan hanya satu alur kerja yang paling umum yang dapat membantu Anda mengotomatiskan skenario failover.
Topologi default terdiri dari dua node:
Begitu node primary gagal, node secondary harus dipromosikan menjadi primary baru. Ini dapat dilakukan dengan utilitas pg_ctl yang digunakan untuk menginisialisasi, memulai, menghentikan, atau mengontrol server PostgreSQL. Untuk melakukan ini, masuk ke server standby melalui Web SSH dan keluarkan perintah sebagai berikut:
/usr/pgsql-12/bin/pg_ctl promote -D /var/lib/pgsql/data
Dimana /var/lib/pgsql/data adalah direktori data database.
Begitu database secondary dipromosikan menjadi primary, Anda harus mengubah string koneksi aplikasi Anda agar mengubah entry point cluster database ke hostname atau alamat IP baru.
Proses failover dapat mengandalkan utilitas pg_isready yang mengeluarkan pemeriksaan koneksi ke database PostgreSQL.
Anda dapat membuat script sederhana yang memeriksa ketersediaan server database primary dan mempromosikan standby jika terjadi kegagalan primary. Jalankan script melalui crontab di node secondary dengan interval yang sesuai. Script dapat terlihat seperti di bawah ini. Mari kita sebut sebagai failover.sh :
#!/bin/bash
primary="172.25.2.22"
secondary="172.25.2.31"
status=$(/usr/pgsql-12/bin/pg_isready -d postgres -h $primary)
response="$primary:5432 - no response"
if [ "$status" == "$response" ]
then
/usr/pgsql-12/bin/pg_ctl promote -D /var/lib/pgsql/data
echo "Secondary promoted to new Primary. Change your app connection string to new Primary address $secondary"
else
echo "Primary is alive. Nothing to do."
fi
Setelah script dipicu oleh promosi secondary ke primary, output script harus terlihat seperti:
Sekarang database Anda kembali berfungsi dan siap untuk menangani permintaan baca/tulis dengan alamat primary baru.
Cluster Restoration
Dengan alamat primary baru, Anda dapat dengan mudah menghindari penyesuaian string koneksi aplikasi Anda dengan mengubah alamat IP dari database primary. Untuk melakukan ini, Anda harus meletakkan load balancer di depan cluster yang akan memantau status komponennya dan mengarahkan lalu lintas ke primary saat ini. Di bawah ini, kami akan menunjukkan cara memulihkan topologi cluster asli sehingga tidak diperlukan perubahan di frontend.
Alasan lain topologi harus dipulihkan terkait dengan memastikan kemampuan scaling dari cluster. Hanya topologi asli yang dapat di-scale in/out secara horizontal.
Mari kita lihat bagaimana melakukan pemulihan cluster database PostgreSQL setelah primary sebelumnya terputus dari cluster dan secondary sebelumnya dipromosikan menjadi primary.
Jadi, tugasnya adalah: primary yang terputus harus menjadi primary sebenarnya dan primary saat ini (secondary sebelumnya) harus menjadi secondary sebenarnya.
Data awalnya adalah:
- Cluster database terdiri dari dua node primary (IP: 172.25.2.22) dan secondary (IP: 172.25.2.31).
- Node primary mengalami down dan database primary dihentikan.
- Database standby dipromosikan ke peran primary.
- Sekarang secondary menahan operasi baca/tulis.
- Node primary sebelumnya telah diperbaiki dan siap untuk diperkenalkan kembali ke replikasi sebagai primary.
Lakukan langkah-langkah berikut untuk mendapatkan cluster dengan topologi awal:
1. Masuk ke node primary sebelumnya melalui Web SSH dan keluarkan perintah:
rm -rf /var/lib/pgsql/data/*
2. Tambahkan alamat IP primary sebelumnya 172.22.2.22 ke pg_hba.conf di node primary saat ini:
host replication replication 172.22.2.22/32 trust
Restart database primary saat ini untuk menerapkan perubahan:
sudo service postgresql restart
3. Masuk ke node primary sebelumnya melalui Web SSH dan keluarkan perintah:
pg_basebackup -U replication -h 172.25.2.31 -D /var/lib/pgsql/data -Fp -Xs -P -R
Dimana:
- pg_basebackup - digunakan untuk mengambil base backup dari cluster database PostgreSQL yang sedang berjalan.
- 172.25.2.31 - alamat IP node primary saat ini.
- /var/lib/pgsql/data - direktori data PostgreSQL.
4. Pastikan alamat IP dalam parameter host yang dijelaskan di langkah kedua dari Configuring Standby berisi alamat IP primary sebelumnya yang benar.
5. Buat file standby.signal di primary saat ini:
touch /var/lib/pgsql/data/standby.signal
Dan restart node untuk mendapatkan database secondary baru:
sudo service postgresql restart
Hapus file standby.signal di primary sebelumnya:
rm /var/lib/pgsql/data/standby.signal
Dan restart node untuk mendapatkan database primary baru:
sudo service postgresql restart
6. Terakhir, untuk mencapai status recovery yang konsisten untuk kedua database primary dan standby, restart akhir diperlukan yang dapat dilakukan melalui dashboard sebagai berikut:
Setelah proses restart selesai, cluster kembali ke topologi asli dan dapat di-scale secara horizontal.