Mdr{dani} Notes

Beyond Load Balancing: Arsitektur High Availability yang Sebenarnya (Part 2)

·

7 min read

Cover Image for Beyond Load Balancing: Arsitektur High Availability yang Sebenarnya (Part 2)

Teori tanpa praktik itu seperti sayur tanpa garam. Untuk membuktikan arsitektur pada artikel Part 1 bekerja, saya akan membagikan langkah-langkah implementasinya menggunakan lingkungan virtual yang bisa kamu replikasi sendiri di laptop atau PC.

Persiapan Environment

Sebelum kita masuk ke konfigurasi masing-masing server, pastikan kamu sudah menyiapkan "bahan-bahan" berikut:

  1. Virtualization Tool: Saya menggunakan Oracle VM VirtualBox.

  2. Sistem Operasi: Image Ubuntu 24.04 LTS (Noble Numbat) untuk semua node server.

    Spesifikasi Server: 2 GB RAM dan 15 GB Hardisk.

  3. Networking: Setiap VM dikonfigurasi dengan 2 Network Adapter:

    • Adapter 1 (NAT): Untuk akses internet (update package, install HAProxy, dll).

    • Adapter 2 (Host-Only): Digunakan untuk jaringan LAN antar VM (komunikasi internal agar IP 192.168.87.x bisa saling ping).

  4. Source Code: Kita akan menggunakan API sederhana berbasis Go sebagai bahan uji coba. Kamu bisa melakukan clone dari repository ini: https://github.com/mdrdani/GoDocAPI.

  5. Docker: Dengan Docker, kita dapat dengan mudah mengatur dan mengelola environment yang diperlukan untuk menguji arsitektur yang telah dirancang.

  6. DBeaver: Tambahkan DBeaver untuk akses dan manajemen database.

  7. Koneksi Internet: Dibutuhkan selama proses instalasi dependency.

Rekomendasi hosting untuk praktek tutorial ini

Topologi Lab Virtual

Berdasarkan diagram yang sudah kita bahas, kita akan membagi peran setiap VM sebagai berikut:

  • Load Balancer 1 & 2: Menginstal haproxy dan keepalived.

  • App Backend 1 & 2: Menjalankan GoDocAPI.

  • Storage & DB: Menginstal postgresql dan setup Rustfs.

Dengan set-up ini, kita benar-benar mensimulasikan lingkungan pusat data (data center) nyata di dalam satu mesin lokal. Yuk, kita mulai dengan konfigurasi pertama!

Konfigurasi Single HAProxy (Basic Load Balancing)

Tujuan utama kita di tahap ini adalah memastikan bahwa layanan aplikasi tetap online selama setidaknya ada satu server backend yang hidup. HAProxy akan bertindak sebagai "polisi lalu lintas" yang memantau kesehatan setiap node aplikasi.


VM Database Postgres SQL dan RustFS Object Storage Setup

SSH Server IP Address 192.168.87.11

Install Docker

Jalankan perintah berikut untuk melakukan installasi Docker di VM.

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y 

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc 

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

sudo usermod -aG docker $user

silakan buatkan file docker-compose.yaml dengan konfigurasi sebagai berikut.

services:
  postgres:
    image: postgres:16
    container_name: postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: app_password
      POSTGRES_DB: app_db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app_user -d app_db"]
      interval: 10s
      timeout: 5s
      retries: 5

  rustfs:
    image: rustfs/rustfs:latest
    container_name: rustfs
    restart: unless-stopped
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      RUSTFS_VOLUMES: /data/rustfs{0..3}
      RUSTFS_ADDRESS: 0.0.0.0:9000
      RUSTFS_CONSOLE_ADDRESS: 0.0.0.0:9001
      RUSTFS_CONSOLE_ENABLE: "true"
      RUSTFS_ACCESS_KEY: rustfsadmin
      RUSTFS_SECRET_KEY: rustfsadmin
    volumes:
      - rustfs_data:/data
      - rustfs_logs:/logs
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/"]
      interval: 15s
      timeout: 5s
      retries: 5
      start_period: 20s

volumes:
  postgres_data:
  rustfs_data:
  rustfs_logs:

Jalankan service

Setelah file dibuat:

mkdir -p data/rustfs0 data/rustfs1 data/rustfs2 data/rustfs3 logs
docker compose up -d

Cek container:

docker ps

Akses service:

Server C kini siap menjadi storage layer untuk cluster Docker Swarm pada tahap berikutnya.

Test Akses PostgreSQL

jangan lupa untuk inisialisasi Database schema dahulu:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE IF NOT EXISTS documents (
  id           UUID        PRIMARY KEY DEFAULT uuid_generate_v4(),
  filename     TEXT        NOT NULL,
  storage_path TEXT        NOT NULL UNIQUE,
  size         BIGINT      NOT NULL CHECK (size >= 0),
  content_type TEXT        NOT NULL,
  created_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_documents_filename ON documents (filename);

Test Akses RustFS

jika ingin melihat logs dari docker container yang telah kita jalankan jalankan perintah

docker compose logs -f


VM Backend 1 dan 2 Setup

SSH Server IP Address 192.168.87.12

Install Docker

Jalankan perintah berikut untuk melakukan installasi Docker di VM.

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y 

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc 

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

sudo usermod -aG docker $user

Clone Repository

Lakukan clone repository dengna perintah berikut.

git clone https://github.com/mdrdani/GoDocAPI

Build Docker Image

Lakukan build image pada repository GoDocAPI.

cd GoDocAPI/

docker build -t godocapi .

Create Docker Compose

buatkan file docker-compose.yaml dengan konfigurasi sebagai berikut

services:
  app:
    image: godocapi:latest
    container_name: godocapi-app
    restart: unless-stopped
    ports:
      - 8080:8080
    env_file:
      - .env

Create .Env

buatkan satu buah file .env untuk menyimpan konfigurasi aplikasi seperti koneksi database dan object storage

SERVER_PORT=:8080
DB_URL=postgres://app_user:app_password@192.168.87.11:5432/app_db?sslmode=disable
RUSTFS_ENDPOINT=http://192.168.87.11:9000
RUSTFS_ACCESS_KEY=rustfsadmin
RUSTFS_SECRET_KEY=rustfsadmin
RUSTFS_BUCKET=docapi
RUSTFS_REGION=us-east-1

Running Docker Compose

jalankan Docker compose dengan perintah berikut

docker compose up -d

jika ingin melihat logs dari docker container yang telah kita jalankan jalankan perintah

docker compose logs -f

Ulangi di VM kedua menggunakan SSH ke IP address 192.168.87.13.


Load Balancer Setup

Pada tahap ini, kita akan menggunakan HAProxy Community Edition sebagai solusi load balancer. Saya menyiapkan satu Virtual Machine khusus dengan sistem operasi Ubuntu 24.04 LTS (Noble Numbat) untuk menjalankan tugas ini. Berikut adalah langkah-langkah instalasi dan konfigurasinya.

Install HAProxy

SSH ke VM IP Address 192.168.87.6, kemudian jalankan perintah berikut

sudo apt update

sudo apt-get install --no-install-recommends software-properties-common

sudo add-apt-repository ppa:vbernat/haproxy-3.2

sudo apt-get install haproxy=3.2.\*

untuk memastikan HAProxy sudah berjalan dengan baik kita check dengan perintah

sudo systemctl status haproxy

Enable Dashboard

Secara default, HAProxy bekerja di balik layar tanpa tampilan visual. Namun, HAProxy memiliki fitur dashboard bawaan yang sangat berguna untuk memantau status server backend, jumlah trafik, hingga mendeteksi secara visual jika salah satu node aplikasi sedang down.

Untuk mengaktifkan fitur ini, silakan ikuti langkah-langkah berikut:

Modifikasi Konfigurasi HAProxy Buka file /etc/haproxy/haproxy.cfg dan tambahkan blok konfigurasi berikut untuk menentukan pada port dan alamat mana dashboard bisa diakses:

frontend stats
        mode http
        bind :8404
        stats enable
        stats refresh 10s
        stats uri /stats
        stats show-modules

Catatan: Di sini kita menggunakan port 8404. Pastikan port ini terbuka dan tidak terpakai oleh layanan lain.

Terapkan Perubahan Agar konfigurasi baru terbaca oleh sistem, lakukan restart pada layanan HAProxy dengan perintah berikut:

sudo systemctl restart haproxy.service

Akses Dashboard Sekarang, kita bisa melihat kondisi infrastruktur secara langsung melalui browser dengan mengakses alamat: http://192.168.87.6:8404/stats

Load Balancer Config

Setelah dashboard aktif, langkah selanjutnya adalah inti dari skenario kita: mengatur pembagian trafik. Di sini, HAProxy akan bertindak sebagai gerbang utama (port 80) yang akan meneruskan permintaan user ke dua server aplikasi (backend-1 dan backend-2) secara bergantian.

Silakan buka kembali file /etc/haproxy/haproxy.cfg dan tambahkan blok konfigurasi berikut di bagian bawah:

frontend docapi_front
        bind :80
        default_backend docapi_backend

backend docapi_backend
        balance roundrobin
        option httpchk GET /api/v1/health

        # Definisi server aplikasi dengan parameter health check yang presisi
        server backend-1 192.168.87.12:8080 check inter 5s fall 3 rise 2
        server backend-2 192.168.87.13:8080 check inter 5s fall 3 rise 2

Agar sistem benar-benar High Availability, kita tidak hanya sekadar mendaftarkan IP, tapi juga mengatur bagaimana HAProxy memantau "kesehatan" server tersebut:

  • balance roundrobin: Trafik akan dibagi rata secara bergantian ke setiap server.

  • option httpchk: HAProxy akan melakukan pengecekan ke endpoint /api/v1/health. Jika endpoint ini merespon dengan status 200 OK, maka server dianggap sehat.

  • inter 5s: Pengecekan dilakukan setiap 5 detik sekali.

  • fall 3: Jika server gagal merespon sebanyak 3 kali berturut-turut, HAProxy akan menandai server tersebut sebagai DOWN dan berhenti mengirim trafik ke sana.

  • rise 2: Jika server yang sebelumnya mati kembali sehat dan berhasil merespon sebanyak 2 kali berturut-turut, HAProxy akan memasukkannya kembali ke dalam antrean trafik (UP).

Terakhir, simpan file tersebut dan jalankan perintah berikut untuk menerapkan konfigurasi baru:

sudo systemctl restart haproxy.service

Testing Load Balancer

Setelah semua konfigurasi selesai, saatnya kita melakukan pembuktian. Tujuan pengujian ini adalah memastikan bahwa Load Balancer benar-benar mampu menjaga ketersediaan layanan meskipun salah satu server di belakangnya tumbang.

Pertama, pastikan aplikasi dapat diakses secara normal melalui alamat IP Load Balancer. Karena kita menggunakan GoDocAPI, silakan buka browser dan akses: http://192.168.87.6/swagger/index.html

Jika muncul tampilan dokumentasi Swagger, berarti HAProxy telah berhasil meneruskan trafik ke salah satu backend yang tersedia.

Sekarang, mari kita simulasikan kondisi error yang sebenarnya. Ikuti langkah berikut:

  • Matikan Aplikasi: Masuk ke VM App Backend 2 (192.168.87.13) dan hentikan layanan aplikasinya (atau matikan VM tersebut).

  • Pantau Dashboard: Jika kamu membuka dashboard stats di port 8404, kamu akan melihat baris backend-1 berubah menjadi warna merah (Status: DOWN).

  • Uji Kembali: Coba refresh halaman Swagger tadi.

Hasilnya? Aplikasi tetap dapat diakses dan berfungsi dengan normal. Hal ini terjadi karena HAProxy secara otomatis mendeteksi kegagalan pada backend-1 dan mengalihkan seluruh permintaan user ke backend-2. Inilah esensi dari redundansi di level aplikasi.

Next Part 3 kita akan implementasikan 2 HAProxy.

Mdr{dani} Notes

A digital garden where I plant ideas, share thoughts on DevOps, cloud infrastructure, open-source, and my journey in tech. Keep exploring and happy automating!

Explore Topics

Web DevelopmentReactNext.jsGolangOpen SourceTutorials

Supported By

Codeathome
LampungDev

Made with© 2026 Muhamad Dani Ramanda

Powered by HashnodeHosted on Vercel