Belajar Vitess - Performance Optimization
Episode 15 of 23

Belajar Vitess - Performance Optimization

Episode ini membahas optimasi performa end-to-end: tuning query dengan indexing dan vindexes, VTGate connection pooling, resource tuning VTTablet, serta pengaturan buffer, innodb, dan storage MySQL.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Setelah cluster berjalan aman dan tersebar di beberapa region, pertanyaannya bergeser: seberapa cepat bisa? Episode 15 membahas optimasi performa Vitess dari tiga lapisan: query dan skema, layer VTGate dan VTTablet, lalu MySQL dan storage. Performa adalah kombinasi ketiganya — mengoptimasi satu lapisan saja hasilnya terbatas.

Roadmap episode 15: tuning query dengan indexing dan vindexes, VTGate connection pooling, resource tuning VTTablet, lalu pengaturan innodb dan storage MySQL.

Tuning Query: Indexing dan Vindexes

Optimasi query dimulai dari dua hal: indeks MySQL untuk mempercepat eksekusi di dalam shard, dan vindex untuk mempercepat routing antar shard. Keduanya berbeda dan saling melengkapi.

Indeks MySQL standar tetap relevan: kolom yang sering dipakai dalam WHERE dan JOIN di dalam satu shard butuh indeks biasa. Tapi di Vitess ada satu aturan tambahan: query sebaiknya selalu menyertakan kolom sharding key agar tidak scatter. Ini optimasi paling berdampak yang tidak ada di MySQL vanilla.

Explain query untuk melihat rencana
EXPLAIN SELECT name FROM users WHERE user_id = 42

EXPLAIN menampilkan rencana eksekusi — di VTGate, pastikan query hanya menyentuh satu shard. Gunakan perintah EXPLAIN VITESS untuk melihat rencana VTGate:

Rencana eksekusi di level vitess
EXPLAIN VITESS SELECT name FROM users WHERE user_id = 42

Outputnya menunjukkan apakah query dirutekan ke satu shard (fast path) atau ke semua shard (scatter). Target kalian: query hot path selalu fast path.

Info

Urutan prioritas optimasi query di Vitess: pertama pastikan tidak scatter (vindex), kedua pastikan memakai indeks yang tepat (MySQL index), ketiga baru tuning parameter eksekusi. Langkah pertama memberi dampak terbesar.

VTGate Connection Pooling

Setiap koneksi aplikasi ke VTGate memakan resource. VTGate memakai connection pooling: sekumpulan koneksi ke VTTablet yang dipakai ulang untuk banyak query, mengurangi overhead pembuatan koneksi MySQL. Konfigurasi yang perlu disetel:

  • Ukuran pool per target (PoolSize, StreamPoolSize) — seberapa banyak koneksi ke VTTablet.
  • QueryTimeout — batas waktu query.
  • MaxPayloadSize — ukuran maksimum payload query.
Setel pooling vtgate
vtgate:
  extraFlags:
    mysql_server_pool_size: 128
    query_timeout: 30s
    max_payload_size: 16777216

mysql_server_pool_size: 128 memberi VTGate 128 koneksi pooled per target. Aturan praktis: terlalu kecil membuat antrian, terlalu besar membuat VTTablet kewalahan. Ukur dengan metrik dari episode 7 lalu setel berdasarkan beban nyata.

Resource Tuning VTTablet

VTTablet punya dua sisi resource: menjalankan query MySQL dan menjalankan background work (replikasi, backup, VReplication). Tuning yang penting:

  • PoolSize VTTablet — jumlah query bersamaan yang bisa dijalankan ke MySQL.
  • TransactionPoolSize — jumlah transaksi bersamaan.
  • Resource limits — pastikan container punya cukup CPU dan memory, dan MySQL punya buffer yang proporsional.
Resource tuning vttablet
vttablet:
  resources:
    requests:
      cpu: "2"
      memory: 4Gi
    limits:
      cpu: "4"
      memory: 8Gi

resources.requests dan limits di atas menentukan berapa banyak resource yang dijamin dan dibatasi untuk setiap tablet. Jangan beri memory limit terlalu kecil untuk MySQL — tabel besar dan buffer pool butuh ruang.

Perhatikan juga tabel _vt di dalam MySQL tablet: tabel ini menyimpan state Vitess seperti posisi replikasi. Pantau pertumbuhannya karena VReplication bisa membuat tabel vreplication yang membutuhkan maintenance rutin.

MySQL Buffer, InnoDB, dan Storage

Di lapisan paling bawah, MySQL perlu disetel sesuai peran. Pengaturan yang paling berdampak:

  • innodb_buffer_pool_size — cache data dan indeks di memory. Aturan umum: 70-80% memory yang dialokasikan ke MySQL.
  • innodb_flush_log_at_trx_commit — keseimbangan antara durability dan kecepatan tulis.
  • max_connections — batas koneksi; terlalu rendah membuat query gagal.
  • Storage — gunakan SSD/NVMe; MySQL di disk HDD untuk workload OLTP adalah resep latensi tinggi.
Pengaturan innodb penting
innodb_buffer_pool_size = 6G
innodb_flush_log_at_trx_commit = 1
innodb_log_file_size = 1G
max_connections = 1000

Baris innodb_buffer_pool_size = 6G memberi MySQL buffer pool 6GB untuk cache. Konfigurasi MySQL di Vitess diletakkan lewat custom my.cnf yang di-mount ke tablet.

Warning

Setiap pengaturan MySQL punya trade-off. innodb_flush_log_at_trx_commit = 1 memberi durability maksimal dengan biaya latensi tulis. Nilai lain mempercepat tulis tapi bisa kehilangan data saat crash. Pilih sesuai kebutuhan bisnis, bukan asal cepat.

Untuk mengukur dampak optimasi, bandingkan metrik sebelum dan sesudah:

Metrik performa dari tablet
curl -s http://localhost:15100/metrics | grep vttablet_query

curl -s http://localhost:15100/metrics di port tablet menampilkan metrik query — baseline yang harus kalian pantau setiap kali mengubah konfigurasi.

Penutup

Pada episode 15 ini kalian sudah memahami optimasi performa Vitess end-to-end: memastikan query tidak scatter dengan vindex lalu memakai indeks yang tepat, mengatur VTGate connection pooling, tuning resource VTTablet, dan menyetel MySQL innodb serta storage.

Inti yang harus dibawa pulang:

  • Optimasi terbesar adalah memastikan query hot path tidak scatter.
  • Gunakan EXPLAIN VITESS untuk melihat rencana routing query.
  • Connection pooling VTGate butuh ukuran yang disetel dari beban nyata, bukan asal besar.
  • VTTablet butuh resource yang cukup untuk query dan background work.
  • innodb_buffer_pool_size adalah pengaturan MySQL yang paling berdampak.
  • Setiap perubahan performa harus diukur dengan metrik sebelum dan sesudah.

Di episode 16 berikutnya kita skala: resharding dan scaling workflows — online resharding dengan VReplication, perbedaan splitting dan moving shards, scaling replica, serta vertical vs horizontal scaling. Sampai jumpa!

Belajar Vitess - Performance Optimization | Belajar Vitess