Time-to-Live (TTL) dizinlerine sahip MongoDB koleksiyonlarını Data Transmission Service (DTS) ile senkronize ederken veya geçirirken, hedefteki TTL tabanlı otomatik silme işlemi görev gecikmelerine ve veri tutarsızlıklarına neden olabilir. Bu durumu önlemek için senkronizasyon veya geçiş süresince hedefteki TTL dizinlerinin sona erme değerini geçici olarak maksimum değere ayarlayın.
Arka Plan
Kullanıcı oturumları, günlükler veya önbellek verileri gibi TTL dizinlerine sahip koleksiyonlar içeren bir MongoDB örneğini geçirdiğinizde tam ve artımlı senkronizasyon için DTS kullanabilirsiniz. Amaç, hizmet etkisini en aza indirerek veri kaybını sıfıra çekmektir.
Ancak TTL otomatik silme mekanizması DTS senkronizasyonu ile çakışabilir; bu da görev gecikmesine ve veri tutarsızlığına yol açar:
Gereksiz DELETE işlemleri verimliliği düşürür: Kaynak tarafındaki TTL dizini süresi dolmuş verileri sildiğinde Oplog'a bir DELETE kaydı yazar. DTS bu DELETE işlemini hedefte tekrar oynatır. Hedefteki TTL dizini aynı veriyi zaten silmişse MongoDB beklenmedik bir etkilenen satır sayısı döndürür; bu durum özel durum işleme tetikler ve geçişi yavaşlatır.
-
Asenkron TTL silmesinden kaynaklanan veri tutarsızlığı: TTL dizinleri verileri gerçek zamanlı olarak silmez. Süresi dolmuş veriler kaynakta hala mevcutken hedefte zaten silinmiş olabilir; bu durum tutarsızlığa neden olur.
Örnek:
MongoDB Oplog veya ChangeStream, bir UPDATE işlemi için tüm belgeyi değil yalnızca güncellenen alanları kaydeder. UPDATE işlemi hedefte hedef veriyi bulamazsa DTS işlemi yok sayar.
Zamanlama
Kaynak örnek
Hedef örnek
1
Hizmet veri ekler
2
DTS INSERT işlemini senkronize eder
3
Verinin süresi doldu ancak TTL dizini tarafından henüz silinmedi
4
Hizmet veriyi günceller (örneğin, sona erme zamanını değiştirmek için TTL dizini alanını günceller)
5
TTL dizini veriyi siler
6
DTS UPDATE işlemini senkronize eder ancak veri bulunamaz. İşlem yok sayılır.Sonuç olarak bu belge hedef MongoDB örneğinde eksik kalır.
Çözüm
Senkronizasyon veya geçişin tamamı boyunca (tam ve artımlı aşamalar dahil) hedef TTL dizinlerinin sona erme değerini geçici olarak maksimum değere ayarlayın. Trafiği yeni örneğe yönlendirdikten sonra özgün TTL ayarlarını geri yükleyin.
Yöntem:
-
TTL dizini ayarlarını yedekleyin: Kaynak veritabanında TTL dizinlerine sahip tüm koleksiyonları belirlemek ve sona erme değerlerini kaydetmek için bir betik çalıştırın.
-
Hedefte TTL otomatik silmesini devre dışı bırakın:
Hedef örnekte hedef koleksiyonların ve TTL dizinlerinin zaten var olup olmadığını kontrol edin.
Yoksa önce şema geçişi kullanarak koleksiyonları senkronize edin. Ardından hedef veritabanına bağlanın ve süreç sırasında otomatik silmeyi önlemek için sona erme süresini maksimum değere ayarlayın.
Varsa DTS görevini başlatmadan önce hedef veritabanına bağlanın ve süreç sırasında otomatik silmeyi önlemek için TTL sona erme süresini maksimum değere ayarlayın.
-
DTS görevini çalıştırın ve izleyin: Tam ve artımlı DTS senkronizasyon görevini başlatın. Hedefte TTL otomatik silmesi devre dışı bırakıldığında DTS kaynakta oluşan tüm işlemleri çakışma olmadan tekrar oynatabilir.
DTS konsolunda veri senkronizasyonu veya geçiş görevini oluşturun ve başlatın.
-
Süreç boyunca aşağıdaki ölçümleri izleyin:
DTS görev gecikmesi: Görev ayrıntıları sayfasında artımlı senkronizasyon gecikmesinin düşük kaldığını doğrulayın.
Hedef depolama kullanımı: Geçiş sırasında hedefteki verilerin süresi dolmayacağından depolama kullanımı sürekli artar. Yeterli depolama alanının bulunduğundan emin olun.
TTL ayarlarını geri yükleyin: DTS senkronizasyonu tamamlandıktan ve trafik yeni örneğe yönlendirildikten sonra yedeğinizden özgün TTL sona erme değerlerini geri yükleyin. MongoDB arka plan iş parçacığı daha sonra geçiş sırasında biriken süresi dolmuş belgeleri temizler.
Notlar:
Artımlı senkronizasyon veya geçiş sırasında DTS, kaynak TTL dizini tarafından süresi dolmuş veriler için oluşturulan DELETE işlemlerini hedefte yine de tekrar oynatır.
Hedefteki TTL sona erme süresi artırıldığında senkronizasyon/geçiş sırasında gecikme oluşursa hedef, kaynakta süresi zaten dolmuş verileri depolar. Kaynak yazma hacmine göre hedefte yeterli depolama alanı sağlayın.
Çok kısa TTL değerlerine sahip koleksiyonlar için (geçici veriler veya günlükler) geçmiş verileri geçirmekten kaçının. Aşırı durumlarda tamamen geçirilen veriler hedefte neredeyse anında süresi dolabilir ve koleksiyon boş kalabilir. Bunun yerine çift yazma stratejisi veya yalnızca artımlı geçiş düşünün.