Sebuah aplikasi yang hanya di-deploy pada sebuah server umumnya akan menimbulkan masalah single point of failure apabila server tersebut sudah mencapai batas kapasitasnya pada saat penggunaan tinggi. Akibatnya, pengguna tidak akan dapat menggunakan layanan software dan akan mengakibatkan kerugian bisnis.

Aplikasi yang baik adalah aplikasi yang memiliki ketersediaan hampir setiap saat (high availability), sekalipun tingkat penggunaan yang sangat tinggi atau sibuk. Untuk mencapai ini maka harus dilakukan perancangan yang baik pada sisi software dan juga hardware. Pada kali ini saya akan menuliskan bagaimana merancang arsitektur server yang scalable dan memiliki high availability.

Pada tulisan ini saya akan membahas penggunaan Nginx (baca: Engine X) dan GlusterFS untuk menghasilkan infrastruktur yang memiliki high availability. Nginx akan berperan sebagai pintu masuk dan load balancer untuk mengatur traffic dari setiap pengguna ke beberapa server aplikasi. GlusterFS akan berperan dalam melakukan replikasi dan sinkronisasi informasi (misal dokumen pada file system) dari beberapa server aplikasi tersebut. Proses replikasi file system ini akan sangat instan ke seluruh server selama network traffic juga baik, maka latency akan cenderung rendah.

Mengapa perlu melakukan replikasi file system ke beberapa application server? Mari kita jawab masalah ini melalui contoh kasus. Misalnya terdapat 3 server aplikasi yang di-load-balanced, ketika seorang pengguna mengunjungi aplikasi dan dilayani oleh server aplikasi ke-1, dan terdapat pengunjung lain pada saat yang sama dilayani oleh server aplikasi ke-2. Kemudian pengunjung pertama melakukan upload dokumen ke server aplikasi ke-1 maka pengunjung lain seharusnya juga segera dapat melihat dokumen tersebut pada server aplikasi ke-2. Kesimpulannya, pengunjung akan merasa dilayani oleh aplikasi yang sama sekalipun terdapat beberapa server di belakangnya.

Infrastruktur

  • Load balancer: Nginx
    OS: Debian 8
  • Application Server: GlusterFS, NodeJS
    OS: Debian 8
    Hostname: App1
  • Application Server: GlusterFS, NodeJS
    OS: Debian 8
    Hostname: App2
  • Application Server: GlusterFS, NodeJS
    OS: Debian 8
    Hostname: App3

Setup Nginx

Kali ini saya akan membuat panduan minimal, lengkapnya silakan baca pada dokumentasi lengkap.

  1. SSH ke server load balancer
  2. Install Nginx
sudo apt-get install nginx
  1. Buka file konfigurasi Nginx pada directory /etc/nginx/nginx.conf
  2. Konfigurasikan sebagai berikut: (sebagai catatan, anda juga dapat menggani hostname menjadi IP address dan port dari application servers anda)
upstream balancedAppKu {

   server App1;

   server App2;

   server App3;

}

server {

   location /balanced-app/ {

      proxy_pass http://balancedAppku/;

   }

}
  1. Simpan perubahan dan restart server Nginx
sudo nginx -s reload

Instalasi dan Konfigurasi GlusterFS

Lakukan instalasi GlusterFS pada seluruh application server.

  1. SSH pada setiap application server
  2. Install GlusterFS (pada contoh ini saya menggunakan Debian)
sudo apt-get install glusterfs-server
  1. Buatlah directory untuk menyimpan GlusterFS Brick
sudo mkdir -p /srv/data/appku
  1. Nyalakan layanan GlusterFS
sudo /etc/init.d/glusterfs-server start

Setelah GlusterFS terinstall pada seluruh application server, langkah selanjutnya adalah melakukan konfigurasi peer antar server.

  1. SSH pada salah satu application server (contoh: App1)
  2. Konfigurasi peer terhadap dua server lain
sudo gluster peer probe App2
sudo gluster peer probe App3
  1. Lakukan verifikasi status peer, dan lihatlah pesan yang menyatakan bahwa servers sudah salihg terhubung (connected)
sudo gluster peer status
  1. Membuat GlusterFS volume yang dinamakan Appku-vol dengan menggunakan seluruh application server sebagai peer.
sudo gluster volume create Appku-vol replica 3 transport tcp App1:/srv/data/appku App2:/srv/data/appku App3:/srv/data/appku force
  1. Mulai menjalankan volume Appku-vol
sudo gluster volume start Appku-vol
  1. Verifikasi konfigurasi volume yang berjalan
sudo gluster volume info
  1. Konfigurasi agar hanya application server yang anda perbolehkan untuk dapat melakukan mounting pada volume GlusterFS
sudo gluster volume set Appku-vol auth.allow App1,App2,App3

Langkah berikutnya adalah melakukan mounting storage yang akan direplikasi pada seluruh application server. Pada contoh aplikasi NodeJS, saya akan menyimpan file pada directory /home/app/uploads (pastikan anda sudah membuat directory tersebut pada ketiga server anda!). Maka saya akan melakukan mounting GlusterFS sebagai directory tersebut.

  1. Buka fstab
sudo nano /etc/fstab
  1. Tambahkan perintah berikut pada fstab pada seluruh server. Hal ini akan menyebabkan proses mounting akan otomatis terjadi pada saat terjadi restart server.

Pada application server App1:

App1:/Appku-vol /home/app/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0

Pada application server App2:

App2:/Appku-vol /home/app/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0

Pada application server App3:

App3:/Appku-vol /home/app/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0
  1. Simpan perubahan dan lakukan mounting dengan perintah berikut
mount -a

Selamat! saat ini anda sudah bisa mencoba replikasi dokumen pada ketiga server. Cobalah membuat satu dokumen pada salah satu server pada directory /home/app/uploads dan lihatlah hasil replikasinya pada dua server yang lain.  Tentunya anda dapat mengganti volume yang direplikasi sesuai dengan kebutuhan anda, misalnya pada /var/www/html.

Demikian sharing panduan singkat untuk menghasilkan infrastruktur yang memiliki high availability dengan Nginx dan GlusterFS. Panduan ini tentunya masih harus dilengkapi lagi untuk mencapai high availability, contohnya baru terdapat 1 load balancer server yang akan menjadi single point of failure. Silakan mengeksplorasi lebih lanjut untuk mencapai hal ini.

Bacaan lanjutan: https://www.digitalocean.com/community/tutorials/what-is-high-availability