Mongodb artımlı yedeklemeler


26

MongoDB replicaset için artımlı yedeklemeler yapma görevi verildi, başlangıç ​​noktası olarak elbette, Google’a gitmiştim ve MongoDB belgelerinde hiçbir şey bulamadım, ancak bu soruyu kendi çözümümü geliştirmeye teşvik eden Stack Overflow’ta buldum. Tayra'yı çok aktif bulmadı.

Bilgiyi okudum oplogve günlüğü tekrarlamak için bir şeyler geliştirmenin çok kolay olduğunu anladım, ancak benim için böyle bir şey yapmak zorunda olmadığım ortaya çıktı mongorestore.

Şimdi bash scriptleri ile çalışan bir çözümüm var ve bu oldukça kolaydı, işte mantığımın herhangi bir kusuru veya gelecekte beni ısırtacak bir şey olup olmadığını sormamın nedeni bu.

Bunu nasıl uyguladım aşağıda:

Tam yedekleme prosedürü

  1. lock ikincil bir üyeye yazıyor db.fsyncLock()
  2. Ekran alıntısı al
  3. Oplog'dan son pozisyonu kaydet

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. Kilidini yazar db.fsyncUnlock()

Artımlı yedekleme prosedürü

  1. lock ikincil bir üyeye yazıyor
  2. Tam (veya en son artımlı) yedeklemede kayıtlı oplog konumundan oplogyu boşalt:

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
  3. En son oplog konumunu kaydet (tam yedeklemeler için olduğu gibi)

  4. Kilidini yazar

Tam yedekleme geri yükleme prosedürü

  1. tüm örneklerini durdur mongod
  2. anlık olanı birincil olan kutunun veri dizinine kopyala, ancak hepsini dışladığından emin ol local*ve mongod.lock bu geri yükleme tekniğine aynayı kırarak yeniden yapılandırma denir.
  3. Birincil başlat
  4. kopya kopyayı yeniden yapılandırma
  5. herhangi bir veri olmadan ikincilleri başlatın, ilk senkronizasyonu yapmalarına izin verin. Veya verileri yeni birincil localveri tabanından yeni veritabanına kopyalayın.

Artımlı yedeklemeyi geri yükle

Artımlı yedekleme oluşturduğumuzda bunu şöyle sakladı:

/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json

Gizlendik oplog.rs.bsonama yeniden adlandırmamız gerekecek, işte adımlar:

  1. dizini yedeğe değiştir: cd /mnt/mongo-test_backup/1/local
  2. json dosyasını sil rm *.json
  3. bson dosyasını yeniden adlandır mv oplog.rs.bson oplog.bson
  4. geri yükle:

    mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local

Hepsini yazdıysam, daha sonra GitHub'a yazabilirim.

Asıl soru, mantıkta herhangi bir kusur olup olmadığıdır? Prosedür oldukça basit olduğundan şüpheliyim ve hala hiçbir yerde belgelemedim.


2
Mongo'nun hangi sürümünü kullanıyorsunuz? Wiredtiger kullanıyorsanız, db.fsyncLock () ile başvurduğunuz ilk öğe bir sorundur. MongoDB Inc, "WiredTiger ile kilit seçeneğiyle fsync komutu, veri dosyalarının değişmemesini garanti edemez. Sonuç olarak, yedekleme oluşturmak amacıyla tutarlılık sağlamak için bu yöntemleri kullanmayın." bağlantı
SDillon

1
@SDillon 3.0.4 kullanıyor, ancak WiredTiger kullanmıyor, en azından henüz değil. Kullanmaya karar verdim, kilit yazmak yerine hep birlikte mongodu durdurmak zorunda kalacağız. Bu çok adil bir nokta
Tiago

Artımlı yedekleme için aşağıdaki aracı buldum github.com/EqualExperts/Tayra bunun yardımcı olacağını umuyor
Ahmad Abuhasna

1
"3.2 sürümünde değiştirildi: kilit seçeneğiyle fsync komutu, veri dosyalarının MMAPv1 veya WiredTiger depolama motorlarını kullanarak MongoDB örnekleri için değişmemesini sağlayabilir ve böylece yedek oluşturma amaçları için tutarlılık sağlar."
güvenlik

Artımlı yedekleme yapmanın normal (ve kesinlikle en kolay) yolu LVM ve anlık görüntüleri kullanmaktır. docs.mongodb.com/manual/tutorial/…
JJussi

Yanıtlar:


3

Soruna cevap vermek için. Yok hayır! Mantığınızda hiçbir başarısızlık yoktur ve sorunsuz çalışmalıdır. Ancak, LVM anlık görüntüleri kullanılabilirse, yedekleme yapmak için daha iyi bir yoldur.


LVM anlık görüntüsünün artımlı yedeklemelerini nasıl yaparsınız? Teşekkürler!
TanisDLJ

LVM anlık görüntüleri doğa tarafından artımlıdır. Anlık görüntü, zaman içindeki anlardır ve yalnızca kaydedilen değişiklikler vardır.
JJussi

Sadece çekilmiş bir fotoğraf evet, bu artımlı. Ancak, anlık görüntüyü arşivlerseniz, tam bir yedekleme olur. Örneğin, yinelemenin yaptığı gibi farklı artımlı yedekleri arşivleyemezsiniz. Performansı gerçekten kötü bir şekilde etkileyeceğinden, artımlı yedeklemeler için her 30 dakikada bir anlık görüntüler oluşturmaya başlayamazsınız.
TanisDLJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.