Backup incrementali Mongodb


26

Mi è stato assegnato il compito di impostare backup incrementali per il replicaset MongoDB, come punto di partenza, ovviamente, l'ho cercato su Google e non ho trovato nulla sui documenti MongoDB, ho trovato comunque questa domanda su Stack Overflow, che ha incoraggiato a sviluppare la mia soluzione come non ho trovato Tayra molto attivo.

Ho letto oploge capito che era molto facile sviluppare qualcosa per riprodurre il registro, ma risulta che non dovevo farlo mongorestoreper me.

Ora ho una soluzione funzionante con script bash ed è stato abbastanza facile, ecco il motivo per cui sto chiedendo qui se c'è qualche difetto nella mia logica, o forse qualcosa che mi morderà in futuro.

Di seguito come l'ho implementato:

Procedura di backup completo

  1. lock scrive su un membro secondario db.fsyncLock()
  2. Scatta un'istantanea
  3. Registra l'ultima posizione da oplog

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

Procedura di backup incrementale

  1. lock scrive su un membro secondario
  2. Dump oplog dalla posizione di oplog registrata sul backup completo (o più recente incrementale):

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
    
  3. Registra l'ultima posizione di oplog (come per i backup completi)

  4. Sblocca le scritture

Procedura di ripristino del backup completo

  1. interrompere tutte le istanze di mongod
  2. copia l'istantanea nella directory dei dati della casella che sarà la principale, ma assicurati di escludere tutto local*e mongod.lock questa tecnica di ripristino si chiama riconfigura rompendo il mirror
  3. Inizia primario
  4. riconfigurare replicaset
  5. avviare secondari senza dati, consentire loro di eseguire la sincronizzazione iniziale. Oppure copia i dati dal nuovo primario con un nuovo localdatabase

Ripristina backup incrementale

Quando abbiamo creato il backup incrementale lo ha archiviato in questo modo:

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

Siamo coinvolti oplog.rs.bsonma dovremo rinominarlo, quindi ecco i passaggi:

  1. cambia directory nel backup: cd /mnt/mongo-test_backup/1/local
  2. elimina il file json rm *.json
  3. rinominare il file bson mv oplog.rs.bson oplog.bson
  4. ripristinalo:

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

Ho tutto lo script, potrei impegnarlo su GitHub in seguito.

La domanda è se c'è qualche difetto nella logica? Sono un po 'sospettoso in quanto la procedura è piuttosto semplice e ancora non riesco a trovarla documentata da nessuna parte.


2
Quale versione di Mongo stai usando? Se si utilizza wiredtiger, il primo elemento a cui si fa riferimento con db.fsyncLock () è un problema. MongoDB Inc afferma "Con WiredTiger, il comando fsync con l'opzione lock non può garantire che i file di dati non cambino. Di conseguenza, non utilizzare questi metodi per garantire la coerenza ai fini della creazione di backup." link
SDillon

1
@SDillon usando 3.0.4 ma non usando WiredTiger, almeno non ancora. Decidiamo di usarlo, invece di scrivere in blocco dovremo fermare mongod tutti insieme. È un bel punto grazie
Tiago,

Ho trovato il seguente strumento per il backup incrementale github.com/EqualExperts/Tayra spero che questo possa aiutare
Ahmad Abuhasna,

1
"Modificato nella versione 3.2: il comando fsync con l'opzione di blocco può garantire che i file di dati non cambino per le istanze MongoDB utilizzando MMAPv1 o i motori di archiviazione WiredTiger, fornendo così coerenza ai fini della creazione di backup."
sicurezza

Il modo normale (e assolutamente più semplice) per eseguire backup incrementali è utilizzare LVM e le istantanee. docs.mongodb.com/manual/tutorial/…
JJussi

Risposte:


3

Per rispondere alla tua domanda. No! Non c'è errore nella tua logica e dovrebbe funzionare senza problemi. Tuttavia, se è possibile utilizzare le snapshot LVM, è il modo migliore per eseguire i backup.


Come si eseguono backup incrementali di un'istantanea LVM? Grazie!
TanisDLJ,

Le istantanee LVM sono incrementali per natura. Le istantanee sono momenti nel tempo e sono state registrate solo le modifiche.
JJussi,

Solo un'istantanea presa sì, è incrementale. Ma se archivi l'istantanea, allora è un backup completo. Ad esempio, non è possibile archiviare diversi backup incrementali come fa la duplicità. E non è possibile semplicemente iniziare a creare snapshot ogni 30 minuti per backup incrementali, poiché ciò comprometterebbe le prestazioni.
TanisDLJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.