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.Posted on: January 30, 2019, by : Julian's | 1,389 views
sumber : https://www.belajarsys.net/cara-load-balance-mysql-database-dengan-haproxy/