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 oplog
e capito che era molto facile sviluppare qualcosa per riprodurre il registro, ma risulta che non dovevo farlo mongorestore
per 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().ts
Sblocca 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.lock
questa 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
local
database
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.bson
ma 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.