Pendahuluan
Pada tutorial kali ini kita akan mencoba membuat High Availability Database menggunakan database PostgreSQL. Lalu apa yang dimaksud dengan High Availability dalam lingkup sebuah database ? Secara mudah dapat diartikan sebagai konsep,cara, atau tindakan yang dilakukan untuk mengupayakan sebuah server database tetap dapat diakses oleh pengguna. Atau dengan arti lain adalah tindakan yang dilakukan pada sebuah server database untuk terus menerus beroperasi tanpa sebuah kegagalan pada sistem dengan cara meminimalisir gangguan-gangguan yang timbul dan berakibat pada kegagalan suatu sistem tersebut. Lalu kenapa itu penting ? Dalam penerapannya, ketersediaan pada suatu database server sangatlah penting apalagi jika berjalan pada suatu sistem yang terdapat pada sebuah perusahaan dengan skala yang besar. Kegagalan suatu server database dapat mengakibatkan kegagalan sistem yang bersifat masif dan dapat menghambat kinerja suatu perusahaan. Bersama dengan itu maka tujuan dari dibentuknya sebuah sistem High Availability Database adalah menjadi salah satu cara perusahaan atau instansi untuk membentuk suatu Disaster Recovery System untuk meminimalkan dampak dari suatu kejadian atau mungkin dengan tujuan untuk meniadakan kejadian tersebut dapat terjadi dengan cara meminimalkan faktor-faktor pemicunya.
Kebutuhan/Prasayarat
Sebelum memulai membuat sistem High Availability Database, anda dapat memperhatikan apa saja kubutuhan yang diperlukan untuk membentuk sistem tersebut.
- Server database berjumlah 3 buah berbasiskan PostgreSQL dan Rocky Linux 9 (node1, node2, node3)
- Sebuah server ETCD Cluster dengan basis Rocky Linusx 9 (node4)
- Sebuah server HAProxy sebagai load balancer berbasis Rocky Linux 9 (haproxy)
- Sebuah komputer user untuk pengakses kelima node
- Jaringan internet untuk update package dan repository server
Tabel dan Keterangan
- node1 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
- node2 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
- node3 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
- node4 berisikan etcd, digunakan sebagai clustering PostgreSQL
- node5/haproxy beriksikan HAProxy digunakan sebagai failover atau load balancer PostgreSQL
Ilustrasi Alur Kerja
Membentuk Sebuah Sistem High Availability Database
Langkah pertama adalah lakukan update package dan repository pada setiap node yang ada (node1, node2, node3, node4, haproxy).
dnf update --refresh
Kedua tambahkan repository epel pada node1, node2, dan node3.
dnf install epel-release
[root@node1 sysadmin]# dnf install epel-release
Last metadata expiration check: 0:00:30 ago on Sat 11 May 2024 03:00:27 AM UTC.
Dependencies resolved.
=============================================================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================================================
Installing:
epel-release noarch 9-7.el9 extras 19 k
Installing dependencies:
python3-dateutil noarch 1:2.8.1-7.el9 baseos 287 k
python3-dnf-plugins-core noarch 4.3.0-13.el9 baseos 246 k
python3-six noarch 1.15.0-9.el9 baseos 36 k
python3-systemd x86_64 234-18.el9 baseos 83 k
Installing weak dependencies:
dnf-plugins-core noarch 4.3.0-13.el9 baseos 36 k
Transaction Summary
=============================================================================================================================================================================================================================
Install 6 Packages
Total download size: 707 k
Installed size: 2.1 M
Is this ok [y/N]:
Ketiga tambahkan repository dari PosgreSQL 16 dan disable module pada PostgreSQL default Rocky Linux 9.
dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@node1 sysadmin]# dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Extra Packages for Enterprise Linux 9 - x86_64 4.9 MB/s | 21 MB 00:04
Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 2.3 kB/s | 2.5 kB 00:01
pgdg-redhat-repo-latest.noarch.rpm 651 B/s | 12 kB 00:18
Dependencies resolved.
=============================================================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================================================
Installing:
pgdg-redhat-repo noarch 42.0-43PGDG @commandline 12 k
Transaction Summary
=============================================================================================================================================================================================================================
Install 1 Package
Total size: 12 k
Installed size: 15 k
Is this ok [y/N]:
yum-config-manager --enable pgdg16
dnf -qy module disable postgresql
Keempat instalasi PosgreSQL 16 Database pada node1, node2, node3.
dnf install postgresql16-server postgresql16
[root@node1 sysadmin]# dnf install postgresql16-server postgresql16
Last metadata expiration check: 0:03:43 ago on Sat 11 May 2024 03:35:52 AM UTC.
Dependencies resolved.
=============================================================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================================================
Installing:
postgresql16 x86_64 16.3-1PGDG.rhel9 pgdg16 1.7 M
postgresql16-server x86_64 16.3-1PGDG.rhel9 pgdg16 6.7 M
Installing dependencies:
libicu x86_64 67.1-9.el9 baseos 9.6 M
lz4 x86_64 1.9.3-5.el9 baseos 58 k
postgresql16-libs x86_64 16.3-1PGDG.rhel9 pgdg16 333 k
Transaction Summary
=============================================================================================================================================================================================================================
Install 5 Packages
Total download size: 18 M
Installed size: 72 M
Is this ok [y/N]:
Kelima lakukan instalasi patroni dan tambahan package pada node1, node2, dan node3.
dnf install patroni
[root@node1 sysadmin]# dnf install patroni
Last metadata expiration check: 0:18:25 ago on Sat 11 May 2024 03:35:52 AM UTC.
Dependencies resolved.
=============================================================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================================================
Installing:
patroni noarch 3.3.0-1PGDG.rhel9 pgdg-common 1.1 M
Installing dependencies:
less x86_64 590-3.el9_3 baseos 160 k
python3-cdiff noarch 1.0-1.rhel9 pgdg-common 30 k
python3-click noarch 8.0.3-1.el9 epel 174 k
python3-idna noarch 2.10-7.el9 baseos 92 k
python3-prettytable noarch 0.7.2-27.el9 appstream 41 k
python3-psutil x86_64 5.8.0-12.el9 appstream 205 k
python3-psycopg2 x86_64 2.9.9-1PGDG.rhel9 pgdg-common 188 k
python3-pysocks noarch 1.7.1-12.el9 baseos 34 k
python3-pyyaml x86_64 5.4.1-6.el9 baseos 191 k
python3-setuptools noarch 53.0.0-12.el9 baseos 839 k
python3-urllib3 noarch 1.26.5-5.el9 baseos 187 k
python3-ydiff noarch 1.2-10.rhel9 pgdg-common 30 k
Transaction Summary
=============================================================================================================================================================================================================================
Install 13 Packages
Total download size: 3.2 M
Installed size: 13 M
Is this ok [y/N]:
//dapat menggunakan
dnf install patroni
//atau
pip install patroni[etcd]
Keenam atur konfigurasi patroni pada node1, node2 dan node3 sesuai dengan masing-masing ip dengan perintah berikut apabila sebelumnya tidak terdapat konfigurasi dengan nama tersebut, buat file dengan nama konfigurasi tersebut.
nano /etc/patroni/patroni.yml
scope: postgres
namespace: /pg_cluster/
name: node1
restapi:
listen: 172.31.254.8:8008
connect_address: 172.31.254.8:8008
etcd:
host: 172.31.254.11:2379
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: hot_standby
hot_standby: "on"
max_connections: 100
max_worker_processes: 8
wal_keep_segments: 8
max_wal_senders: 10
max_replication_slots: 10
max_prepared_transactions: 0
max_locks_per_transaction: 64
wal_log_hints: "on"
track_commit_timestamp: "off"
archive_mode: "on"
archive_timeout: 1800s
archive_command: mkdir -p ../wal_archive && test ! -f ../wal_archive/%f && cp %p ../wal_archive/%f
recovery_conf:
restore_command: cp ../wal_archive/%f %p
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
- host replication replicator 127.0.0.1/32 md5
- host replication replicator 172.31.254.8/28 md5
- host replication replicator 172.31.254.9/28 md5
- host replication replicator 172.31.254.10/28 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 172.31.254.8:5432
connect_address: 172.31.254.8:5432
data_dir: /var/lib/pgsql/16/data
bin_dir: /usr/pgsql-16/bin
pgpass: /tmp/pgpass0
authentication:
replication:
username: replicator
password: reppassword
superuser:
username: postgres
password: password
tags:
noloadbalance: false
clonefrom: false
nosync: false
nostream: false
Ketujuh lakukan instalasi etcd pada node4, anda dapet menggunakan command sebagai berikut untuk mekakukan tahap instalasi.
dnf install https://mirror.stream.centos.org/SIGs/9-stream/cloud/x86_64/openstack-yoga/Packages/e/etcd-3.4.14-1.el9s.x86_64.rpm
Last metadata expiration check: 0:04:52 ago on Tue 14 May 2024 03:51:32 AM UTC.
etcd-3.4.14-1.el9s.x86_64.rpm 2.5 MB/s | 11 MB 00:04
Dependencies resolved.
=====================================================================
Package Arch Version Repository Size
=====================================================================
Installing:
etcd x86_64 3.4.14-1.el9s @commandline 11 M
Transaction Summary
=====================================================================
Install 1 Package
Total size: 11 M
Installed size: 44 M
Is this ok [y/N]: ^COperation aborted.
[root@node4 sysadmin]#
Kedelapan, setelah melakukan instalasi pada etcd langkah selanjutnya adalah melakukan konfifurasi pada etcd dilanjutkan dengan melakukan start pada etcd dan mengatur etcd agar dapat melakukan auto start
nano /etc/etcd/etcd.conf
Anda dapat memasukan configurasi seperti dibawah ini dengan disesuaikan kondisi alamat ip anda
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://172.31.254.11:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.254.11:2379,http://127.0.0.1:2379"
ETCD_NAME="default"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.254.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.254.11:2379"
ETCD_INITIAL_CLUSTER="default=http://172.31.254.11:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_ENABLE_V2="true"
Lalu lakukan start pada etcd dan atur agar etcd melakukan autostart dengan command seperti dibawah ini.
systemctl start etcd
systemctl enable etcd
Kesembilan. setelah itu anda dapat melakukan start dan melakukan konfigurasi auto start pada patroni yang berada pada node1. node2. dan node3.
systemctl start patroni
systemctl enable patroni
Kesepuluh lakukan instalasi HAProxy pada node haproxy, ada dapat menggunakan command sebagai berikut.
dnf install haproxy
Last metadata expiration check: 0:21:39 ago on Tue 14 May 2024 05:14:45 AM UTC.
Dependencies resolved.
=====================================================================
Package Arch Version Repository Size
=====================================================================
Installing:
haproxy x86_64 2.4.22-3.el9_3 appstream 2.2 M
Transaction Summary
=====================================================================
Install 1 Package
Total download size: 2.2 M
Installed size: 6.6 M
Is this ok [y/N]:
Kesebelas, setelah proses instalasi selesai anda dapat melanjutkan proses konfigurasi pada HAProxy lakukan konfigurasi dengan menggunakan command di bawah dan sesuaikan konfigurasi sesuai dengan alamat IP anda.
nano /etc/haproxy/haproxy.conf
global
maxconn 100
log 127.0.0.1 local2
defaults
log global
mode tcp
retries 2
timeout client 30m
timeout connect 4s
timeout server 30m
timeout check 5s
listen stats
mode http
bind *:8080
stats hide-version
stats refresh 30s
stats show-node
stats auth username:password
stats enable
stats uri /
listen postgres
bind *:5432
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server node1 172.31.254.8:5432 maxconn 100 check port 8008
server node2 172.31.254.9:5432 maxconn 100 check port 8008
server node3 172.31.254.10:5432 maxconn 100 check port 8008
Selanjutnya anda dapat mengecek melalui browser anda dengan alamat [ip haproxy]:[port], jika saat mengakses anda diminta untuk memasukan username dan password maka masukan username dengan username, password dengan password. Atau anda dapat menonaktifkan fitur otentikasi dengan memberi comment pada baris stats auth username:password.
Berikut adalah tampilan menu statistik yang ditampilkan melalui HAProxy, jika anda dapat mengakses seperti hasil di atas maka anda telah seukses membuat sebuah High Availability PostgreSQL Database. Anda dapat mencoba fungsi dengan menonaktifkan salah satu server/node anda, jika fungsi berjalan maka node aktif akan langsung berpindah ke node yang tersedia dalam hitungan detik.