High Availability Yang Kantong Friendly: Database dengan Galera Cluster, ProxySQL, dan Keepalived di Ubuntu 26.04 Bagian 2
Ini adalah tulisan lanjutan dari membangun server database High Availability. Bagian 1 bisa dibaca kembali disini: High Availability Yang Kantong Friendly: Database dengan Galera Cluster, ProxySQL, dan Keepalived di Ubuntu 26.04
Tahap 2: Konfigurasi Master
Kita masih berada di VM master (node-1). Setelah semua konfigurasi selesai, baru kita melakukan cloning.
Konfigurasi MariaDB Galera Cluster
Buka file konfigurasi server MariaDB menggunakan editor teks (misalnya nano):
sudo nano /etc/mysql/mariadb.conf.d/60.galera.cnf
Buat konfigurasi seperti berikut:
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_name = "db_cluster"
wsrep_cluster_address = "gcomm://192.168.56.21,192.168.56.22,192.168.56.23"
wsrep_node_name = "node1"
wsrep_node_address = "192.168.56.21" # IP milik Node1
wsrep_sst_method = rsync
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
Untuk node 2 & 3 kita cukup ganti bagian wsrep_node_name menjadi node2/node3 dan wsrep_node_address dengan IP mereka masing-masing).
Konfigurasi Nginx
Sebenarnya tidak ada konfigurasi yang dilakukan, kita hanya akan membuat file index.html untuk menandakan server yang sedang berjalan.
sudo echo "<h1>Halo dari NODE 1</h1>" | sudo tee /var/www/html/index.html
Konfigurasi Awal ProxySQL (Kondisi Service Mati)
Secara bawaan, ProxySQL membawa file konfigurasi standar yang sangat panjang. Kita akan mengosongkannya dan mengisinya dengan konfigurasi minimalis namun siap pakai untuk kebutuhan High Availability cluster kita,.
Langkah 1: Cadangkan File Konfigurasi Bawaan
Langkah aman, selalu cadangkan file asli sebelum melakukan perubahan.
sudo mv /etc/proxysql.cnf /etc/proxysql.cnf.bak
Langkah 2: Buat File Konfigurasi Baru
Buat file konfigurasi kosong yang bersih:
sudo nano /etc/proxysql.cnf
Langkah 3: Isi dengan Parameter cluster dan credential
Copy-paste konfigurasi di bawah ini. Konfigurasi ini mengatur agar port admin ProxySQL berada di 6032 (dengan credential: admin/admin), dan port aplikasi untuk website berada di 6033.
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="admin:admin"
mysql_ifaces="127.0.0.1:6032"
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6033"
default_schema="information_schema"
connect_timeout_server=3000
monitor_username="proxy_monitor"
monitor_password="PasswordMonitor123!"
monitor_history=60000
monitor_connect_interval=10000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_galera_healthcheck_interval=2000
}
Simpan dengan menekan CTRL+O, Enter, lalu keluar dengan CTRL+X.
Catatan Penting: Kita mendefinisikan monitor_username dengan nama proxy_monitor. User ini wajib ada di MariaDB nanti karena ProxySQL akan menggunakannya untuk mondar-mandir mengecek kesehatan (health check) Galera Cluster secara otomatis setiap 2 detik (monitor_galera_healthcheck_interval=2000).
Menyusun Skrip Inisiasi Data (SQL Script)
Karena ProxySQL menyimpan data sirkulasi routing-nya di dalam SQLite internal, cara paling praktis setelah server nanti dihidupkan adalah mengeksekusi skrip SQL otomatis.
Mari kita buat satu file skrip penyiapan di folder home untuk dieksekusi nanti saat cluster dinyalakan.
nano ~/inisiasi_proxysql.sql
Isi file tersebut dengan rangkaian logika pembagian bobot (weight) dan query rules yang sudah kita matangkan sebelumnya:
-- 1. Bersihkan sisa data server jika ada
DELETE FROM mysql_servers;
-- 2. Daftarkan Node MariaDB ke Hostgroup 10 (Writer)
-- Node 1 diberi bobot raksasa (1000) sebagai Primary Writer, Node 2 & 3 sebagai Backup Aktif (bobot 1)
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (10, '192.168.56.21', 3306, 1000);
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (10, '192.168.56.22', 3306, 1);
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (10, '192.168.56.23', 3306, 1);
-- 3. Daftarkan Node MariaDB ke Hostgroup 20 (Reader)
-- Semua node diberi bobot seimbang (100) untuk membagi beban SELECT secara Round-Robin
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (20, '192.168.56.21', 3306, 100);
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (20, '192.168.56.22', 3306, 100);
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight) VALUES (20, '192.168.56.23', 3306, 100);
-- 4. Daftarkan User Aplikasi
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('user_aplikasi', 'password_user_aplikasi', 10);
-- 5. Bersihkan dan Set Aturan Pemisahan Query (Read/Write Split)
DELETE FROM mysql_query_rules;
-- Aturan A: Jika query mengandung "FOR UPDATE" (aplikasi row locking), paksa ke Hostgroup 10 (Writer)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT.*FOR UPDATE$', 10, 1);
-- Aturan B: Jika query diawali dengan SELECT biasa, belokkan ke Hostgroup 20 (Reader)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (2, 1, '^SELECT', 20, 1);
-- 6. Eksekusi Load ke Runtime dan Kunci Permanen di Disk
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
Penulisan konfigurasi mentah ProxySQL di Node Master sudah selesai. File /etc/proxysql.cnf dan ~/inisiasi_proxysql.sql sudah siap.
Konfigurasi Keepalived di Node Master (Kondisi Service Mati)
Keepalived menggunakan file konfigurasi tunggal bernama keepalived.conf. Kita akan membuat file konfigurasi baru yang mendefinisikan peran Node 1 sebagai pemegang Floating IP utama.
Langkah 1: Buat File Konfigurasi Baru
Buka editor teks untuk membuat file konfigurasi Keepalived:
sudo nano /etc/keepalived/keepalived.conf
Langkah 2: Isi dengan Konfigurasi VRRP Master
Copy-paste konfigurasi di bawah ini ke dalam file tersebut:
vrrp_instance VI_1 {
state MASTER
interface enp0s8 # Sesuaikan dengan nama network interface yg digunakan (cek via 'ip a')
virtual_router_id 51
priority 255 # Angka tertinggi (255) memastikan Node 1 selalu menjadi utama
advert_int 1
authentication {
auth_type PASS
auth_pass Password123! # Password enkripsi sinkronisasi antar-node (harus sama di semua node)
}
virtual_ipaddress {
192.168.56.20 # TENTUKAN FLOATING IP SIMULASI ANDA DI SINI
}
}
Simpan perubahan dengan menekan CTRL+O, Enter, lalu keluar dengan CTRL+X.
Periksa nama interface yang digunakan menggunakan perintah ip a. Di VirtualBox, biasanya bernama enp0s3 atau enp0s8. Jika nama interface-nya salah, Keepalived akan gagal beroperasi dan tidak bisa memunculkan Floating IP.
Clone Virtual Machine
Konfigurasi sudah selesai, berikutnya kita cloning VM node1 menjadi node2 & node3. Sebelum melakukan proses cloning, matikan dulu VM node1 dengan perintah
sudo poweroff
atau
sudo shutdown -h now
Cara cloning VM di virtualbox dengan klik kanan di VM kemudian klik clone.

Pastikan bagian nama menjadi node-2 atau node-3 kemudian MAC Address Policy Generate new AC address…

Penyesuaian VM (Node 2 & 3)
Setelah proses cloning selesai, langkah berikutnya kita harus menyesuaikan hostname & IP. Untuk merubah hostname, edit file hostname
sudo nano /etc/hostname
ganti menjadi node-2. Kemudian kita akan menyesuaikan alamat IP VM:
sudo nano /etc/netplan/00-installer-config.yaml
ganti bagan addresses:
# This is the network config written by 'subiquity'
network:
ethernets:
enp0s3:
dhcp4: true
dhcp6: true
enp0s8:
dhcp4: no
addresses:
- 192.168.56.22/24
version: 2
Simpan perubahan dengan menekan CTRL+O, Enter, lalu keluar dengan CTRL+X.
reload konfigurasi dengan perintah
sudo netplan apply
kemudian cek alamat ip yg baru dengan perintah ip a. Lakukan hal yang sama untuk node 3.
Penyesuaian Konfigurasi
Karena Node 2 dan Node 3 adalah kloningan identik dari Node 1, maka saat ini masih membawa konfigurasi Keepalived yang berstatus MASTER. Kita harus mengubahnya menjadi BACKUP.
Mari aktifkan Node 2 dan Node 3 Anda, lalu lakukan perubahan berikut:
Penyesuaian Keepalived
sudo nano /etc/keepalived/keepalived.conf
Ubah dua parameter utama (state dan priority):
vrrp_instance VI_1 {
state BACKUP # <--- UBAH JADI BACKUP
interface enp0s8
virtual_router_id 51
priority 200 # <--- UBAH JADI 200 (Di bawah Node 1, di atas Node 3)
advert_int 1
authentication {
auth_type PASS
auth_pass Password123!
}
virtual_ipaddress {
192.168.56.20
}
}
Simpan perubahan dengan menekan CTRL+O, Enter, lalu keluar dengan CTRL+X.
Lakukan yg sama di node 3 tetapi ubah priority menjadi 100.
vrrp_instance VI_1 {
state BACKUP # <--- UBAH JADI BACKUP
interface enp0s8
virtual_router_id 51
priority 100 # <--- UBAH JADI 100 (Di bawah Node 2)
advert_int 1
authentication {
auth_type PASS
auth_pass Password123!
}
virtual_ipaddress {
192.168.56.20
}
}
Penyesuaian Konfigurasi Galera
Silakan buka file konfigurasi Galera di masing-masing node kloning:
Node 2
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
wsrep_node_address="192.168.56.22" # <--- Ubah ke IP Node 2
wsrep_node_name="node2" # <--- Ubah nama menjadi node2
Node 3
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
wsrep_node_address="192.168.56.23" # <--- Ubah ke IP Node 3
wsrep_node_name="node3" # <--- Ubah nama menjadi node3
Untuk parameter wsrep_cluster_address=”gcomm://192.168.56.21,192.168.56.22,192.168.56.23″, biarkan tetap sama karena daftar semua IP anggota klaster memang harus tercantum di sana.
Penyesuaian Nginx
Langkah ini dilakukan agar kita bisa melihat secara visual server mana yang sedang melayani request dari Floating IP saat pengujian failover nanti.
Node 2
sudo echo "<h1>Halo dari NODE 2</h1>" | sudo tee /var/www/html/index.html
Node 3
sudo echo "<h1>Halo dari NODE 3</h1>" | sudo tee /var/www/html/index.html
Penyesuaian konfigurasi selesai kita lakukan. Artikel berikutnya adalah proses eksekusi dengan menghidupkan satu per satu.