Episode ini mengupas bagaimana VTGate merencanakan dan merutekan query ke VTTablet yang tepat, perilaku query lintas shard dengan scatter-gather, dukungan SQL dan batasannya, serta mode kegagalan yang perlu kalian kenali.

Episode 4 mengatur data ke dalam shard. Sekarang kita bedah mesin yang membuat penyebaran itu transparan bagi aplikasi: VTGate. VTGate adalah orkestrator semua query — ia memutuskan ke shard mana sebuah query pergi, bagaimana hasil digabungkan jika harus menyentuh banyak shard, dan bagaimana query dipotong-potong agar MySQL tiap shard hanya menerima pekerjaan yang relevan.
Roadmap episode 5: peran VTGate dalam routing, fast path satu shard, query lintas shard dan scatter-gather, query planning dan dukungan SQL, lalu mode kegagalan yang perlu diwaspadai. Ini episode yang paling sering dipakai saat debugging query di produksi.
VTGate adalah proxy MySQL stateless yang menghadap aplikasi. Tiga tugas intinya: parsing (memahami SQL), planning (membuat rencana eksekusi lintas shard), dan execution (mengirim ke shard dan menggabungkan hasil). Karena stateless, VTGate mudah di-scale — tambah Pod VTGate, tambah kapasitas.
Aplikasi melihat satu "MySQL raksasa". VTGate yang memikul kerumitan di belakang layar, termasuk memilih shard yang tepat lewat kombinasi VSchema dan Topology Service.
Query yang memfilter kolom sharding key adalah fast path — VTGate menghitung shard dari nilai vindex dan mengirim query ke satu shard saja:
SELECT name FROM users WHERE user_id = 42Karena user_id adalah kolom sharding key dengan vindex hash, VTGate tahu persis shard mana yang menyimpan user_id = 42. Satu round-trip, tanpa penggabungan. Inilah alasan desain skema menekankan sharding key yang sering dipakai query.
Query tanpa kolom sharding key harus menyentuh semua shard — ini disebut scatter atau scatter-gather. Contohnya:
SELECT COUNT(*) FROM users WHERE name = 'Arman'VTGate mengirim query ke setiap shard, menerima hasil parsial, lalu menggabungkan hasilnya. Untuk COUNT(*) hasilnya dijumlahkan; untuk ORDER BY dan LIMIT VTGate melakukan sortir dan pemotongan global. Ini bekerja, tapi biayanya naik seiring jumlah shard.
Penting untuk dipahami: JOIN lintas shard didukung, dengan syarat. Join antar tabel yang co-located (sharding key sama) bisa diselesaikan di satu shard. Join yang melintasi shard berbeda akan memaksa VTGate melakukan gather dan join di memory — bekerja tapi mahal.
vtctlclient VtGateExecute -json "SELECT COUNT(*) FROM users" commercePerintah vtctlclient VtGateExecute mengeksekusi query melalui VTGate dari sisi admin — berguna untuk mengetes bagaimana VTGate menangani query tanpa aplikasi.
VTGate menulis ulang dan memecah query sebelum dikirim ke shard. Teknik utamanya adalah query splitting: query global dipecah menjadi query per-shard yang hanya membawa data yang relevan. Contoh query WHERE user_id IN (1, 2, 3) dipecah per shard berdasarkan lokasi masing-masing nilai.
Dukungan SQL di VTGate luas, tapi tidak total. Hal-hal yang perlu kalian ketahui:
SELECT, INSERT, UPDATE, DELETE, agregasi, JOIN co-located, transaksi single-shard.JOIN lintas shard (bisa tapi mahal), GROUP BY lintas shard (didukung untuk agregasi tertentu), subquery dalam bentuk tertentu.UPDATE massal tanpa filter sharding key) — Vitess akan menolak dengan tegas untuk mencegah update tidak sengaja yang melampaui batas.Saat query ditolak, pesan errornya biasanya jelas. Ini fitur keamanan, bukan bug: Vitess lebih baik menolak query berbahaya daripada menjalankannya secara salah.
Warning
UPDATE atau DELETE tanpa filter pada kolom sharding key biasanya ditolak Vitess. Ini disengaja: query seperti itu tidak tahu harus dijalankan di shard mana, dan menjalankannya di semua shard adalah risiko besar.
Beberapa kegagalan yang paling sering dijumpai di VTGate:
Untuk memeriksa status shard dan kesehatan query, vtctlclient adalah teman terbaik:
vtctlclient ListShardHealth
vtctlclient GetTablet -tablet <alias>Salah satu teknik yang paling sering dipakai VTGate adalah query splitting. Ambil contoh query dengan nilai berulang:
SELECT * FROM users WHERE user_id IN (5, 1000, 2500000)Jika ketiga nilai itu berada di shard yang berbeda, VTGate memecah query menjadi tiga query per-shard, masing-masing hanya memuat nilai yang relevan, lalu menggabungkan hasilnya. Setiap shard hanya mengerjakan porsinya sendiri — tidak ada shard yang menanggung query penuh.
Pola ini juga berlaku untuk UPDATE dan DELETE dengan IN — asalkan kolomnya adalah sharding key. Itu sebabnya filter WHERE user_id IN (...): justru disarankan, bukan dihindari. VTGate menangani pemecahan dan penggabungan otomatis.
Untuk query yang tidak menyebut keyspace, VTGate memakai keyspace yang dipilih lewat USE atau default. Pemetaan keyspace dan tabel bisa dilihat langsung:
vtctlclient GetVschema commercevtctlclient GetVschema menampilkan VSchema aktif — peta tabel, vindex, dan status sharding. Saat debugging routing query, ini tempat pertama untuk memverifikasi bahwa konfigurasi sesuai harapan.
Pada episode 5 ini kalian sudah memahami bagaimana VTGate merutekan query: fast path satu shard untuk query dengan kolom sharding key, scatter-gather untuk query lintas shard, query planning dengan splitting, serta batas dukungan SQL dan mode kegagalan yang umum.
Inti yang harus dibawa pulang:
UPDATE/DELETE tanpa filter sharding key demi keamanan.Di episode 6 berikutnya kita jaga ketersediaan: replikasi dan failover — topologi primary dan replica, failover otomatis dengan vtctld dan pseudo-GTID, serta strategi backup dan recovery. Sampai jumpa!