Merencanakan kapasitas sebelum server sesak: mengukur baseline pertumbuhan data dan beban, memilih scale-up vertikal versus scale-out horizontal, menerapkan read replicas untuk beban baca, memahami sharding beserta trade-off-nya, dan menyusun rencana kapasitas yang berdasarkan data nyata bukan tebakan

Setelah mengamankan database di episode 9, kita menatap masa depan: kapasitas. Server yang sesak diam-diam adalah penyebab terbesar downtime mendadak. Capacity planning adalah seni membaca data pertumbuhan dan menyiapkan jalan sebelum macet — bukan menunggu macet, lalu buru-buru menambah instance.
Kesalahan paling mahal seorang DBA: menambah resource berdasarkan panik, bukan data. Episode ini mengajarkan kalian mengukur, memilih strategi, dan mendokumentasikan rencana — sehingga kapan pun ditanya "kapan kita perlu naik kapasitas?", kalian punya jawaban angka, bukan perasaan.
Semua perencanaan dimulai dari pengukuran. Kumpulkan dari dashboard episode 7:
| Metrik | Pertanyaan yang dijawab |
|---|---|
| Ukuran DB & tabel teratas | Berapa cepat data tumbuh per bulan? |
| TPS & queries/detik | Seberapa tinggi beban puncak? |
| CPU, RAM, I/O utilization | Komponen mana yang sudah jenuh? |
| Koneksi puncak | Apakah mendekati max_connections? |
| Latensi p95 | Seberapa buruk sebelum crash? |
Contoh perhitungan sederhana: tabel orders tumbuh 8 GB/bulan dan disk sisa 120 GB → sekitar 15 bulan sebelum penuh. Dengan ambang aman 80%, kalian punya waktu ~10 bulan untuk bertindak. Itulah bahasa bisnis yang membuat CFO mau mendengarkan: "kita butuh upgrade sekitar Q3, berdasarkan tren 10 bulan ini."
Dua arah utama scaling:
| Scale-up (vertikal) | Scale-out (horizontal) | |
|---|---|---|
| Cara | Mesin lebih besar (RAM/CPU/disk) | Banyak mesin bekerja bersama |
| Beban | Menaikkan seluruh beban | Memisah baca/tulis atau memecah data |
| Implementasi | Ubah instance, restart | Replicas, sharding, partitioning |
| Batas | Ada: mesin terbesar di pasaran | Lebih elastis, tapi kompleks |
| Biaya | Sederhana, linear | Infra tambahan + complexity |
Aturan praktis DBA: scale-up untuk langkah cepat, scale-out untuk janji jangka panjang. Naikkan instance dulu (mudah, satu restart), sambil menyiapkan replikasi/sharding untuk beban yang terus naik. Jangan langsung sharding sebelum benar-benar perlu — ia mahal dalam kompleksitas operasional.
Kebanyakan aplikasi adalah 80-90% baca. Solusi paling murah: pindahkan baca ke read replicas — infrastruktur yang sudah kita bangun di episode 8. Pola implementasi:
# contoh di aplikasi (pseudo): dua endpoint connection string
DB_PRIMARY=10.0.0.11:5432
DB_REPLICA=10.0.0.12:5432 # read-onlyBahaya yang harus dikelola: stale reads — data di replica bisa tertinggal beberapa detik (replikasi async). Query yang menulis lalu langsung membaca datanya sendiri harus tetap ke primary, atau hasilnya tidak konsisten.
Ketika satu database terlalu besar walau sudah di-scale-up dan dibantu replica, tiba saatnya sharding: memecah data ke beberapa node berdasarkan kunci (shard key). Contoh nyata: orders di-shard per user_id ke 4 node.
node-1: user_id % 4 == 0 node-2: user_id % 4 == 1
node-3: user_id % 4 == 2 node-4: user_id % 4 == 3Trade-off yang wajib dipahami sebelum sharding:
user_id bagus, status (hanya 3 nilai) bencana.Di PostgreSQL, sharding bisa dilakukan dengan extension citus; MongoDB punya sharding native (episode 13); dan skala raksasa memakai solusi distributed seperti CockroachDB (episode 22). Prinsip kunci: sharding adalah pilihan terakhir, bukan langkah pertama.
Warning
Sharding mengubah arsitektur data secara permanen dan hampir mustahil di-rollback tanpa migrasi besar. Sebelum memutuskan, jawab tiga pertanyaan: apakah scale-up sudah benar-benar mentok? apakah read replicas sudah dimaksimalkan? apakah beban tulis (bukan baca) yang menjadi botolnya? Jika tiga jawabannya belum tegas, sharding terlalu dini.
Jangan tertukar: partitioning memecah tabel dalam satu database (bukan antar server). Tabel orders di-partition per bulan tetap berada di satu instance, tapi query yang menyentuh bulan tertentu hanya memindai partition itu:
CREATE TABLE orders (
id BIGINT, created_at TIMESTAMPTZ, total_cents BIGINT
) PARTITION BY RANGE (created_at);
CREATE TABLE orders_2026_07 PARTITION OF orders
FOR VALUES FROM ('2026-07-01') TO ('2026-08-01');
CREATE TABLE orders_2026_08 PARTITION OF orders
FOR VALUES FROM ('2026-08-01') TO ('2026-09-01');Manfaat: hapus data lama cukup dengan DROP TABLE orders_2026_01 (jauh lebih cepat dari DELETE), vacuum per partition, dan maintenance independen. Kita perdalam di episode 21 bersama materialized views.
Rencana kapasitas yang baik adalah dokumen hidup:
Tambahkan jadwal review bulanan untuk membandingkan proyeksi vs kenyataan. Capacity planning bukan dokumen sekali jadi — ia dipelihara seperti database itu sendiri.
Inti yang harus dibawa pulang:
Di episode 11 selanjutnya kita melakukan perjalanan berbahaya yang paling sering membuat DBA tegang: migration & upgrade — upgrade major version PostgreSQL, migrasi antar engine database, strategi zero-downtime migration, dan validasi data pasca-migrasi. Sampai jumpa di episode 11!