Tuesday, June 14, 2016

Managing Multiple Configuration Files in HAProxy

Selama ini dalam mengkonfigurasi HAProxy di project-project yang saya jalani, saya tidak pernah terpikir untuk memecah file konfigurasi menjadi beberapa file konfigurasi yang kecil. Biasanya konfigurasi yang diperlukan cukup singkat dan terfokus pada aplikasi backend tertentu yang perlu di-load-balanced. Namun ketika saya mulai mengkonfigurasi HAProxy untuk infrastruktur development kantor, saya mulai terbentur kebutuhan ini. Kebutuhan ini ada karena dalam infrastruktur development kantor terdiri dari beberapa project deployment environment yang sedang berjalan bersamaan. Agar efisien secara penggunaan resource, HAProxy yang digunakan cukup menggunakan 2 node HAProxy yang sifatnya global terhadap semua project yang ada.

Berangkat dari kebutuhan tersebut, saya kemudian mencari informasi bagaimana caranya memecah file konfigurasi HAProxy menjadi beberapa file konfigurasi kecil. Dengan pendekatan ini, konfigurasi dapat diatur lebih spesifik per project, membacanya juga lebih mudah, termasuk jika saya perlu men-disable konfigurasi tertentu dengan cepat saya cukup me-rename file konfigurasi yang ingin saya disable dan me-restart HAProxy-nya.

Willy Tarreau, pengembang utama HAProxy, menyatakan dalam salah satu entry di mailing list HAProxy [1], bahwa cara untuk memecah konfigurasi adalah dengan menggunakan parameter -f config.cfg secara berulang-ulang di command line argument-nya HAProxy. Pendekatan ini belum sempat saya lakukan, karena saya melihat ketidakpraktisan dalam operasionalnya. Perubahan init script Linux, seperti upstart, systemd, atau init system lainnya, untuk HAProxy perlu dilakukan untuk menambahkan parameter -f config.cfg. Perubahan init script Linux tersebut juga perlu dilakukan baik ketika ada penambahan file konfigurasi baru, maupun ketika ada keperluan untuk men-disable konfigurasi tertentu.

Merasa kurang cocok dengan solusi tersebut, saya teruskan pencarian alternatif lain sampai saya menemukan artikel milik Josip Lazić [2]. Pada artikel tersebut ternyata dia memiliki masalah yang sama dengan yang saya hadapi, bahkan menemukan link yang sama dengan yang saya temui sebelumnya [1]. Dia pun juga merasa kurang puas dan akhirnya membuat sebuah Shell script sederhana untuk memantain lebih dari satu konfigurasi HAProxy. Pada dasarnya Shell script tersebut menggabungkan file-file konfigurasi berakhiran .cnf di dalam direktori /etc/haproxy/conf.d menjadi sebuah file konfigurasi lengkap /etc/haproxy/haproxy.cfg untuk kemudian me-reload instance HAProxy. Shell script tersebut juga melakukan validasi sintaks konfigurasi sebelum me-reload HAProxy. Saya perlu melakukan beberapa penyesuaian dalam script tersebut, seperti menghilangkan etckeeper dan menggunakan systemd, sehingga saya putuskan untuk mem-fork-nya ke akun Github saya [3]. Shell script ini perlu paket diffcolor untuk proses pembandingan konfigurasi sebelum dan sesudah perubahan.

Berikut adalah struktur dari konfigurasi yang saya lakukan berdasarkan cara kerja Shell script [3]:
Gambar 1. Struktur Multi-Konfigurasi HAProxy

Terlihat pada gambar sebelumnya, semua konfigurasi saya simpan di dalam direktori /etc/haproxy/conf.d. Untuk menghindari salah urutan konfigurasi, saya beri 2 digit nomor sebagai prefix urutannya, sesuai dengan yang disarankan Shell script [3]. Jumlah digit nomor prefiks ini sebetulnya tidak ada keharusan berapa digit, namun sebaiknya 2 digit atau lebih untuk memfasilitasi kemungkinan jumlah project atau aplikasi yang perlu dipisahkan konfigurasinya. Di sini saya mencoba membuat sebuah konvensi penomoran prefiks seperti berikut ini:

  • 0x-nama.cfg - konfigurasi global dan statistik HAProxy
  • 1x-nama.cfg - konfigurasi infrastruktur Nostratech
  • 2x-nama.cfg - konfigurasi project yang sedang berjalan
  • 3x-nama.cfg - konfigurasi demo dan prospek lainnya
  • 9x-nama.cfg - konfigurasi dummy backend

Dengan struktur seperti itu, konfigurasi-konfigurasi yang sifatnya tidak pernah berubah seperti konfigurasi global, errorfile, user, group, dsb, dapat diletakkan pada 00-global.cfg. Kemudian untuk melihat statistik secara instance HAProxy keseluruhan dapat diletakkan di 01-statistics.cfg. Infrastuktur yang sifatnya shareable ke semua project atau prospek seperti MySQL cluster, GlusterFS cluster, dsb. dimasukkan ke dalam konfigurasi 10-nostratech.cfg. Project dan prospek diletakkan di masing-masing konfigurasi, dan dummy backend diletakkan pada 99-dummy.cfg. Ketika misalnya saya perlu menonaktifkan konfigurasi sebuah prospek yang sudah selesai, saya cukup me-rename file tersebut dan menjalankan kembali Shell script-nya.

Konvensi penamaan prefiks yang saya lakukan masih dapat divariasikan kembali tergantung dari kondisi di environment-nya. Sekian artikel saya kali ini. Selamat mencoba! :)

Daftar Referensi:

No comments:

Post a Comment