MongoDB 8.0 menghadirkan peningkatan performa signifikan dan kemampuan baru di berbagai aspek, termasuk manajemen memori, replikasi, sharding, agregasi, dan keamanan. Topik ini merangkum perubahan utama untuk membantu Anda mengevaluasi upgrade dan memahami dampaknya terhadap aplikasi Anda.
Untuk changelog lengkap dari upstream, lihat catatan rilis MongoDB 8.0.
Advanced TCMalloc
MongoDB 8.0 mengganti alokator memori sebelumnya dengan Advanced TCMalloc yang mengurangi fragmentasi memori dan mempertahankan performa di bawah beban berat. Dua perubahan utama mendorong peningkatan ini:
Per-CPU caching: Advanced TCMalloc menggunakan cache per inti CPU alih-alih per thread, sehingga mengurangi fragmentasi memori dan memungkinkan database menangani workload konkuren yang lebih tinggi.
Background memory release: Sebuah thread latar belakang mencoba melepaskan memori yang tidak digunakan kembali ke sistem operasi setiap detik.
Parameter tcmallocReleaseRate mengontrol laju pelepasan dalam byte/detik. Sebelum MongoDB 8.0, parameter ini menerima rentang nilai samar 1–10. Di ApsaraDB for MongoDB, nilai default-nya adalah 10485760 (10 MB). Bahkan ketika diatur ke 0, alokator tetap melepaskan sebagian memori. Sesuaikan nilai ini berdasarkan kebutuhan workload Anda.
Performa replikasi
Perubahan perilaku write concern "Majority"
Mulai MongoDB 8.0, ketika writeConcern diatur ke majority, MongoDB mengakui penulisan setelah entri oplog ditulis ke mayoritas anggota replica set — tanpa menunggu anggota tersebut menerapkan perubahan tersebut. Hal ini meningkatkan throughput penulisan dalam mode majority.
Dampak potensial: Jika aplikasi Anda membaca dari node secondary segera setelah menerima acknowledgment penulisan majority, kueri tersebut mungkin mengembalikan hasil yang tidak mencakup perubahan dari penulisan tersebut.
Penulisan dan penerapan oplog secara paralel
Node secondary kini menulis dan menerapkan batch oplog secara paralel:
Sebuah Writer thread membaca entri oplog baru dari node primary dan menuliskannya ke oplog lokal.
Sebuah Applier thread menerapkan perubahan tersebut ke database lokal secara asinkron.
Hal ini meningkatkan throughput replikasi pada node secondary. Metrik serverStatus terkait kini dilaporkan sebagai metrics.repl.buffer.write dan metrics.repl.buffer.apply.
Performa resharding
reshardCollection jauh lebih cepat di MongoDB 8.0. Opsi baru forceRedistribution memungkinkan Anda melakukan resharding koleksi menggunakan kunci shard yang sudah ada dan mendistribusikan ulang data ke shard baru. Proses ini lebih cepat dibandingkan migrasi chunk ke rentang tertentu. Gabungkan forceRedistribution dengan opsi zones untuk memigrasikan data ke zona tertentu.
db.adminCommand({
reshardCollection: "db.coll",
key: { shard_key: "hashed" },
forceRedistribution: true
})Pembuatan indeks selama resharding dapat menyebabkan pembuatan indeks gagal diam-diam, tanpa pesan error eksplisit. Selesaikan semua pembuatan indeks sebelum memulai resharding, atau hindari membuat indeks saat resharding sedang berlangsung.
Selama tahap catch-up oplog inkremental, shard sumber hanya memblokir penulisan ke koleksi ketika perkiraan waktu tersisa berada dalam rentang dua detik, lalu menunggu shard tujuan menyelesaikan catch-up. Jika kasus penggunaan Anda dapat mentoleransi jendela pemblokiran yang lebih lama — misalnya, selama jendela pemeliharaan — jalankan perintah commitReshardCollection untuk segera memblokir penulisan dan mempercepat penyelesaian resharding.
Untuk informasi lebih lanjut, lihat Proses resharding dan Shard a collection.
Sharding
Selain peningkatan resharding di atas, MongoDB 8.0 mencakup perubahan sharding berikut:
Default hashed sharding: Hashed sharding membuat 1 chunk per shard secara default (turun dari 2 chunk sebelum MongoDB 8.0).
`dbHash` pada shard: Perintah
dbHashkini dapat dijalankan pada shard individual.Kunci shard parsial dalam kueri:
findAndModifydandeleteOnemenerima kunci shard parsial sebagai predikat kueri.`updateOne` dengan upsert: Saat menggunakan
updateOnedenganupsert: truepada koleksi sharded, semua bidang kunci shard dapat dihilangkan dari predikat kueri.`unshardCollection`: Menghapus sharding dari koleksi yang sudah ada dan memindahkan semua dokumen ke shard tertentu, atau ke shard dengan data paling sedikit.
`moveCollection`: Memindahkan koleksi yang tidak di-shard ke shard tertentu, terlepas dari shard utama. Koleksi time series dan koleksi Queryable Encryption tidak dapat dipindahkan. Operasi penulisan diblokir selama sekitar 2 detik selama proses pemindahan.
Perintah dan fungsi pembantu mongosh berikut kini tersedia:
| Command | mongosh helper | Description |
|---|---|---|
moveCollection | sh.moveCollection() | Memindahkan koleksi yang tidak di-shard ke shard tertentu. |
unshardCollection | sh.unshardCollection() | Menghapus sharding dari koleksi dan memindahkan semua data ke shard tertentu. |
abortMoveCollection | sh.abortMoveCollection() | Membatalkan operasi moveCollection yang sedang berlangsung. |
abortUnshardCollection | sh.abortUnshardCollection() | Membatalkan operasi unshardCollection yang sedang berlangsung. |
| None | sh.shardAndDistributeCollection() | Melakukan sharding pada koleksi dan segera mendistribusikan ulang data dengan kunci shard yang sudah ada. Setara dengan menjalankan shardCollection diikuti oleh reshardCollection. |
Pencatatan log
Bidang workingMillis ditambahkan ke log kueri lambat. Bidang ini menunjukkan waktu yang sebenarnya dihabiskan MongoDB untuk memproses operasi, yang berguna untuk mengidentifikasi hambatan performa sebenarnya.
Berbeda dengan durationMillis — yang mencerminkan latensi operasi total termasuk waktu tunggu lock atau throttling traffic — workingMillis tidak mencakup waktu tunggu eksternal tersebut. Gunakan workingMillis ketika Anda ingin mengukur waktu pemrosesan aktual secara independen dari antrian atau kontensi lock.
Agregasi
Konversi BinData
Operator $convert kini mendukung konversi berikut:
String ke BinData
BinData ke string
Ekspresi $toUUID menyediakan cara singkat untuk mengonversi nilai string ke UUID.
$queryStats
Tahap agregasi $queryStats mengembalikan statistik untuk kueri yang terekam. Di MongoDB 8.0, tahap ini juga melacak dan melaporkan metrik pada change stream secara lebih efisien.
Keamanan database
Queryable Encryption: kueri rentang
Queryable Encryption kini mendukung kueri rentang pada bidang terenkripsi menggunakan $lt, $lte, $gt, dan $gte.
Antrian masuk
MongoDB 8.0 memperkenalkan antrian masuk (ingressAdmissionControllerTicketPoolSize) untuk permintaan jaringan masuk. Operasi yang diterima dari jaringan memasuki antrian ini sebelum diterima oleh database.
Antrian ini tidak terbatas secara default. Tetapkan ukuran maksimum antrian untuk membatasi jumlah permintaan dalam antrian dan mencegah antrian tak terbatas selama lonjakan traffic.
Optimasi lainnya
Bentuk kueri dan pengaturan kueri
MongoDB 8.0 memperkenalkan konsep Query Shape baru. Bentuk kueri sebelumnya kini disebut plan cache query shape. Gunakan pengaturan kueri (bukan filter indeks) untuk memengaruhi pemilihan rencana kueri — planCacheSetFilter untuk mengatur filter indeks tidak lagi didukung di MongoDB 8.0.
Tiga perintah mengelola pengaturan kueri:
setQuerySettings: Tentukan petunjuk indeks atau atur kebijakanrejectuntuk Query Shape tertentu guna memblokir eksekusinya.removeQuerySettings: Hapus pengaturan kueri untuk Query Shape.$querySettings: Lihat pengaturan kueri saat ini.
Waktu optimasi rencana kueri
Output explain() kini mencakup queryPlanner.optimizationTimeMillis, yang melaporkan waktu yang dihabiskan untuk optimasi rencana kueri dalam milidetik.
Timeout operasi baca default
Parameter baru defaultMaxTimeMS menetapkan batas waktu default (dalam milidetik) untuk operasi baca. Parameter ini berlaku untuk find, aggregate (kecuali tahap $merge dan $out), count, distinct, dan dbHash. Jika klien menentukan maxTimeMS pada operasi individual, nilai tersebut akan didahulukan.
Perintah bulkWrite
Perintah baru bulkWrite menjalankan beberapa operasi insert, update, dan delete di beberapa koleksi dalam satu permintaan.
Perubahan tambahan
Pengurutan `updateOne`:
updateOnekini mendukung opsisort.Indeks TTL pada koleksi capped: Indeks TTL kini dapat dibuat pada koleksi capped.
Pemaketan oplog bulk insert: Insert bulk non-transaksional kini ditulis sebagai satu entri oplog alih-alih entri terpisah. Semua dokumen yang dimasukkan berbagi
clusterTimeyang sama dalam event change stream. Hal ini meningkatkan performa bulk insert dan mengurangi replikasi lag akibat replay beberapa oplog pada node secondary.Operasi DDL konkuren: Koleksi berbeda dalam database yang sama kini dapat menjalani operasi DDL secara simultan.
Perubahan keanggotaan shard selama DDL: Menambah atau menghapus shard dari kluster sharded diblokir selama operasi DDL (seperti
reshardCollection) sedang berlangsung. Selesaikan operasi DDL sebelum memodifikasi keanggotaan shard.
Perbaikan pembuatan indeks
MongoDB 8.0 meningkatkan pelaporan error dan ketahanan untuk pembuatan indeks:
| Aspek | MongoDB 8.0 | Sebelum MongoDB 8.0 |
|---|---|---|
| Pelaporan error | Error yang terdeteksi selama fase pemindaian koleksi (kecuali error kunci duplikat) dikembalikan segera, dan pembuatan indeks dihentikan. | Error yang terdeteksi selama pemindaian koleksi hanya dikembalikan pada fase commit di akhir pembuatan indeks, sehingga memperpanjang waktu diagnosis. |
| Secondary Node Resilience | Pada error pembuatan indeks, node secondary dapat meminta primary untuk menghentikan pembuatan indeks dan tidak crash. (Jika secondary telah memberikan suara untuk commit, ia tidak dapat berhenti dan akan crash — konsisten dengan perilaku MongoDB 7.0.) | Error pembuatan indeks dapat menyebabkan node secondary crash. |
| Manajemen Ruang Disk | Jika ruang disk yang tersedia turun di bawah indexBuildMinAvailableDiskSpaceMB, pembuatan indeks dihentikan secara otomatis. (Tidak dihentikan jika anggota telah memberikan suara untuk commit.) | Pembuatan indeks juga dihentikan karena ruang disk tidak mencukupi. |