Tuesday, February 14, 2012

MongoDb ile Aşırı Disk Kullanımı ve Sonrasında Optimizasyon

Senaryomuz su :
MongoDb diskiniz %88 doldu. Makineye yeni bir dik takamiyorsunuz. Gereksiz buyuk boyutlu collectionlar var ve siz bu gereksiz collection'lari sildiniz.
db.col1.drop()
db.col2.drop()
db.col3.drop()
Veri buyuklugunun neredeyse yaridan fazlasini sildiginizi dusunurken hala %88 doluluk orani sizi sasirtti zira mongodb bir takim disk ve indexleme performansi kurallari geregi sildiginiz datanin kapladigi alani diskte hala ayrilmis olarak tutar. Bunun icin collection'lari silmeden once bosaltip ardinddan db.col1.runCommand("compact") calistirmaniz gerekirdi ama artik silindi ve bunu calistirinca hata veriyor (ve tabiki ayni adda bos bir collection acip calistirmak anlamsiz olacaktir).
Bu durumda veri tabanina repair komutu vermek gerekecek ancak bu da kullanimda olan disk alanini kadar bos alana ihtiyaca ihtiyac duyacaktir ve hata verecektir. Bu durumda yapilmasi gereken sey (eger bir disk ekleyemiyorsaniz) elinizdeki var olan datasinin gercekte diskin yarisindan kucuk bir alana sigdigini dusundugunuz veritabanina :

1. db.copyDatabase("db1","db1back") 
2. use db1 
3. db.dropDatabase() 
4. db.copyDatabase("db1back","db1") 
5. use db1back 
6. db.db1() 

19G lik veri icin ortalama yarim saat surdugunu ve hakli olarak bu sirada gelen insert ve find komutlarina cevap vermedgini de ekleyim.

Ek olarak okunmalidir  ki  http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

No comments: