Wednesday, June 15, 2016

Alternative Backend Mapping in HAProxy

HAProxy memiliki fitur Access Control List (ACL) [1] yang sangat bermanfaat dalam menentukan backend mana yang akan dilewatkan sebuah request yang masuk ke HAProxy. Kriterium yang selama ini paling saya gunakan adalah hdr(host), di mana akan sangat bermanfaat terutama jika disinergikan dengan fitur server block dari nginx[2]. Misalnya untuk me-load-balanced 1 atau lebih nginx cluster yang memiliki banyak server name, kita cukup mendefinisikan sebuah frontend proxy dengan banyak kombinasi acl, hdr(host), dan use_backend sehingga request yang masuk dapat diteruskan ke backend proxy yang tepat sesuai dengan keinginan kita.

Berikut adalah contoh konfigurasinya:
# /etc/haproxy/haproxy.cfg
...
frontend https-endpoint
 bind *:443 ssl crt /etc/ssl/somedomain.com/STAR_somedomain_com.pem
 mode http
 acl WWW_REQUESTS hdr(host) -i www.somedomain.com
 acl DEV_REQUESTS hdr(host) -i dev.somedomain.com
 acl FIN_REQUESTS hdr(host) -i fin.somedomain.com
 acl CS_REQUESTS hdr(host) -i cs.somedomain.com
 acl API_REQUESTS hdr(host) -i api.somedomain.com
 use_backend www-nodes if WWW_REQUESTS
 use_backend dev-nodes if DEV_REQUESTS
 use_backend fin-nodes if FIN_REQUESTS
 use_backend cs-nodes if CS_REQUESTS
 use_backend api-nodes if API_REQUESTS
 default_backend dummy-nodes
...

Walaupun metode ini sangat powerful untuk kebutuhan seperti ini, namun menggunakan metode ini memiliki kekurangan terutama jika jumlah hostname yang perlu dievaluasi cukup banyak. Terbayang sebuah frontend proxy section yang memiliki jumlah baris yang banyak untuk mengevaluasi 1000 hostname misalnya. Untungnya HAProxy memiliki metode lain untuk menyelesaikan permasalahan ini. HAProxy mulai memperkenalkan fitur map sejak versi 1.5 [3], di mana HAProxy dapat membaca file selain konfigurasi HAProxy untuk menentukan backend mana yang perlu dijalankan terhadap sebuah hostname tertentu.

Format file yang perlu dibuat untuk proses mapping ini sangat sederhana, yaitu 2 kolom yang dipisahkan dengan whitespace. Kolom pertama merupakan kolom untuk kemungkinan nilai yang akan ada, sementara kolom kedua merupakan nama backend proxy section yang akan dijalankan ketika nilai yang telah dievaluasi dari frontend cocok dengan kolom pertama.

Jika menggunakan contoh sebelumnya, kurang lebih isi dari map file tersebut adalah seperti ini:
# /etc/haproxy/maps.d/20-somedomain.map
...
#domain name   #backend name
www.somedomain.com  www-nodes
dev.somedomain.com  dev-nodes
fin.somedomain.com  fin-nodes
cs.somedomain.com  cs-nodes
api.somedomain.com  api-nodes
...

Kemudian muncul pertanyaan, bagaimana menutupi kebutuhan untuk default_backend? Jawabannya ada di format HAProxy map-nya itu sendiri di konfigurasi utama HAProxy. Berikut adalah konfigurasi HAProxy yang baru dengan menggunakan HAProxy map:
# /etc/haproxy/haproxy.cfg
...
frontend somedomain_https-endpoint
 bind *:443 ssl crt /etc/ssl/somedomain.com/STAR_somedomain_com.pem
 mode http
 use_backend %[req.hdr(host),lower,map_dom(/etc/haproxy/maps.d/20-somedomain.map,generic_dummy-nodes)]
...

Konfigurasi menjadi lebih sederhana dan singkat, sehingga konfigurasi juga lebih terbaca. Selain itu jika kita perhatikan lebih seksama, format HAProxy map ini generik dan dapat digunakan untuk fungsi lain selain untuk membaca kombinasi hostname request dan backend routing. Misalnya untuk menggantikan fungsi evaluasi ACL untuk prefiks dari web site dan lain-lain. Saya mulai menggunakan konfigurasi ini untuk infrastruktur di kantor dan sejauh ini berjalan sangat stabil.

Sekian artikel saya kali ini, selamat mencoba ya! :)

Daftar Referensi:

No comments:

Post a Comment