High Availability PostgreSQL Cluster Menggunakan Patroni dan HAProxy

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.

  1. Server database berjumlah 3 buah berbasiskan PostgreSQL dan Rocky Linux 9 (node1, node2, node3)
  2. Sebuah server ETCD Cluster dengan basis Rocky Linusx 9 (node4)
  3. Sebuah server HAProxy sebagai load balancer berbasis Rocky Linux 9 (haproxy)
  4. Sebuah komputer user untuk pengakses kelima node
  5. Jaringan internet untuk update package dan repository server
Tabel dan Keterangan
  1. node1 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
  2. node2 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
  3. node3 berisikan PostgreSQL dan Patroni, Patroni digunakan sebagai pengelola konfigurasi PostgreSQL
  4. node4 berisikan etcd, digunakan sebagai clustering PostgreSQL
  5. 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.

Leave a Reply

Your email address will not be published. Required fields are marked *