Tutorial Setup Cluster PostgreSQL High Availability Pakai Patroni & etcd di VPS
Poin Kunci Artikel Ini:
- Node 1 (node1): 192.168.1.10
- Node 2 (node2): 192.168.1.11
- Node 3 (node3): 192.168.1.12
Bayangkan skenario horor ini: jam dua pagi, ponsel Anda berbunyi keras. Notifikasi monitoring menunjukkan server database utama mati total karena masalah jaringan di provider VPS. Aplikasi e-commerce milik klien berhenti beroperasi, transaksi gagal, dan Anda harus bangun dalam keadaan setengah sadar untuk mengubah alamat IP database secara manual di file konfigurasi aplikasi.
Proses perpindahan manual atau failover manual seperti ini punya tingkat risiko yang sangat tinggi. Kesalahan manusia atau human error sangat rawan terjadi saat kita bekerja di bawah tekanan di tengah malam. Di sinilah arsitektur High Availability (HA) mengambil peran. Sistem HA memastikan peran database utama dapat berpindah secara otomatis tanpa perlu campur tangan manusia sedikit pun saat terjadi kegagalan.
Masalah Single Point of Failure dan Konsep Utama HA
Arsitektur PostgreSQL tradisional umumnya hanya mengandalkan satu node Utama (Primary) dan satu node Cadangan (Standby) menggunakan fitur streaming replication bawaan. Kelemahan terbesar dari skenario ini adalah adanya titik kegagalan tunggal atau Single Point of Failure. Jika node Primary mendadak tumbang, node Standby tidak akan pernah naik kelas menjadi Primary secara otomatis kecuali ada perintah eksternal yang mempromosikannya.
Untuk membangun sistem failover otomatis yang benar-benar andal dan responsif, kita membutuhkan tiga komponen penting yang saling melengkapi:
- etcd: Layanan penyimpanan data berpasangan (Key-Value Store) terdistribusi yang bertugas mencatat status cluster dan menentukan siapa pimpinan cluster (leader election) menggunakan algoritma konsensus Raft.
- Patroni: Layanan pendukung (daemon) berbasis Python yang mengontrol siklus hidup PostgreSQL secara penuh (memulai, menghentikan, mempromosikan, atau menurunkan status node) berdasarkan data real-time di etcd.
- HAProxy: Penyeimbang beban (load balancer) yang bertugas mengarahkan lalu lintas koneksi dari aplikasi ke node Primary untuk operasi tulis (Write) atau ke node Replica untuk operasi baca (Read-Only).
Dalam panduan ini, kita akan menyusun simulasi menggunakan tiga node VPS Ubuntu 22.04 LTS beserta satu node khusus untuk HAProxy. Berikut adalah alokasi IP yang digunakan:
- Node 1 (node1): 192.168.1.10
- Node 2 (node2): 192.168.1.11
- Node 3 (node3): 192.168.1.12
- HAProxy (haproxy-lb): 192.168.1.5
Langkah 1: Setup etcd Cluster
Layanan etcd membutuhkan jumlah node ganjil (minimal 3 node) untuk membentuk kuorum keputusan dan menghindari kondisi split-brain. Langkah awal, pasang paket etcd di ketiga node VPS Anda.
sudo apt update
sudo apt install -y etcd-server etcd-client
Buka dan ubah file konfigurasi /etc/etcd/etcd.yml pada Node 1 (192.168.1.10). Sesuaikan alamat IP serta nama host untuk masing-masing node.
name: 'node1'
data-dir: '/var/lib/etcd/node1.etcd'
listen-peer-urls: 'http://192.168.1.10:2380'
listen-client-urls: 'http://192.168.1.10:2379,http://127.0.0.1:2379'
initial-advertise-peer-urls: 'http://192.168.1.10:2380'
advertise-client-urls: 'http://192.168.1.10:2379'
initial-cluster: 'node1=http://192.168.1.10:2380,node2=http://192.168.1.11:2380,node3=http://192.168.1.12:2380'
initial-cluster-token: 'etcd-pg-cluster'
initial-cluster-state: 'new'
Terapkan konfigurasi yang sama pada Node 2 dan Node 3 dengan menyesuaikan IP serta nilai name masing-masing node. Setelah itu, jalankan layanan etcd dan pastikan status kesehatan cluster dalam kondisi normal.
sudo systemctl restart etcd
sudo systemctl enable etcd
etcdctl endpoint health --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379
Langkah 2: Install dan Konfigurasi Patroni
Selanjutnya, pasang PostgreSQL dan Patroni di ketiga node. Matikan layanan bawaan PostgreSQL agar kendali penuh atas database diserahkan kepada Patroni.
sudo apt install -y postgresql postgresql-contrib patroni python3-psycopg2
sudo systemctl stop postgresql
sudo systemctl disable postgresql
Buat file konfigurasi /etc/patroni/patroni.yml pada Node 1. Pastikan direktori data PostgreSQL dalam kondisi bersih sebelum Patroni diaktifkan pertama kali.
scope: postgres-cluster
namespace: /service
name: node1
etcd3:
hosts:
- 192.168.1.10:2379
- 192.168.1.11:2379
- 192.168.1.12:2379
restapi:
listen: 192.168.1.10:8008
connect_address: 192.168.1.10:8008
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
max_wal_senders: 10
max_replication_slots: 10
hot_standby: "on"
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
- host replication replicator 192.168.1.0/24 md5
- host all all 192.168.1.0/24 md5
- host all all 127.0.0.1/32 md5
postgresql:
listen: 192.168.1.10:5432
connect_address: 192.168.1.10:5432
data_dir: /var/lib/postgresql/14/main
bin_dir: /usr/lib/postgresql/14/bin
pgpass: /var/lib/postgresql/.pgpass
authentication:
replication:
username: replicator
password: ReplicatePassword123
superuser:
username: postgres
password: SuperPassword123
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Salin berkas konfigurasi di atas ke Node 2 dan Node 3. Sesuaikan atribut name, IP pada bagian restapi, serta IP pada postgresql.listen. Setelah selesai, jalankan layanan Patroni secara berurutan mulai dari Node 1.
sudo systemctl start patroni
sudo systemctl enable patroni
Periksa kondisi kesehatan cluster dari salah satu node menggunakan perintah CLI dari Patroni:
patronictl -c /etc/patroni/patroni.yml list
Langkah 3: Routing Lalu Lintas Data Menggunakan HAProxy
Patroni menyediakan REST API untuk pengecekan kesehatan di port 8008. Endpoint /primary akan mengembalikan status HTTP 200 hanya jika node tersebut bertindak sebagai Leader. Sementara itu, endpoint /replica memberikan respon status 200 untuk node yang berstatus Standby. HAProxy memanfaatkan fitur API ini untuk mengarahkan koneksi aplikasi secara dinamis.
Pasang HAProxy di server khusus (192.168.1.5) atau pada node load balancer Anda.
sudo apt update && sudo apt install -y haproxy
Buka berkas /etc/haproxy/haproxy.cfg lalu tambahkan baris konfigurasi berikut di bagian paling bawah:
frontend stats
mode http
bind *:7000
stats enable
stats uri /
frontend postgres_write_front
bind *:5000
mode tcp
option tcplog
default_backend postgres_write_back
backend postgres_write_back
mode tcp
option httpchk GET /primary
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server node1 192.168.1.10:5432 maxconn 100 check port 8008
server node2 192.168.1.11:5432 maxconn 100 check port 8008
server node3 192.168.1.12:5432 maxconn 100 check port 8008
frontend postgres_read_front
bind *:5001
mode tcp
option tcplog
default_backend postgres_read_back
backend postgres_read_back
mode tcp
balance roundrobin
option httpchk GET /replica
http-check expect status 200
default-server inter 3s fall 3 rise 2
server node1 192.168.1.10:5432 maxconn 100 check port 8008
server node2 192.168.1.11:5432 maxconn 100 check port 8008
server node3 192.168.1.12:5432 maxconn 100 check port 8008
Muat ulang layanan HAProxy untuk mengaktifkan perubahan konfigurasi:
sudo systemctl restart haproxy
Kini aplikasi Anda cukup diarahkan ke 192.168.1.5:5000 untuk transaksi menulis data (Write) dan ke 192.168.1.5:5001 untuk transaksi membaca data (Read).
Simulasi Failover dan Pencegahan Split-Brain
Pengujian sistem dilakukan dengan mensimulasikan kegagalan pada node utama. Hentikan layanan Patroni pada Node 1 untuk menguji skenario ini:
# Jalankan pada Node 1
sudo systemctl stop patroni
Pantau proses perubahan kondisi cluster dari Node 2 atau Node 3:
patronictl -c /etc/patroni/patroni.yml list
Dalam kurun waktu 10 hingga 15 detik, kuncian (lock) milik Node 1 di etcd akan kadaluarsa. Patroni dan etcd akan langsung menggelar proses pemilihan leader baru. Salah satu node Standby (misalnya Node 2) akan naik statusnya menjadi Leader. HAProxy secara otomatis mendeteksi perubahan ini dan mengalihkan lalu lintas port 5000 ke Node 2 tanpa perlu melakukan restart pada aplikasi.
Ketika Node 1 kembali menyala, Patroni akan mendeteksi keberadaan Leader baru di dalam cluster. Node 1 akan diturunkan statusnya menjadi Standby secara otomatis dan menjalankan proses pg_rewind untuk menyelaraskan data log WAL dengan Leader baru.
Pencegahan Kondisi Split-Brain
Kondisi split-brain terjadi ketika dua node merasa dirinya adalah Primary akibat terputusnya jalur komunikasi jaringan. Kombinasi etcd dan Patroni mencegah masalah serius ini lewat dua mekanisme utama:
- Kuorum etcd: Node Leader wajib memperbarui status kuncian di etcd secara berkala. Apabila node Primary terisolasi dari jaringan etcd, node tersebut gagal memperbarui kuncian dan akan menurunkan statusnya sendiri (demote) secara aman.
- Linux Watchdog: Integrasi dengan modul kernel
softdogmemastikan bahwa jika proses Patroni berhenti mendadak atau tidak merespons, kernel sistem operasi akan langsung mereset sistem untuk mencegah PostgreSQL menulis data yang tidak konsisten.
Ringkasan dan Panduan Lingkungan Production
Kombinasi antara Patroni, etcd, dan HAProxy memberikan fondasi arsitektur PostgreSQL yang tangguh, mandiri, serta bebas dari resiko Single Point of Failure.
Beberapa hal penting yang wajib diperhatikan sebelum menerapkan arsitektur ini di lingkungan produksi:
- Gunakan jumlah node etcd ganjil: Gunakan minimal 3 node untuk mengantisipasi toleransi kegagalan 1 node, atau 5 node untuk mengantisipasi kegagalan 2 node sekaligus.
- Aktifkan Linux Watchdog: Tambahkan integrasi watchdog pada
patroni.ymluntuk perlindungan tambahan di tingkat kernel OS. - Perhatikan Latensi Jaringan: Pastikan latensi antar-node berada di bawah 10ms untuk menghindari lepasnya kuncian etcd secara tidak disengaja.
- Sistem HA Bukan Pengganti Backup: Tetap siapkan strategi cadangan data berkala seperti pgBackRest atau WAL-G. Replikasi otomatis tidak dapat menyelamatkan data Anda dari perintah
DROP TABLEyang tidak sengaja dieksekusi.
Langkah terbaik selanjutnya: coba buat lab percobaan sederhana menggunakan 3 VPS murah, simulasikan penghentian node secara acak, dan perhatikan bagaimana cluster ini memulihkan dirinya sendiri secara otomatis.



