L
GraphQL API Development • Literally Web ID

Optimisasi Query Kompleks dan Sharding Strategis pada MySQL Enterprise Skala Petabaya

⏱️ 18 menit baca • 📅 20 Oct 2026 • 👁️ 2 views
Optimisasi Query Kompleks dan Sharding Strategis pada MySQL Enterprise Skala Petabaya

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur sistem enterprise modern, volume data bertumbuh secara eksponensial. Skala petabaya (petabyte-scale) bukan lagi monopoli perusahaan teknologi raksasa seperti Meta atau Google, melainkan tantangan nyata bagi platform e-commerce global, penyedia layanan fintech, dan infrastruktur logistik skala masif. Pada volume ini, basis data relasional tradisional monolitik (seperti MySQL yang berjalan pada satu instans server tunggal) pasti akan mencapai titik jenuh operasional.

Bottleneck performa utama pada basis data relasional skala besar umumnya berakar pada beberapa faktor krusial:

  • Keterbatasan Sumber Daya Fisik (Vertical Scalability Limit): Penambahan RAM, CPU, dan storage NVMe pada satu mesin memiliki batas fisik dan finansial yang curam (the law of diminishing returns).
  • Contentious Locking & Latch Contention: Beban transaksi konkuren tinggi (High Concurrency) menyebabkan perebutan lock pada row dan table level, berujung pada thread blocking dan lonjakan latensi.
  • Inefficient Query Execution & Missing Indexes: Query kompleks yang melibatkan operasi JOIN masif tanpa covering index memaksa database melakukan Full Table Scan, menghabiskan I/O disk dan memori buffer pool.
  • I/O Bottleneck pada Storage Engine: InnoDB buffer pool yang mengalami cache miss memaksa sistem membaca data dari disk, menciptakan I/O wait yang melumpuhkan throughput.

Kondisi Sebelum vs. Sesudah Penerapan

Metrik Performa Sebelum Optimisasi (Monolitik) Sesudah Optimisasi (Sharded + ProxySQL)
Latensi Rata-rata (P99) 1,200 ms - 3,500 ms 15 ms - 45 ms
Throughput (QPS) 2,500 Queries/Sec 85,000+ Queries/Sec
Penggunaan Disk I/O 95% - 100% (I/O Wait Tinggi) 20% - 35% (Optimal Buffer Pool Hit)
Skalabilitas Terbatas pada kapasitas 1 server fisik Skalabel secara horizontal tanpa batas teoritis

[!WARNING] Melakukan sharding tanpa perencanaan strategi shard key yang matang adalah jalan pintas menuju bencana arsitektur. Kesalahan pemilihan shard key akan menyebabkan distributed JOIN yang mahal dan fenomena hotspotting pada satu shard tunggal.


2. Konsep Inti & Deep Dive Arsitektur

Untuk mengelola data skala petabaya, kita harus meninggalkan pendekatan monolitik dan beralih ke arsitektur terdistribusi. Tiga pilar utama dalam arsitektur ini adalah Horizontal Sharding, Advanced Execution Plan Indexing, dan Read/Write Splitting menggunakan ProxySQL.

Alur Eksekusi Arsitektur Terdistribusi

[ Client / Web App ]
         │
         ▼
   [ ProxySQL ] ──(Write / INSERT)──> [ Master Shard A ] ──(Binlog)──> [ Replica Shard A ]
         │
         ├──(Read / SELECT)───> [ Replica Shard A ]
         │
         └──(Read / SELECT)───> [ Replica Shard B ]

Cara Kerja di Balik Layar

  1. Routing Query: Klien mengirimkan query ke ProxySQL. ProxySQL menganalisis pola query, apakah termasuk operasi baca (SELECT) atau tulis (INSERT/UPDATE/DELETE).
  2. Read/Write Splitting: Operasi tulis dilempar langsung ke instance Master, sementara operasi baca didistribusikan secara load balanced ke instance Replica menggunakan algoritma Round Robin atau Weight-based.
  3. Horizontal Sharding: Tabel besar dipecah berdasarkan Shard Key (misalnya tenant_id atau user_id). Algoritma hash-based atau range-based menentukan shard fisik mana yang menyimpan atau harus dicari datanya.

3. Perbandingan Komparatif / Analisis Pendekatan

Berikut adalah analisis mendalam mengenai tiga pendekatan arsitektur database untuk beban kerja skala enterprise:

Dimensi Perbandingan Vertical Scaling (Scale-Up) Distributed SQL (Cloud-Native) MySQL Sharding + ProxySQL
Biaya Infrastruktur Sangat Tinggi (Hardware Enterprise) Tinggi (Managed Service Mahal) Menengah (Commodity Hardware)
Kompleksitas Operasional Rendah Menengah Tinggi
Kontrol & Tuning Terbatas pada OS/MySQL Sangat Terbatas (Black Box) Penuh (Full Control)
Konsistensi Data ACID Kuat (Single Node) ACID Terdistribusi (Paxos/Raft) ACID Lokal per Shard
Resiko Vendor Lock-in Rendah Sangat Tinggi Rendah (Open Source Stack)

[!TIP] Jika tim Anda memiliki kapabilitas DBA internal yang kuat, pendekatan MySQL Sharding manual dipadukan dengan ProxySQL memberikan performa mentah (raw performance) dan efisiensi biaya terbaik dibandingkan menggunakan Distributed SQL engine komersial.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan arsitektur ini, pastikan infrastruktur pendukung telah siap dan terkonfigurasi dengan benar.

Spesifikasi Minimum Environment Produksi (Per Shard Node)

  • OS: Ubuntu Server 22.04 LTS / RHEL 9
  • CPU: 16 vCPU / 32 Threads
  • RAM: 64 GB (Minimum 32 GB dialokasikan untuk innodb_buffer_pool_size)
  • Storage: NVMe SSD dengan RAID 10 (IOPS > 20,000)

Verifikasi Awal Sistem Operasi

Jalankan perintah berikut untuk mengoptimalkan kernel Linux bagi kinerja database berkinerja tinggi:

# Optimisasi sysctl untuk jaringan dan memori
echo 'fs.file-max = 2097152' | sudo tee -a /etc/sysctl.conf
echo 'vm.swappiness = 1' | sudo tee -a /etc/sysctl.conf
echo 'vm.dirty_background_ratio = 5' | sudo tee -a /etc/sysctl.conf
echo 'vm.dirty_ratio = 10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Konfigurasi MySQL Server (my.cnf)

Terapkan konfigurasi optimal pada setiap node MySQL untuk memaksimalkan penggunaan memori dan mengurangi I/O wait.

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp

# Buffer Pool & Memory Tuning
innodb_buffer_pool_size = 48G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 4G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT

# Connections & Threads
max_connections = 2000
thread_cache_size = 128
table_open_cache = 8192
table_definition_cache = 4096

# Binary Logging for Replication
server-id = 101
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
relay-log = mysql-relay-bin
read_only = 0

Langkah 2: Pembuatan Skema Sharding & Tabel Partisi

Kita asumsikan tabel transactions di-shard berdasarkan tenant_id menggunakan teknik modulo pada aplikasi atau sharding middleware.

-- Dibuat pada Shard 0 (tenant_id % 2 = 0)
CREATE DATABASE IF NOT EXISTS enterprise_db;
USE enterprise_db;

CREATE TABLE IF NOT EXISTS transactions (
    transaction_id BIGINT UNSIGNED NOT NULL,
    tenant_id INT UNSIGNED NOT NULL,
    account_id BIGINT UNSIGNED NOT NULL,
    amount DECIMAL(18,4) NOT NULL,
    status ENUM('PENDING', 'COMPLETED', 'FAILED') NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (transaction_id, tenant_id),
    INDEX idx_tenant_account (tenant_id, account_id),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB
PARTITION BY RANGE (tenant_id) (
    PARTITION p_even VALUES LESS THAN MAXVALUE
);

Langkah 3: Konfigurasi ProxySQL untuk Read/Write Splitting

Konfigurasikan ProxySQL untuk memisahkan lalu lintas baca dan tulis secara otomatis.

-- Masuk ke console administrative ProxySQL
mysql -u admin -padmin -h 127.0.0.1 -P 6032

-- Tambahkan MySQL Server Backend
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '192.168.1.10', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '192.168.1.11', 3306);

-- Load servers ke runtime
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

-- Konfigurasi User Akses Database
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('app_user', '*9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B', 10);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

-- Aturan Query Routing (SELECT ke Hostgroup Read / Replica)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT.*', 20, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • innodb_buffer_pool_size = 48G: Mengalokasikan 75% dari total RAM (64GB) khusus untuk InnoDB Buffer Pool. Parameter ini krusial agar indeks dan data yang sering diakses (hot data) dapat ditampung langsung di dalam memori tanpa harus melakukan pembacaan fisik ke disk.
  • innodb_flush_log_at_trx_commit = 2: Mengatur perilaku penulisan log transaksi. Nilai 2 berarti log transaksi ditulis ke file log setiap detik dan di-flush ke disk. Ini memberikan performa tulis yang jauh lebih tinggi dibandingkan nilai 1, dengan risiko kehilangan data transaksi maksimal 1 detik jika terjadi kegagalan daya total pada server.
  • destination_hostgroup = 20 pada ProxySQL: Mengarahkan seluruh query yang diawali dengan pola SELECT ke hostgroup 20 (yang berisi instance Replica), sementara query INSERT/UPDATE/DELETE otomatis dilempar ke default hostgroup 10 (instance Master).

7. Skenario Produksi & Studi Kasus Dunia Nyata

Sebuah perusahaan payment gateway global dengan 50 juta transaksi harian mengalami lonjakan latensi drastis saat Flash Sale akhir tahun. Arsitektur awal menggunakan satu database master dengan 4 read replica mengalami replication lag hingga 45 detik karena antrean Binary Log menumpuk akibat tingginya operasi INSERT.

Solusi yang Diterapkan:

  1. Implementasi Sharding Berbasis Hash Tenant: Membagi database menjadi 16 shard terpisah berdasarkan modulo dari tenant_id.
  2. Pemisahan Beban Write: Beban INSERT yang tadinya terkonsentrasi pada 1 master kini terdistribusi merata di 16 master shard independen.
  3. Optimisasi Index & Query: Menghapus indeks yang tidak terpakai dan membuat Composite Covering Index (tenant_id, status, created_at) untuk query laporan transaksi.

Hasil Akhir: Latensi rata-rata turun dari 2.1 detik menjadi 12 milidetik, dan replication lag terpangkas menjadi 0 detik secara konsisten.


8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Melakukan Distributed JOIN Antar Shard Berbeda.
    • Dampak: Menghancurkan performa karena aplikasi harus melakukan scatter-gather query dan menggabungkan data di level memori aplikasi.
    • Solusi: Denormalisasi data atau pastikan seluruh data relasional yang sering di-JOIN berada dalam satu shard yang sama menggunakan strategi Colocation Sharding Key.
  • Anti-Pattern 2: Menggunakan Auto-Increment ID Monolitik pada Lingkungan Sharded.
    • Dampak: Menyebabkan tabrakan ID (primary key collision) antar shard yang berbeda.
    • Solusi: Gunakan Distributed ID Generator berbasis Snowflake ID atau UUID v7.
  • Anti-Pattern 3: Mengabaikan Maintenance Statistik Tabel (ANALYZE TABLE).
    • Dampak: Optimizer MySQL membuat rencana eksekusi yang salah karena statistik indeks sudah kedaluwarsa.
    • Solusi: Jadwalkan eksekusi ANALYZE TABLE secara berkala pada jam sepi trafik menggunakan cron job.

9. Benchmark, Metrik Kinerja & Tuning Performa

Pengujian performa dilakukan menggunakan tool sysbench untuk mensimulasikan beban transaksi konkuren tinggi pada arsitektur yang telah di-deploy.

Perintah Benchmark Sysbench

# Inisialisasi data test sebanyak 10 juta baris
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 \
  --mysql-port=6033 \
  --mysql-user=app_user \
  --mysql-password=secure_password \
  --mysql-db=enterprise_db \
  --table-size=10000000 \
  prepare

# Jalankan eksekusi benchmark selama 300 detik dengan 64 thread
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 \
  --mysql-port=6033 \
  --mysql-user=app_user \
  --mysql-password=secure_password \
  --mysql-db=enterprise_db \
  --table-size=10000000 \
  --threads=64 \
  --time=300 \
  run

Interpretasi Hasil Metrik

  • Transactions Per Second (TPS): Target enterprise minimum adalah > 15,000 TPS dengan ProxySQL routing.
  • Latency Response Time (P95 / P99): Pastikan P99 berada di bawah 50ms di bawah beban puncak.
  • Innodb Buffer Pool Hit Rate: Harus di atas 99.5%. Jika di bawah angka tersebut, tambahkan kapasitas RAM atau optimalkan ukuran buffer pool.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur sharding dan optimisasi query ini ke lingkungan produksi live, pastikan seluruh item dalam checklist berikut terpenuhi:

  • Konfigurasi kernel sysctl dan limit file descriptor sistem operasi telah dioptimalkan.
  • Seluruh tabel memiliki Primary Key yang optimal dan menghindari penggunaan kolom monotonik tanpa strategi shard.
  • ProxySQL telah dikonfigurasi dengan connection pooling dan aturan query routing yang teruji.
  • Mekanisme backup otomatis (seperti Percona XtraBackup) telah diuji coba untuk proses point-in-time recovery (PITR) pada setiap shard.
  • Sistem monitoring (Prometheus + Grafana) aktif memantau metrik Buffer Pool Hit Rate, Thread Concurrency, dan Replication Lag.

Dengan penerapan strategi sharding horizontal yang presisi, indexing berbasis execution plan, serta pemisahan read/write menggunakan ProxySQL, infrastruktur database enterprise Anda siap menghadapi pertumbuhan data skala petabaya tanpa kompromi terhadap performa dan stabilitas.

🏷️ Tags: #Mysql #Performance Tuning #Proxysql #Database Architecture #Sharding