Cara Load Balance MySQL Database dengan HAProxy

Selain bisa digunakan untuk load balancing HTTP Web Server, HAProxy juga bisa digunakan untuk load balancing SQL Database. Sebenarnya sangat banyak sekali yang bisa dilakukan oleh si HAProxy ini, tapi kali ini kita cukup membahas cara Load Balancing MySQL Database dengan HAProxy.

Persiapan

Disini kita akan menggunakan 3 VM Ubuntu server 16.04.

VM 1 – Load Balancer
Hostname: haproxy
IP: 172.19.0.254

VM 2 – MySQL 1 (Master)
Hostname: mysql-1
IP: 172.19.0.1

VM 3 – MySQL 2 (Slave)
Hostname: mysql-2
IP: 172.19.0.2

Sebelumnya pastikan dulu di VM 2 dan VM 3 sudah terpasang MySql Server dan sudah di replikasi. Jika belum bisa mengikuti tutorial cara replikasi MySql Master-Master dengan Mysql-replication.

Persiapan MySQL Server

Cukup lakukan hanya di VM MySql 1 saja karena nanti si server akan otomatis me-replicate data dari Master ke Slave. Pertama kita harus membuat 2 user di MySQL server yang nantinya akan digunakan oleh si HAProxy. User pertama akan digunakan si HAProxy untuk mengecek status dari si server.

root@mysql-1# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('172.19.0.254','haproxy_check'); FLUSH PRIVILEGES;"

User yang kedua harus memilki privileges setara dengan root yang nanti digunakan si HAProxy untuk mengakses server.

Catatan: Jangan pernah menggunakan user root secara langsung untuk menghindari hal yang tidak di inginkan. Lebih baik membuat user baru yang setara dengan root.

root@mysql-1# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'user_baru'@'172.19.0.254' IDENTIFIED BY 'kata_sandi' WITH GRANT OPTION; FLUSH PRIVILEGES"

Ganti user_baru dan kata_sandi sesuai dengan yang anda suka.

Install MySQL Client

Kita harus menginstall MySql client di Load Balancer, tujuannya adalah untuk mengecek konektivitas dari si MySql server nantinya.

root@haproxy# apt-get install mysql-client

Sekarang kita coba tes untuk melihat database yang ada di Master dengan menggunakan user user_baru.

root@haproxy# mysql -h 172.19.0.1 -u haproxy_root -p -e "SHOW DATABASES"

Seharusnya akan tampil list database yang ada pada Master.

Install HAProxy

Install paket haproxy di server Load Balancer:

root@haproxy# apt-get install haproxy

Kemudian enable HAProxy agar dapat dijalankan oleh init script secara otomatis.

root@haproxy# sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy

Untuk mengetahui bahwa HAProxy sudah dapat dijalankan oleh init script adalah dengan menjalankan perintah service

root@haproxy:~# service haproxy
Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}

Konfigurasi HAProxy

File konfigurasi default dari HAProxy ada di /etc/haproxy/haproxy.cfg. Kita harus membuat backup terlebih dulu untuk menghindari hal yang tidak diinginkan.

root@haproxy:~# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

Sekarang edit file tersebut.

nano /etc/haproxy/haproxy.cfg

Edit atau tambahkan pada baris global dan defaults:

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

Opsi log berarti kita akan menyimpan pesan log pada syslog server 127.0.0.1 (localhost).

Pada Ubuntu secara default rsyslog sudah terinstall dan berjalan namun belum listen ke IP manapun.

Opsi user dan group adalah user yang menangani proses HAProxy yang berjalan. Jangan pernah ganti baris ini.

Sekarang tambahkan bagian terpenting agar Load Balancing dapat berjalan:

listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 172.19.0.1:3306 check
    server mysql-2 172.19.0.2:3306 check

Mode yang pakai untuk Load Balancing MySQL tidak sama dengan cara untuk Load Balancing HTTP Web server, jadi kita menggunakan mode tcp. Konfigurasi diatas nantinya HAProxy akan bisa Listen dari lokal saja (anggap aja semua aplikasi terpusat di server Load Balancer), tapi jika ingin HAProxy hanya bisa Listen dari manapun maka ganti 127.0.0.1 jadi 0.0.0.0.
Sekarang tinggal jalankan service dari HAProxy.

service haproxy start

Saatnya kita tes untuk menampilkan database di HAProxy.

root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"

Opsi “-h” artinya kita akan konek ke host… kalau tidak pakai opsi “-h” atau langsung localhost maka MySql client akan berusaha menghubungkan ke mysql.sock yang mana file nya tidak ada di server HAProxy karena kita tidak menginstall paket mysql-server dan otomatis pasti akan gagal.

Testing Load Balancing dan Failover

Untuk mengetahui kalau load balancing sudah berjalan atau belum kita bisa lihat dari variabel “server_id” dengan menjalankan query dua kali atau lebih.

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

Karena kita menggunakan metode roundrobin maka akan terbagi sama rata dan bergantian. Sekarang kita coba ubah weightuntuk mysql-2 kemudian lihat bedanya.

nano /etc/haproxy/haproxy.cfg

server mysql-2 172.19.0.2:3306 check weight 2

Reload service haproxy jika sudah melakukan perubahan.

service haproxy reload

Kemudian untuk menjalankan query beberapa kali bisa menggunakan command dibawah:

root@haproxy:~# for i in `seq 1 6`
do
mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"
done

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

Sekarang load balancing bekerja dengan rasio 1:2 yaitu ke mysql-1 sekali dan ke mysql-2 dua kali.

Untuk mengetes failover kita matikan salah satu service mysql yang ada di mysql-1

root@mysql-1# service mysql stop

atau bisa dengan cara mematikan interfacenya

root@mysql-1# ifconfig eth1 down

Coba lihat log haproxy, akan terdeteksi bahwa mysql-1 DOWN

tail /var/log/haproxy/haproxy.log

Nov 15 00:08:51 localhost haproxy[1671]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

sumber : https://www.belajarsys.net/cara-load-balance-mysql-database-dengan-haproxy/
Posted on: January 30, 2019, by :