A. Apa itu load balancer?
Load balancer artinya adalah pembagian beban. Dalam dunia web, HTTP Load Balancer artinya membagi beban server-server HTTP agar beban tidak terpusat pada satu server saja. Ya, atas alasan teknis pembagian beban, sebuah server web sering dibuat lebih dari satu. Jika salah satu mengalami beban penuh, dapat dioper beban ke server lainnya. Load balancer akan diletakkan pada bagian depan server-server tersebut, menjadi perantara client dan server.
B. Apa itu HAProxy?
HAProxy adalah sebuah produk opensource yang dibuat secara khusus untuk dapat melakukan pembagian request ke arah server. HA sendiri singkatan dari High Availability, yang secara teknis artinya adalah kondisi tidak akan mati saat salah satu sumber server mengalami kondisi down atau overload.
Pada gambar di bawah digambarkan sebuah susunan topologi server lengkap dengan backend maupun proxy (frontend). Proxy sebenarnya dapat menggunakan seluruh HTTP server seperti Apache dan Nginx. Namun HAProxy memang telah didesain untuk secara khusus mengatur tentang load balancing saja.
Gambar 1. Ilustrasi posisi load balancer pada topologi HTTP Server
HAProxy menerima request dari client, dan diberikan pada server-server backend (upstream) di belakangnya. Beban akan diatur oleh proxy dengan beberapa pilihan algoritma.
- Round Robin : haproxy akan mengambil source dengan beban yang setara antara satu server dengan server lainnya
- Leastconn : haproxy akan mengambil jumlah koneksi network paling sedikit
- First : haproxy akan mengambil dari server upstream pertama lebih dulu, setelah terlacak beban penuh, haproxy akan mengambil pada server upstream selanjutnya
- Source : haproxy akan mengambil data dari server, secara tetap, tidak berpindah-pindah. Sehingga jika sebuah sessi koneksi terjadi di upstream pertama, tidak akan terputus hingga sessi koneksi tersebut diakhiri
Cara instalasi HAProxy pada Linux cukup mudah, tinggal memanggil online-packet-manager seperti yum, apt, zypper, yast dan lain sebagainya. Misal adalah :
#ubuntu16 ke atas atau debian8 keatas apt install haproxy systemctl enable haproxy service haproxy start service haproxy status
#centos7 ke atas yum install epel-release yum install haproxy systemctl enable haproxy systemctl start haproxy systemctl status haproxy
#ubuntu15 dan sebelumnya apt-get install haproxy systemctl enable haproxy service haproxy start service haproxy status
#centos6 yum install epel-release yum install haproxy chkconfig haproxy on service haproxy start
Lokasi file konfigurasi HAProxy adalah di : /etc/haproxy/haproxy.cfg. Bukalah dengan text-editor seperti vim, nano, ee atau apapun. Akan ditemui isi file sebagai berikut :
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon . . . . defaults log global mode http option httplog option dontlognull option forwardfor . . . . #dst
C. Setting HAProxy untuk Load Balancer Single Domain
Sebuah situs portal berita yang memiliki traffic sangat tinggi akan membutuhkan load balancer dalam proses pengaturan beban. Di sini digambarkan alur kerja sebuah HAProxy untuk melayani traffic HTTP yang bekerja dengan satu domain.
Gambar 2. Ilustrasi Request user hingga node backend, pada single domain
Request User akan diterima oleh HAProxy (frontend) dan kemudian akan dibagikan pada server-server node di belakangnya (backend). Maka susunan konfigurasi HAProxy akan menjadi seperti berikut:
#lanjutan konfigurasi di atas #memberi nama bind frontend [nama-http-proxy] bind *:80 default_backend [nama-http-upstream-belakang] backend nama-http-upstream-belakang balance roundrobin server [namaserver/servername-1] ip.ad.dr.es:port check server [namaserver/servername-2] ip.ad.dr.es:port check server [namaserver/servername-3] ip.ad.dr.es:port check
Misal lengkapnya adalah
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ # An alternative list with additional directives can be obtained from # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults log global mode http option httplog option dontlognull option forwardfor timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http ###############start-http-80################# #memberi nama bind frontend my_front_server bind *:80 default_backend my_back_server backend my_back_server balance roundrobin server node1 10.10.10.1:80 check server node2 10.10.10.2:80 check server node3 10.10.10.3:80 check
Pada code di atas, menggunakan tiga buah server upstream / backend yaitu 10.10.10.1, 10.10.10.2, 10.10.10.3
D. Setting HAProxy untuk Banyak Domain dalam Satu Server HAProxy
Penggunaan banyak domain dalam satu server, jika dalam nGinX atau Apache akan diatur dengan menggunakan konsep VirtualHost (dapat dilihat di sini https://blogit.bimosaurus.com/2015/06/13/flash-back-virtualhost-apache-dan-nginx/), maka pada HAProxy akan menggunakan konsep Access List (ACL). (ACL ini mengingatkan saya pada penggunaan SQUID)
Berikut di bawah adalah gambar skemanya:
Gambar 3 Skema HAProxy sebagai Load Balancer untuk multi domain
Pada Tag Frontend, traffic akan ditandai.
- Jika request ke server tersebut dengan menggunakan nama panggil domain1, akan diberikan nama acl1.
- Jika request ke server tersebut dengan menggunakan nama panggil domain2, akan diberikan nama acl2
Kemudian pada Tag Backend, akan memunculkan aturan backend sejumlah ACL yang dibuat. Masing-masing aturan backend akan berisi aturan-aturan lagi seperti metode algoritma load balancer dan menentukan node.
#lanjutan dari global dan default frontend [nama-http-proxy] bind *:80 acl nama_host_1 hdr(host) -i nama_domain_1 acl nama_host_2 hdr(host) -i nama_domain_2 acl nama_host_3 hdr(host) -i nama_domain_3 use_backend backend_1 if nama_host_1 use_backend backend_2 if nama_host_2 use_backend backend_3 if nama_host_3 backend backend_1 balance {roundrobin|leastconn|first|source} server [namaserver/servername-1] ip.ad.dr.es:port check server [namaserver/servername-2] ip.ad.dr.es:port check server [namaserver/servername-3] ip.ad.dr.es:port check backend backend_2 balance roundrobin server [namaserver/servername-1] ip.ad.dr.es:port check server [namaserver/servername-2] ip.ad.dr.es:port check server [namaserver/servername-3] ip.ad.dr.es:port check backend backend_3 balance roundrobin server [namaserver/servername-1] ip.ad.dr.es:port check server [namaserver/servername-2] ip.ad.dr.es:port check server [namaserver/servername-3] ip.ad.dr.es:port check
Selengkapnya kira-kira adalah seperti berikut :
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy stats auth usermasuk:passwordmasuk stats uri /haproxy?stats daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ # An alternative list with additional directives can be obtained from # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults log global mode http option httplog option dontlognull option forwardfor timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http ###############start-http-80################# frontend my_frontend_server bind *:80 acl acl_abcde hdr(host) -i abcde.bimosaurus.com acl acl_fghij hdr(host) -i fghij.bimosaurus.com acl acl_klmno hdr(host) -i klmno.bimosaurus.com use_backend backend_abcde if acl_abcde use_backend backend_fghij if acl_fghij use_backend backend_klmno if acl_klmno backend abcde balance roundrobin server node_1a 10.10.10.1:80 check server node_1b 10.10.10.2:80 check server node_1c 10.10.10.3:80 check backend fghij balance roundrobin server node_2a 10.10.10.4:80 check server node_2b 10.10.10.5:80 check server node_2c 10.10.10.6:80 check backend klmno balance roundrobin server node_3a 10.10.10.7:80 check server node_3b 10.10.10.8:80 check server node_3c 10.10.10.9:80 check ###contoh bonus untuk nampilkan stat
Kira-kira seperti diatas tersebut. Perhatikan pada bagian :
stats auth usermasuk:passwordmasuk stats uri /haproxy?stats
Ini mengartikan bahwa jika si server HAProxy direquest dengan tambahan belakang /haproxy?stats maka akan memunculkan dialog user password sesuai dengan yang ditentukan. Jika sukses, maka akan muncul tampilan statistik seperti berikut :
Gambar 4. Tampilan Statistik Request HAProxy
Selamat mencoba.