delete komutu veya TTL dizinleri kullanılarak veriler silindiğinde fiziksel disk alanı otomatik olarak serbest kalmaz. Kullanılmayan boş alan disk parçalarına dönüşür. Bu konuda üç geri kazanım yöntemi açıklanmaktadır: otomatik geri alma planları, konsoldan manuel geri alma ve compact komutu.
Geri kazanım yöntemi seçin
ApsaraDB for MongoDB'de delete komutu veya TTL dizinleri kullanılarak veriler silindiğinde fiziksel disk alanı otomatik olarak serbest kalmaz. Silinen verilerin kapladığı alan boş olarak işaretlenir ve gelecekteki yazma işlemleri için ayrılır. Yeniden kullanılmayan kısım disk parçaları haline gelir. Parça birikimi yüksek disk kullanımına neden olduğunda fiziksel alanı boşaltmak için parçaları geri kazanmanız gerekir.
Üç geri kazanım yönteminin karşılaştırması aşağıdadır:
|
Boyut |
Yöntem 1: Otomatik geri alma planı |
Yöntem 2: Konsoldan manuel geri alma |
Yöntem 3: Komut satırı compact |
|
Hedef düğüm |
Yalnızca Gizli düğümler |
Yalnızca Gizli düğümler |
Birincil veya İkincil düğümler |
|
Çekirdek sürümü gereksinimleri |
|
|
Yok |
|
Tur başına geri alınabilir alan sınırı |
100 GB |
Yok |
Yok |
|
Hizmet etkisi |
Yok (bakım pencereleri sırasında çalıştırılır) |
Yok (Gizli düğümleri hedefler) |
Evet. Ayrıntılar için bkz. Compact'ın iş yüklerine etkisi. |
|
Kullanım durumu |
Geri alınabilir alanı az olan çok sayıda koleksiyon için uygundur. |
Geri alınabilir alanı büyük olan koleksiyonlar için uygundur. |
Büyük hacimler, hassas kontrol veya konsol geri almasının yetersiz olduğu durumlar |
Tüm bir koleksiyonda veya veritabanında drop çalıştırmak fiziksel alanını anında serbest bırakır. Ancak bu bir veri silme işlemidir ve yalnızca disk alanı kritik düzeydeyse veya örnek kilitlendiğinde acil durum önlemi olarak kullanılmalıdır. Rutin bir parça geri kazanım yöntemi değildir.
Yöntem 1: Otomatik geri alma planı ayarlayın
ApsaraDB for MongoDB, DAS (Database Autonomy Service) tarafından desteklenen bir parça geri alma planı sunar. DAS, örnek bakım penceresi sırasında Gizli düğümlerde otomatik olarak algılama yapar ve compact çalıştırır. Manuel müdahale gerekmez ve süreç iş yüklerinizi etkilemez.
Tetikleme koşulları ve kurallar
Sistem, aşağıdaki koşulları aynı anda karşılayan koleksiyonlardan parçaları otomatik olarak geri alır:
Dizin alanı ve veri alanının toplam boyutu 1 GB'yi aşar.
Parçalanma oranı %20'nin üzerindedir.
Ek kurallar:
Tek bir geri alma turu için üst sınır 100 GB'dir. Fazlası sonraki turlarda geri alınır.
Yukarıdaki eşikler sisteme dahildir ve özelleştirilemez.
Yapılandırma giriş noktası
MongoDB konsolu üzerinde oturum açın ve hedef örneğe gidin.
Sol gezinme bölmesinde CloudDBA > Storage Analysis seçeneğini belirleyin.
Data Space listesinde Fragmentation Rate sütununu bulun ve Recycle bağlantısına tıklayın.
Açılan Fragment Recycling Plan iletişim kutusunda Create Plan öğesine tıklayın ve onaylayın.
Yöntem 2: Konsoldan manuel geri alma
Bir koleksiyonun geri alınabilir alanı 100 GB'yi aştığında bu yöntemi kullanın.
Bir koleksiyonun geri alınabilir alanı 100 GB'yi aştığında geri alma işlemi 1 saatten fazla sürebilir. Geri alma zamanınızı buna göre planlayın.
Prosedür
Hedef örneğe gidin. Sol gezinme bölmesinde CloudDBA > Storage Analysis seçeneğini belirleyin.
-
Data Space listesinde her koleksiyon için parçalanma oranını ve geri alınabilir alanı görüntüleyin.
Geri almak istediğiniz yüksek parçalanma oranına sahip koleksiyonlar için ilgili Recycle düğmesine tıklayarak çalıştırın.
Geri alma başarısını doğrulayın
Geri alma tamamlandıktan sonra depolama analizini tekrar çalıştırın ve hedef koleksiyonun parçalanma oranının azalıp azalmadığını kontrol edin. Geri almanın yapıldığı aynı düğümü görüntülediğinizden emin olun (bkz. SSS ve sorun giderme).
Komut satırı aracılığıyla birincil veya ikincil düğümde compact çalıştırdıysanız konsol depolama analizindeki parçalanma oranı değişmez. Bu geri almanın başarısız olduğu anlamına gelmez. Monitoring Information sayfasına gidin ve sonucu doğrulamak için işlemi gerçekten çalıştırdığınız düğüme geçin.
Yöntem 3: Komut satırı compact
Tek bir koleksiyon 100 GB'yi aştığında, konsol geri alması yetersiz kaldığında veya hassas kontrole ihtiyaç duyduğunuzda bu yöntemi kullanın.
İzin gereksinimleri
Compact çalıştırmak için hesabın dbAdmin veya hostManager (sürüm > 8.0) izinlerine sahip olması gerekir. Aksi takdirde bir izin hatası bildirilir:
not authorized on <database> to execute command { compact: ... }
Compact'ın iş yüklerine etkisi
-
Okuma/yazma engelleme ve performans etkisi
MongoDB 4.4 öncesi:
compactkomutu koleksiyonu içeren veritabanını kilitler ve bu veritabanındaki tüm okuma ve yazma işlemlerini engeller. Parçalanma şiddetli olduğundacompacttamamlanması uzun sürebilir ve bu da Gizli düğümlerde çoğaltma gecikmesine neden olabilir. Yoğun olmayan saatlerde çalıştırmanızı, yazma iş yükünüze göre oplog boyutunu artırmanızı veya parçaları geri almadan önce MongoDB 4.4 veya sonraki bir sürüme Veritabanı ana sürümünü yükseltin yükseltmenizi öneririz.MongoDB 4.4 ve sonrası:
compactkomutu artık okuma ve yazma işlemlerini engellemez ancak yürütme sırasında performansı etkileyebilir. Yoğun olmayan saatlerde çalıştırmanızı öneririz.
-
Düğüm yeniden oluşturma
MongoDB 3.4 (tüm sürümler), MongoDB 4.0 (tüm sürümler), MongoDB 4.2 erken alt sürümleri (4.0.22 veya öncesi) ve MongoDB 4.4 erken alt sürümleri (5.0.6 veya öncesi):
compactçalıştıran düğüm RECOVERING durumuna girer. Bu durum çok uzun sürerse sağlık denetimi bileşeni düğümü sağlıksız olarak işaretleyebilir ve otomatik yeniden oluşturmaya neden olabilir. MongoDB sürüm bilgileri için bkz. MongoDB alt sürümleri.Daha sonraki sürümleri çalıştıran örnekler için:
compactyürüten düğüm SECONDARY durumunda kalır ve yeniden oluşturma tetiklemez.
Sürümden bağımsız olarak birincil düğümü etkilememek için her zaman parçaları öncelikle Gizli veya İkincil düğümlerden geri almayı tercih edin. Disk parçalarını geri almadan önce veritabanınızı yedeklemenizi öneririz.
compact yürütme süresi
Yürütme süresi veri hacmine, sistem yüküne ve diğer faktörlere bağlıdır ve kesin olarak tahmin edilemez. Daha fazla parçalanmaya sahip daha büyük koleksiyonlar daha uzun sürer. Çok büyük koleksiyonlar (yüzlerce GB) önemli ölçüde daha uzun sürebilir. Önce geri alınabilir alanı tahmin etmek için dryRun: true kullanmanızı ve işlemi yoğun olmayan saatlerde çalıştırmanızı öneririz.
Aşağıdaki veriler yalnızca referans amaçlıdır:
Gerçek dünya testi (MongoDB 4.4): Yaklaşık %50 parçalanmaya sahip 2,5 GB'lık bir koleksiyonda compact çalıştırmak yaklaşık 5 saniye sürdü ve yaklaşık 1,9 GB alan boşalttı.
Compact'ın etkili olmadığı senaryolar
Aşağıdaki senaryolar compact komutunun etkisiz kalmasına neden olabilir:
Fiziksel koleksiyon boyutu 1 MB'tan küçüktür.
Parçalanma oranı %20'nin altındadır.
Dosyanın ilk %80'inde %20'den az boş alan varsa veya dosyanın ilk %90'ında %10'dan az boş alan varsa.
Daha fazla bilgi için bkz. block_compact.
Çoğaltma kümesi örnekleri
Compact'ı doğrudan birincil düğümde çalıştırmak önerilmez. Compact önemli G/Ç ve CPU kaynakları tüketir; birincil düğümde çalıştırıldığında çevrimiçi iş yüklerini etkileyebilir. İkincil düğümlerde çalıştırmanızı ve ardından yük devretme yoluyla düğümleri döndürerek her bir düğümü sırayla geri almanızı öneririz.
Bağımsız (StandAlone) bir örneğin yalnızca bir düğümü vardır. Buna bağlanın ve compact'ı doğrudan çalıştırın.
Bir İkincil düğüme bağlanın ve aşağıdaki komutları çalıştırın:
use <database>
// Before reclamation: check database space usage for comparison
db.stats()
// Dry run: estimate reclaimable space without actually reclaiming
db.runCommand({ compact: "<collection>", dryRun: true })
// Actual reclamation
db.runCommand({ compact: "<collection>" })
// After reclamation: check again to compare space
db.stats()
dryRun: true parametresi herhangi bir dosyayı değiştirmeden yalnızca estimatedBytesFreed (boşaltılabilecek tahmini bayt sayısı) değerini döndüren kuru çalıştırma modunu etkinleştirir. Kuru çalıştırma sonuçlarını inceledikten sonra bu parametreyi kaldırın ve gerçek geri almayı çalıştırın. Veritabanı alanı kullanımını karşılaştırmak ve sonucu onaylamak için geri almadan önce ve sonra db.stats() çalıştırın.
Aynı koleksiyonda yeni bir compact başlatmadan önce önceki compact işleminin tamamlandığından emin olun.
Parçalı küme örnekleri
Parçalı kümeler için yalnızca Shard bileşenindeki karşılık gelen düğümlerden parçaları geri almanız gerekir. Mongos ve ConfigServer bileşenleri kullanıcı verisi depolamaz ve geri alma gerektirmez.
Parçalı kümelerdeki salt okunur düğümler compact komutunu desteklemez; bu nedenle salt okunur (ReadOnly) düğümlerden parçaları geri alamazsınız.
İkincil düğüm parçalarını geri alma: runCommandOnShard çalıştırırken okuma tercihini Secondary olarak ayarlamanız gerekir. Sözdizimi istemciye göre değişir. İstemciniz için uygun yöntemi seçin:
mongosh 2.x
mongosh 2.x runCommand ikinci parametresinde okuma tercihini doğrudan belirtmeyi destekler:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"}},{readPreference: "secondary"})
mongosh 1.x
mongosh 1.x komutu çalıştırmadan önce okuma tercihini setReadPref aracılığıyla ayarlamayı gerektirir:
db.getMongo().setReadPref('secondary')
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"}})
mongo shell (legacy)
mongo shell (legacy) okuma tercihini belirtmek için $queryOptions eklemeyi gerektirir:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},$queryOptions: {$readPreference: {mode: 'secondary'}}})
Birincil düğüm parçalarını geri alma (önerilmez):
Hizmet etkisini en aza indirmek için Birincil düğümü İkincil düğüme geçirmek üzere bir birincil/ikincil yük devretme gerçekleştirmenizi ve ardından parçaları yeni İkincil düğümden geri almanızı öneririz. Birincil/ikincil yük devretme talimatları için bkz. Parçalı küme örneği için birincil/ikincil geçiş.
db.adminCommand({
runCommandOnShard: "<shardId>",
dbName: "<database>",
command: { compact: "<collection>", force: true }
})
SSS ve sorun giderme
Geri alma çalıştırıldı ancak görünür etki yok
Aşağıdakileri sırayla kontrol edin:
İşlem ve doğrulama arasında düğüm uyumsuzluğu (en yaygın neden): Konsol depolama analizi Gizli düğümlerden parçaları geri alır ve sayfa varsayılan olarak Gizli düğümler için parçalanma oranını görüntüler. Komut satırı compact bağlandığınız düğümü etkiler. Birincil veya ikincil düğümde compact çalıştırdıysanız ancak konsol depolama analizinde parçalanma oranını kontrol ettiyseniz sayılar değişmez. Doğru yaklaşım: Monitoring Information sayfasına gidin ve disk alanı kullanımını görüntülemek için işlemi gerçekten gerçekleştirdiğiniz düğüme geçin.
Dahili dosya parçalanması: compact yalnızca bir dosyanın sonundaki bitişik boş alanı kısaltabilir. Dosya içindeki yeniden kullanılabilir alan geri alınamaz. Parçalar dosya içinde dağılmışsa compact sonrasında disk alanı neredeyse değişmeden kalabilir. Bu WiredTiger depolama altyapısının beklenen davranışıdır bir arıza değildir. Geri alınabilir alanı tahmin etmek için
db.<collection>.stats()çalıştırın vefreeStorageSizeilestorageSizeoranını kontrol edin.Geri alma eşiğinin altında: Parçalanma oranı %20'nin altındaysa fiziksel koleksiyon boyutu 1 MB'tan küçükse veya koleksiyon küçükse mutlak geri alınabilir alan çok küçüktür ve geri almanın görünür bir etkisi olmayabilir.
Birincil düğüm koruması işlemi engelledi:
use force:true to forcegörürseniz bu compact'ın birincil düğümde çalıştırıldığını belirten koruma mekanizmasıdır. Force kullanmayın. Bunun yerine compact'ı Gizli veya İkincil düğümde çalıştırın veya Gizli düğümleri geri almak için konsol depolama analizini kullanın.
Parçalanma oranı neden %0'a düşmüyor?
Bu beklenen bir davranıştır. compact yalnızca bir dosyanın sonundaki bitişik boş alanı geri alır. Dosya içindeki yeniden kullanılabilir alan gelecekteki yazmalar için korunur. Bu nedenle parçalanma oranı tipik olarak %0'a düşemez. Bu WiredTiger depolama altyapısının bir tasarım tercihidir.
Hata: Interrupted ... cache eviction pressure
Neden: Compact yürütme sırasında WiredTiger depolama altyapısı önbellek tahliye baskısı yaşar. Eski sürümler ve küçük teknik özelliklere sahip örneklerin bellek kaynakları sınırlıdır. Önbellek baskısı çok yüksek hale geldiğinde ve altyapı sayfaları zamanında tahliye edemediğinde compact kesintiye uğrar ve erken çıkar.
Çözüm: Yoğun olmayan saatlerde yeniden deneyin, bir birincil/ikincil yük devretme tetikleyip tekrar deneyin veya geri almadan önce örnek teknik özelliklerini yükseltin.
Disk doluluğu nedeniyle örnek kilitlendiğinde compact çalıştırabilir miyim?
Evet. Disk dolduğunda örnek kilitli duruma geçer. Yazma (insert) ve silme (delete) işlemleri cloud instance error, disk locked... hatasıyla reddedilir ancak find, compact ve drop işlemleri hala çalıştırılabilir.
Silme işlemi neden reddediliyor?
Silme işlemi kendisi oplog'a yazar ve hala disk alanı tüketir; bu nedenle kilitli durumda reddedilir. Ancak drop ve compact meta veri düzeyinde veya alan yeniden düzenleme işlemleridir ve sistem tarafından izin verilir. Kilitli durumda parçaları geri almak ve alan boşaltmak için compact çalıştırabilir veya koleksiyonları silmek ve alan boşaltmak için drop çalıştırabilirsiniz. Her ikisi de ölçeklendirmeyi gerektirmeyen kurtarma yollarıdır.
En hızlı kurtarma kararı
|
Durumunuz |
Önerilen eylem |
Kurtarma hızı |
Maliyet |
|
Güvenle silinebilecek kullanılmayan koleksiyonlarınız veya veritabanlarınız var. |
|
Alan boşaltıldıktan sonra örnek yaklaşık 4 ila 5 dakika içinde otomatik olarak kilidi açar (bir algılama gecikmesi vardır; anlık değildir). |
Maliyet yok ancak veriler silinir. Verilerin silinebileceğini onaylayın. |
|
Veriler silinemez ancak geri alınacak önemli parçalar var. |
Compact çalıştırın (compact kilitli durumda izin verilir). |
Compact alan boşalttıktan sonra örnek yaklaşık 5 dakika içinde otomatik olarak kilidi açar (bir algılama gecikmesi vardır; anlık değildir). |
|
|
Silinecek veri yok / veri kaybolamaz. |
Ölçeklendirme tamamlandıktan sonra kilit açılır. |
|
Kilit açıldıktan sonra diskin tekrar dolmasını önlemek için parçaları hızla geri alın veya kullanılmayan verileri temizleyin. Bkz. Tükenmiş disk alanından kaynaklanan örnek kilidini çözün.
Konsol kullanımı uyarılarla eşleşmiyor (örneğin, konsol %60 gösteriyor ancak uyarı %90'da tetikleniyor)
Bu bir veri hatası değil farklı görüntüleme boyutlarından kaynaklanır:
Uyarılar "en yüksek tek düğüm" üzerinde tetiklenir: Bir çoğaltma kümesinde Birincil, İkincil ve Gizli düğümlerin disk kullanımı farklı olabilir (oplog, geri alma zamanlaması, geçici dosyalar ve diğer nedenlerle İkincil/Gizli düğümler genellikle Birincil'den daha yüksektir). Herhangi bir tek düğüm eşiği aştığında bir uyarı tetiklenir.
Konsol varsayılan olarak "en yüksek düğümü" göstermez: Örnek Basic Information sayfası toplu bir değer gösterir ve Storage Analysis sayfası varsayılan olarak Gizli düğümü gösterir. Her ikisi de uyarıyı tetikleyen düğümden daha düşük olabilir.
Her düğümün gerçek kullanımını nasıl görüntülersiniz: Örnek Monitoring Information sayfasına gidin görüntüleme modunu Sub-node independent olarak değiştirin ve uyarıyı tetikleyen yüksek kullanıma sahip düğümü bulmak için her Birincil / İkincil düğümün disk alanı kullanımını ayrı ayrı görüntüleyebilirsiniz.
Birincil ve ikincil düğüm disk kullanımının neden farklı olduğu ve bunun nasıl ele alınacağı hakkında daha fazla bilgi için bkz. ApsaraDB for MongoDB örneklerinin yüksek disk alanı kullanımı.
Para tasarrufu yapmak için diski küçültebilir miyim?
Küçültme desteklenmez. ApsaraDB for MongoDB hiçbir sürüm için satın alınan disk alanının azaltılmasını desteklemez. Büyük miktarda veriyi temizleyip parçaları geri alsanız bile disk teknik özelliklerini yalnızca koruyabilir veya artırabilirsiniz. Doğrudan azaltamazsınız.
Daha küçük bir disk teknik özelliğine ihtiyacınız varsa tek seçenek daha küçük bir teknik özelliğe sahip yeni bir örnek oluşturmak verilerinizi DTS kullanarak geçirmek ve ardından orijinal örneği serbest bırakmaktır. Devam etmeden önce geçiş maliyetini ve kesinti süresi penceresini değerlendirin.
Yapılandırma değişikliği ve teknik özellik sınırları için bkz. Çoğaltma kümesi örneği yapılandırmasını değiştirin.
Ek
Disk parçaları neden oluşur?
delete komutu veya TTL süresi dolması kullanılarak veriler silindiğinde yalnızca silindi olarak işaretlenir. Kapladığı alan hemen işletim sistemine iade edilmez. Bunun yerine gelecekteki yazmalar için ücretsiz bloklar olarak saklanır. Silmeler yazmalardan daha hızlı olduğunda bu ücretsiz bloklar uzun süre kullanılmadan kalır ve parçalar oluşturur. Bu nedenle veri hacmi azalsa bile disk kullanımı yüksek kalır.
Disk parçaları ne zaman geri alınmalı
Aşağıdaki durumlarda disk parçalarını geri almayı düşünün:
-
Büyük hacimli veri silindikten sonra: Çok sayıda belge sildiğinizde boşaltılan alan işletim sistemine iade edilmez gelecekteki yazmalar için ayrılır ve diskte önemli miktarda parçalanmış alan bırakır.
ÖnemliManuel silme (
delete) ve TTL süresi dolması disk parçalarını otomatik olarak geri almaz. Manuel geri alma gerekir. Uzun süreli yüksek yazma iş yüklerinden sonra: Sürekli yüksek yazma iş yükleri (sık inserts, updates ve deletes) diskte yavaş yavaş parçalanmış alan biriktirir.
Disk alanı düşük ve parçalanma %20'yi aştığında: Disk kullanımı %85 ila %90 veya daha yüksek seviyelere ulaştığında parçaları geri almak alanı boşaltabilir ve depolama baskısını azaltabilir.
Geri alınabilir alanı görüntüleme ve tahmin etme
Örneğe bağlanın (çoğaltma kümesi örnekleri için hizmet etkisini en aza indirmek amacıyla bir İkincil düğüme bağlanın) ve bir koleksiyonun depolama durumunu görüntülemek için db.runCommand({collStats: "<collection>"}) çalıştırın. Aşağıdaki alanlara dikkat edin:
size: Koleksiyonun mantıksal depolama boyutu.storageSize: Koleksiyonun fiziksel depolama boyutu.freeStorageSize: Koleksiyon içindeki geri alınabilir boş alan (MongoDB 4.4 ve sonraki sürümlerde mevcuttur).
remove komutuyla belgeleri sildikten sonra size azalır ancak storageSize değişmeyebilir. freeStorageSize ile storageSize oranının daha yüksek olması daha yüksek bir parçalanma oranını gösterir.
Ayrıca bir koleksiyonun geri alınabilir parça alanını tahmin etmek için aşağıdaki komutu çalıştırabilirsiniz (yeniden kullanılabilir bayt sayısını döndürür):
db.<collection>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
Neredeyse boş örnekler için freeStorageSize null döndürebilir. Bu durumda parçalanma oranını tahmin etmek için wiredTiger["block-manager"]["file bytes available for reuse"] (yeniden kullanılabilir baytlar) ve ["file size in bytes"] (toplam dosya boyutu) değerlerini kontrol edin. Alan açıklamaları için bkz. collStats Output.