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
- lock scrive su un membro secondario
db.fsyncLock() - Scatta un'istantanea
Registra l'ultima posizione da oplog
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().tsSblocca le scritture
db.fsyncUnlock()
Procedura di backup incrementale
- lock scrive su un membro secondario
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) } }'Registra l'ultima posizione di oplog (come per i backup completi)
- Sblocca le scritture
Procedura di ripristino del backup completo
- interrompere tutte le istanze di
mongod - copia l'istantanea nella directory dei dati della casella che sarà la principale, ma assicurati di escludere tutto
local*emongod.lockquesta tecnica di ripristino si chiama riconfigura rompendo il mirror - Inizia primario
- riconfigurare replicaset
- 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:
- cambia directory nel backup:
cd /mnt/mongo-test_backup/1/local - elimina il file json
rm *.json - rinominare il file bson
mv oplog.rs.bson oplog.bson 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.