Setelah data dihapus menggunakan perintah delete atau indeks TTL, ruang disk fisik tidak dilepaskan secara otomatis. Ruang kosong yang tidak terpakai menjadi disk fragments. Topik ini menjelaskan tiga metode reclamation: rencana reclaim otomatis, reclaim manual dari konsol, dan perintah compact.
Pilih metode reclamation
Di ApsaraDB for MongoDB, setelah data dihapus menggunakan perintah delete atau indeks TTL, ruang disk fisik tidak dilepaskan secara otomatis. Ruang yang ditempati oleh data yang dihapus ditandai sebagai bebas dan disimpan untuk penulisan di masa depan. Bagian yang tetap tidak digunakan kembali menjadi disk fragments. Ketika akumulasi fragment menyebabkan utilisasi disk tinggi, Anda perlu melakukan reclaim fragment untuk membebaskan ruang fisik.
Tiga metode reclamation dibandingkan sebagai berikut:
|
Dimensi |
Metode 1: Rencana reclaim otomatis |
Metode 2: Reclaim manual dari konsol |
Metode 3: Compact melalui command-line |
|
Node target |
Hanya node Hidden |
Hanya node Hidden |
Utama atau Node sekunder |
|
Persyaratan versi kernel |
|
|
Tidak ada |
|
Batas ruang yang dapat direclaim per putaran |
100 GB |
Tidak ada |
Tidak ada |
|
Dampak terhadap layanan |
Tidak ada (dieksekusi selama jendela pemeliharaan) |
Tidak ada (menargetkan node Hidden) |
Ya. Untuk detailnya, lihat Dampak compact terhadap workload. |
|
Kasus penggunaan |
Cocok untuk jumlah koleksi besar dengan jumlah ruang yang dapat direclaim kecil. |
Cocok untuk koleksi dengan jumlah ruang yang dapat direclaim besar. |
Volume besar, kontrol presisi, atau reclaim melalui konsol tidak mencukupi |
Menjalankan drop pada seluruh koleksi atau database segera melepaskan ruang fisiknya. Namun, ini adalah operasi penghapusan data dan hanya boleh digunakan sebagai tindakan darurat ketika ruang disk terbatas atau instans terkunci. Ini bukan metode reclaim fragment rutin.
Metode 1: Menyiapkan rencana reclaim otomatis
ApsaraDB for MongoDB menyediakan rencana reclaim fragment yang didukung oleh DAS (Database Autonomy Service). DAS secara otomatis mendeteksi dan menjalankan compact pada node Hidden selama jendela pemeliharaan instans. Tidak diperlukan intervensi manual dan proses ini tidak memengaruhi workload Anda.
Kondisi dan aturan pemicu
Sistem secara otomatis mereclaim fragment hanya dari koleksi yang secara bersamaan memenuhi kondisi berikut:
-
Ukuran gabungan ruang indeks dan ruang data melebihi 1 GB.
-
Tingkat fragmentasi melebihi 20%.
Aturan tambahan:
-
Batas atas untuk satu putaran reclaim adalah 100 GB. Kelebihannya akan direclaim dalam putaran berikutnya.
-
Ambang batas di atas sudah tertanam dalam sistem dan tidak dapat dikustomisasi.
Titik masuk konfigurasi
-
Login ke Konsol MongoDB dan navigasi ke instans target.
-
Di panel navigasi kiri, pilih CloudDBA > Storage Analysis.
-
Di daftar Data Space, temukan kolom Fragmentation Rate dan klik tautan Recycle.
-
Pada kotak dialog Fragment Recycling Plan yang muncul, klik Create Plan dan konfirmasi.
Metode 2: Reclaim manual dari konsol
Gunakan metode ini ketika ruang yang dapat direclaim dari suatu koleksi melebihi 100 GB.
Ketika ruang yang dapat direclaim dari suatu koleksi melebihi 100 GB, reclaim mungkin memakan waktu lebih dari 1 jam. Rencanakan waktu reclaim Anda sesuai.
Prosedur
-
Navigasi ke instans target. Di panel navigasi kiri, pilih CloudDBA > Storage Analysis.
-
Di daftar Data Space, lihat tingkat fragmentasi dan ruang yang dapat direclaim untuk setiap koleksi.
-
Untuk koleksi dengan tingkat fragmentasi tinggi yang ingin Anda reclaim, klik tombol Recycle yang sesuai untuk mengeksekusi.
Verifikasi keberhasilan reclaim
Setelah reclaim selesai, jalankan analisis penyimpanan lagi dan periksa apakah tingkat fragmentasi koleksi target telah menurun. Pastikan Anda melihat node yang sama tempat reclaim dilakukan (lihat FAQ dan troubleshooting).
Jika Anda menjalankan compact pada node primary atau secondary melalui command line, tingkat fragmentasi di analisis penyimpanan konsol tidak akan berubah. Ini tidak berarti reclaim gagal. Buka halaman Monitoring Information dan beralih ke node tempat Anda benar-benar menjalankan operasi untuk memverifikasi hasilnya.
Metode 3: Compact melalui command-line
Gunakan metode ini ketika satu koleksi melebihi 100 GB, reclaim melalui konsol tidak mencukupi, atau Anda memerlukan kontrol presisi.
Persyaratan izin
Menjalankan compact memerlukan akun memiliki izin dbAdmin atau hostManager (versi > 8.0). Jika tidak, kesalahan izin akan dilaporkan:
not authorized on <database> to execute command { compact: ... }
Dampak compact pada beban kerja
-
Pemblokiran read/write dan dampak performa
-
Sebelum MongoDB 4.4: Perintah
compactmengunci database yang berisi koleksi tersebut, memblokir semua operasi read dan write pada database tersebut. Ketika fragmentasi parah,compactmungkin memerlukan waktu lama untuk diselesaikan, yang dapat menyebabkan lag replikasi pada node Hidden. Kami menyarankan menjalankannya selama jam sepi, meningkatkan ukuran oplog berdasarkan workload write Anda, atau Upgrade versi utama database meningkatkan ke MongoDB 4.4 atau lebih baru sebelum melakukan reclaim fragment. -
MongoDB 4.4 dan lebih baru: Perintah
compacttidak lagi memblokir operasi read dan write, tetapi mungkin memengaruhi performa selama eksekusi. Kami menyarankan menjalankannya selama jam sepi.
-
-
Pembangunan ulang node
-
MongoDB 3.4 (semua versi), MongoDB 4.0 (semua versi), MongoDB 4.2 versi minor awal (4.0.22 atau lebih lama), dan MongoDB 4.4 versi minor awal (5.0.6 atau lebih lama): Node yang menjalankan
compactmemasuki status RECOVERING. Jika status ini berlangsung terlalu lama, komponen pemeriksaan kesehatan mungkin menandai node sebagai tidak sehat dan memicu pembangunan ulang otomatis. Untuk informasi versi MongoDB, lihat Versi minor MongoDB. -
Untuk instans yang menjalankan versi lebih baru: Node yang mengeksekusi
compacttetap dalam status SECONDARY dan tidak memicu pembangunan ulang.
-
-
Terlepas dari versinya, selalu prioritaskan reclaim fragment dari node Hidden atau Secondary untuk menghindari dampak pada node primary. Sebelum reclaim disk fragments, kami menyarankan membuat backup database Anda.
Waktu eksekusi compact
Waktu eksekusi bergantung pada volume data, beban sistem, dan faktor lainnya, dan tidak dapat diperkirakan secara tepat. Koleksi yang lebih besar dengan fragmentasi lebih banyak memerlukan waktu lebih lama. Koleksi yang sangat besar (ratusan GB) mungkin memerlukan waktu jauh lebih lama. Kami menyarankan menggunakan dryRun: true untuk memperkirakan ruang yang dapat direclaim terlebih dahulu, dan menjalankan operasi selama jam sepi.
Data berikut hanya disediakan sebagai referensi:
Uji dunia nyata (MongoDB 4.4): Menjalankan compact pada koleksi sekitar 2,5 GB dengan fragmentasi 50% memakan waktu sekitar 5 detik dan membebaskan sekitar 1,9 GB ruang.
Skenario di mana compact tidak efektif
Skenario berikut mungkin menyebabkan perintah compact tidak berpengaruh:
-
Ukuran koleksi fisik kurang dari 1 MB.
-
Tingkat fragmentasi di bawah 20%.
-
Kurang dari 20% ruang bebas ada di 80% pertama file, atau kurang dari 10% ruang bebas ada di 90% pertama file.
Untuk informasi lebih lanjut, lihat block_compact.
Instans replica set
Menjalankan compact langsung pada node primary tidak disarankan. compact mengonsumsi sumber daya I/O dan CPU yang signifikan, yang dapat memengaruhi workload online jika dijalankan pada node primary. Kami menyarankan menjalankannya pada node Secondary, lalu melakukan rotasi node melalui failover untuk reclaim setiap node secara bergiliran.
Instans standalone (StandAlone) hanya memiliki satu node. Hubungkan ke node tersebut dan jalankan compact langsung.
Hubungkan ke node Secondary dan jalankan perintah berikut:
use <database>
// Sebelum reclaim: periksa penggunaan ruang database untuk perbandingan
db.stats()
// Dry run: perkirakan ruang yang dapat direclaim tanpa benar-benar reclaim
db.runCommand({ compact: "<koleksi>", dryRun: true })
// Reclaim aktual
db.runCommand({ compact: "<koleksi>" })
// Setelah reclaim: periksa lagi untuk membandingkan ruang
db.stats()
Parameter dryRun: true mengaktifkan mode dry run, yang hanya mengembalikan estimatedBytesFreed (perkiraan jumlah byte yang dapat dibebaskan) tanpa memodifikasi file apa pun. Setelah meninjau hasil dry run, hapus parameter ini dan jalankan reclaim aktual. Jalankan db.stats() sebelum dan sesudah reclaim untuk membandingkan penggunaan ruang database dan mengonfirmasi hasilnya.
Pastikan operasi compact sebelumnya telah selesai sebelum memulai yang baru pada koleksi yang sama.
Instans kluster sharded
Untuk kluster sharded, Anda hanya perlu reclaim fragment dari node yang sesuai dalam komponen Shard. Komponen Mongos dan ConfigServer tidak menyimpan data pengguna dan tidak memerlukan reclaim.
Node read-only dalam kluster sharded tidak mendukung perintah compact, sehingga Anda tidak dapat reclaim fragment dari node read-only (ReadOnly).
Reclaim fragment node Secondary: Saat menjalankan runCommandOnShard, Anda harus mengatur preferensi baca ke Secondary. Sintaksnya bervariasi tergantung klien. Pilih metode yang sesuai untuk klien Anda:
mongosh 2.x
mongosh 2.x mendukung menentukan preferensi baca langsung di parameter kedua runCommand:
db.runCommand({runCommandOnShard:"<ID Shard>","command":{compact:"<nama_koleksi>"}},{readPreference: "secondary"})
mongosh 1.x
mongosh 1.x memerlukan pengaturan preferensi baca melalui setReadPref sebelum menjalankan perintah:
db.getMongo().setReadPref('secondary')
db.runCommand({runCommandOnShard:"<ID Shard>","command":{compact:"<nama_koleksi>"}})
mongo shell (legacy)
mongo shell (legacy) memerlukan penambahan $queryOptions untuk menentukan preferensi baca:
db.runCommand({runCommandOnShard:"<ID Shard>","command":{compact:"<nama_koleksi>"},$queryOptions: {$readPreference: {mode: 'secondary'}}})
Mengambil kembali fragmen node utama (tidak disarankan):
Untuk meminimalkan dampak layanan, kami menyarankan melakukan failover primary/secondary untuk mengalihkan node Primary ke node Secondary, lalu reclaim fragment dari node Secondary baru. Untuk instruksi failover primary/secondary, lihat Alih bencana primary/secondary untuk instans kluster sharded.
db.adminCommand({
runCommandOnShard: "<shardId>",
dbName: "<database>",
command: { compact: "<koleksi>", force: true }
})
FAQ dan troubleshooting
Reclaim dijalankan tetapi tidak ada efek yang terlihat
Periksa hal berikut secara berurutan:
-
Ketidaksesuaian node antara operasi dan verifikasi (penyebab paling umum): Analisis penyimpanan konsol mereclaim fragment dari node Hidden, dan halaman menampilkan tingkat fragmentasi untuk node Hidden secara default. Compact melalui command line memengaruhi node tempat Anda terhubung. Jika Anda menjalankan compact pada node primary atau secondary tetapi memeriksa tingkat fragmentasi di analisis penyimpanan konsol, angkanya tidak akan berubah. Pendekatan yang benar: Buka halaman Monitoring Information dan beralih ke node tempat Anda benar-benar melakukan operasi untuk melihat utilisasi ruang disk.
-
Fragmentasi file internal: compact hanya dapat memotong ruang bebas kontigu di akhir file. Ruang yang dapat digunakan kembali di dalam file tidak dapat direclaim. Jika fragment tersebar di dalam file, ruang disk mungkin tetap hampir tidak berubah setelah compact. Ini adalah perilaku yang diharapkan dari mesin penyimpanan WiredTiger, bukan kegagalan. Jalankan
db.<koleksi>.stats()dan periksa rasiofreeStorageSizeterhadapstorageSizeuntuk memperkirakan ruang yang dapat direclaim. -
Di bawah ambang batas reclaim: Jika tingkat fragmentasi di bawah 20%, ukuran koleksi fisik kurang dari 1 MB, atau koleksinya kecil, ruang absolut yang dapat direclaim sangat kecil dan reclaim mungkin tidak menunjukkan efek yang terlihat.
-
Proteksi node primary memblokir operasi: Jika Anda melihat
use force:true to force, ini adalah mekanisme proteksi yang menunjukkan bahwa compact dijalankan pada node primary. Jangan gunakan force. Sebagai gantinya, jalankan compact pada node Hidden atau Secondary, atau gunakan analisis penyimpanan konsol untuk reclaim node Hidden.
Mengapa tingkat fragmentasi tidak turun ke 0%?
Ini adalah perilaku yang diharapkan. compact hanya mereclaim ruang bebas kontigu di akhir file. Ruang yang dapat digunakan kembali di dalam file dipertahankan untuk penulisan di masa depan. Oleh karena itu, tingkat fragmentasi biasanya tidak dapat turun ke 0%. Ini adalah pilihan desain dari mesin penyimpanan WiredTiger.
Kesalahan: Interrupted ... cache eviction pressure
Penyebab: Selama eksekusi compact, mesin penyimpanan WiredTiger mengalami tekanan eviksi cache. Versi lama dan instans spesifikasi kecil memiliki sumber daya memori terbatas. Ketika tekanan cache terlalu tinggi dan mesin tidak dapat mengevakuasi halaman tepat waktu, compact diinterupsi dan keluar lebih awal.
Resolusi: Coba lagi selama jam sepi, picu failover primary/secondary dan coba lagi, atau tingkatkan spesifikasi instans sebelum reclaim.
Dapatkah saya menjalankan compact saat instans terkunci karena disk penuh?
Ya. Ketika disk penuh, instans memasuki status terkunci. Operasi write (insert) dan delete (delete) ditolak dengan kesalahan cloud instance error, disk locked..., tetapi operasi find, compact, dan drop masih dapat dieksekusi.
Mengapa operasi delete juga ditolak?
Operasi delete sendiri menulis ke oplog dan tetap mengonsumsi ruang disk, sehingga juga ditolak dalam status terkunci. Namun, drop dan compact adalah operasi tingkat metadata atau reorganisasi ruang dan diizinkan oleh sistem. Dalam status terkunci, Anda dapat menjalankan compact untuk reclaim fragment dan membebaskan ruang, atau menjalankan drop untuk menghapus koleksi dan membebaskan ruang. Keduanya adalah jalur pemulihan yang tidak memerlukan scaling up.
Keputusan pemulihan tercepat
|
Situasi Anda |
Tindakan yang disarankan |
Kecepatan pemulihan |
Biaya |
|
Anda memiliki koleksi atau database yang tidak digunakan yang dapat dihapus dengan aman. |
Jalankan |
Setelah membebaskan ruang, instans secara otomatis membuka kunci dalam waktu sekitar 4 hingga 5 menit (ada penundaan deteksi; tidak instan). |
Tidak ada biaya, tetapi data dihapus. Pastikan data tersebut dapat dihapus. |
|
Data tidak dapat dihapus, tetapi ada fragment signifikan yang dapat direclaim. |
Jalankan compact (compact diizinkan dalam status terkunci). |
Setelah compact membebaskan ruang, instance akan secara otomatis terbuka kuncinya dalam waktu sekitar 5 menit (terdapat keterlambatan deteksi; proses ini tidak instan). |
|
|
Tidak ada data yang dapat dihapus / data tidak boleh hilang. |
Akan terbuka setelah proses penskalaan selesai. |
|
Setelah membuka kunci, segera reclaim fragment atau bersihkan data yang tidak digunakan untuk mencegah disk penuh lagi. Lihat Atasi kunci instans yang disebabkan oleh ruang disk habis.
Utilisasi konsol tidak sesuai dengan alert (misalnya, konsol menunjukkan 60% tetapi alert dipicu pada 90%)
Ini disebabkan oleh dimensi tampilan yang berbeda, bukan kesalahan data:
-
Alert dipicu berdasarkan "node tunggal tertinggi": Dalam replica set, utilisasi disk node Primary, Secondary, dan Hidden mungkin berbeda (node Secondary/Hidden sering lebih tinggi daripada Primary karena oplog, waktu reclaim, file sementara, dan alasan lainnya). Alert dipicu ketika node tunggal melebihi ambang batas.
-
Konsol tidak menampilkan "node tertinggi" secara default: Halaman Basic Information instans menunjukkan nilai agregat, dan halaman Storage Analysis secara default menampilkan node Hidden. Keduanya mungkin lebih rendah daripada node yang memicu alert.
Cara melihat penggunaan aktual setiap node: Buka halaman Monitoring Information instans, ubah mode tampilan ke Sub-node independent, lalu Anda dapat melihat penggunaan ruang disk masing-masing node Primary dan Secondary secara individual untuk mengidentifikasi node dengan penggunaan tinggi yang memicu peringatan.
Untuk informasi lebih lanjut tentang mengapa utilisasi disk node primary dan secondary berbeda dan cara mengatasinya, lihat Utilisasi ruang disk tinggi pada instans ApsaraDB for MongoDB.
Dapatkah saya mengecilkan disk untuk menghemat uang?
Pengecilan tidak didukung. ApsaraDB for MongoDB tidak mendukung pengurangan ruang disk yang telah dibeli untuk versi apa pun. Bahkan jika Anda telah membersihkan sejumlah besar data dan mereclaim fragment, Anda hanya dapat mempertahankan atau meningkatkan spesifikasi disk. Anda tidak dapat langsung menguranginya.
Jika Anda memerlukan spesifikasi disk yang lebih kecil, satu-satunya pilihan adalah membuat instans baru dengan spesifikasi lebih kecil, migrasi data Anda menggunakan DTS, lalu lepaskan instans asli. Evaluasi biaya migrasi dan jendela downtime sebelum melanjutkan.
Untuk perubahan konfigurasi dan batasan spesifikasi, lihat Ubah konfigurasi instans replica set.
Apendiks
Mengapa disk fragments terjadi?
Ketika data dihapus menggunakan perintah delete atau kedaluwarsa TTL, data tersebut hanya ditandai sebagai dihapus. Ruang yang ditempatinya tidak segera dikembalikan ke sistem operasi. Sebaliknya, ruang tersebut dipertahankan sebagai blok bebas untuk penulisan di masa depan. Ketika penghapusan melebihi penulisan, blok bebas ini tetap tidak digunakan dalam periode panjang, membentuk fragment. Inilah mengapa utilisasi disk tetap tinggi meskipun volume data berkurang.
Kapan harus reclaim disk fragments
Pertimbangkan untuk mengambil kembali fragmen disk dalam situasi berikut:
-
Setelah menghapus volume data besar: Ketika Anda menghapus sejumlah besar dokumen, ruang yang dibebaskan tidak dikembalikan ke sistem operasi tetapi disimpan untuk penulisan di masa depan, meninggalkan ruang fragmentasi signifikan pada disk.
PentingPenghapusan manual (
delete) dan kedaluwarsa TTL tidak secara otomatis reclaim disk fragments. Reclaim manual diperlukan. -
Setelah workload write tinggi berkepanjangan: Workload write tinggi berkelanjutan (sering melakukan insert, update, dan delete) secara bertahap mengakumulasi ruang fragmentasi pada disk.
-
Ketika ruang disk rendah dan fragmentasi melebihi 20%: Ketika utilisasi disk mencapai 85% hingga 90% atau lebih tinggi, reclaim fragment dapat membebaskan ruang dan mengurangi tekanan penyimpanan.
Lihat dan perkirakan ruang yang dapat direclaim
Hubungkan ke instans (untuk instans replica set, hubungkan ke node Secondary untuk meminimalkan dampak layanan) dan jalankan db.runCommand({collStats: "<koleksi>"}) untuk melihat status penyimpanan koleksi. Perhatikan bidang berikut:
-
size: Ukuran penyimpanan logis koleksi. -
storageSize: Ukuran penyimpanan fisik koleksi. -
freeStorageSize: Ruang bebas yang dapat direclaim dalam koleksi (tersedia di MongoDB 4.4 dan lebih baru).
Setelah menghapus dokumen dengan perintah remove, size berkurang, tetapi storageSize mungkin tidak berubah. Rasio freeStorageSize terhadap storageSize yang lebih tinggi menunjukkan tingkat fragmentasi lebih tinggi.
Anda juga dapat menjalankan perintah berikut untuk memperkirakan ruang fragment yang dapat direclaim dari koleksi (mengembalikan jumlah byte yang dapat digunakan kembali):
db.<koleksi>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
Untuk instans yang hampir kosong, freeStorageSize mungkin mengembalikan null. Dalam kasus ini, periksa wiredTiger["block-manager"]["file bytes available for reuse"] (byte yang dapat digunakan kembali) dan ["file size in bytes"] (ukuran file total) untuk memperkirakan rasio fragmentasi. Untuk deskripsi bidang, lihat Output collStats.