Showing posts with label keepalived. Show all posts
Showing posts with label keepalived. Show all posts

Sunday, March 15, 2015

Synchronizing Multiple VIP Failover with Keepalived


Tepat setahun yang lalu, saya sempat menuangkan langkah-langkah bagaimana mengkonfigurasi 2 node HAProxy cluster secara active/passive dengan menggunakan Keepalived [1]. Konfigurasi tersebut dapat digunakan ketika HAProxy berada di belakang DMZ. Namun bagaimana jika HAProxy dan Keepalived berada di DMZ dan harus me-manage 2 VIP address? Misalnya pada kasus 1 public VIP address sebagai frontend IP address yang diakses oleh client dan 1 private VIP address yang diakses oleh aplikasi backend untuk komunikasi dengan database. Dalam konfigurasi ini, Keepalived harus mengatur failover kedua VIP secara bersamaan, dengan asumsi ketika salah satu VIP (public atau private) fail di node master, maka kedua VIP akan pindah ke node backup.

Gambar berikut ini menunjukkan topologi HAProxy sebagai load balancer di sisi public network.
HAProxy/Keepalived with Public VIP

Sedangkan gambar berikut menunjukkan topologi HAProxy ketika berperan sebagai load balancer di sisi private network.
HAProxy/Keepalived with Private VIP

Keepalived memiliki subblock configuration untuk kebutuhan ini, yaitu dengan menggunakan VRRP instance synchronization group subblock vrrp_sync_group [2][3].

Berikut adalah konfigurasi Keepalived yang digunakan di node master:
okky@hap01:~$ cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
 script "killall -0 haproxy"
 interval 2
 weight 2
}

vrrp_sync_group VSG {
 group {
  VI_PUBLIC
  VI_PRIVATE
 }
}

vrrp_instance VI_PUBLIC {
 interface eth0
 state MASTER
 virtual_router_id 51
 priority 101
 virtual_ipaddress {
  100.100.100.100/24 brd 100.100.100.255 dev eth0
 }
 track_script {
  chk_haproxy
 }
}

vrrp_instance VI_PRIVATE {
 interface eth1
 state MASTER
 virtual_router_id 52
 priority 101
 virtual_ipaddress {
  192.168.1.100/24 brd 192.168.1.255 dev eth1
 }
 track_script {
  chk_haproxy
  }
}

Sedangkan konfigurasi di node backup adalah sebagai berikut:
okky@hap02:~$ cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
 script "killall -0 haproxy"
 interval 2
 weight 2
}

vrrp_sync_group VSG {
 group {
  VI_PUBLIC
  VI_PRIVATE
 }
}

vrrp_instance VI_PUBLIC {
 interface eth0
 state BACKUP
 virtual_router_id 51
 priority 50
 virtual_ipaddress {
  100.100.100.100/24 brd 100.100.100.255 dev eth0
 }
 track_script {
  chk_haproxy
 }
}

vrrp_instance VI_PRIVATE {
 interface eth1
 state BACKUP
 virtual_router_id 52
 priority 50
 virtual_ipaddress {
  192.168.1.100/24 brd 192.168.1.255 dev eth1
 }
 track_script {
  chk_haproxy
 }
}

Restart service Keepalived di kedua node (master dan backup) setelah melakukan perubahan konfigurasi Keepalived tersebut. Output dari command ip addr show pada node master adalah seperti berikut:
okky@hap01:~$ ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: venet0:  mtu 1500 qdisc noop state DOWN
    link/void
3: eth0:  mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:18:51:47:76:40 brd ff:ff:ff:ff:ff:ff
    inet 100.100.100.101/24 brd 100.100.100.255 scope global eth0
    inet 100.100.100.100/24 brd 100.100.100.255 scope global secondary eth0
    inet6 fe80::218:51ff:fe47:7640/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever
4: eth1:  mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:18:51:a2:f0:65 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.100/24 brd 192.168.1.255 scope global secondary eth1
    inet6 fe80::218:51ff:fea2:f065/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever

Sedangkan output command tersebut pada node backup adalah:
okky@hap02:~$ ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: venet0:  mtu 1500 qdisc noop state DOWN
    link/void
3: eth0:  mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:18:51:54:c7:5f brd ff:ff:ff:ff:ff:ff
    inet 100.100.100.102/24 brd 100.100.100.255 scope global eth0
    inet6 fe80::218:51ff:fe54:c75f/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever
4: eth1:  mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:18:51:49:a2:f1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::218:51ff:fe49:a2f1/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever

Selamat mencoba! :)

[1] Active Passive HAProxy with Keepalived
[2] LVS NAT + Keepalived HOWTO

Saturday, March 15, 2014

Active-Passive HAProxy with Keepalived


Beberapa waktu lalu, saya sempat membahas mengenai ZenLB, yaitu load balancer appliance yang berbasiskan Debian. Kali ini saya ingin mencoba alternatif software-based load balancer lainnya yang bernama HAProxy. HAProxy merupakan software load balancer yang sangat handal, di mana banyak sekali digunakan oleh penyedia layanan Internet besar seperti GitHub, Imgur, Instagram, Reddit, Stack Overflow, ServerFault, Tumbler, Twitter, dan masih banyak lagi. Tidak seperti ZenLB, HAProxy bukan merupakan sebuah appliance, sehingga dapat dikonfigurasi ke OS yang sudah ada.

Load balancer seperti HAProxy merupakan komponen penting dalam high availability deployment, di mana load balancer menjadi pintu gerbang utama dari semua request user ke aplikasi. Sehebat apapun aplikasi, tapi jika suatu ketika load balancer down, maka aplikasi juga tidak dapat diakses oleh user. Untuk itulah diperlukan setidaknya 2 load balancer yang saling menggantikan ketika salah satu proses/mesin menjadi down.

Keepalived merupakan routing software yang dapat dikombinasikan dengan HAProxy untuk dapat menghasilkan solusi high availability pada level load balancer. Keepalived bekerja dengan cara terus-menerus memonitor proses HAProxy di masing-masing node. Secara default, master node akan memegang virtual IP (VIP) dan akan menjadi node yang aktif. Ketika proses HAProxy di master node menjadi down dan tidak dapat di-restart kembali, Keepalived akan mendeteksi hal tersebut dan akan memindahkan VIP aktif ke backup node. Setelah backup node memiliki VIP, proses HAProxy pada backup node akan di-restart/reload kembali secara otomatis.

Pada blog kali ini, saya ingin mencoba mengkonfigurasi 2 instance HAProxy dan Keepalived pada 2 mesin Linux. Saya tidak mengkompilasi HAProxy dan Keepalived dari source code, namun saya download paket RPM dan menginstalasi melalui command rpm.

Instalasi dan Konfigurasi Keepalived


Download paket RPM untuk Keepalived dan instal pada kedua mesin.
[root@machine1 ~] # wget -c http://svn.riviera.org.uk/repo/RPMS/keepalived/RPMS/x86_64/keepalived-1.2.1-5.el5.x86_64.rpm
[root@machine1 ~] # rpm -ivh keepalived-1.2.1-5.el5.x86_64.rpm
Preparing...                 ################################################### [100%]
   1:keepalived              ################################################### [100%]
[root@machine1 ~] # service keepalived status
keepalived is stopped
Backup file /etc/sysctl.conf kemudian tambahkan 2 baris berikut di akhir file /etc/sysctl.conf di kedua mesin.
...
# HAProxy - Keepalived VIP
net.ipv4.ip_nonlocal_bind = 1
Baris tersebut berperan dalam perpindahan VIP antara machine1 dan machine2. Refresh perubahan parameter kernel tersebut dengan command berikut pada kedua mesin.
[root@machine1 ~] # sysctl -p
Backup file /etc/keepalived/keepalived.conf dan buat menjadi seperti ini pada master node (machine1):
vrrp_script chk_haproxy {  # Requires keepalived-1.1.13
 script "killall -0 haproxy" # cheaper than pidof
 interval 2   # check every 2 seconds
 weight 2   # add 2 points of prio if OK
}

vrrp_instance VI_1 {
 interface eth0
 state MASTER
 virtual_router_id 51
 priority 101   # 101 on master, 100 on backup
 virtual_ipaddress {
  192.168.0.100
 }
 track_script {
  chk_haproxy
 }
}
Lakukan hal serupa pada backup node (machine2), namun ada sedikit perubahan pada bagian priority dan state:
vrrp_script chk_haproxy {  # Requires keepalived-1.1.13
 script "killall -0 haproxy" # cheaper than pidof
 interval 2   # check every 2 seconds
 weight 2   # add 2 points of prio if OK
}

vrrp_instance VI_1 {
 interface eth0
 state BACKUP
 virtual_router_id 51
 priority 100   # 101 on master, 100 on backup
 virtual_ipaddress {
  192.168.0.100
 }
 track_script {
  chk_haproxy
 }
}
Restart proses Keepalived pada kedua mesin.
[root@machine1 ~] # service keepalived restart
Validasi konfigurasi dengan melihat IP address di masing-masing mesin. Jika proses Keepalived sedang berjalan di kedua mesin, maka VIP address 192.168.0.100 akan berada di machine1. VIP address akan berpindah ke machine2 jika proses Keepalived pada machine1 dinonaktifkan. Berikut adalah contoh output pada machine1 ketika VIP berada di machine1.
[root@machine1 ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:27:69:8e:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.193/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0
Pada kondisi kedua Keepalived berjalan, machine2 akan memiliki output tanpa VIP address.
[root@machine2 ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:27:25:2b:8c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.192/24 brd 192.168.0.255 scope global eth0
Perpindahan VIP dapat diamati dari /var/log/messages.

Instalasi dan Konfigurasi HAProxy


Download paket RPM untuk HAProxy dan instal pada kedua mesin.
[root@machine1 ~] # wget -c http://svn.riviera.org.uk/repo/RPMS/haproxy/RPMS/x86_64/haproxy-1.4.10-1.el5.x86_64.rpm
[root@machine1 ~] # rpm -ivh haproxy-1.4.10-el5.x86_64.rpm
Preparing...                 ################################################### [100%]
   1:haproxy                 ################################################### [100%]
[root@machine1 ~] # service haproxy status
haproxy is stoppped
Backup file /etc/haproxy/haproxy.conf dan buat menjadi seperti ini pada kedua mesin: (sesuaikan backend server dengan kebutuhan, pada kasus ini saya membuat HAProxy menjadi frontend untuk salah satu WebLogic AdminServer yang ada)
global
 log 127.0.0.1 local0
 log 127.0.0.1 local1 notice
        maxconn 4096
        user haproxy
        group haproxy

defaults
 log global
 option dontlognull
 option redispatch
 retries 3
 maxconn 2000
 contimeout 500000
 clitimeout 500000
 srvtimeout 500000

listen blogadmin.nostratech.com 192.168.0.100:7001
        mode tcp
        option tcplog
        server adminserver blogadminvhn.nostratech.com:7001 check
Saya mengisi listen IP address untuk entry blogadmin.nostratech.com dengan VIP address yang telah saya siapkan dengan Keepalived sebelumnya. Untuk keamanan, proses HAProxy akan dijalankan oleh user dedicated, haproxy. Buat user dan group yang bernama haproxy pada kedua mesin.
[root@machine1 ~] # useradd haproxy
[root@machine1 ~] # id haproxy
uid=54322(haproxy) gid=54323(haproxy) groups=54323(haproxy)
Restart proses HAProxy pada kedua mesin.
[root@machine1 ~] # service haproxy restart
Sekarang saatnya pengujian. :)

Pengujian HAProxy dan Keepalived


Buka browser kemudian coba akses VIP dan listen port yang telah kita spesifikasikan pada file /etc/haproxy/haproxy.conf yaitu http://192.168.0.100:7001/console.
HAProxy pada machine1 menjadi frontend AdminServer
Simulasikan proses HAProxy pada machine1 down dengan cara menghentikan proses HAProxy pada machine1.
[root@machine1 ~] $ service haproxy stop
Akses kembali alamat yang sama, seharusnya masih dapat diakses.
HAProxy pada machine2 menjadi frontend AdminServer
Jika masih bisa diakses, selamat konfigurasi Anda berhasil. :) Selamat mencoba!