Menjaga kesehatan MongoDB: memeriksa kondisi dengan db.serverStatus, db.currentOp, mongostat, dan mongotop, memantau via Prometheus dan Grafana, melakukan maintenance seperti compact dan reIndex, serta menangani masalah umum seperti slow queries, memory pressure, dan replication lag.

Database yang sehat tidak terlihat — sampai tiba-tiba aplikasi melambat, memory melonjak, dan semua orang panik. Perbedaan antara tim yang panik dan tim yang tenang bukanlah keberuntungan, melainkan visibility: mereka tahu apa yang diukur, alat apa yang dipakai, dan prosedur apa yang dijalankan saat angka menyimpang.
Episode 19 melengkapi kalian dengan kacamata observasi. Roadmap-nya: pertama alat pemantauan kesehatan — db.serverStatus, db.currentOp, mongostat, mongotop, kedua pipeline Prometheus + Grafana, ketiga operasional maintenance — compact, reIndex, log rotation, tuning WiredTiger, dan keempat troubleshooting masalah umum. Mari mulai.
db.serverStatus() adalah jendela tunggal kondisi server — metrik uptime, koneksi, operasi, memory, dan storage engine dalam satu panggilan:
db.serverStatus()Metrik yang paling sering diamati:
connections — jumlah koneksi aktif; mendekati limit menandakan connection pool exhaustion.mem.resident dan mem.virtual — penggunaan memory proses.opcounters — jumlah insert, query, update, delete yang dilayani; berguna untuk tren beban.uptime — berapa lama server berjalan sejak terakhir restart.Saat server terasa lambat, pertanyaan pertama adalah "operasi apa yang sedang berjalan?". Jawabannya ada di db.currentOp():
db.currentOp()Hasilnya menampilkan operasi aktif, berapa lama sudah berjalan (secs_running), query apa yang dieksekusi, dan rencana eksekusinya. Ini alat utama menemukan query "bandel" yang menyandera resource. Untuk menghentikan operasi yang benar-benar macet:
db.killOp(12345)db.killOp menerima opid yang kalian lihat di output db.currentOp(). Gunakan dengan hati-hati — menghentikan operasi di tengah transaksi bisa memicu rollback.
Untuk observasi berkelanjutan, dua utilitas bawaan ini tak ternilai:
mongostat --uri "mongodb://localhost:27017" --discover --rowcount 20mongostat menampilkan metrik per detik: operasi tulis/baca, jumlah koneksi, dan penggunaan memory. Berjalan otomatis dan bisa dipakai untuk melihat lonjakan beban secara real-time.
mongotop --uri "mongodb://localhost:27017"mongotop menunjukkan berapa lama waktu yang dihabiskan server pada tiap collection — membantu mengidentifikasi collection mana yang paling sibuk dan membutuhkan perhatian index.
Untuk observasi level produksi yang disimpan dan di-alert, gunakan percona/mongodb_exporter bersama Prometheus dan Grafana:
services:
mongo-exporter:
image: percona/mongodb_exporter:0.40.0
command:
- --mongodb.uri=mongodb://monitor:pass@mongo:27017
- --collector.diagnosticdata
- --collector.replicasetstatus
ports:
- "9216:9216"Exporter mengekspos metrik MongoDB dalam format Prometheus di port 9216. Prometheus menariknya secara berkala, dan Grafana menampilkan dashboard visual dengan alert. Metrik yang biasa dimonitor: operasi per detik, queue, replication lag, memory cache WiredTiger, dan koneksi. Pola ini adalah fondasi observability MongoDB di produksi modern.
Seiring waktu, storage WiredTiger bisa memiliki fragmentasi — ruang kosong antar dokumen yang tidak terpakai. Compact menata ulang data untuk mengembalikan ruang:
db.runCommand({ compact: "orders" })Compact memakan resource dan memblokir operasi pada collection tersebut — lakukan saat beban rendah (maintenance window). Untuk perbaikan yang lebih agresif, db.repairDatabase() memperbaiki dan mengkompresi seluruh database, tapi ini operasi berat yang menghentikan layanan — jarang dipakai, dan lebih baik memakai restore dari backup.
Jika index korup atau berubah versi, rebuild index mengembalikan integritasnya:
db.orders.reIndex()reIndex() menghapus dan membuat ulang semua index collection — berguna setelah restore atau saat index dicurigai korup, tapi lakukan di maintenance window karena memakan resource.
Untuk log rotation, MongoDB menyediakan perintah yang memutar log aktif tanpa restart:
db.adminCommand({ logRotate: 1 })Pola ini dijadwalkan dengan cron untuk mencegah log membesar tanpa kendali, lalu log lama diarsipkan atau dihapus sesuai retensi.
WiredTiger menyimpan "working set" data di cache memory. Ukuran default cache sekitar 50% dari RAM dikurangi 1GB. Tuning bisa dilakukan lewat konfigurasi:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4Cache terlalu kecil menyebabkan banyak pembacaan dari disk (IO tinggi); cache terlalu besar bisa mendesak proses lain di host. Tuning membutuhkan observasi metrik cache pressure — bagian dari seni administrasi MongoDB.
Gejala: CPU melonjak, aplikasi lambat. Penyebab paling umum: missing index yang memaksa COLLSCAN pada collection besar. Diagnosa dengan profiler (episode 13), lalu buat index yang sesuai dengan aturan ESR (episode 12). Solusi kedua: menulis ulang query yang tidak selektif.
Gejala: memory terisi hampir penuh, swap aktif. WiredTiger memang dirancang memakai sebanyak mungkin cache — bukan langsung masalah. Ukur cache pressure (persentase cache yang dipakai untuk page baru) dan evictions per detik. Jika page terus ter-evict sebelum sempat dipakai, working set melebihi cache — saatnya menambah RAM atau memangkas data yang jarang diakses.
Gejala: secondary tertinggal jauh dari primary; data yang dibaca dari secondary usang. Penyebab umum: oplog terlalu kecil sehingga secondary kehilangan jejak, atau write di primary lebih cepat dari kemampuan secondary mereplikasi. Periksa rs.status().members[].optime untuk melihat seberapa besar lag. Solusi: perbesar ukuran oplog, tinjau workload write, atau evaluasi bandwidth jaringan antar node.
Gejala: aplikasi error "Too many connections" atau "connection pool exhausted". Setiap koneksi mongod butuh memory; ribuan koneksi idle memakan resource. Solusi: sesuaikan ukuran connection pool di driver, batasi koneksi maksimal server, dan singkirkan koneksi idle yang tidak perlu.
Warning
Sebelum memulai maintenance apa pun (compact, reIndex, repair), pastikan backup terbaru tersedia. Beberapa operasi maintenance bersifat berat dan bisa gagal di tengah jalan. Dalam kondisi serius, pilihan paling aman sering bukan memperbaiki — melainkan mengganti node dengan restore dari backup dan shard yang sehat.
Info
Kembangkan kebiasaan "baseline": catat metrik normal saat sistem sehat (ops per detik, memory, latency query). Tanpa baseline, kalian tidak bisa tahu apakah angka saat ini normal atau tidak. Dashboard Grafana dengan rentang waktu panjang membantu mengenali pola musiman dan lonjakan yang wajar versus yang mengkhawatirkan.
Pada episode 19 ini kalian telah membekali diri dengan visibilitas: memeriksa kesehatan dengan db.serverStatus, db.currentOp, mongostat, dan mongotop; membangun observability level produksi dengan percona/mongodb_exporter, Prometheus, dan Grafana; melakukan maintenance seperti compact, reIndex, log rotation, dan tuning cache WiredTiger; serta menangani empat masalah paling umum — slow queries karena missing index, memory pressure, replication lag, dan connection pool exhaustion.
Inti yang harus dibawa pulang:
db.serverStatus dan db.currentOp adalah alat diagnosis pertama saat masalah.Di episode 20 berikutnya kita merangkai semua yang dipelajari menjadi satu kesatuan: Studi Kasus Production-Grade E-Commerce Document Database. Kalian akan merancang schema users, product catalog, orders, dan analytics; membangun deployment dengan replica set, TLS, backup otomatis, dan monitoring; serta meninjau checklist kesiapan produksi sebagai penutup seri. Sampai jumpa di episode 20 — episode penutup!