Ada beberapa kebingungan yang cukup besar tentang reklamasi ruang di MongoDB, dan beberapa praktik yang disarankan benar-benar berbahaya untuk dilakukan dalam jenis penyebaran tertentu. Lebih detail di bawah ini:
TL; DR repairDatabase
berupaya untuk menyelamatkan data dari penyebaran MongoDB mandiri yang mencoba untuk pulih dari kerusakan disk. Jika ruang pulih, itu murni efek samping . Memulihkan ruang seharusnya tidak menjadi pertimbangan utama untuk berlari repairDatabase
.
Memulihkan ruang dalam node mandiri
WiredTiger: Untuk node mandiri dengan WiredTiger, menjalankan compact
akan melepaskan ruang ke OS, dengan satu peringatan: compact
Perintah pada WiredTiger di MongoDB 3.0.x dipengaruhi oleh bug ini: SERVER-21833 yang diperbaiki di MongoDB 3.2.3. Sebelum versi ini, compact
pada WiredTiger bisa gagal secara diam-diam.
MMAPv1: Karena cara kerja MMAPv1, tidak ada metode yang aman dan didukung untuk memulihkan ruang menggunakan mesin penyimpanan MMAPv1. compact
di MMAPv1 akan mendefrag file data, berpotensi membuat lebih banyak ruang tersedia untuk dokumen baru, tetapi tidak akan melepaskan ruang kembali ke OS.
Anda mungkin dapat menjalankannya repairDatabase
jika Anda sepenuhnya memahami konsekuensi dari perintah yang berpotensi berbahaya ini (lihat di bawah), karena repairDatabase
pada dasarnya menulis ulang seluruh database dengan membuang dokumen yang rusak. Sebagai efek samping, ini akan membuat file data MMAPv1 baru tanpa ada fragmentasi dan melepaskan ruang kembali ke OS.
Untuk metode yang tidak terlalu berani, menjalankan mongodump
dan mongorestore
dimungkinkan juga dalam penerapan MMAPv1, tergantung pada ukuran penerapan Anda.
Memulihkan ruang dalam set replika
Untuk konfigurasi set replika, metode terbaik dan teraman untuk memulihkan ruang adalah dengan melakukan sinkronisasi awal , untuk WiredTiger dan MMAPv1.
Jika Anda perlu memulihkan ruang dari semua node di set, Anda dapat melakukan sinkronisasi awal bergulir. Yaitu, lakukan sinkronisasi awal pada masing-masing sekunder, sebelum akhirnya mundur primer dan lakukan sinkronisasi awal di atasnya. Menggulir metode sinkronisasi awal adalah metode paling aman untuk melakukan pemeliharaan set replika, dan juga tidak melibatkan downtime sebagai bonus.
Harap dicatat bahwa kelayakan melakukan sinkronisasi awal bergulir juga tergantung pada ukuran penempatan Anda. Untuk penyebaran yang sangat besar, mungkin tidak layak untuk melakukan sinkronisasi awal, dan karenanya opsi Anda agak lebih terbatas. Jika WiredTiger digunakan, Anda mungkin dapat mengambil satu sekunder dari set, mulai sebagai standalone, jalankan compact
di atasnya, dan bergabung kembali ke set.
Mengenai repairDatabase
Tolong jangan dijalankan repairDatabase
pada set node replika . Ini sangat berbahaya, seperti yang disebutkan dalam halaman database Repair dan dijelaskan lebih detail di bawah ini.
Namanya repairDatabase
agak menyesatkan, karena perintah tidak berusaha memperbaiki apa pun. Perintah itu dimaksudkan untuk digunakan ketika ada kerusakan disk pada node mandiri , yang dapat menyebabkan dokumen rusak.
The repairDatabase
perintah bisa lebih tepat disebut sebagai "basis data penyelamatan". Yaitu, ini membuat ulang basis data dengan membuang dokumen yang rusak dalam upaya untuk membuat basis data ke dalam keadaan di mana Anda dapat memulainya dan menyelamatkan dokumen yang utuh darinya.
Dalam penyebaran MMAPv1, pembangunan kembali file database melepaskan ruang ke OS sebagai efek samping . Melepaskan ruang ke OS tidak pernah tujuannya.
Konsekuensi repairDatabase
pada set replika
Dalam set replika, MongoDB mengharapkan semua node di set untuk berisi data yang identik. Jika Anda menjalankan repairDatabase
simpul set replika, ada kemungkinan simpul tersebut berisi korupsi yang tidak terdeteksi, dan dengan repairDatabase
patuh akan menghapus dokumen yang rusak untuk Anda.
Bisa ditebak, ini membuat simpul yang berisi dataset berbeda dari sisa set. Jika pembaruan terjadi untuk mencapai satu dokumen itu, seluruh rangkaian dapat macet.
Untuk memperburuk keadaan, sangat mungkin bahwa situasi ini bisa tetap tidak aktif untuk waktu yang lama, hanya untuk menyerang tiba-tiba tanpa alasan yang jelas.