Monday, February 22, 2016

Konfigurasi HAProxy Untuk Load Balancing MySQL Database

Pada artikel sebelumnya saya menulis tentang bagaimana menjadikan HAProxy sebagai load balancer web services. Kali ini saya akan membuat catatan dan percobaan bagaimana membuat HAProxy menjadi load balancer untuk database MySQL.


Pada sistem yang sudah besar dan aktivitas query ke database sudah sangat tinggi maka menggunakan load balancer bisa menjadi sebuah solusi agar load kerja database tidak terlalu tinggi dan performance dapat tetap stabil.

Sebagai catatan apabila Anda ingin menggunakan load balancer ke arah database maka sudah menjadi common practice di database yang kita miliki harus melakukan Replication Mode dan mode replication yang paling umum digunakan adalah Master-Master replication.

PREREQUISITES
Pada percobaan kali ini kita akan menggunakan 3 buah server yang bisa kita buat dari virtual machine dan 3 buah VM yang saya gunakan adalah sebagai berikut ini.

VM1 - Load Balancer HAProxy
Hostname  : haproxy
IP Address : 192.168.227.10
Operating System : Centos 6.5

VM2 - MySQL Node1
Hostname  : mysql1
IP Address : 192.168.227.20
Operating System : Centos 6.5

VM2 - MySQL Node2
Hostname  : mysql2
IP Address : 192.168.227.30
Operating System : Centos 6.5

Notes :
  • Semua VM diatas kondisi iptablesnya dalam keadaan off.
  • Selinux dalam keadaan disabled.


KONFIGURASI

1) Konfigurasi Node1 MySQL (192.168.227.20)

Konfigurasi /etc/hosts
[root@mysql1 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL dan Setting Password
[root@mysql1 ~]# yum install mysql-server -y
[root@mysql1 ~]# mysqladmin -u root password 'centos'
[root@mysql1 ~]# mysqladmin -u root -h mysql1 password 'centos'

Tambahkan Identity Server-id MySQL
[root@mysql1 ~]# vi /etc/my.cnf
## Lalu tambahkan line dibawah ini pada bagian tag [mysqld] ##
server-id=1

Lalu Jalankan 2 Buah Command SQL Dibawah
[root@mysql1 ~]# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.227.10','haproxy_check'); FLUSH PRIVILEGES;"
[root@mysql1 ~]# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.227.10' IDENTIFIED BY 'centos' WITH GRANT OPTION; FLUSH PRIVILEGES"


2) Konfigurasi Node2 MySQL (192.168.227.30)

Konfigurasi /etc/hosts
[root@mysql2 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL dan Setting Password
[root@mysql2 ~]# yum install mysql-server -y
[root@mysql2 ~]# mysqladmin -u root password 'centos'
[root@mysql2 ~]# mysqladmin -u root -h mysql2 password 'centos'

Tambahkan Identity Server-id MySQL
[root@mysql2 ~]# vi /etc/my.cnf
## Lalu tambahkan line dibawah ini pada bagian tag [mysqld] ##
server-id=2

Lalu Jalankan 2 Buah Command SQL Dibawah
[root@mysql2 ~]# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.227.10','haproxy_check'); FLUSH PRIVILEGES;"
[root@mysql2 ~]# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.227.10' IDENTIFIED BY 'centos' WITH GRANT OPTION; FLUSH PRIVILEGES"

NOTES :
Pada konfigurasi kedua server diatas Anda mengeksekusi 2 Command SQL yang sama, fungsi dan kegunaannya adalah sebagai berikut ini.

Command SQL Pertama 
Parameter 'haproxy_check' dapat diganti sesuai keinginan Anda. Parameter ini digunakan oleh haproxy sebagai user untuk melakukan checking status server atau istilah saya mengirim heartbeat ke masing2 node di belakangnya (mysql1 & mysql2). 

Command SQL Kedua 
Parameter haproxy_root dan centos dapat diganti sesuai keinginan Anda. Parameter ini digunakan oleh HAProxy untuk mengakses MySQL Cluster. Oleh karena itu kita harus membuat MySQL user dan memberikan privilege root.


3) Konfigurasi Load Balancer HAProxy (192.168.227.10)

Konfigurasi /etc/hosts
[root@mysql1 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL-Client dan Install HAProxy
[root@haproxy ~]# yum install mysql -y
[root@haproxy ~]# yum install haproxy -y
[root@haproxy ~]# chkconfig haproxy on

Konfigurasi HAProxy
Pertama, backup original konfigurasinya.
[root@haproxy ~]# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig

Kedua, buat konfigurasi baru dengan mengikuti line konfigurasi dibawah ini.
[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg
## Lalu tambahkan line dibawah ini ##
global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000

listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql1 192.168.227.20:3306 check
    server mysql2 192.168.227.30:3306 check

Setelah selesai lalu save & quit.

Start Service HAProxy dan Testing Query
[root@haproxy ~]# /etc/init.d/haproxy start


[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
Enter password: 

Apabila output seperti dibawah ini berarti sudah OK.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+


TESTING LOAD BALANCING & FAILOVER

1) Testing Load Balancing
Gunakan command dibawah ini untuk memastikan load balancer berjalan dengan baik, lakukan 4x test dan perhatikan outputnya.
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"

Apabila dari 4x testing tersebut outputnya seperti gambar dibawah ini, berarti load balancer sudah berjalan dengan baik dengan mode round robin seperti yang dikonfigurasikan.

[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+


2) Testing Failover
Untuk testing failover coba matikan service mysqld di salah satu node database (mysql1 atau mysql2), kemudian gunakan lagi command dibawah ini untuk testing query dari HAProxy.
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"

Dibawah ini saya mencoba mematikan service mysqld di node2 mysql2.





Lalu testing query lagi dari HAProxy, coba lakukan 4x query maka seharusnya yang keluar hanya server_id dengan value 1.

[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+


OPTIMIZING FAILOVER INTERVAL
Dari contoh diatas sebenernya ketika salah satu MySQL node mati maka HAProxy membutuhkan waktu sekian detik untuk menghapus node tersebut dari clusternya.

Untuk mengubah interval failover ini, kita hanya perlu mengubah konfigurasi di server HAProxy konfigurasi (/etc/haproxy/haproxy.cfg) dengan mengubah bagian.

Parameter Awal,
server mysql1 192.168.227.20:3306 check
server mysql2 192.168.227.30:3306 check

Diubah Menjadi,
server mysql1 192.168.227.20:3306 check fastinter 1000
server mysql2 192.168.227.30:3306 check fastinter 1000

Dari konfigurasi diatas maka parameter interval checking ketika server melakukan transisi UP ke DOWN diubah menjadi 1000ms atau 1 seconds.

Jangan Lupa Restart HAProxy Service Lalu Testing Kembali!


OK sekian dulu tulisan tentang HAProxy kali ini semoga bermanfaat...

No comments:

Post a Comment