Second Brain

Sebuah catatan perjalanan menekuni bidang IT Infra, Cloud, DevOps, dan Security

Build a Resilient Load Balancer with HAProxy & Docker

Dalam dunia DevOps dan SRE modern load balancing dan high availability (HA) bukan lagi fitur tambahan saja, melainkan sebuah keharusan untuk menjaga agar aplikasi tetap dapat diakses dan memiliki kinerja yang optimal.

Pada tutorial kali ini saya akan memberikan penjelasan dan gambaran terkait dengan Load Balancing dengan HAProxy.

Struktur Proyek

haproxy-lb-demo/
├── docker-compose.yml
├── haproxy/
│   └── haproxy.cfg
├── app1/index.html
├── app2/index.html
└── app3/index.html

Buat Aplikasi Web Sederhana

Setiap aplikasi hanya menampilkan halaman HTML statis untuk mengidentifikasi dirinya.

mkdir -p haproxy-lb-demo/{app1,app2,app3,haproxy}
cd haproxy-lb-demo

echo "<h1>Halo, ini server 1</h1>" > app1/index.html
echo "<h1>Halo, ini server 2</h1>" > app2/index.html
echo "<h1>Halo, ini server 3</h1>" > app3/index.html

Konfigurasi HAProxy

Buat file haproxy/haproxy.cfg

global
    log /dev/log local0
    log /dev/log local1 notice
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000

# Frontend: terima traffic di port 80
frontend http_front
    bind *:80
    stats uri /haproxy?stats          # Dashboard monitoring
    default_backend http_back

# Backend: distribusikan beban ke 3 aplikasi
backend http_back
    balance roundrobin
    option httpchk GET /index.html    # Health check
    http-check expect status 200
    server server1 app1:80 check inter 2000 rise 2 fall 3
    server server2 app2:80 check inter 2000 rise 2 fall 3
    server server3 app3:80 check inter 2000 rise 2 fall 3

Definisikan Layanan dengan Docker Compose

Buat file docker-compose.yml

version: '3.8'

services:
  app1:
    image: nginx:alpine
    volumes:
      - ./app1:/usr/share/nginx/html:ro
    expose:
      - "80"
    networks:
      - lb-net

  app2:
    image: nginx:alpine
    volumes:
      - ./app2:/usr/share/nginx/html:ro
    expose:
      - "80"
    networks:
      - lb-net

  app3:
    image: nginx:alpine
    volumes:
      - ./app3:/usr/share/nginx/html:ro
    expose:
      - "80"
    networks:
      - lb-net

  haproxy:
    image: haproxy:2.8
    volumes:
      - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    ports:
      - "8080:80"
    networks:
      - lb-net

networks:
  lb-net:
    driver: bridge

Deploy & Uji

# Jalankan semua layanan
docker-compose up -d

# Periksa status
docker-compose ps

Ketika semua sudah berhasil berjalan maka akan ada 4 container seperti gambar berikut

Akses web menggunakan browser dan refresh beberapa kali dan perhatikan tampilannya. Web akan menampilkan konten yang berbeda beda ketika kita refresh.

Untuk memastikan HAProxy berjalan, kita bisa matikan salah satu container. Kemudian kita refresh lagi untuk melihat apakah load balancing berjalan dengan baik atau tidak.

Untuk melihat status real-time tiap backend (UP/DOWN), jumlah request, dan hasil health check kita bisa akses dengan endpoint berikut

http://43.xx.xx.238:8080/haproxy?stats