Arsitektur High Availability MySQL dengan Master-Slave Replication & ProxySQL
1. Konteks Industri & Analisis Akar Masalah
Dalam lanskap arsitektur web modern, skalabilitas dan High Availability (HA) pada lapisan database adalah benteng pertahanan terakhir yang menentukan apakah sebuah aplikasi enterprise dapat bertahan di bawah tekanan trafik tinggi atau mengalami downtime katastrofik. Pola penerapan tradisional di mana aplikasi backend (PHP, Go, Node.js) melakukan query baca (read) dan tulis (write) secara langsung ke satu instance database MySQL tunggal (Single Point of Failure / SPOF) adalah resep bencana untuk aplikasi dengan konkurensi masif.
Bottleneck Performa pada Arsitektur Konvensional
- I/O Saturation: Seluruh operasi read (SELECT) dan write (INSERT, UPDATE, DELETE) bersaing memperebutkan resource CPU, memori, dan subsystem disk (I/OPS) yang sama pada satu mesin.
- Keterbatasan Locking: Operasi tulis yang intensif dapat memicu table-level atau row-level locking yang menghambat eksekusi query baca yang seharusnya ringan dan cepat.
- Risiko Bencana Total: Ketika server database utama mengalami kegagalan hardware, kernel panic, atau kehabisan memori (OOM Killer), seluruh ekosistem aplikasi lumpuh seketika karena tidak ada jalur failover otomatis.
Perbandingan Kondisi: Sebelum vs Sesudah Implementasi HA
- Sebelum: Aplikasi menggunakan satu server MySQL (Primary). Traffic tinggi menyebabkan latensi melonjak hingga ribuan milidetik. Saat server down, situs offline total selama proses pemulihan manual (cold backup restoration).
- Sesudah: Aplikasi terhubung ke database virtualization layer (ProxySQL). Query tulis dialihkan secara otomatis ke Master, sementara query baca didistribusikan secara cerdas ke kluster Slave (Read/Write Splitting). Jika Master gagal, ProxySQL bersama orchestrator mendeteksi kegagalan dan mempromosikan Slave secara seamless tanpa modifikasi kode di sisi aplikasi.
[!IMPORTANT] Mengandalkan koneksi langsung aplikasi ke beberapa IP database tanpa middleware routing adalah antipola karena akan membebani application code dengan logika connection pooling dan failover handling yang rumit.
2. Konsep Inti & Deep Dive Arsitektur
Arsitektur High Availability MySQL dengan Master-Slave Replication dan ProxySQL menggabungkan tiga komponen utama: MySQL Primary (Master), MySQL Replica (Slave), dan ProxySQL sebagai High-Performance MySQL Proxy.
Alur Data & Eksekusi (Under The Hood)
- Aplikasi mengirimkan SQL query melalui port koneksi ProxySQL (biasanya port
6033). - ProxySQL Query Processor menganalisis apakah query tersebut berjenis
SELECTatauINSERT/UPDATE/DELETEberdasarkan aturan Query Rules yang telah dikonfigurasi. - Jika query adalah Write, ProxySQL merutekannya ke Master Node.
- Jika query adalah Read, ProxySQL menggunakan algoritma load balancing (seperti Round-Robin atau Weight-based) untuk mendistribusikannya ke salah satu Slave Node.
- MySQL Master mengeksekusi transaksi dan mencatat perubahannya ke dalam Binary Log (Binlog).
- MySQL Slave mengambil (fetch) Binlog dari Master melalui I/O Thread, menulisnya ke Relay Log, lalu SQL Thread mengeksekusi ulang perubahan tersebut pada database lokalnya.
+-------------+
| Application |
+-------------+
|
| SQL Query (Port 6033)
v
+---------------------------------------------------+
| ProxySQL |
| +--------------------+ +--------------------+ |
| | Read Queries |-->| Slave Nodes | |
| +--------------------+ +--------------------+ |
| | (Replication Lag) | |
| +--------------------+ +--------------------+ |
| | Write Queries |-->| Master Node | |
| +--------------------+ +--------------------+ |
+---------------------------------------------------+
|
| Binlog Streaming
v
+--------------+
| Slave Nodes |
+--------------+
3. Perbandingan Komparatif / Analisis Pendekatan
Membangun HA MySQL memiliki beberapa jalur pendekatan arsitektural. Berikut perbandingan mendalam antara Master-Slave dengan ProxySQL melawan alternatif lain seperti MySQL Group Replication (MGR) dan MariaDB Galera Cluster.
| Parameter | Master-Slave + ProxySQL | MySQL Group Replication (MGR) | MariaDB Galera Cluster |
|---|---|---|---|
| Model Konsensus | Asynchronous / Semi-Sync | Paxos (Multi-Master / Single-Master) | Certification-based Replication |
| Kompleksitas Setup | Menengah (Perlu konfigurasi proxy) | Tinggi (Butuh minimal 3 node) | Tinggi (Butuh minimal 3 node) |
| Write Scalability | Terbatas pada 1 Master | Terbatas pada 1 Master (jika Single-Master MGR) | Tinggi (Multi-Master Write ke semua node) |
| Read Scalability | Sangat Tinggi (Banyak Slave bisa ditambah) | Tinggi (Melalui node tambahan) | Tinggi (Melalui node tambahan) |
| Latency Write | Sangat Rendah (Asynchronous) | Lebih tinggi (Paxos consensus overhead) | Lebih tinggi (Certification checks) |
| Konsumsi Resource | Rendah di sisi DB, Sedang di ProxySQL | Tinggi (Proses konsensus terus berjalan) | Tinggi (Replikasi antar node intensif) |
[!TIP] Gunakan arsitektur Master-Slave + ProxySQL jika beban aplikasi Anda didominasi oleh operasi baca (read-heavy dengan rasio 80:20 atau 90:10) dan Anda menginginkan kontrol penuh terhadap routing query serta connection pooling.
4. Prasyarat Sistem & Persiapan Lingkungan
Sebelum memulai implementasi teknis, pastikan environment infrastruktur Anda memenuhi spesifikasi berikut:
Spesifikasi Minimum Node
- OS: Ubuntu Server 22.04 LTS / Debian 12 / Rocky Linux 9
- Node 1 (Master): IP
192.168.1.10, MySQL 8.0, RAM 4GB, CPU 2 Cores - Node 2 (Slave): IP
192.168.1.11, MySQL 8.0, RAM 4GB, CPU 2 Cores - Node 3 (ProxySQL): IP
192.168.1.12, ProxySQL 2.5+, RAM 2GB, CPU 1 Core
Verifikasi Jaringan & Firewall
Pastikan port-port berikut terbuka dan tidak diblokir oleh UFW atau Firewalld:
- Port
3306: Komunikasi MySQL internal dan replikasi. - Port
6033: ProxySQL port klien (aplikasi terhubung ke sini). - Port
6032: ProxySQL Admin interface.
5. Panduan Implementasi Langkah demi Langkah
Langkah 1: Konfigurasi MySQL Master (192.168.1.10)
Edit file konfigurasi MySQL /etc/mysql/mysql.conf.d/mysqld.cnf (atau /etc/my.cnf):
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
relay-log = mysql-relay-bin
bind-address = 0.0.0.0
read_only = 0
Restart layanan MySQL:
sudo systemctl restart mysql
Buat user replikasi dan user monitoring di MySQL Master:
CREATE USER 'replicator'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongReplPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
CREATE USER 'proxysql_monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'MonitorPassword123!';
GRANT SELECT ON performance_schema.* TO 'proxysql_monitor'@'%';
CREATE USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'AppUserPassword123!';
GRANT ALL PRIVILEGES ON production_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
Dapatkan status master untuk sinkronisasi awal:
SHOW MASTER STATUS;
Catat nilai File dan Position yang dihasilkan.
Langkah 2: Konfigurasi MySQL Slave (192.168.1.11)
Edit file konfigurasi MySQL di Slave:
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1
bind-address = 0.0.0.0
Restart layanan MySQL Slave:
sudo systemctl restart mysql
Hubungkan Slave ke Master menggunakan SQL command:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='replicator',
MASTER_PASSWORD='StrongReplPassword123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
START SLAVE;
Verifikasi status slave:
SHOW SLAVE STATUSG
Pastikan Slave_IO_Running: Yes dan Slave_SQL_Running: Yes.
Langkah 3: Instalasi dan Konfigurasi ProxySQL (192.168.1.12)
Tambahkan repository ProxySQL dan instal:
sudo apt update
sudo apt install -y lsb-release gnupg2 wget
wget -O - 'https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key' | sudo apt-key add -
echo "deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/$(lsb_release -sc)/ ./" | sudo tee /etc/apt/sources.list.d/proxysql.list
sudo apt update
sudo apt install -y proxysql
sudo systemctl start proxysql
Masuk ke ProxySQL Admin Interface (Default password: admin / admin):
mysql -u admin -padmin -h 127.0.0.1 -P 6032
Konfigurasikan Server Pools, Monitor, Users, dan Query Rules:
-- 1. Tambahkan Server ke Server Groups
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, '192.168.1.10', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '192.168.1.11', 3306);
-- 2. Konfigurasi User Monitoring
UPDATE global_variables SET variable_value='proxysql_monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='MonitorPassword123!' WHERE variable_name='mysql-monitor_password';
-- 3. Konfigurasi User Aplikasi
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('app_user', '*436D2576974B39B6F38592FA0CCDBBD8D46850EA', 1);
-- Catatan: Password di atas adalah bentuk hash SHA1 dari 'AppUserPassword123!' dengan prefiks bintang (*)
-- 4. Konfigurasi Read/Write Splitting Rules
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FOR UPDATE$', 1, 1);
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (2, 1, '^SELECT', 2, 1);
-- 5. Simpan Konfigurasi ke Disk dan Muat ke Runtime
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;
6. Bedah Kode & Penjelasan Detail Baris Kunci
binlog_format = ROW: Baris ini krusial pada konfigurasi MySQL Master. FormatROWmemastikan setiap perubahan baris data dicatat secara presisi ke dalam binary log, menghindari inkonsistensi replikasi yang sering terjadi pada formatSTATEMENTsaat mengeksekusi query non-deterministik.read_only = 1: Diterapkan pada MySQL Slave untuk mencegah aplikasi atau user secara tidak sengaja melakukan operasi tulis langsung ke server slave, yang dapat merusak integritas rantai replikasi.destination_hostgroup = 2pada ProxySQL Query Rules: Mengarahkan seluruh query yang cocok dengan pola regex^SELECT(pencarian data biasa) menuju hostgroup 2 (Slave Nodes), sementara query tulis otomatis jatuh ke default hostgroup (Hostgroup 1 - Master Node).
7. Skenario Produksi & Studi Kasus Dunia Nyata
Pada sistem e-commerce berskala besar dengan ribuan transaksi per detik, lonjakan trafik mendadak saat flash sale dapat melumpuhkan database tradisional.
Implementasi Nyata
- Koneksi Aplikasi: Framework backend (seperti Laravel atau Go Fiber) dikonfigurasi untuk terhubung ke ProxySQL di
192.168.1.12:6033alih-alih langsung ke database fisik. - Pemisahan Beban: Dashboard analitik dan laporan penjualan mengeksekusi query
SELECTmasif yang diarahkan secara otomatis ke 3 node Slave terpisah. - Proteksi Master: Master Node hanya menerima query
INSERTpesanan (checkout) danUPDATEstok, menjadikannya bersih dari beban query analitik yang berat.
8. Common Pitfalls, Anti-Patterns & Solusi
- Replication Lag yang Tinggi:
- Masalah: Slave tertinggal jauh dari Master akibat query baca yang kompleks atau spesifikasi hardware slave yang lebih rendah.
- Solusi: Aktifkan Multi-threaded Slave Replication di MySQL (
slave_parallel_workers = 4) dan optimalkan indeks pada tabel.
- Koneksi Putus Akibat Timeout ProxySQL:
- Masalah: Aplikasi mengalami error
MySQL server has gone away. - Solusi: Sesuaikan parameter
mysql-connection_max_idle_timedanmysql-connect_timeout_serverdi ProxySQL.
- Masalah: Aplikasi mengalami error
- Lupa Menyimpan Konfigurasi ProxySQL ke Disk:
- Masalah: Konfigurasi hilang saat service ProxySQL direstart.
- Solusi: Selalu jalankan perintah
SAVE MYSQL ... TO DISKsetelah melakukan modifikasi runtime.
9. Benchmark, Metrik Kinerja & Tuning Performa
Untuk menguji ketahanan kluster, gunakan tool benchmark standar industri seperti sysbench:
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=192.168.1.12 \
--mysql-port=6033 \
--mysql-user=app_user \
--mysql-password=AppUserPassword123! \
--mysql-db=production_db \
--tables=10 \
--table-size=100000 \
prepare
# Jalankan eksekusi benchmark
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=192.168.1.12 \
--mysql-port=6033 \
--mysql-user=app_user \
--mysql-password=AppUserPassword123! \
--mysql-db=production_db \
--tables=10 \
--table-size=100000 \
--threads=64 \
--time=60 \
run
Interpretasi & Tuning Lanjutan
- Pantau metrik QPS (Queries Per Second) melalui ProxySQL Stats Interface (
SELECT * FROM stats_mysql_connection_pool;). - Jika latensi tinggi, sesuaikan ukuran
innodb_buffer_pool_sizedi MySQL (atur hingga 70-80% dari total RAM server database).
10. Checklist Penerapan Produksi & Kesimpulan
- Konfigurasi
server-idunik pada setiap node MySQL. - Aktifkan
binlog_format = ROWdanlog_binpada Master. - Pastikan
read_only = 1aktif pada semua Slave. - ProxySQL terkonfigurasi dengan aturan Read/Write Splitting yang benar.
- Lakukan uji coba failover manual (Kill Master Node) untuk memastikan ProxySQL mengalihkan trafik dengan mulus.
- Monitor Replication Lag secara berkala menggunakan sistem monitoring seperti Prometheus dan Grafana.
Dengan menerapkan arsitektur Master-Slave Replication yang dikombinasikan dengan ProxySQL, infrastruktur database enterprise Anda kini memiliki ketahanan tinggi, skalabilitas baca yang optimal, serta performa puncak yang siap menghadapi lonjakan trafik ekstrem di lingkungan produksi.