Mongodb incremental backup


26

Saya diberi tugas untuk membuat cadangan tambahan untuk replika MongoDB, sebagai titik awal, tentu saja, saya meng-google-nya dan tidak dapat menemukan apa pun di dokumen MongoDB, namun saya menemukan pertanyaan tentang Stack Overflow ini, yang mendorong untuk mengembangkan solusi saya sendiri karena tidak menemukan Tayra sangat aktif.

Saya membaca oplogdan menyadari sangat mudah untuk mengembangkan sesuatu untuk memutar ulang log, tetapi ternyata saya tidak harus mongorestoremelakukannya untuk saya.

Sekarang saya punya solusi yang berfungsi dengan skrip bash dan itu cukup mudah, itulah alasan saya bertanya di sini apakah ada kesalahan dalam logika saya, atau mungkin sesuatu yang akan menggigit saya di masa depan.

Di bawah ini cara saya menerapkannya:

Prosedur pencadangan penuh

  1. kunci menulis pada anggota sekunder db.fsyncLock()
  2. Ambil foto
  3. Rekam posisi terakhir dari oplog

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

Prosedur pencadangan tambahan

  1. kunci menulis pada anggota sekunder
  2. Dump oplog dari posisi oplog yang direkam dengan cadangan penuh (atau tambahan terbaru):

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
    
  3. Rekam posisi oplog terbaru (dengan cara yang sama seperti untuk backup penuh)

  4. Buka kunci tulis

Prosedur pemulihan cadangan penuh

  1. hentikan semua contoh mongod
  2. salin snapshot ke dir data dari kotak yang akan menjadi yang utama, tetapi pastikan untuk mengecualikan semua local*dan mongod.lock teknik pemulihan ini disebut rekonfigurasi dengan memecahkan cermin
  3. Mulai primer
  4. mengkonfigurasi ulang replaset
  5. mulai sekunder tanpa data, biarkan mereka melakukan sinkronisasi awal. Atau salin data dari primer baru dengan localdatabase baru

Kembalikan cadangan tambahan

Ketika kami membuat cadangan tambahan, ia menyimpannya seperti ini:

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

Kami telah ditanamkan oplog.rs.bsontetapi kami harus mengganti nama, jadi inilah langkah-langkahnya:

  1. ubah direktori ke cadangan: cd /mnt/mongo-test_backup/1/local
  2. hapus file json rm *.json
  3. ganti nama file bson mv oplog.rs.bson oplog.bson
  4. pulihkan:

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

Saya memiliki semua skrip, saya dapat mengkomitnya di GitHub nanti.

Pertanyaannya adalah apakah ada kesalahan dalam logika? Saya agak curiga karena prosedurnya cukup mudah dan saya masih belum menemukannya di mana pun.


2
Mongo versi apa yang Anda gunakan? Jika Anda menggunakan wiredtiger, maka item pertama yang Anda referensikan dengan db.fsyncLock () adalah masalah. MongoDB Inc mengklaim "Dengan WiredTiger, perintah fsync dengan opsi kunci tidak dapat menjamin bahwa file data tidak berubah. Akibatnya, jangan gunakan metode ini untuk memastikan konsistensi untuk tujuan membuat cadangan." tautan
SDillon

1
@ SDillon menggunakan 3.0.4 tetapi tidak menggunakan WiredTiger, setidaknya belum. Jika kita memutuskan untuk menggunakannya, alih-alih menulis kunci, kita harus menghentikan mongod bersama-sama. Ini poin yang adil terima kasih
Tiago

Saya menemukan alat berikut untuk cadangan tambahan github.com/EqualExperts/Tayra berharap ini akan membantu
Ahmad Abuhasna

1
"Berubah dalam versi 3.2: perintah fsync dengan opsi kunci dapat memastikan bahwa file data tidak berubah untuk instance MongoDB menggunakan mesin penyimpanan MMAPv1 atau WiredTiger, sehingga memberikan konsistensi untuk tujuan membuat cadangan."
keamanan

Cara normal (dan benar-benar termudah) untuk melakukan backup inkremental adalah menggunakan LVM dan snapshots. docs.mongodb.com/manual/tutorial/…
JJussi

Jawaban:


3

Untuk menjawab pertanyaan Anda. Tidak! Tidak ada kegagalan pada logika Anda dan itu harus bekerja tanpa masalah. Namun, jika snapshot LVM dapat digunakan, itu adalah cara yang lebih baik untuk melakukan backup.


Bagaimana Anda melakukan backup incremental snapshot LVM? Terima kasih!
TanisDLJ

Snapshots LVM pada dasarnya bersifat incremental. Jepretan adalah momen dalam waktu dan hanya ada perubahan yang direkam.
JJussi

Hanya snapshot yang diambil ya, itu tambahan. Tetapi jika Anda mengarsipkan snapshot, maka itu adalah cadangan penuh. Misalnya, Anda tidak dapat mengarsipkan cadangan inkremental yang berbeda seperti yang dilakukan duplikat. Dan Anda tidak bisa begitu saja mulai membuat foto setiap 30 menit untuk cadangan tambahan karena itu akan memukul kinerja yang sangat buruk.
TanisDLJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.